₹ cost per lead.
X-Api-Key header — generate it under Settings → Integrations → API in your Apollo account. Note that enrichment consumes credits, billed at roughly $0.20 per credit on metered plans, and a full enrichment including a phone number can cost 9 or more credits. Slack needs a bot token with chat:write and the channels the bot is invited to.
reveal_phone_number: false. We left it on during a test run and burned through 1,400 credits in two days. For routing, email plus company data is enough — phone enrichment can happen later, only for claimed leads.
{
"parameters": {
"method": "POST",
"url": "https://api.apollo.io/api/v1/people/match",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-Api-Key", "value": "={{ $credentials.apolloApi.apiKey }}" },
{ "name": "Content-Type", "value": "application/json" }
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({\n email: $json.email,\n reveal_personal_emails: false,\n reveal_phone_number: false\n}) }}"
},
"name": "Apollo Enrich",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2
}
Verify this node by enriching your own work email first — the response person object should return your real title and company headcount. If person is null, the email is not in Apollo's database, so your scoring logic must handle the null gracefully.
## Step 3: The scoring Code node
Node 7 is where the triage decision lives. It scores 0–100 from company size, seniority, and a target-industry list. This is the logic that used to live in three SDRs' heads:
// n8n Code node — lead scoring
const p = $json.person || {};
let score = 0;
// Company size (headcount)
const size = p.organization?.estimated_num_employees || 0;
if (size >= 1000) score += 40;
else if (size >= 200) score += 30;
else if (size >= 50) score += 20;
else score += 5;
// Seniority of the contact
const senior = (p.seniority || '').toLowerCase();
if (['c_suite', 'vp', 'head'].includes(senior)) score += 35;
else if (['director', 'manager'].includes(senior)) score += 20;
else score += 5;
// Target industry bonus
const targets = ['software', 'financial services', 'logistics'];
if (targets.includes((p.organization?.industry || '').toLowerCase())) score += 25;
return [{ json: { ...$json, lead_score: Math.min(score, 100) } }];
## Step 4: Route by region and post to Slack
Node 10 reads person.organization.country (or a state field for India) and routes to the AE who owns that territory. Node 12 posts a Slack Block Kit card with a Claim button. The Slack node body:
{
"parameters": {
"resource": "message",
"operation": "post",
"channel": "={{ $json.ae_channel }}",
"blocksUi": "={{ JSON.stringify([\n { type: 'section', text: { type: 'mrkdwn',\n text: 'New lead — score ' + $json.lead_score + '/100\\n' +\n $json.email + ' · ' + ($json.person?.title || 'Unknown') + '\\n' +\n ($json.person?.organization?.name || '') + ' · ' +\n ($json.person?.organization?.estimated_num_employees || '?') + ' staff' } },\n { type: 'actions', elements: [\n { type: 'button', text: { type: 'plain_text', text: 'Claim' },\n style: 'primary', value: $json.email } ] }\n]) }}"
},
"name": "Post To AE Channel",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2
}
- Apollo API key in the
X-Api-Keyheader - Phone enrichment disabled to save credits
- Slack bot invited to every AE channel
- Scoring bands agreed with the sales lead, not guessed
- Null-person handling in the Code node
- Territory map matches your AE assignments
- Google Sheets log row for every routed lead
$0.20 each, so about ₹17–₹34 per lead at current exchange rates. Here is the per-component monthly cost for a team routing 800 leads a month:
Apollo dominates the cost, so the credit discipline from Step 1 matters more than the infra choice. Our AI and automation team usually negotiates an annual Apollo plan with bulk credits for clients at this volume.
One detail teams miss: the scoring bands are the whole game, and they are not a technical decision. We always run a calibration session with the sales lead where we pull 30 leads the team already qualified by hand, run them through the Code node, and compare. If the workflow's "qualified" band disagrees with the humans more than twice, the bands are wrong, not the humans. We tune the headcount and seniority weights until the agreement is tight, then lock them. This one-hour exercise is what makes the AEs trust the Slack card enough to act on it without second-guessing — and trust is the only thing that actually replaces the meeting.
## When should you not build this?
If you get fewer than 10 inbound leads a week, the triage meeting is cheaper than the maintenance. If your leads are mostly known existing accounts, Apollo enrichment adds little — you already have the data in your CRM. And if your AEs do not actually act on Slack notifications, automating the routing just moves the bottleneck; fix the response culture first. Automation amplifies a working process, it does not create one.
## Real example: the Bangalore SaaS team
The client had three AEs split by region (India, SEA, rest-of-world) and a daily triage call that everyone disliked. After we shipped this flow, the median time from form submit to first AE touch dropped from about 14 hours to 22 minutes, and the SDRs reclaimed 7.5 hours a week for actual outbound. We built the same enrich-score-route spine into the sales pipeline for Radiant Finance, where speed-to-lead directly moved their conversion rate.
The triage meeting felt productive, but it was really just three people reading the same form fields out loud. The workflow does it in ninety seconds and never skips a 4 PM lead.
Want this lead-routing pipeline live on your Slack this month?
We ship a self-hosted n8n enrich-score-route workflow for B2B teams in 7 working days. Typical cost: ₹60,000–₹95,000 plus your Apollo credits. Suitable if you route 40+ inbound leads a week and your AEs live in Slack. No slides — bring your scoring rules and we will wire them.

