Apollo to Airtable, smarter candidate shortlists
Candidate sourcing looks simple until you’re doing it for the third role this week. You search Apollo, open profiles, copy details into a spreadsheet, then try to remember why Candidate A felt “better” than Candidate B.
This hits recruiters first, honestly. But agency owners and in-house talent leads feel it too when shortlists slip, hiring managers get impatient, and outreach goes out late. Apollo Airtable automation fixes the messy middle so your shortlist is consistent and usable.
This workflow takes a job description and turns it into an Airtable shortlist with AI scoring, deduped candidates, and outreach drafts you can send right away. You’ll see what it does, what you need, and how teams typically customize it.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Apollo to Airtable, smarter candidate shortlists
flowchart LR
subgraph sg0["On form submission Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>On form submission"]
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>LinkedIn Profile Enrichment"]
n8@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser1", pos: "b", h: 48 }
n10@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n12@{ icon: "mdi:brain", form: "rounded", label: "Anthropic Chat Model", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Auto-fixing Output Parser2", pos: "b", h: 48 }
n14@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model4", pos: "b", h: 48 }
n15@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser2", pos: "b", h: 48 }
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Create Candidates in AirTable"]
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Add Job to AirTable"]
n18@{ icon: "mdi:robot", form: "rounded", label: "Create Candidate Assessment", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Limit1", pos: "b", h: 48 }
n21@{ icon: "mdi:brain", form: "rounded", label: "GPT-4.1-mini", pos: "b", h: 48 }
n22@{ icon: "mdi:robot", form: "rounded", label: "Scoring and Prequalification", pos: "b", h: 48 }
n23@{ icon: "mdi:robot", form: "rounded", label: "Data Structuring", pos: "b", h: 48 }
n24@{ icon: "mdi:robot", form: "rounded", label: "Generate Job Title Mutations", pos: "b", h: 48 }
n25@{ icon: "mdi:brain", form: "rounded", label: "GPT 4.1-mini", pos: "b", h: 48 }
n26@{ icon: "mdi:robot", form: "rounded", label: "Message Generation", pos: "b", h: 48 }
n27["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Apollo People Search1"]
n28@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out1", pos: "b", h: 48 }
n29@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out2", pos: "b", h: 48 }
n30@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Fields", pos: "b", h: 48 }
n19 --> n7
n20 --> n22
n5 --> n6
n31 --> n17
n28 --> n27
n29 --> n30
n1 --> n20
n6 --> n19
n25 -.-> n23
n21 -.-> n22
n23 --> n5
n30 --> n1
n26 --> n16
n0 --> n31
n3 -.-> n2
n8 -.-> n18
n10 -.-> n9
n14 -.-> n13
n17 --> n24
n12 -.-> n26
n27 --> n29
n4 -.-> n2
n2 -.-> n23
n11 -.-> n9
n15 -.-> n13
n9 -.-> n18
n13 -.-> n26
n18 --> n26
n7 --> n18
n24 --> n28
n22 --> n23
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n2,n4,n9,n11,n13,n15,n18,n22,n23,n24,n26 ai
class n3,n8,n10,n12,n14,n21,n25 aiModel
class n5 decision
class n16,n17 database
class n7,n27 api
classDef customIcon fill:none,stroke:none
class n0,n7,n16,n17,n27 customIcon
The Problem: Shortlists take forever and still feel subjective
Turning a job description into a recruiter-ready shortlist usually means juggling five different “mini tasks” that all require focus. You mutate titles, run Apollo searches, open tabs for LinkedIn checks, paste profile bits into a tracker, then attempt to score “fit” from memory. It’s not just slow. It’s inconsistent. Two people can review the same candidate and come back with totally different notes, which leads to extra back-and-forth and (worse) delayed outreach while the best candidates keep getting messages from competitors.
The friction compounds. Here’s where it breaks down.
- Manual sourcing turns into about 2 hours per role before you even write a single message.
- Duplicates sneak in when you search multiple title variants and locations, so your “top 20” is really 14 people and confusion.
- Scoring ends up vibe-based, which means you second-guess yourself and re-review profiles later.
- Outreach gets postponed because writing “just 15 emails” is never just 15 emails.
The Solution: Job description in, Airtable shortlist out
This n8n workflow runs a complete recruiting pipeline from one intake form or webhook. You submit the job title, job description, and location (plus optional target company domains), and the workflow normalizes the title so your search isn’t too narrow. It then generates several title variations, searches candidates in Apollo via API, and removes duplicates so your list stays clean. Next, AI scores each candidate from 0–5 with concise reasoning across experience, industry, and seniority, then structures the output into recruiter-friendly fields. Finally, it enriches profiles (like name, title, location, image, and basic experience), drafts a short email and LinkedIn DM, and writes everything into Airtable for review and downstream automation.
The workflow starts with job intake, then moves through search, deduping, and scoring. After enrichment, it generates a full candidate assessment and outreach messages, then logs the job and candidates to Airtable so you can shortlist, assign, and follow up without copy-pasting.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you’re filling one role and you normally try five title variations in Apollo, then review 30 profiles. If you spend about 5 minutes per profile to skim LinkedIn, paste notes, and write a quick outreach draft, that’s roughly 2.5 hours. With this workflow, you submit the job intake in about 3 minutes, then let n8n run search, dedupe, scoring, enrichment, and outreach generation in the background (often around 10–15 minutes depending on APIs). You’re mostly just reviewing the Airtable shortlist and sending messages.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtable for jobs, candidates, and outreach tracking
- Apollo to source candidates via people search
- OpenAI or Anthropic API key (get it from your LLM provider dashboard)
Skill level: Intermediate. You’ll connect credentials, match Airtable field names, and adjust a few prompts for your niche.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Job intake triggers the run. A form or webhook captures job title, job description, location, and optional target company domains, then creates a Job record in Airtable right away.
Title normalization widens the search. An AI node cleans up the title (so “AE” becomes “Account Executive,” for example) and generates up to five variations, which are split into separate Apollo searches.
Candidate sourcing and cleanup happens automatically. n8n queries Apollo via HTTP requests, splits the result set into individual candidates, then removes duplicates before anything gets scored.
Scoring, enrichment, and outreach run as a pipeline. AI produces a 0–5 fit score with reasons, a structured recruiter assessment (positives, red flags, recommendation), and short outreach drafts. A LinkedIn enrichment API fills gaps like location, image, and experience, then candidates are written into Airtable for review.
You can easily modify the scoring thresholds to only push “4–5” candidates into Airtable views, or swap Apollo for a different source. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the form intake so hiring managers can submit job details that kick off the workflow.
- Add the Form Intake Trigger node and set Form Title to
Job Input. - Under Form Fields, include Job Title, Job Description, Location, and a textarea field Target Companies with placeholder
Comma separated domains of target companies to source talent from. - Save the webhook URL from Form Intake Trigger for testing later.
Step 2: Connect Airtable for Job Records
Store the incoming job data in Airtable so candidates can be linked back to the search.
- Open Map Job Inputs and verify the three assignments: Job Title =
{{ $json["Job Title"] }}, Job Description ={{ $json["Job Description"] }}, Location ={{ $json.Location }}. - Configure Add Job to Airtable with Operation set to
create, and map fields Job Title, Job Location, and Job Description to the incoming values. - Credential Required: Connect your airtableTokenApi credentials in Add Job to Airtable.
Candidate Search - From Job Description → Job Searches to avoid creating records in the wrong workspace.Step 3: Generate and Split Job Title Variants
Use AI to normalize the job title and create search-friendly variants before sourcing candidates.
- In Generate Title Variants, confirm Model is
gpt-4.1-miniand JSON Output is enabled. - Ensure the first message references the job inputs with
{{ $('Map Job Inputs').item.json["Job Title"] }}and{{ $('Map Job Inputs').item.json["Job Description"] }}. - Credential Required: Connect your openAiApi credentials in Generate Title Variants.
- In Split Title Variants, set Field to Split Out to
choices[0].message.contentto produce individual titles.
Step 4: Source Candidates via Apollo and Clean Results
Search Apollo for people matching the generated titles, then split and deduplicate results.
- Configure Apollo People Lookup with URL
https://api.apollo.io/api/v1/mixed_people/searchand MethodPOST. - Set query parameters: person_titles[] =
{{ $json['choices[0].message.content'] }}, per_page =10, include_similar_titles =false, person_locations[] ={{ $('Map Job Inputs').item.json.Location }}. - Replace the header value x-api-key from
[CONFIGURE_YOUR_API_KEY]with your Apollo API key. - In Split People Results, set Field to Split Out to
people. - In Remove Duplicate People, set Compare to
selectedFieldsand Fields to Compare toid.
Step 5: Score Candidates with AI and Route Qualified Leads
Build a structured, machine-readable fit score and route candidates for enrichment.
- In Assemble Profile Text, keep LinkedIn_profile as
{{ Object.entries($json).map(([key, value]) => `${key}:${value}`).join(', ') }}and employment_history as the mapped string join expression. - Set Limit Scoring Batch to Max Items
50to cap scoring volume. - Open Prequalify Candidate and confirm the prompt references
{{ $json.LinkedIn_profile }},{{ $json.employment_history }}, and job data from Map Job Inputs. - Ensure GPT Mini Scoring Model is connected as the language model for Prequalify Candidate; Credential Required: Connect your openAiApi credentials in GPT Mini Scoring Model.
- In Structure Scoring Output, keep the JSON schema prompt and confirm hasOutputParser is enabled.
- Ensure GPT Mini Structuring Model is connected as the language model for Structure Scoring Output; Credential Required: Connect your openAiApi credentials in GPT Mini Structuring Model.
- Verify Score Branch Router uses
{{ $json.output.general_fit_score }}with the rule>= 4to pass only high scores to Map Candidate Fields.
Step 6: Enrich Profiles and Generate Reviews + Outreach
Enrich candidate profiles, generate recruiter-ready reviews, and compose outreach messaging.
- In Map Candidate Fields, confirm the output mappings like Name =
{{ $json.output.candidate_name }}and LinkedIn ={{ $json.output.candidate_linkedinUrl }}. - Set Limit Enrichment Batch to Max Items
50. - Configure LinkedIn Enrichment API with URL
https://real-time-data-enrichment.p.rapidapi.com/get-profile-data-by-url, and query parameter url ={{ $json.LinkedIn }}. - Replace x-rapidapi-key from
[CONFIGURE_YOUR_API_KEY]with your RapidAPI key. - Ensure Generate Candidate Review includes the assessment fields and job inputs, and uses OpenAI Chat Engine B as the language model. Credential Required: Connect your openAiApi credentials in OpenAI Chat Engine B.
- Ensure Compose Outreach Messages references
{{ JSON.stringify($('Generate Candidate Review').item.json.output) }}and is connected to Anthropic Chat Engine. Credential Required: Connect your anthropicApi credentials in Anthropic Chat Engine.
Step 7: Save Candidates to Airtable
Push enriched candidate data, reviews, and outreach copy into the Candidates table.
- In Add Candidates to Airtable, set Operation to
createand map the key fields: Name ={{ $('LinkedIn Enrichment API').item.json.firstName }} {{ $('LinkedIn Enrichment API').item.json.lastName }}, Email Body ={{ $json.output.Email_Body }}, and Job Searches ={{ [ $('Add Job to Airtable').first().json.id ] }}. - Ensure review fields like Executive Summary and Summary Fit Score map from
{{ $('Generate Candidate Review').item.json.output... }}. - Credential Required: Connect your airtableTokenApi credentials in Add Candidates to Airtable.
Step 8: Test and Activate Your Workflow
Run a full test to confirm candidate scoring, enrichment, and Airtable outputs are correct.
- Click Execute Workflow and submit a sample job through Form Intake Trigger.
- Confirm a new job record appears in Airtable from Add Job to Airtable and that candidate records are created by Add Candidates to Airtable.
- Verify that Score Branch Router only passes candidates with
general_fit_score >= 4into the enrichment branch. - When satisfied, switch the workflow to Active to enable production intake.
Common Gotchas
- Airtable credentials can expire or need specific permissions. If things break, check your n8n Credentials entry and confirm the Base access first.
- Apollo (or your candidate source) can rate-limit searches when you run lots of title variants. If you start seeing empty results, add batching/pagination and increase the interval between requests.
- Default AI prompts are generic. Add your role-specific “must haves” and your tone for outreach early, or you’ll be rewriting the same messages every time.
Frequently Asked Questions
About an hour if your Airtable base and API keys are ready.
No. You’ll mostly connect accounts and map a few Airtable fields. The “hard” part is deciding your scoring criteria, not writing code.
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 or Anthropic API usage (usually a few dollars for a batch of candidates, depending on how many you score and enrich).
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.
Yes, and it’s a common tweak. Add a simple filter after the scoring output (right after the score routing step) so only candidates with a score of 4 or 5 continue to enrichment and Airtable writing. You can also adjust the scoring prompt to weigh your niche harder, like “enterprise SaaS” or “healthcare compliance,” so the 4–5 bucket actually means something.
Most of the time it’s an expired or rotated API key in n8n Credentials, so regenerate it and update the HTTP Request node. It can also be missing permissions on the Apollo side, or you’re hitting rate limits because the workflow runs several title variations quickly. If results suddenly come back empty, check the raw HTTP response in the last execution to confirm what Apollo is returning.
On n8n Cloud, it depends on your monthly execution limits, but most teams can run this for several roles per week on a starter plan. If you self-host, there’s no execution cap; the real limits become API rate limits (Apollo and enrichment) and how aggressively you batch candidates. Practically, start with scoring 20–50 candidates per role, then increase once you’re happy with the prompts and your API costs.
For this kind of pipeline, usually yes. You’re doing branching, batching, deduping, structured AI outputs, and multiple write-backs, and n8n handles that without turning every extra step into a pricing surprise. Zapier or Make can still work if you only want “job intake → create Airtable record,” but the AI scoring and enrichment logic gets fiddly fast. Also, self-hosting n8n is a big deal if you expect lots of runs. Talk to an automation expert if you want a quick recommendation based on your weekly volume.
Once this is running, your “blank page” shortlist problem disappears. The workflow handles the repetitive parts so you can spend your time on judgment calls and real conversations.
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.