🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Apify + Google Sheets: LinkedIn leads enriched fast

Lisa Granqvist Partner Workflow Automation Expert

Your lead list looks “done” in Google Sheets. Then you start outreach and realize half the rows are missing context, half the LinkedIn URLs are stale, and personalization means opening 30 tabs and pretending you have time.

This LinkedIn lead enrichment workflow hits sales operators and growth marketers first. But agency owners running client campaigns feel it too, because every “quick” icebreaker turns into research, rewriting, and second-guessing.

This automation pulls “unenriched” rows from Sheets, scrapes each LinkedIn profile via Apify, then uses GPT to write a clean, specific icebreaker and saves everything back to your spreadsheets. You’ll see what it does, what you need, and how it behaves in the real world.

How This Automation Works

See how this solves the problem:

n8n Workflow Template: Apify + Google Sheets: LinkedIn leads enriched fast

The Challenge: Personalization That Doesn’t Scale

Personalized outreach is supposed to be your advantage. In practice, it’s a grind. You start with a spreadsheet export from Apollo, then you bounce between LinkedIn, company sites, maybe a news search, and finally your email tool. After the first 15 leads, your brain goes numb and you default to generic lines. Worse, you can’t tell which rows you already “did,” so you either re-check the same people or skip good leads by accident. It’s exhausting, and frankly it’s where a lot of campaigns quietly die.

It adds up fast. Here’s where it usually breaks down.

  • You spend about 5–10 minutes per lead just finding something real to mention.
  • Copy-pasting profile details invites small errors, and small errors create awkward intros.
  • Leads without a valid email slip through and waste your scraping and writing time anyway.
  • No status tracking means you reprocess the same rows or lose track mid-campaign.

The Fix: Enrich Leads in Sheets and Generate Icebreakers Automatically

This n8n workflow turns your Google Sheet into a simple enrichment pipeline. You tag rows as “un-enriched,” run the workflow, and it pulls only those leads to process. It checks each record for a real work email first, so you don’t burn API calls on junk. For each valid lead, it sends the LinkedIn URL to Apify’s LinkedIn Profile Scraper, then combines the scraped profile data with your existing sheet fields. Finally, GPT generates a short, human-sounding icebreaker in a structured format, appends the result into an “Enriched” sheet, and updates the original row’s status to “enriched” so it won’t be touched again.

The workflow starts with a manual run in n8n (so you control when batches happen). It then moves through validation, enrichment via Apify, and icebreaker creation via OpenAI. The output lands back in Google Sheets ready for your cold email or LinkedIn DM tool.

What Changes: Before vs. After

Real-World Impact

Say you enrich 50 new leads each week. Manually, you might spend about 8 minutes per lead bouncing between LinkedIn, notes, and your sheet, which is roughly 6 hours of pure context gathering. With this workflow, you spend maybe 10 minutes setting your batch to “un-enriched” and hitting execute, then wait for Apify and GPT to process in the background. You still review and tweak the best prospects, but you’re doing it with a filled-in profile snapshot and a ready-to-use opener.

Requirements

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Google Sheets to store leads and write back results
  • Apify to scrape LinkedIn profile data at scale
  • OpenAI API key (get it from the OpenAI API dashboard)

Skill level: Beginner. You’ll connect accounts, paste two tokens (Apify key + actor ID), and edit one prompt carefully.

Need help implementing this? Talk to an automation expert (free 15-minute consultation).

The Workflow Flow

A manual run starts it. You click execute when you’re ready to enrich a batch, which is useful if you want to control costs and pacing.

Google Sheets provides the queue. The workflow pulls rows from your “Raw Leads” sheet where the status column is set to “un-enriched,” then filters out entries that don’t have a valid email.

Apify does the profile enrichment. n8n loops through each lead, passes the LinkedIn URL to Apify’s LinkedIn Profile Scraper via an HTTP Request, and aggregates the returned profile fields so they’re consistent.

OpenAI writes the icebreaker, and Sheets stores it. The workflow maps the scraped data into a structured prompt, generates a short opener with GPT-4.1 Mini, appends a new row into an “Enriched” sheet, and finally marks the original lead as “enriched” so it won’t be reprocessed.

You can easily modify the icebreaker prompt to match your niche and tone 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 control when lead enrichment runs.

  1. Add or open Manual Run Trigger as the starting node.
  2. Connect Manual Run Trigger to Retrieve Unenriched Leads.

Step 2: Connect Google Sheets for Lead Intake

Pull the unenriched leads from your spreadsheet and filter valid work emails.

  1. Open Retrieve Unenriched Leads and set Document to [YOUR_ID] (USA_Dental) and Sheet to 100 Leads.
  2. In Retrieve Unenriched Leads, confirm the filter where status equals un-enriched.
  3. Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Unenriched Leads.
  4. Open Validate Work Email and set the condition to email notEmpty using {{ $json.email }}.
  5. Connect Retrieve Unenriched LeadsValidate Work EmailIterate Lead Records.
  6. Tip: Make sure your source sheet includes the email field; empty emails will be filtered out by Validate Work Email.

    Step 3: Configure Apify Enrichment and Data Aggregation

    Enrich each lead with LinkedIn data using Apify, then consolidate fields for the AI prompt.

    1. In Iterate Lead Records, leave Batch Size at default unless you need to throttle requests.
    2. Open Assign Apify Credentials and set apifyAPIKey and apifyActorID to your Apify values.
    3. In Apify LinkedIn API Request, set URL to =https://api.apify.com/v2/acts/{{ $json.apifyActorID }}/run-sync-get-dataset-items and Method to POST.
    4. Set JSON Body in Apify LinkedIn API Request to ={ "profileUrls": [ "{{ $('Iterate Lead Records').item.json.linkedin_url }}" ] }.
    5. Set Authorization header in Apify LinkedIn API Request to =Bearer {{ $json.apifyAPIKey }}.
    6. Connect Assign Apify CredentialsApify LinkedIn API RequestCombine Lead Data.
    7. In Combine Lead Data, set Aggregate to aggregateAllItemData.
    8. ⚠️ Common Pitfall: If apifyAPIKey or apifyActorID is empty in Assign Apify Credentials, the API request will fail. Populate both fields before testing.

      Step 4: Set Up AI Enrichment with Craft Icebreaker Text

      Map the enriched fields into a clean AI prompt and generate the personalized icebreaker.

      1. Open Map Fields for AI and ensure assignments map to expressions like {{ $json.data[0].firstName }}, {{ $json.data[0].lastName }}, and {{ $('Iterate Lead Records').item.json.organization_name }}.
      2. Confirm the city and state fields use {{ $('Iterate Lead Records').item.json.organization_city }} and {{ $('Iterate Lead Records').item.json.organization_state }}.
      3. Open Craft Icebreaker Text and keep Model set to gpt-4.1-mini.
      4. Keep JSON Output enabled in Craft Icebreaker Text to return structured content.
      5. Credential Required: Connect your openAiApi credentials in Craft Icebreaker Text.
      6. Connect Map Fields for AICraft Icebreaker Text.
      7. Tip: The prompt in Craft Icebreaker Text already formats output as JSON. Keep this intact so downstream mapping works correctly.

        Step 5: Configure Output to Google Sheets

        Write the generated icebreaker to your enriched sheet and mark the lead as processed.

        1. Open Append Icebreaker Row and set Operation to append.
        2. Set Document to [YOUR_ID] (USA_Dental) and Sheet to Enriched.
        3. Ensure columns map to expressions like {{ $('Iterate Lead Records').item.json.id }}, {{ $('Map Fields for AI').item.json.headline }}, and {{ $json.message.content.icebreaker }}.
        4. Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Icebreaker Row.
        5. Open Mark Lead Enriched and set Operation to update.
        6. In Mark Lead Enriched, map id to {{ $('Validate Work Email').item.json.id }} and set status to enriched.
        7. Credential Required: Connect your googleSheetsOAuth2Api credentials in Mark Lead Enriched.
        8. Connect Craft Icebreaker TextAppend Icebreaker RowMark Lead Enriched.
        9. ⚠️ Common Pitfall: The Mark Lead Enriched node updates rows by id. If your sheet’s id column doesn’t match, updates will fail silently.

          Step 6: Test and Activate Your Workflow

          Run a manual test and verify that enriched icebreakers are written back to the correct sheets.

          1. Click Execute Workflow starting from Manual Run Trigger.
          2. Confirm that Retrieve Unenriched Leads returns rows with status set to un-enriched.
          3. Verify that Craft Icebreaker Text outputs a JSON object containing icebreaker.
          4. Check Append Icebreaker Row for a new row in the Enriched sheet with the icebreaker text.
          5. Ensure Mark Lead Enriched updates the original row’s status to enriched.
          6. Once validated, activate the workflow to use it in production runs.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Watch Out For

  • Google Sheets permissions can be the silent killer. If rows aren’t updating, check the connected Google account in n8n credentials and confirm it has edit access to both the Raw and Enriched sheets.
  • If you’re using Wait behavior implicitly (because Apify runs can take time), processing times vary. Bump up the wait duration or add a polling check if downstream nodes fail on empty responses.
  • OpenAI outputs can drift if you edit the prompt casually. Keep the JSON output format exactly as the workflow expects, and add your brand voice early or you’ll be cleaning responses every run.

Common Questions

How quickly can I implement this LinkedIn lead enrichment automation?

About 30 minutes if your Sheets, Apify, and OpenAI accounts are ready.

Can non-technical teams implement this lead enrichment?

Yes. You’ll mostly be connecting accounts and copying an API key into the “Set Apify Tokens” step.

Is n8n free to use for this LinkedIn lead enrichment workflow?

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 OpenAI API usage (often a few cents per lead) and Apify runs based on your actor and volume.

Where can I host n8n to run this automation?

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.

How do I adapt this LinkedIn lead enrichment solution to my specific challenges?

You can. Most customizations happen in the “Craft Icebreaker Text” prompt and the “Map Fields for AI” mapping, because that’s where your niche, offer, and tone should be enforced. Some teams add a stricter email validation rule in “Validate Work Email” to avoid personal domains. Others change the output columns in “Append Icebreaker Row” so it matches their exact outreach template.

Why is my Apify connection failing in this workflow?

Usually it’s an expired or wrong Apify API key, or the actor ID was copied incorrectly from the Apify Console URL. Update both values in the “Assign Apify Credentials” node. Also check that your LinkedIn URLs are valid and not empty, because Apify will often return a blank result that breaks the next mapping step.

What’s the capacity of this LinkedIn lead enrichment solution?

If you self-host n8n, executions aren’t capped; your limits are mainly Apify and OpenAI throughput plus your server. On n8n Cloud, capacity depends on your plan, but most small teams comfortably run weekly batches of a few hundred leads. For big lists, process in smaller batches so you don’t hit rate limits.

Is this LinkedIn lead enrichment automation better than using Zapier or Make?

Often, yes, because this flow needs looping, branching (skip missing emails), and structured AI output handling, which gets clunky and expensive in many “per-step” tools. n8n is also easier to self-host if you want unlimited runs. Zapier or Make can still be fine if you’re only enriching a tiny list and want the simplest UI. The real deciding factor is how much logic you need and how often you run it. Talk to an automation expert if you want a quick recommendation.

Once this is set up, your spreadsheet stops being a to-do list and starts being a system. The workflow handles the repetitive research and formatting so you can focus on targeting, messaging, and replies.

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.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal