Apify to Google Sheets, enriched LinkedIn leads
You start with a simple task: turn a list of LinkedIn URLs into a usable lead sheet. Then it turns into the usual mess. Tabs everywhere, copy-paste mistakes, half-filled rows, and a “we’ll fix it later” column that never gets fixed.
This LinkedIn lead enrichment automation hits sales ops first, because they’re the ones cleaning lists before outreach. But recruiters feel it too, and so do growth marketers trying to launch campaigns on time. The outcome is simple: a clean Google Sheet with enriched names, titles, companies (and more) without manual lookups.
Below, you’ll see how the workflow runs in n8n, what it produces, and how to use it as a repeatable “paste URLs → get leads” system.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Apify to Google Sheets, enriched LinkedIn leads
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Create new sheet for enriche..", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Get URLs from first sheet", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set google sheet URL & origi..", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>wait for previous nodes to f.."]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>format data for Apify INPUT .."]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Run Actor on Apify", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Get Results from Apify", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Add profiles into the new Sh..", pos: "b", h: 48 }
n6 --> n7
n7 --> n8
n2 --> n4
n5 --> n6
n4 --> n5
n0 --> n3
n1 --> n4
n3 --> n1
n3 --> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n6,n7 decision
class n1,n2,n8 database
class n5 code
classDef customIcon fill:none,stroke:none
class n4,n5 customIcon
The Problem: LinkedIn URLs Don’t Turn Into Leads by Themselves
A LinkedIn URL list looks like progress, but it’s not campaign-ready. Someone still has to open profiles, grab names and job titles, find the current company, confirm location, and keep everything aligned row-by-row in a spreadsheet. Do this for 50 profiles and you lose an afternoon. Do it weekly and it becomes a quiet tax on your pipeline. The worst part is the mental load: you’re constantly checking “did I paste into the right row?” and “did I already do this profile?”
It adds up fast. Here’s where it usually breaks down.
- Copying fields manually leads to mismatched rows, which means you can’t trust your own list.
- Even careful teams waste about 2 hours per batch just doing lookups and cleanup.
- People change roles often, so the data you gathered last month is already stale.
- Outreach personalization stalls because the list never gets “finished enough” to use.
The Solution: Apify → Google Sheets Enrichment, Automatically
This workflow turns your Google Sheet into the control center for lead enrichment. You paste LinkedIn profile URLs into a sheet (one URL per row). When you run the workflow in n8n, it reads those URLs, packages them into the right payload, and sends the batch to Apify’s LinkedIn Profile Enrichment actor. Apify returns structured profile data like name, title, company, and location. Then n8n creates a new Google Sheet (so your original stays untouched) and appends the enriched results into that new sheet as clean rows you can actually use.
The workflow starts from a manual trigger, which is perfect when you want control over when enrichment runs. In the middle, n8n merges the sheet setup with the retrieved URLs, formats the actor request, then launches Apify and fetches the dataset output. Finally, it writes enriched profiles into Google Sheets so your lead list is ready for CRM import or outreach.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you collect 80 LinkedIn URLs from Sales Navigator each week. Manually, you might spend about 2 minutes per profile to open it, copy name, title, company, and paste it into the right row, which is roughly 2.5 hours. With this workflow, you paste the URLs once, click run, and come back later to an enriched sheet. Your hands-on time drops to about 10 minutes, plus whatever Apify takes to process the batch in the background.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store URLs and receive enriched rows
- Apify to run the LinkedIn Profile Enrichment actor
- Apify API token (get it from your Apify account settings)
Skill level: Beginner. You’ll connect accounts, paste a Sheet URL, and run a test batch.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You kick it off manually inside n8n. That trigger is intentional. Enrichment is something most teams prefer to run when a list is “ready,” not every time someone edits a cell.
The workflow prepares your Google Sheet inputs. A Set (Edit Fields) node assigns the Sheet URL and the original tab name (typically a tab called “profiles”), then n8n creates a fresh destination sheet for enriched data.
n8n pulls the LinkedIn URLs and formats the actor request. It retrieves profile links from Google Sheets, merges that data with the sheet setup, then a small code step shapes the payload Apify expects.
Apify enriches, then results land back in Google Sheets. The workflow launches the Apify actor, fetches the dataset output, and appends enriched profiles into the new sheet so you can filter, score, or export.
You can easily modify which fields you write back to Sheets based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts manually so you can validate your enrichment inputs before running the Apify actor.
- Add and open Manual Run Trigger.
- Leave all fields at their defaults (no parameters required).
Step 2: Connect Google Sheets
These nodes create the enriched output sheet and read the source profile links. The flow splits into parallel branches after the sheet inputs are set.
- Open Assign Sheet Inputs and set google_sheet_url to your sheet URL (replace
xxxxxxxxxxxxwith your actual URL). - In Assign Sheet Inputs, set google_sheet_name to
profiles(or your source sheet name). - Open Generate Enriched Sheet and set Operation to
create. - Set Title to
=profiles-enriched-{{new Date().format('dd/mm-HH:mm')}}. - Set Document to
{{ $json.google_sheet_url }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Generate Enriched Sheet.
- Open Retrieve Profile Links and set Sheet Name to
{{ $json.google_sheet_name }}. - Set Document to
{{ $json.google_sheet_url }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Profile Links.
Assign Sheet Inputs outputs to both Generate Enriched Sheet and Retrieve Profile Links in parallel.
⚠️ Common Pitfall: Make sure your source sheet has a url column containing LinkedIn profile URLs; Format Actor Payload reads that field directly.
Step 3: Set Up the Processing Nodes
These nodes synchronize the branches, build the Apify payload, and launch the enrichment actor.
- Keep Sync Branch Outputs connected to both Generate Enriched Sheet and Retrieve Profile Links to merge branch results.
- Open Format Actor Payload and confirm the JavaScript code builds
startUrlsfrom Retrieve Profile Links. - Open Launch Apify Actor and set Actor Source to
store. - Set Custom Body to
{{ $json.startUrlsObject }}. - Credential Required: Connect your apifyApi credentials in Launch Apify Actor.
- Open Fetch Actor Dataset and set Resource to
Datasets. - Set Dataset ID to
{{ $json.defaultDatasetId }}. - Credential Required: Connect your apifyApi credentials in Fetch Actor Dataset.
Step 4: Configure Output Actions
The final output appends enriched data to the newly created sheet.
- Open Append Enriched Profiles and set Operation to
append. - Set Sheet Name to
{{ $('Generate Enriched Sheet').first().json.sheetId }}. - Set Document to
{{ $('Assign Sheet Inputs').first().json.google_sheet_url }}. - Keep Columns in
autoMapInputDatato map all returned fields (e.g.,full_name,headline,company_name,url). - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Enriched Profiles.
Use Flowpast Branding as a visual header only—it does not affect execution.
Step 5: Test and Activate Your Workflow
Validate the full enrichment loop and then activate the workflow for ongoing use.
- Click Execute Workflow to run Manual Run Trigger.
- Confirm Generate Enriched Sheet creates a new sheet titled like
profiles-enriched-12/03-14:25. - Verify Retrieve Profile Links returns rows with a
urlfield. - Check Fetch Actor Dataset for enriched records and ensure Append Enriched Profiles writes them to the new sheet.
- Toggle the workflow to Active once successful for production use.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check n8n’s Credentials screen and confirm the account has read/write access to the target spreadsheet.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your Google Sheets and Apify accounts are ready.
No coding required. You’ll mostly connect credentials and paste in your Google Sheet URL.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Apify usage costs for the enrichment actor.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll swap the destination step. Keep the Google Sheets “Retrieve Profile Links” part, then replace “Append Enriched Profiles” with your CRM node (or an HTTP Request) and map fields like name, title, company, and LinkedIn URL. Common tweaks include writing back into the same sheet instead of creating a new one, adding a “Status” column for processed rows, or enriching only new URLs you haven’t seen before using an If filter.
Usually it’s an expired or incorrect Apify API token in your n8n credentials. It can also happen if the actor you’re calling isn’t available on your Apify plan, or if you’re hitting usage limits during bigger batches. Double-check the Apify node configuration, then run a small test with a handful of URLs to confirm the dataset fetch returns results.
If you self-host n8n, there’s no execution limit (it mainly depends on your server and Apify throughput).
Often, yes, because this workflow benefits from multi-step handling: creating a new sheet, merging branch outputs, formatting an actor payload, then fetching and appending a dataset. n8n is comfortable with that kind of “batch” logic, and self-hosting can keep costs predictable when volumes grow. Zapier or Make can still work if you’re doing tiny lists and want the easiest UI, but you may hit limits when you need loops, branching, or more control over payload formatting. Honestly, the best choice depends on how often you enrich and how big your batches are. Talk to an automation expert if you want a quick recommendation.
Once this is running, your spreadsheet stops being a dumping ground and becomes a reliable lead pipeline input. Set it up, run it when you need it, and move on to work that actually closes deals.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.