Auto-enrich new HubSpot contacts with Apollo using Make
Prerequisites
- Make account (Free plan works for low volume; Core plan for higher throughput)
- HubSpot connection configured in Make via OAuth
- Apollo API key from Settings → Integrations → API
Step 1: Create a scenario with a HubSpot trigger
Create a new scenario in Make. Add a HubSpot CRM module:
- Module: Watch Contacts
- Connection: Your HubSpot OAuth connection
- Watch: New contacts only
- Limit: 10 (per poll cycle)
Make will poll HubSpot for new contacts at the schedule interval you configure.
On the Free plan, Make polls every 15 minutes. On Core ($29/mo) and above, you can set intervals as low as 1 minute. For enrichment, 15 minutes is usually fine — contacts don't need to be enriched instantly.
Step 2: Call the Apollo People Enrichment API
Add an HTTP module (Make a request):
- URL:
https://api.apollo.io/api/v1/people/match - Method: POST
- Headers:
x-api-key: Your Apollo API keyContent-Type:application/json
- Body type: Raw
- Content type: JSON
- Request content:
{
"email": "{{1.properties.email}}"
}Map the email from the HubSpot trigger module (module 1).
Step 3: Add a filter for matched results
Click the connector line between the Apollo HTTP module and the next module. Add a Filter:
- Label: Apollo matched
- Condition:
personfrom the HTTP response → Exists
This prevents downstream modules from executing when Apollo has no data for a contact.
Apollo returns a 200 with person: null for unmatched emails — it doesn't throw an error. The filter catches these. However, if the API key is invalid or you've exceeded rate limits, Apollo returns 401 or 429. Add a Resume error handler on the HTTP module with a 10-second delay to handle rate limiting gracefully.
Step 4: Update the HubSpot contact
Add a HubSpot CRM module:
- Module: Update a Contact
- Connection: Your HubSpot connection
- Contact ID: Map from module 1 (
{{1.id}}) - Job Title:
{{2.person.title}} - Company Name:
{{2.person.organization.name}} - Phone:
{{2.person.phone_numbers[].sanitized_number}}
For custom properties like linkedin_url, switch to the HTTP module approach:
- Method: PATCH
- URL:
https://api.hubapi.com/crm/v3/objects/contacts/{{1.id}} - Headers: Authorization handled by HubSpot connection
- Body:
{
"properties": {
"jobtitle": "{{2.person.title}}",
"company": "{{2.person.organization.name}}",
"phone": "{{2.person.phone_numbers[1].sanitized_number}}",
"linkedin_url": "{{2.person.linkedin_url}}",
"industry": "{{2.person.organization.industry}}"
}
}Make uses 1-based array indexing. The first phone number is phone_numbers[1], not phone_numbers[0]. This is a common source of bugs when translating API documentation examples.
Step 5: Add error handling and activate
- Right-click the HubSpot Update module → Add error handler → Resume (retries after a delay)
- On the Apollo HTTP module → Add a Break error handler (saves failed contacts for manual retry)
- Click Run once to test with a real contact
- Verify the contact's fields updated in HubSpot
- Set the scenario schedule (e.g., every 15 minutes) and toggle to Active
Cost and credits
- Free plan: 1,000 credits/month. Each enrichment run uses ~3 credits (trigger + HTTP + update). Supports ~333 enrichments/month.
- Core plan: $29/mo for 10,000 credits. Supports ~3,333 enrichments/month.
- Apollo: 1 credit per person enrichment. Basic plan ($49/mo) includes 900 credits/month.
- Credit math: If you add ~50 contacts/week, that's ~200/month × 3 Make credits = 600 Make credits. Fits comfortably on the Free plan.
Next steps
- Add a Router — branch the flow to handle business vs. personal emails differently (enrich business emails, skip personal ones)
- Batch processing — use a Scheduler module to run enrichment in batches during off-peak hours
- Enrichment tracking — add a second HubSpot Update module to stamp
enrichment_dateandenrichment_sourceon each processed contact
Need help implementing this?
We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.