Volume Reach/Docs

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

  1. Settings → API Keys → Create.
  2. Name it: HubSpot Free Production.
  3. Check scopes: leads:inbound, calls:read, webhooks.
  4. 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

  1. Agents → Voice → Edit your default agent (or create a new one).
  2. 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.
    
  3. 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

  1. Automation → Webhooks → Add Endpoint.
  2. URL: paste your Zapier inbound webhook URL (you'll create this in Part 3; come back to fill it in).
  3. Method: POST.
  4. Save the signing secret HubSpot/Zapier will use to verify deliveries.
  5. 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

  1. Log into Zapier (zapier.com). Free account is fine.
  2. Create Zap.
  3. Trigger app: HubSpot. Trigger event: New Form Submission.
  4. Connect your HubSpot account. Pick the form you want to wire up (e.g. "Sell My House Fast" landing page form).
  5. Test trigger — confirm Zapier pulls back recent submissions.

Step 2 — Add the Volume Reach POST action

  1. Action app: Webhooks by Zapier. Action event: POST.
  2. 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
      
  3. Test action — confirm you get a 200 { "outcome": "accepted" } response (or 200 { "outcome": "duplicate" } if you re-test the same submission).
  4. 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 nameLabelType
vr_call_outcomeVolume Reach Call OutcomeSingle-line text
vr_qualifiedQualified by AISingle checkbox
vr_transcript_urlVR Transcript URLSingle-line text (or URL)
vr_last_call_atVR Last Call AtDate 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

  1. Create Zap.
  2. Trigger app: Webhooks by Zapier. Trigger event: Catch Hook.
  3. 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.
  4. Save and continue to the next step.

Step 3 — Add the HubSpot "Update Contact" action

  1. Action app: HubSpot. Action event: Update Contact.
  2. Connect HubSpot (reuses the connection from Part 2).
  3. Find contact by: Email (use {{data.lead.email}} from the catch-hook trigger). If your form doesn't capture email, switch to Phone.
  4. 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}}
  5. Test — Volume Reach has a "Send sample payload" button under Automation → Webhooks → (your endpoint) → Preview payloads. Trigger one and confirm Zapier receives it.
  6. Publish.

End-to-end test (5 min)

  1. In HubSpot, submit your form with a test phone number you own.
  2. Within 5 seconds, the outbound Zap fires → Volume Reach receives the lead → AI calls your test number.
  3. Answer the call, have a quick conversation, hang up.
  4. Within 1–3 minutes, the call.completed webhook fires → Zapier inbound Zap runs → HubSpot contact gets the four vr_* properties updated.
  5. 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) or 400 (missing required field, usually phone).
  • 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.email matches 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 format errors, 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 (vs Create Contact) is the safe choice. Filter data.delivery_id in 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/inbound with the API key in the Authorization header. Zero middleware. See raw-http.md.
  • Voice agent extraction schema: define structured fields (motivation, timeline, price range) on the agent so the call.completed payload includes them in data.call.extraction — and write those back to HubSpot custom properties for sales-team handoff.