Auto-enrich new HubSpot contacts with Apollo using Make

medium complexityCost: $10-29/mo

Prerequisites

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

Why Make?

Make offers the lowest per-contact enrichment cost among no-code platforms. The Free plan includes 1,000 credits/month — enough for ~333 enrichments — and the Core plan ($29/mo) handles over 3,000. Make's Router and Filter modules also make it easy to add conditional logic, like skipping personal email domains or routing different lead sources through different enrichment paths.

The trade-off is Make's array indexing (1-based, not 0-based) and its credit multiplication with Iterator modules. Each downstream module execution counts as a separate credit, so complex workflows consume credits faster than you might expect. For simple enrich-and-update flows, Make is very cost-effective.

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.

Polling frequency

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 key
    • Content-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: person from the HTTP response → Exists

This prevents downstream modules from executing when Apollo has no data for a contact.

Error handling for 404s

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 array indexing

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

  1. Right-click the HubSpot Update module → Add error handlerResume (retries after a delay)
  2. On the Apollo HTTP module → Add a Break error handler (saves failed contacts for manual retry)
  3. Click Run once to test with a real contact
  4. Verify the contact's fields updated in HubSpot
  5. Set the scenario schedule (e.g., every 15 minutes) and toggle to Active

Troubleshooting

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.

Common questions

How many Make credits does each enrichment use?

A simple enrich-and-update flow uses ~3 credits per contact: 1 for the Watch Contacts trigger, 1 for the Apollo HTTP call, and 1 for the HubSpot update. With the Free plan's 1,000 credits, you can enrich ~333 contacts/month.

What happens when Apollo returns null for a contact?

The Filter module (Step 3) catches null responses and stops processing for that contact. No downstream modules execute, saving credits. The contact simply isn't updated in HubSpot.

Can I use Make's free plan for this workflow?

Yes, with limitations. The Free plan polls every 15 minutes (vs. 1 minute on Core), and the Code module requires Core ($29/mo). Without the Code module, use ifempty() in Set Multiple Variables for conditional field mapping.

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_date and enrichment_source on each processed contact

Looking to scale your AI operations?

We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.