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

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

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_date and enrichment_source on 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.