HubSpot Free Integration
Trigger Volume Reach qualification calls from a HubSpot Free account. HubSpot Free gives you contacts + forms + email for $0/month forever; pair it with a single free Zap and you have a working speed-to-lead funnel without a paid CRM.
Time to build: ~25 minutes. HubSpot plan requirement: Free or higher (this guide targets Free; Starter+ users can also use hubspot.md for the simpler Workflows-based path). Zapier plan requirement: Free tier (100 tasks/month — enough for ~3 leads/day).
When to use which HubSpot guide:
- You have HubSpot Free (no Operations Hub, no Workflows) → keep reading.
- You have Marketing Hub Starter or higher with Workflows access → use hubspot.md for the native webhook-action path. Skip the Zapier bridge.
The flow
HubSpot Form Submission → Zapier "New Form Submission in HubSpot" trigger
│
▼
Zapier "Webhooks by Zapier — POST" action
│
▼
POST /api/v1/leads/inbound (Volume Reach)
│
▼
Volume Reach dials within 5s + qualifies
│
▼
call.completed webhook → HubSpot Inbound Webhook (Zapier)
│
▼
Update contact custom properties
(call outcome, transcript URL, qualified)
Two Zaps total: outbound (fires the call) + inbound (writes the result back). They're decoupled because Volume Reach is asynchronous — dial → conversation → transcription → extraction takes 1–3 minutes.
Part 1: One-time setup in Volume Reach (5 min)
Step 1 — Create an API key
- Settings → API Keys → Create.
- Name it:
HubSpot Free Production. - Check scopes:
leads:inbound,calls:read,webhooks. - Create. Copy the
vr_live_...key immediately — shown only once. Paste it into a password manager.
Also save the Signing secret from the same screen. Zapier will need it to sign the outbound request.
Step 2 — Configure your Voice Agent
- Agents → Voice → Edit your default agent (or create a new one).
- Set a Lead-Arrived system prompt — keep it short, qualify-first:
You are calling {{owner_name}} who just submitted a form at {{lead_source}}. Confirm interest, ask one qualifying question, then offer to book a callback. Keep it under 90 seconds. - Save the agent. Note its ID if you want to override the default at the trigger level (Settings → Triggers → Lead Arrived).
Step 3 — Create a webhook endpoint for outcomes
- Automation → Webhooks → Add Endpoint.
- URL: paste your Zapier inbound webhook URL (you'll create this in Part 3; come back to fill it in).
- Method: POST.
- Save the signing secret HubSpot/Zapier will use to verify deliveries.
- Subscribe to triggers:
call.completed.
Part 2: Outbound Zap — HubSpot Form → Volume Reach (10 min)
This Zap fires every time a HubSpot form is submitted. It sends the contact's phone + name to POST /api/v1/leads/inbound.
Step 1 — Create a new Zap in Zapier
- Log into Zapier (zapier.com). Free account is fine.
- Create Zap.
- Trigger app: HubSpot. Trigger event: New Form Submission.
- Connect your HubSpot account. Pick the form you want to wire up (e.g. "Sell My House Fast" landing page form).
- Test trigger — confirm Zapier pulls back recent submissions.
Step 2 — Add the Volume Reach POST action
- Action app: Webhooks by Zapier. Action event: POST.
- Configure:
- URL:
https://api.volumereach.com/api/v1/leads/inbound - Payload Type: JSON
- Data (map HubSpot form fields → Volume Reach lead fields):
phone: {{1.Phone Number}} email: {{1.Email}} first_name: {{1.First Name}} last_name: {{1.Last Name}} source: hubspot_form source_platform: HubSpot Free external_lead_id: {{1.Contact ID}} api_version: 2026-05 - Headers:
Authorization: Bearer vr_live_...your_api_key Content-Type: application/json
- URL:
- Test action — confirm you get a
200 { "outcome": "accepted" }response (or200 { "outcome": "duplicate" }if you re-test the same submission). - Publish Zap.
Signing the request (optional but recommended): Volume Reach accepts requests with just the API key, but adding an HMAC signature catches replay attacks. To sign with Zapier, add a "Code by Zapier" step before the POST to compute
X-VR-Signature: t={unix_ts},v1={hmac_sha256(body, signing_secret)}. Free Zapier accounts allow Code steps; details in the signature reference. Skip for v1 if you're new to webhooks — the API-key-only flow works.
Part 3: Inbound Zap — Volume Reach result → HubSpot contact (10 min)
This Zap receives the call.completed webhook from Volume Reach and writes the outcome back to the HubSpot contact (so the next sales-team touchpoint sees "AI qualified — wants callback" instead of pitching them from scratch).
Step 1 — Create the HubSpot custom properties
In HubSpot, add these custom contact properties (Settings → Properties → Create property under the Contact object):
| Internal name | Label | Type |
|---|---|---|
vr_call_outcome | Volume Reach Call Outcome | Single-line text |
vr_qualified | Qualified by AI | Single checkbox |
vr_transcript_url | VR Transcript URL | Single-line text (or URL) |
vr_last_call_at | VR Last Call At | Date and time picker |
Save all four. (These show up in the contact timeline; you can also build a "Qualified by AI" list view that filters on vr_qualified = true.)
Step 2 — Create the inbound Zap
- Create Zap.
- Trigger app: Webhooks by Zapier. Trigger event: Catch Hook.
- Copy the generated URL (looks like
https://hooks.zapier.com/hooks/catch/...). This is the URL you paste back into the Volume Reach webhook endpoint from Part 1, Step 3. - Save and continue to the next step.
Step 3 — Add the HubSpot "Update Contact" action
- Action app: HubSpot. Action event: Update Contact.
- Connect HubSpot (reuses the connection from Part 2).
- Find contact by: Email (use
{{data.lead.email}}from the catch-hook trigger). If your form doesn't capture email, switch to Phone. - Update fields:
vr_call_outcome:{{data.call.outcome}}vr_qualified:{{data.lead.qualified_at}}(Zapier converts non-empty → checked)vr_transcript_url:{{data.call.transcript_url}}vr_last_call_at:{{timestamp}}
- Test — Volume Reach has a "Send sample payload" button under Automation → Webhooks → (your endpoint) → Preview payloads. Trigger one and confirm Zapier receives it.
- Publish.
End-to-end test (5 min)
- In HubSpot, submit your form with a test phone number you own.
- Within 5 seconds, the outbound Zap fires → Volume Reach receives the lead → AI calls your test number.
- Answer the call, have a quick conversation, hang up.
- Within 1–3 minutes, the
call.completedwebhook fires → Zapier inbound Zap runs → HubSpot contact gets the fourvr_*properties updated. - Open the HubSpot contact — confirm all four fields populated.
If something fails:
- Lead never arrives at VR: check Zapier's Task History on the outbound Zap. Look for
401(wrong API key) or400(missing required field, usuallyphone). - AI never calls: check Automation → Lead Sources → Recent inbound activity in Volume Reach. Outcomes there:
accepted= good,duplicate= same external_lead_id as a previous test,rate_limited= too many tests in a short window. - HubSpot doesn't update: check Zapier's Task History on the inbound Zap. The catch-hook trigger shows the raw payload — verify
data.lead.emailmatches a HubSpot contact.
Payload reference
Outbound: what your Zap sends to /api/v1/leads/inbound
{
"phone": "+13105550100",
"email": "lead@example.com",
"first_name": "Jane",
"last_name": "Doe",
"source": "hubspot_form",
"source_platform": "HubSpot Free",
"external_lead_id": "12345",
"api_version": "2026-05",
"custom_fields": {
"form_name": "Sell My House Fast",
"page_url": "https://yoursite.com/sell"
}
}
custom_fields is optional — any key/value you want preserved on the lead record. These are NEVER exposed to the AI agent prompt unless you explicitly allowlist them in Settings (read-only display on /leads/[id]).
Inbound: what VR sends to your Zapier catch-hook on call.completed
{
"event": "call.completed",
"timestamp": "2026-05-10T17:42:13.000Z",
"delivery_id": "evt_01HXYZABC...",
"data": {
"call": {
"id": "call_01HXYZABC...",
"outcome": "INTERESTED",
"duration_seconds": 124,
"ai_billable_minutes": 3,
"recording_url": "https://recordings.volumereach.com/...",
"transcript_url": "https://app.volumereach.com/calls/call_01HXYZABC..."
},
"lead": {
"id": "lead_01HXYZABC...",
"email": "lead@example.com",
"phone": "+13105550100",
"qualified_at": "2026-05-10T17:43:50.000Z"
},
"contact": {
"phone": "+13105550100",
"name": "Jane Doe"
}
}
}
Full payload reference: Webhooks → Preview payloads in the Volume Reach dashboard.
Common pitfalls
- HubSpot Free has no Workflows. This guide uses Forms + Zapier as the trigger source. If you upgrade to Marketing Hub Starter or higher, switch to hubspot.md for the native Workflows-based path (faster, no Zapier dependency).
- Free Zapier tier = 100 tasks/month. Each lead submission = 2 tasks (outbound POST + inbound HubSpot update). Plan for ~50 leads/month on free. Above that, Zapier Starter is ~$20/mo.
- HubSpot form-trigger latency. Zapier polls HubSpot's free-tier forms every 15 minutes (paid plans poll every 1–2 minutes). If you need true real-time, install a HubSpot Workflow (paid plan) or use a direct landing page → /leads/inbound integration that POSTs directly without HubSpot in the middle.
- Phone format. Volume Reach normalizes to E.164 on receipt, but HubSpot stores phone in whatever format the form captured. If you see
400 invalid phone formaterrors, add a Zapier "Formatter → Phone Number" step before the POST action. - Duplicate webhook deliveries. Volume Reach retries failed webhook deliveries up to 3 times. Make your HubSpot update idempotent —
Update Contact(vsCreate Contact) is the safe choice. Filterdata.delivery_idin Zapier if you want strict deduplication.
What's next
- Move from Free → Starter (HubSpot) when you hit the ~50 leads/month Zapier free-tier ceiling. Starter gets you Workflows + native webhook actions, faster + 100% real-time.
- Direct webhook (skip Zapier entirely): if your tenant builds a custom landing page, point their form's submit handler directly at
/api/v1/leads/inboundwith the API key in theAuthorizationheader. Zero middleware. See raw-http.md. - Voice agent extraction schema: define structured fields (motivation, timeline, price range) on the agent so the
call.completedpayload includes them indata.call.extraction— and write those back to HubSpot custom properties for sales-team handoff.