Find and verify emails for HubSpot prospects using Apollo and Hunter in Make
Prerequisites
- Make account (Free or Core plan)
- HubSpot connection configured in Make via OAuth
- Apollo API key with email finder credits
- Hunter.io API key with verification credits
Overview
Make handles this workflow well because it iterates over search results automatically and supports conditional routing for the verification logic. The scenario: search HubSpot for contacts without emails → find emails via Apollo → conditionally verify with Hunter → write back to HubSpot.
Step 1: Create the scenario and schedule
Create a new scenario. Set the schedule:
- Schedule type: At regular intervals
- Run scenario: Every day
- Time: 06:00
- Timezone: Your team's timezone
Step 2: Search HubSpot for contacts without emails
Add an HTTP module (Make an API Call):
- URL:
https://api.hubapi.com/crm/v3/objects/contacts/search - Method: POST
- Headers: Authorization handled by HubSpot connection
- Body (JSON):
{
"filterGroups": [{
"filters": [
{"propertyName": "email", "operator": "NOT_HAS_PROPERTY"},
{"propertyName": "firstname", "operator": "HAS_PROPERTY"},
{"propertyName": "company", "operator": "HAS_PROPERTY"}
]
}],
"properties": ["firstname", "lastname", "company", "domain"],
"limit": 100
}Step 3: Iterate over contacts
Add an Iterator module:
- Array: Map
{{1.results}}from the search response
This emits one bundle per contact, allowing the downstream modules to process each contact individually.
Each bundle emitted by the Iterator counts as 1 Make credit through all downstream modules. For 50 contacts, this means ~50 credits per downstream module. Plan accordingly.
Step 4: Call Apollo to find the email
Add an HTTP module:
- URL:
https://api.apollo.io/api/v1/people/match - Method: POST
- Headers:
x-api-key: YOUR_APOLLO_KEY,Content-Type: application/json - Body:
{
"first_name": "{{2.properties.firstname}}",
"last_name": "{{2.properties.lastname}}",
"organization_name": "{{2.properties.company}}"
}Add a Filter on the connection after the Apollo module:
- Condition:
person.emailexists
Step 5: Route based on email confidence
Add a Router module with two routes:
Route 1 — Apollo already verified (skip Hunter):
- Filter condition:
person.email_statusequalsverified - This route goes directly to the HubSpot update step
Route 2 — Needs Hunter verification:
- Filter condition:
person.email_statusdoes not equalverified
On Route 2, add an HTTP module for Hunter:
- URL:
https://api.hunter.io/v2/email-verifier - Method: GET
- Query string:
email:{{3.person.email}}api_key: Your Hunter API key
Add a Filter after Hunter:
- Condition:
data.resultequalsdeliverable
Hunter's risky result means the email might bounce — the mailbox exists but there are signals it could be a catch-all or temporary address. For outbound sequences, treat risky as unverified. For CRM storage, you might still want to save it with a flag.
Step 6: Update HubSpot with the verified email
Both routes converge on an HTTP module:
- Method: PATCH
- URL:
https://api.hubapi.com/crm/v3/objects/contacts/{{2.id}} - Headers: Authorization via HubSpot connection
- Body:
{
"properties": {
"email": "{{3.person.email}}",
"email_verification_status": "verified",
"email_source": "{{ifempty(5.data.result; 'apollo-verified'); 'apollo+hunter'}}"
}
}For contacts where Hunter returned risky or undeliverable, add a separate route that updates only the flag without writing the email.
Step 7: Add error handling and activate
- Add Resume error handlers on the Apollo and Hunter HTTP modules (handles
429rate limit responses) - Add a Sleep module (1 second) after the Apollo call to respect rate limits within the Iterator loop
- Click Run once to test with a few contacts
- Verify HubSpot contacts have updated emails
- Toggle the scenario to Active
Cost and credits
- Make Free plan: 1,000 credits/month. Each contact uses ~4-6 credits. Handles ~166-250 contacts/month.
- Make Core plan: $29/mo for 10,000 credits. Handles ~1,600-2,500 contacts/month.
- Apollo: 1 credit per lookup ($49/mo Basic = 900 credits)
- Hunter: 1 credit per verification ($49/mo Starter = 1,000 verifications). Apollo-verified emails skip Hunter entirely.
- Typical split: If 40% of Apollo results are pre-verified, you save 40% on Hunter credits.
Next steps
- Add a Slack notification — append a Slack module at the end to summarize: "Found 12 emails, verified 10, 2 risky"
- Handle no-match contacts — route contacts where Apollo returned no email to a separate HubSpot list for manual research
- Add a domain lookup step — if contacts lack a domain, add a Hunter Domain Search step before Apollo to find the company domain first
Need help implementing this?
We build and optimize automation systems for mid-market businesses. Let's discuss the right approach for your team.