Find decision makers at a HubSpot company using Apollo and n8n
Prerequisites
- n8n instance (cloud or self-hosted)
- HubSpot private app token with
crm.objects.contacts.read,crm.objects.contacts.write,crm.objects.companies.read, andcrm.schemas.contacts.readscopes - Apollo API key with People Search and Enrichment credits
- n8n credential configured for HubSpot
Step 1: Add a HubSpot trigger or manual input
Create a new workflow. Choose your trigger based on how you want to kick this off:
Option A — Manual trigger with company ID:
Add a Manual Trigger node with an input field for companyId. Useful for on-demand prospecting.
Option B — Watch for new target accounts:
Add a HubSpot Trigger node watching for company property changes. Filter for companies where your ABM property (e.g., abm_tier) is set to Tier 1.
Step 2: Fetch company details from HubSpot
Add an HTTP Request node to get the company record:
- Method: GET
- URL:
https://api.hubapi.com/crm/v3/objects/companies/{{ $json.companyId }} - Authentication: Predefined → HubSpot API
- Query params:
properties=domain,name,industry,numberofemployees
You need the domain property to search Apollo by company domain.
Step 3: Search Apollo for decision makers
Add an HTTP Request node to call Apollo's People Search API:
- Method: POST
- URL:
https://api.apollo.io/api/v1/mixed_people/search - Headers:
Content-Type: application/json,X-Api-Key: {{ $credentials.apolloApi.apiKey }} - Body:
{
"q_organization_domains_list": ["{{ $json.properties.domain }}"],
"person_titles": ["VP Sales", "CRO", "VP Marketing", "CMO", "VP RevOps", "Head of Sales"],
"person_seniorities": ["vp", "c_suite", "director"],
"page": 1,
"per_page": 25
}Adjust person_titles and person_seniorities for your buying committee. Selling a dev tool? Search for VP Engineering, CTO, Head of Platform. Selling HR software? VP People, CHRO, Head of Talent.
Step 4: Loop through results and enrich
Add a Split In Batches node to iterate over the people array from Apollo's response.
For each person, add an HTTP Request node to get verified email via Apollo's enrichment endpoint:
- Method: POST
- URL:
https://api.apollo.io/api/v1/people/match - Body:
{
"first_name": "{{ $json.first_name }}",
"last_name": "{{ $json.last_name }}",
"organization_name": "{{ $json.organization.name }}",
"reveal_personal_emails": false
}The People Search endpoint costs 1 credit per result returned. The People Match (enrichment) endpoint costs 1 additional credit per call. Searching a company that returns 8 results and enriching all 8 = 16 credits total.
Step 5: Check for existing contacts in HubSpot
Before creating a contact, check if they already exist. Add an HTTP Request node:
- Method: POST
- URL:
https://api.hubapi.com/crm/v3/objects/contacts/search - Body:
{
"filterGroups": [{
"filters": [{
"propertyName": "email",
"operator": "EQ",
"value": "{{ $json.email }}"
}]
}]
}Add an IF node after this: if results array length is 0, proceed to create. Otherwise, skip to the association step using the existing contact ID.
Step 6: Create contacts in HubSpot
Add an HTTP Request node (inside the "true" branch of the IF node):
- Method: POST
- URL:
https://api.hubapi.com/crm/v3/objects/contacts - Body:
{
"properties": {
"email": "{{ $json.email }}",
"firstname": "{{ $json.first_name }}",
"lastname": "{{ $json.last_name }}",
"jobtitle": "{{ $json.title }}",
"company": "{{ $json.organization.name }}",
"phone": "{{ $json.phone_numbers[0].sanitized_number }}",
"linkedin_url": "{{ $json.linkedin_url }}",
"hs_lead_status": "NEW"
}
}Step 7: Associate contacts with the company
For each contact (new or existing), add an HTTP Request node to create the association:
- Method: PUT
- URL:
https://api.hubapi.com/crm/v3/objects/contacts/{{ $json.contactId }}/associations/companies/{{ $json.companyId }}/contact_to_company
Step 8: Activate and test
- Click Execute Workflow with a real target company ID
- Verify contacts appear in HubSpot associated with the company
- Toggle the workflow to Active if using a trigger
Cost
- n8n Cloud Starter: $24/mo for 2,500 executions. Each company processed = 1 execution with multiple sub-operations.
- Self-hosted: Free. Unlimited executions.
- Apollo credits: 1 credit per search result + 1 credit per enrichment. Budget ~2 credits per decision maker found.
Need help implementing this?
We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.