anaksor-ocr
Sokheng · Kit
Reads Khmer and English text from documents, receipts and photos of signs, using a detector for text lines and a recogniser for each line. Suits developers who…
An n8n workflow that finds leads through an Apify Actor, reads each lead’s website and has GPT-4.1 draft a personalized cold email for each one, saved to a Google Sheet. A form sets the job title, the place, the keywords and your product.
Personalized cold email drafts from a lead search is an n8n workflow in the Marketing & SEO category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Outreach form
It starts when someone sends the Outreach form with:
A sheet of leads, each with a personalized cold email draft, nothing sent
What you need before you start.
Lead search
Runs a leads Actor from your form’s job title, place and keywords, and returns people with verified emails and their company sites.
NeedsApify API token, and credit for the leads
Language model
Runs GPT-4.1 twice per lead: once to summarize each site page and once to write the email.
NeedsOpenAI API key
Lead sheet
Appends one row per lead, with the lead’s details and the email draft in Outreach Content.
NeedsA Google account to sign in with, and a sheet with eight headers
Checked by Mindket on 13 Nov 2026
This n8n workflow turns a description of your product into a sheet of leads, each with a cold email drafted for them. A form takes the product, a job title, a place and some keywords. An Apify Actor returns matching people with verified emails. For each one, the workflow reads up to three pages of their company’s site, has GPT-4.1 summarize them and has it write an email that mentions what it found. The drafts and the lead details go to a Google Sheet. Nothing is sent.
Founders, outbound sales teams, freelancers and agencies that prospect by job title and place and want a draft that mentions the lead’s own business, not a template with a name swapped in.
| Industry | Who uses it | How they use it | Example |
|---|---|---|---|
| B2B software | Founders and sales reps | Describe the product once, then search a job title in one region | A founder targets operations leads in Spain and gets a sheet of drafts to read and send by hand. |
| Web and design agencies | Agency owners | Reach small companies whose sites show a need | An agency searches founders of small studios and gets drafts that mention each studio’s services. |
| Staffing | Recruiters | Prospect hiring managers by title and place | A recruiter searches engineering managers in one city and reviews each draft before sending. |
| Freelancers | Consultants and copywriters | Fill the form for one niche at a time | A copywriter searches marketing leads at software companies and keeps the best drafts. |
You need real comfort with n8n: three accounts, a sheet with the right headers and a loop of nineteen nodes. Skip it if you want emails sent for you, since it only drafts. Its author puts setup at about 18 minutes, which assumes the accounts already exist.
Any n8n you run will do, as long as it can reach Apify, OpenAI, Google and the websites of your leads.
Add Row with its node, or add one after itGet it saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. Have these ready before you import it.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud or on a server of your own |
| Apify | An account, its API token and credit for the lead search |
| OpenAI | A key that can use gpt-4.1 |
| An account and a sheet with the eight headers named below |
workflow.json.Leads Scraper, replace YOUR_TOKEN in the Authorization header with your Apify token. Keep Bearer before it.Summarize Website Page and Generate Multiline Icebreaker.first_name, last_name, designation, email, website_url, location, phone_number and Outreach Content.Add Row. Replace YOUR_SHEET_ID and YOUR_SHEET_TAB_ID with the sheet’s ID and the tab’s gid.Generate Multiline Icebreaker and change what it claims about the product.max_result in the body of Leads Scraper to 3 or 5, then save and use the form’s test address.The sheet’s ID sits between /d/ and /edit in its address, and the tab’s gid follows gid=. You can also switch both fields to From list and pick them. Press Publish when the first run looks right.
Open the form from On form submission and fill in your product, the job title to target, the place, keywords if you like, your name and your product’s link. The workflow then takes the leads one at a time, and each gets a row with its details and a draft in Outreach Content. A long search takes a while, so watch the sheet fill. Read every draft before you use it.
| To change | Where |
|---|---|
| Number of leads | max_result in the body of Leads Scraper, 100 in the file |
| Who counts as a lead | The rest of that body, such as email_status and contact_email_exclude_catch_all_domains |
| Pages read per lead | The number in Limit, 3 in the file |
| The email | The second message in Generate Multiline Icebreaker. Keep its email key, because Add Row reads it |
| Columns saved | The mapping in Add Row |
These entries in the form:
About your Product: A tool that drafts a first project brief from a client questionnaire Designation: Founder Location: Portugal Keywords: web design Your Name: Alex Product URL: https://example.com/
The Actor returns founders in Portugal with a verified email and a website. For each, the workflow reads a few pages of the site. It drafts a subject line and a body that names something specific it found there, then your product, three features and a request for a short call. The row holds the lead’s name, title, email, site, place and phone number beside the draft.
If you are new. This is a long workflow, so read it in three parts. The first finds leads, the second reads each lead’s website and the third writes the email and saves it. Run it with max_result at 3 or 5 first, and open Executions to see what each node received.
For experts. One loop carries a lead through the site reader and the writer, and Add Row returns to Loop Over Items for the next.
| Stage | Nodes | What to know |
|---|---|---|
| Lead search | Leads Scraper posts to Apify’s run-sync-get-dataset-items and waits for the dataset | The Actor ID in the address must stay. Code in JavaScript encodes the form values first, so spaces reach it as %20 |
| Site reading | Scrape Home, HTML, Filter, Limit | Filter keeps links that start with /, so only relative links are followed, and the home page itself is not summarized |
| Summaries | Summarize Website Page | GPT-4.1 writes a two-paragraph abstract as JSON for each page |
| The email | Generate Multiline Icebreaker | GPT-4.1 at temperature 0.5 with JSON output. The reply needs an email key, since Add Row reads message.content.email |
Each run costs money, and the drafts are about named people.
Add Row appends, so the same search run twice adds the same people twicemax_result firstAn n8n workflow. A form takes a description of your product, a job title, a place and some keywords. An Apify Actor finds
matching leads with verified emails, the workflow reads each lead's website, and GPT-4.1 drafts a cold email for each
one. The drafts land in a Google Sheet and nothing is sent.
workflow.json: the workflow as n8n exports it, twenty nodes: nineteen that run and one sticky note with the title.README.md: these notes.Generate Multiline Icebreaker is now an invented one.icebreaker key, while the instructions and Add Row use email. The newemail.nn and n- where line breaks were meant. We wrote \n there.join("/n") in the last message, which put the text /n between page summaries, is now join("\n").gpt-4.1.workflow.json.Leads Scraper, replace YOUR_TOKEN in the Authorization header with your Apify API token. Keep Bearer Summarize Website Page and Generate Multiline Icebreaker.first_name, last_name,designation, email, website_url, location, phone_number, Outreach Content.Add Row. Replace YOUR_SHEET_ID and YOUR_SHEET_TAB_ID/d/ and /edit in the sheet's address, and the gid comes after gid=.Generate Multiline Icebreaker and change what it claims about the product (below).max_result in the body of Leads Scraper from 100 to 3 or 5. Save, open the form's testAbout your Product, Designation, Location, Keywords (optional), Your Name andProduct URL.Code in JavaScript percent-encodes every text field, so Product Managers reaches the search asProduct%20Managers. Its comment says it also lowercases, but the code only encodes. If a search with spaces returnsLeads Scraper posts the search to an Apify Actor and waits for its dataset. Apify's listing for the Actor ID in themax_result leads.Only Websites & Emails drops leads without a website or an email. Scrape Home fetches each home page, HTMLEdit Fields keeps the lead's details beside them.Loop Over Items takes one lead at a time. Split Out, Filter, Code and Remove Duplicate URLs turn the linksLimit keeps the first three.Request web page for URL, Markdown and Summarize Website Page fetch the page and have GPT-4.1Aggregate gathers them.Generate Multiline Icebreaker writes the email from the abstracts, the lead's name and headline, and your productAdd Row appends the lead's details and the draft to the sheet, and the loop moves to the next lead.Filter keeps only links that start with /, so absolute links to the same site never reach Code. The home page
itself is not summarized, only up to three pages linked from it.
max_result in Leads Scraper.email_status andcontact_email_exclude_catch_all_domains.Limit.Generate Multiline Icebreaker, which holds the structure and the rules. Keep theemail key in its JSON format, because Add Row reads message.content.email.Add Row. headline and links are not saved.Add Row appends, so the same search run twice adds the same people twice.max_result first.README.md 6 KB workflow.json 26 KB
Sokheng · Kit
Reads Khmer and English text from documents, receipts and photos of signs, using a detector for text lines and a recogniser for each line. Suits developers who…
Qwen · Kit
Qwen2.5-7B-Instruct as GGUF files in eight quantization sizes, to chat with locally through llama.cpp. For people who want a capable 7.6B model on their own co…
ACE-Step · Kit
Generates music from text with a 4B diffusion decoder, 50 steps and guidance control, aiming for higher audio quality than the base. For creators with a GPU of…
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
nerijs · Kit
A pixel art style add-on for Stable Diffusion XL that turns text prompts into pixel-style images, with an optional LCM LoRA for faster runs. For game makers, d…
LiconStudio · Kit
Keeps characters, clothing, objects and backgrounds consistent in generated video by feeding the model up to five reference images. A LoRA for LTX-2.5 in Comfy…