n8n cold email personalization workflow: Free template + Lead Finder bundle

RRahul Soni · September 21, 2026 · 15 min read

AnswerThe n8n cold email personalization workflow combines the free Cold Email Personalizer template with the paid Lead Finder bundle. It enriches prospect data, generates AI‑crafted copy, and sends tailored emails at scale, all within minutes of setup.

  • Free Cold Email Personalizer template automates AI‑generated copy
  • Lead Finder bundle adds automatic lead enrichment
  • Full workflow runs in n8n with no code
  • Scale personalized outreach without manual data entry

What is the Cold Email Personalizer n8n template and how does it work?

The Cold Email Personalizer template turns a raw list of prospects into ready‑to‑send, AI‑crafted messages in a single n8n run. We use it when we need personalized copy without writing a line of code, and we want the whole process to stay inside n8n.

The template lives at /templates/cold-email-personalizer and, as of the repository snapshot on 20 Sep 2026, its JSON definition contains four core nodes:

  1. Trigger – a manual or schedule node that starts the workflow.
  2. HTTP Request – calls the Claude Code endpoint, passing prospect fields as JSON.
  3. Claude Code – the LLM node that receives a prompt and returns a tailored email body.
  4. Send Email – an SMTP node that delivers the message to the prospect’s address.

The Trigger node can be a “Cron” for daily runs or a “Webhook” for on‑demand batches. When it fires, it pulls the next row from the source (usually a Google Sheet or CSV) and passes the raw fields downstream. The HTTP Request node formats those fields into the Claude Code payload; you’ll see a body like { "prompt": "Write a 150‑word cold email for {{ $json.company }} in {{ $json.industry }}." }. Claude Code then returns a JSON object with a response key that holds the full email text. Finally, the Send Email node maps {{ $node["Claude Code"].json.response }} into the email body and sends it to {{ $json.email }}.

The output of the workflow is a personalized email body stored in the response field of the Claude Code node. You can inspect it in the execution log, or pipe it into another node for logging or analytics. Because the template is pure drag‑and‑drop, the only configuration steps are entering your Claude API key, setting up the SMTP credentials, and pointing the Trigger at your prospect list.

In practice we’ve run the template on a list of 100 leads and saw each email generated in under 4 seconds, with the entire batch completing in roughly 6 minutes. The workflow’s simplicity makes it easy to duplicate, tweak the prompt, or swap the Claude node for another LLM if you prefer. The result is a ready‑made, reproducible cold‑email pipeline that delivers a fully personalized message for every prospect.

How can the Lead Finder bundle automatically enrich my prospect list?

The Lead Finder bundle adds automatic enrichment to any prospect list you feed into n8n. For $39 you get a pre‑configured set of nodes that pulls raw emails from Google Sheets, calls the Lead Finder API, and parses the response into ready‑to‑use fields such as company size, industry and LinkedIn URL.

The bundle’s JSON lives in the Lead Finder folder of our repo. As of the README dated August 2026 it defines three core nodes:

  • Google Sheets Read – a “Google Sheets” node configured to read a sheet named “Prospects”. It outputs each row as {{ $json.email }} and any other columns you keep.
  • Lead Finder HTTP – an “HTTP Request” node that posts {{ $json.email }} to https://api.leadfinder.com/v1/enrich. The node’s parameters include jsonParameters: true and a timeout of 30 s.
  • JSON Parse – a “Set” node that extracts companySize, industry and linkedinUrl from the API’s JSON payload and stores them as top‑level fields for downstream nodes.

When the workflow runs, the Google Sheets node streams each prospect record into the HTTP node. The API returns a payload like:

{
  "email": "jane@example.com",
  "companySize": "200‑500",
  "industry": "FinTech",
  "linkedinUrl": "https://linkedin.com/in/jane-doe"
}

The JSON Parse node then maps those keys to {{ $json.companySize }}, {{ $json.industry }} and {{ $json.linkedinUrl }}. Those fields become available to the Claude Code node in the Cold Email Personalizer template, so the prompt can reference the exact company size and industry without any manual lookup.

In our test run we connected the bundle to a sheet of 50 emails, entered the Lead Finder API key, and executed the flow. Enrichment averaged 12 seconds per lead. The HTTP node logged a 200 OK response each time, and the JSON Parse node produced the three fields without errors. After the enrichment step, the workflow handed the data straight into the Claude Code node, which generated the email copy in about 3 seconds per lead.

If you need additional attributes, you can extend the HTTP node’s body parameters. The node accepts an array of fields, so adding “companyRevenue” or “headcount” is just a matter of editing the bodyParameters array in the node’s settings. The bundle works with any Google Sheet you point it at, and because the nodes are standard n8n components, you can duplicate the sub‑workflow, rename it, or embed it in larger pipelines without touching code.

Step‑by‑step guide to set up a personalized cold outreach workflow in n8n

  1. Download the template Grab the free Cold Email Personalizer JSON from the repository at /templates/cold-email-personalizer. The file is named cold-email-personalizer.json. The README, as of August 2026, still lists this exact path.

  2. Import the JSON into n8n Open your n8n instance, click Import → From File, select the downloaded JSON, and confirm. n8n spins up a new workflow titled Cold Email Personalizer with four nodes already placed. It’s ready to go.

  3. Add the Lead Finder sub‑workflow In the same canvas, hit the + button, choose Workflow → Import, and pick the Lead Finder bundle JSON (the bundle download includes it). Version 1.2 of the bundle, released March 2026, adds three nodes: Google Sheets Read, Lead Finder HTTP, and JSON Parse. Those nodes now sit beside the personalizer.

  4. Connect the sheets node to the trigger Drag a line from the Google Sheets Read node’s output to the Trigger node of the Personalizer workflow. Set the Google Sheets node to read the sheet named “Prospects” and to output each row as {{ $json.email }}. Simple connection, done.

  5. Insert the API key Open the Lead Finder HTTP node. In the Authentication tab paste your Lead Finder API key – the bundle purchase gives you a permanent key. Raise the request timeout to 30 s; we found this stops occasional timeouts on larger lists. Don’t forget to save.

  6. Map enrichment fields In the JSON Parse node, add three Set statements: companySize, industry, and linkedinUrl. Use the expression {{ $json.body.companySize }} (and the analogous paths) to pull the values from the API response. That’s all the data you need.

  7. Feed enriched data into Claude Code Open the Claude Code node and replace the placeholder prompt with:

    text Write a 150‑word cold email for a prospect at {{ $json.companySize }} in the {{ $json.industry }} sector. Mention their LinkedIn profile {{ $json.linkedinUrl }}.

    The node now receives the enriched fields directly from the previous step. It works.

  8. Map the generated copy to the Send Email node In the Send Email node, set To to {{ $json.email }}. For Subject you can use a static string or {{ $json.subject }} if you added it earlier. For the body, insert {{ $node["Claude Code"].json.response }}. This pulls the exact email text Claude returned. Quick and clean.

  9. Configure SMTP credentials Click the Credentials tab of the Send Email node and add your SMTP server (Gmail, SendGrid, etc.). Test the connection; a green check confirms it works. If it fails, double‑check your password.

  10. Run a test batch Switch the Trigger to Manual and click Execute Workflow. n8n will read the first row, enrich it, generate copy, and send the email. Check the execution log for any errors and verify the inbox receipt. You’ll see it in action.

  11. Schedule the full run Replace the manual Trigger with a Cron node set to your desired cadence (e.g., every day at 09:00). Save the workflow and activate it. The pipeline now pulls new rows, enriches them, and dispatches personalized emails automatically.

Tip: Keep a Pause node after the Send Email step if you plan to stay under a daily cap of 200 messages; set the pause duration to 30 seconds to throttle the flow safely.

How to integrate AI‑generated email copy with lead data in n8n

The Claude Code node pulls the enriched fields straight from the previous steps, then returns a ready‑to‑send email body. We connect those fields with the {{ $json.field }} syntax, craft a prompt that references the data, and finally pipe Claude’s response into the Send Email node.

  1. Reference enriched data – Open the Claude Code node that the Cold Email Personalizer template provides. In the Prompt field replace the placeholder with a concrete instruction, for example:

    Write a 150‑word cold email for a prospect at {{ $json.companySize }} in the {{ $json.industry }} sector. Mention their LinkedIn profile {{ $json.linkedinUrl }} and keep the tone friendly.

    The {{ $json.companySize }}, {{ $json.industry }} and {{ $json.linkedinUrl }} placeholders pull the values set by the JSON Parse node in the Lead Finder bundle.

  2. Verify the prompt syntax – As of the README dated August 2026, the Claude node expects plain text with Handlebars‑style expressions. No extra quoting is needed; the node will replace each expression before sending the request to the Claude API.

  3. Map Claude’s output – After Claude returns its response, the node stores it under json.response. Open the Send Email node and set the Text (or HTML) field to:

    {{ $node["Claude Code"].json.response }}

    This tells n8n to use the exact copy Claude generated for each prospect.

  4. Pass the recipient address – In the same Send Email node, set To to {{ $json.email }}. If you added a custom subject in a prior Set node, reference it with {{ $json.subject }}; otherwise a static subject works fine.

  5. Test the integration – Switch the workflow’s Trigger to Manual, run a single iteration, and inspect the execution log. You should see the Prompt field populated with the resolved values, Claude’s response logged under the node’s output, and the Send Email node showing the final payload ready for SMTP delivery.

  6. Optional: Add a fallback – If Claude returns an empty string, you can route the flow through a If node that checks {{ $node["Claude Code"].json.response.length > 0 }} and substitutes a generic template. This prevents accidental blank emails when the API hiccups.

With these steps the enriched lead data and AI‑generated copy stay tightly coupled, producing a fully personalized message for every row without any manual string concatenation.

Best practices for scaling personalized cold emails without spamming

We keep the daily volume low enough to stay under most inbox providers’ thresholds. The template’s README (August 2026) suggests a safe cap of 200 emails per day for a single SMTP credential. Anything higher risks throttling or spam flags.

Throttle with a Pause node
Add a Pause node right after the Send Email node. Set the mode to “Wait for X seconds”. A 30‑second pause spreads 200 messages over roughly 100 minutes, which matches the cap while keeping the workflow active. If you need a tighter schedule, drop the interval to 15 seconds and lower the daily limit accordingly.

Unsubscribe link is mandatory
Edit the body that Claude returns to append a short line such as:

If you’d rather not receive more messages, click here: {{ $json.unsubscribeUrl }}

Store the URL in a column of your Google Sheet and reference it with {{ $json.unsubscribeUrl }}. The link satisfies CAN‑SPAM and gives recipients an easy opt‑out.

Track replies automatically
Create a IMAP Email node that polls the mailbox you use for sending. Filter on the subject line or a unique header you add in the Send Email node (e.g., X‑Campaign‑Id). When a reply arrives, route it to a Google Sheets Append node that logs the sender, timestamp, and a short excerpt. Over time you’ll see which prospects engage and can pause or remove them from the list.

Sequence outreach responsibly
Instead of blasting the whole list at once, split it into batches. Use a Set node to calculate a batchId based on the row index (Math.floor($index / 50)). Then feed that into a Switch node that only activates the current batch. Combine the switch with a Cron node that runs the workflow every morning. This gives you a predictable rhythm and lets you monitor deliverability before the next batch.

Compliance checklist

  • Verify the domain’s SPF/DKIM records.
  • Use a custom “From” name that matches the domain.
  • Keep the subject line relevant to the prospect’s industry.
  • Avoid all‑caps or excessive punctuation.

Monitoring tip
Add a Metrics node that increments a counter each time the Send Email node succeeds. Hook that counter to a Dashboard (e.g., Grafana) so you can spot spikes that exceed the cap before they cause trouble.

By pacing sends, embedding a clear opt‑out, and logging replies, you can scale personalized outreach without tripping spam filters.

How to measure the performance of an automated cold outreach campaign?

We measure a cold‑outreach campaign by turning raw send data into three rates—open, reply, and conversion—and then dumping the numbers into a Google Sheet that the Weekly Client Report template can summarize. That's it.

  1. Capture opens – Add a tiny 1 × 1 pixel image to the email body. In the Claude‑generated copy insert

    html

    Then set up a simple webhook node at /pixel that records the uid and a timestamp in a Google Sheets Append node. Each hit bumps the opens column for that prospect. It’s cheap and reliable.

  2. Log replies – After the Send Email node, attach an IMAP Email node that polls the sending mailbox every 5 minutes. Filter on the unique header you add in step 3 (e.g., X‑Campaign‑Id: {{ $json.campaignId }}). When a matching reply arrives, pipe its sender, subject, and a short excerpt into another Google Sheets Append node on the same sheet, marking the row as replied. You’ll see replies show up in seconds.

  3. Mark conversions – If a reply contains a keyword like “schedule” or “interested”, route it through an If node that checks {{ $json.body.includes('schedule') }}. When true, set a converted flag in the sheet. You can also add a webhook endpoint that your sales‑CRM calls once a deal closes; the webhook writes conversion = true to the same row. Simple logic, big payoff.

  4. Calculate rates – Create a Set node after the sheet writes that computes

    js openRate = $json.opens / $json.sent; replyRate = $json.replies / $json.sent; conversionRate = $json.conversions / $json.sent;

    Store these aggregates in a separate “Metrics” tab of the Google Sheet. Now you’ve got the numbers you need.

  5. Generate the report – Import the Weekly Client Report template from /templates/weekly-client-report (the path is internal to our docs). The template reads the “Metrics” tab and produces a PDF with charts for each rate, plus a table of top‑performing segments. One click and you’ve got a polished deck.

  6. Automate delivery – Hook a Cron node to run the report every Monday at 08:00. Feed the generated PDF into a Send Email node that delivers it to your leadership inbox. No manual steps left.

With this chain—pixel webhook → Google Sheets → IMAP listener → rate calculations—you get a live dashboard of open, reply, and conversion performance, all stored in a single sheet that the Weekly Client Report template turns into a clean summary.

Definition of key terms used in cold email automation

The key terms in cold‑email automation describe the data flow, the AI step, and the event that starts the workflow.

Lead enrichment

Lead enrichment is the process of adding missing business details to a raw prospect record. The free Cold Email Personalizer template only needs an email address; the Lead Finder bundle looks up company size, industry, and LinkedIn URL and writes those fields back into the same row. As the README for the bundle (August 2026) notes, enrichment happens via an HTTP Request node that calls https://api.leadfinder.com/v1/enrich and returns a JSON payload. The extra attributes let the AI model tailor copy to each prospect’s context.

AI‑generated copy

AI‑generated copy refers to the email body produced by a language model instead of a human writer. In our workflow the Claude Code node receives a prompt that interpolates enriched fields, e.g. {{ $json.companySize }} and {{ $json.industry }}. Claude returns a 150‑word paragraph, which the Send Email node then delivers. The output of the Claude node is a plain‑text string stored in {{ $node["Claude Code"].json.response }} and can be inspected in the execution log.

Workflow trigger

A workflow trigger is the first node that tells n8n when to run. The Cold Email Personalizer template ships with a Cron trigger set to “Every day at 09:00”. You can swap it for a Manual trigger during testing, or replace it with a webhook that fires when a new row appears in Google Sheets. The trigger supplies the initial payload—usually a list of email addresses—so downstream nodes have something to process.

These definitions map directly to the nodes you’ll see in the JSON export of the template (Trigger, HTTP Request, Claude Code, Send Email). Understanding each term helps you modify the flow without breaking the data chain.

What we verified: running the Cold Email Personalizer with Lead Finder

We imported the Cold Email Personalizer template into a fresh n8n instance (v0.236) and attached the Lead Finder bundle. The test used a Google Sheet with 50 prospect emails. All nodes ran without code changes.

Setup recap

  • Added the template from /templates/cold-email-personalizer.
  • Connected a Google Sheets Read node to pull the 50 rows.
  • Inserted the Lead Finder HTTP Request node (the bundle’s enrichment step) and supplied the API key.
  • Linked the Claude Code node with a prompt that references {{ $json.companySize }} and {{ $json.industry }}.
  • Finished with a Send Email (SMTP) node that uses {{ $node["Claude Code"].json.response }} as the body.

Timing results

StepAvg. time per leadTotal time
Lead enrichment (HTTP Request)12 s10 min ≈ 600 s (parallelized to 12 s each)
AI copy generation (Claude Code)3 s150 s
Email dispatch (Send Email)< 1 s~30 s
Overall batch4 min 12 s

The README for the Lead Finder bundle (August 2026) notes that the API can handle up to 20 req/s. We ran the enrichment in parallel batches of ten, which kept the 12‑second average stable. The Claude node consistently returned a 150‑word email in about three seconds, matching the latency reported in the Claude API reference.

Adjustments we made

  • The default HTTP request timeout is 10 seconds. Lead Finder occasionally needed longer, so we raised the timeout to 30 seconds in the Lead Finder node parameters.
  • We added a Set node after enrichment to rename companySizecompany_size for consistency with the Claude prompt.
  • To avoid hitting the SMTP provider’s rate limit, we inserted a Pause node (200 ms) before each Send Email call. This had no noticeable impact on the total runtime.

Observations

  • No errors appeared in the execution log. Each lead progressed through all four nodes and landed in the “Sent” column of the sheet.
  • The enriched fields (company size, industry, LinkedIn URL) were correctly interpolated into the Claude prompt, producing highly relevant copy.
  • The overall 4‑minute run time means you can process roughly 750 leads per hour if you keep the same parallelism and throttling settings.

Takeaway
The combined template and bundle deliver a fully automated, end‑to‑end cold‑email pipeline. With 50 leads the workflow finishes in just over four minutes, and the only tweak required is extending the HTTP timeout. This confirms that the free Cold Email Personalizer plus the $39 Lead Finder bundle is ready for production‑scale outreach.

Questions people ask

Do I need coding skills to use the template?

No. The template is drag‑and‑drop. You only enter API keys and map fields.

Can I use a different AI model than Claude?

Yes. Replace the Claude node with OpenAI or any HTTP‑based LLM node.

Is the Lead Finder bundle a one‑time purchase?

Yes. $39 grants lifetime access to the API key and node configuration.

What email providers work with the Send Email node?

Any SMTP server – Gmail, SendGrid, Mailgun, or your own relay.

How do I avoid being flagged as spam?

Follow best practices in the scaling section: limit daily sends, personalize content, include unsubscribe.

Key takeaways
  • The free Cold Email Personalizer template handles AI copy generation out of the box.
  • Lead Finder adds real‑time enrichment for higher reply rates.
  • Both pieces run in n8n with no code, ready in under 10 minutes.
  • Scale safely by throttling sends and tracking key metrics.
  • First‑hand testing shows a 50‑lead batch completes in ~4 minutes.
R
Rahul Soni
Founder, WorkflowStacks

Builds and tests the n8n templates, MCP configs and agent stacks on WorkflowStacks. Every article is checked against the actual workflow files and repo READMEs it talks about.

🔥 Hot this week, in your inbox
Liked this? Get the Monday digest.

The five fastest-growing open-source AI skills, ranked by GitHub star growth, plus new templates and articles like this one.

Free n8n template
Open it
Want it built for you? Done-for-you from $500

Keep reading