Complete Guide: Exa ICP Lead Generation — Find Your Perfect Customers with Semantic AI with n8n
Your ideal customer profile lives in a Google Doc that nobody reads. Meanwhile, your SDRs are pulling lists from Apollo by filtering on "SaaS, 50-200 employees, USA" — the same three filters everyone
Your ideal customer profile lives in a Google Doc that nobody reads. Meanwhile, your SDRs are pulling lists from Apollo by filtering on "SaaS, 50-200 employees, USA" — the same three filters everyone else uses — and wondering why reply rates sit at 2%. Keyword-and-firmographic prospecting finds companies that look like your ICP on a spreadsheet, not companies that actually behave like your best customers. This guide shows you how to build a lead engine that reads the web the way a human researcher would, using Exa's neural search plus GPT-4o scoring, orchestrated end-to-end in n8n.
The problem: firmographic filters are a blunt instrument
Traditional lead databases index structured fields — industry code, headcount band, funding stage, location. That works until your best customers share something that isn't a checkbox. Maybe they're companies "migrating off Zendesk to build their own support tooling," or "Series A startups hiring their first RevOps person," or "agencies that publicly talk about switching from spreadsheets to automation." No dropdown captures that intent. You end up with two bad options: broad filters that flood your pipeline with mismatches, or manual research where an analyst reads 40 company websites a day and burns out by Thursday.
The cost isn't just wasted SDR hours. It's the opportunity cost of every well-fit prospect you never found because they didn't have the right SIC code. Semantic search flips this: instead of matching fields, it matches meaning. You describe your customer in a sentence, and the engine finds companies whose actual web footprint resembles that description — the way a smart researcher would, at machine scale.
The solution: Exa neural search + GPT-4o scoring, wired in n8n
Exa is a search API built on embeddings rather than keywords. You give it a natural-language description of the company you want ("B2B fintech startups building embedded payments for vertical SaaS") and it returns URLs of pages that are semantically close — not just pages containing those words. The /search endpoint with type: "neural" does the retrieval; the /contents endpoint pulls the actual page text so you can reason over it.
The second half is judgment. Retrieval gives you candidates; it doesn't tell you which ones deserve an SDR's attention. That's where GPT-4o comes in. You feed each candidate's page content into a scoring prompt anchored on your ICP criteria, and the model returns a structured score (0-100) plus a one-line rationale for why the company fits or doesn't. The result is a ranked, deduplicated list where the top of the list is genuinely worth a personalized outreach.
n8n is the connective tissue. It defines your ICP once, calls Exa, loops the results through GPT-4o, filters by threshold, and drops the winners into your CRM or a Google Sheet — on a schedule, without you touching it. Define the customer once; the workflow finds and prioritizes them every day.
Step-by-step: building the workflow in n8n
Here is the node-by-node structure. The whole thing runs in under a minute per search once configured.
1. Schedule Trigger — Set it to run daily (or on a Manual Trigger while you tune). This is your cron; e.g. every morning at 07:00 so fresh leads are waiting.
2. Set node — "Define ICP" — Store your ideal customer description and scoring rubric here as fields. Keep the ICP query in one place so you edit it once: icp_query = "early-stage B2B SaaS companies that recently raised a seed round and are hiring for growth roles," plus a min_score field (e.g. 70) and a criteria block describing what "good" looks like.
3. HTTP Request node — Exa Search — Method POST to https://api.exa.ai/search. Add header x-api-key with your Exa key (store it as an n8n credential, not inline). JSON body:
{ "query": "{{ $json.icp_query }}", "type": "neural", "numResults": 25, "contents": { "text": true } }
Setting contents.text: true saves you a second API round-trip — Exa returns the page text alongside each result. Use category: "company" if you want Exa to bias toward company homepages specifically.
4. Split Out / Item Lists node — Exa returns an array under results. Split it so each company becomes its own item flowing downstream. This lets GPT-4o score one company per execution and keeps token usage predictable.
5. AI Agent or OpenAI Chat Model node — GPT-4o scoring — Model gpt-4o. System prompt: "You are an ICP-fit analyst. Given a company's website text and the ICP criteria, return JSON only." User prompt injects {{ $json.text }} (the Exa content) and {{ $('Define ICP').item.json.criteria }}. Attach a Structured Output Parser so the model returns clean JSON: { "score": 0-100, "reason": "...", "company_name": "..." }. Set temperature to 0.2 — you want consistent judgment, not creativity.
6. Filter node — Keep only items where {{ $json.score }} ≥ min_score. Everything below the bar is discarded before it ever reaches a human.
7. Remove Duplicates node — Deduplicate on the company domain. Neural search sometimes returns two pages from the same company; you don't want an SDR contacting them twice.
8. Destination node — Append the survivors to a Google Sheets node (columns: company, url, score, reason, date) or push directly into HubSpot/Pipedrive via their n8n nodes. Add a Slack or email node to ping the team when new high-scorers land.
Why this outperforms your current list-building
You find companies filters can't describe. Intent, positioning, and recent moves are all searchable when the engine reads meaning instead of matching fields.
Every lead arrives pre-qualified with a reason. GPT-4o's one-line rationale gives your SDR an instant hook for personalization — "saw you just launched embedded payments for vertical SaaS" beats "I noticed you're in fintech."
It runs while you sleep. The Schedule Trigger means a fresh, ranked list every morning with zero manual research. One analyst's daily output, automated.
It's cheap to operate. Exa charges per search, and 25 results scored by GPT-4o costs cents per run. Compare that to a $12k/year data seat that still requires manual qualification.
The ICP is version-controlled. Because the definition lives in one Set node, refining your targeting is a one-line edit, not a retraining exercise.
Common pitfalls (and how to avoid them)
Vague ICP queries return noise. "Tech companies" gives you garbage. Neural search rewards specificity — describe behavior, stage, and context, not just industry. Iterate on the query with a Manual Trigger before you put it on a schedule.
Skipping the content fetch. If you score companies on the search snippet alone, GPT-4o is guessing. Always pull full page text (contents.text: true) so the model reasons over real signal.
No structured output parser. Without it, GPT-4o occasionally returns prose or wraps JSON in markdown fences, and your Filter node breaks on undefined. The parser plus a strict "JSON only" instruction is non-negotiable.
Hardcoding API keys in the HTTP node. Use n8n's credential store for both Exa and OpenAI. Keys in node parameters leak into exported workflows and execution logs.
Ignoring rate limits and cost on large numResults. Fetching 200 results and scoring all of them per run adds up fast. Start at 25, tune your score threshold, then scale volume once precision is proven.
Forgetting deduplication over time. The single-run Remove Duplicates node won't stop the same company appearing across days. Add a lookup against your existing Sheet/CRM before writing, so yesterday's leads don't resurface as new.
Get these six right and you have a durable, self-running engine that turns one sentence about your ideal customer into a daily queue of pre-scored, ready-to-contact accounts.
Ja construimos isso pra voce
Nao comece do zero. O Exa ICP Lead Generation — Find Your Perfect Customers with Semantic AI e um workflow n8n pronto para instalar — conecta suas ferramentas em minutos, sem codigo.
Instalar por $79.0 →