Volume Reach/Docs

End-to-end no-code workflow: a new Facebook Lead Ads submission triggers a Volume Reach qualification call, and if the lead books an appointment, Zapier creates the Google Calendar event automatically.

Time to build: 15 minutes. Tools required: Zapier (Starter plan or above — Webhooks by Zapier is a Starter feature).


Overview

Facebook Lead Ads  →  Zap A: trigger Volume Reach call
                          │
                          ▼
                      Volume Reach dials + qualifies
                          │
                          ▼
                      call.completed webhook  →  Zap B: book Google Calendar + update HubSpot

Two Zaps. Zap A fires on new leads; Zap B fires on completed calls. They're independent because Volume Reach runs asynchronously (2–5 min per call).


One-time setup

Before building Zaps:

  1. In Volume Reach:
    • Create a Voice Agent and save its agentId.
    • Create an API key with scopes calls:place, webhooks, write.
    • Configure extraction schema for the agent (see below).
  2. In Zapier:
    • Sign in (or create an account).
    • Keep the API key + webhook signing secret handy.

Configure the extraction schema

Run once (e.g. from your terminal or Postman):

curl -X POST https://api.volumereach.com/api/v1/public/agents/va_abc/extraction-schema \
  -H "Authorization: Bearer vr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "schema": {
      "type": "object",
      "properties": {
        "interested": { "type": "boolean" },
        "wantsAppointment": { "type": "boolean" },
        "appointmentDateTimeISO": { "type": ["string", "null"], "format": "date-time" },
        "appointmentDurationMinutes": { "type": ["integer", "null"] },
        "contactEmail": { "type": ["string", "null"] },
        "summary": { "type": "string", "description": "One-sentence summary for the sales rep." }
      },
      "required": ["interested", "wantsAppointment"]
    }
  }'

Zap A: Facebook Lead → Volume Reach call

Step 1 — Trigger: New Lead in Facebook Lead Ads

  1. New Zap → Trigger app: Facebook Lead Ads.
  2. Event: New Lead.
  3. Connect your Facebook account.
  4. Select the Page + Form you want to listen to.
  5. Test — Zapier pulls a recent test lead. You'll need full_name, email, phone_number, and whatever custom fields your form captures.

Step 2 — Action: Webhooks by Zapier → Custom Request

  1. Action app: Webhooks by Zapier.
  2. Event: Custom Request.
  3. Configure:
    • Method: POST
    • URL: https://api.volumereach.com/api/v1/public/calls
    • Data Pass-Through: false
    • Data: paste JSON:
      {
        "agentId": "va_abc",
        "phoneNumber": "<insert phone_number field from Step 1>",
        "variables": {
          "leadName": "<insert full_name>",
          "leadEmail": "<insert email>",
          "leadSource": "facebook-lead-form-<your form name>"
        },
        "metadata": {
          "zapier_run_id": "<Zapier run ID token>",
          "facebook_lead_id": "<lead id>"
        },
        "idempotencyKey": "fb-lead-<insert lead id>",
        "knownConsent": true,
        "consentRecordId": "facebook-lead-form-checkbox"
      }
      
      Replace the <insert ...> placeholders by clicking the "+" button and selecting the field from Step 1.
    • Headers (add two):
      • Authorization: Bearer vr_live_...
      • Content-Type: application/json
  4. Test — Zapier POSTs to Volume Reach. Expected response: 201 with call.id.
  5. Turn on the Zap.

That's Zap A. New leads will trigger calls within ~10 seconds.


Zap B: Volume Reach webhook → Google Calendar + HubSpot

Step 1 — Trigger: Webhooks by Zapier → Catch Raw Hook

  1. New Zap → Trigger app: Webhooks by Zapier.
  2. Event: Catch Raw Hook (not "Catch Hook" — we need raw bytes for signature verification).
  3. Zapier displays a unique URL like https://hooks.zapier.com/hooks/catch/<team>/<hook>/. Copy it.

Step 2 — Register with Volume Reach

Run once (terminal):

# Create the webhook endpoint
curl -X POST https://api.volumereach.com/api/v1/public/webhooks \
  -H "Authorization: Bearer vr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Zapier — call.completed",
    "url": "https://hooks.zapier.com/hooks/catch/XXX/YYY/"
  }'
# Save the returned "signingSecret" — shown ONCE.

# Subscribe to call.completed for interested leads only
curl -X POST https://api.volumereach.com/api/v1/public/automation-triggers \
  -H "Authorization: Bearer vr_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Interested lead completions",
    "eventType": "call.completed",
    "webhookEndpointId": "whe_abc",
    "conditions": { "outcome": ["INTERESTED", "APPOINTMENT"] }
  }'

Step 3 — Back in Zapier — Test the trigger

Trigger a test call via Zap A (or with a manual curl POST /calls) so Volume Reach fires a test webhook at Zapier. Zapier should show the full payload under "Test trigger".

Security note: for small-volume Zapier workflows, many users skip signature verification because Zapier's catch-hook URL is secret enough on its own. For production workflows, add a Filter step that verifies the X-Webhook-Signature header using Zapier's Code step (JavaScript). See webhooks.md#verifying-signatures for the algorithm.

Step 4 — Filter: only act if extraction.wantsAppointment is true

  1. Add action: Filter by Zapier.
  2. Condition: data > extraction > wantsAppointment (Text) exactly matches true.
  3. Condition (AND): data > extraction > appointmentDateTimeISO (Text) exists.

Step 5 — Action: Google Calendar → Create Detailed Event

  1. App: Google Calendar.
  2. Event: Create Detailed Event.
  3. Connect your Google account.
  4. Configure:
    • Calendar: select your sales calendar.
    • Summary: Site visit: <insert data.contact.name>.
    • Start Date & Time: <insert data.extraction.appointmentDateTimeISO>.
    • End Date & Time: Use Zapier's Formatter → Date/Time → add appointmentDurationMinutes (default 60 if null) to start.
    • Attendees: <insert data.extraction.contactEmail>.
    • Description:
      Outcome: <data.outcome>
      Summary: <data.extraction.summary>
      Transcript:
      <data.transcript>
      
      Recording: fetch via GET /calls/<data.call_id>
      

Step 6 — Action: HubSpot → Update Contact

  1. App: HubSpot.
  2. Event: Update Contact.
  3. Search: by email (data.extraction.contactEmail).
  4. Map:
    • Lifecycle StageSales Qualified Lead.
    • Last Volume Reach Call Outcome (custom property) → data.outcome.
    • Last Volume Reach Call Summary (custom long-text property) → data.extraction.summary.
    • Appointment Scheduleddata.extraction.appointmentDateTimeISO.

Step 7 — Action (optional): Slack → Send Channel Message

Notify the sales team in real time.

  1. App: Slack.
  2. Event: Send Channel Message.
  3. Channel: #sales-leads.
  4. Message:
    🔥 New qualified lead from Volume Reach
    Name: <data.contact.name>
    Phone: <data.contact.phone>
    Email: <data.extraction.contactEmail>
    Appointment: <data.extraction.appointmentDateTimeISO>
    Summary: <data.extraction.summary>
    

Step 8 — Turn on Zap B


Verifying it works end-to-end

  1. Submit a test Facebook lead (use your own phone number).
  2. Within 10 seconds, your phone should ring.
  3. Have a short conversation with the AI agent — "yes I'm interested, can we schedule a visit next Tuesday at 2 PM, email is test@example.com".
  4. Hang up.
  5. Within 30 seconds, check:
    • Google Calendar — should have a new event on Tuesday at 2 PM.
    • HubSpot — contact should be updated.
    • Slack — should show the notification.

If any step didn't fire, open Settings → Automations in the Volume Reach app and inspect the webhook delivery log.


Handling non-interested calls

The filter in Step 4 ensures Zap B only books appointments when the lead wanted one. You may want a second Zap (or additional branches) for other outcomes:

  • NOT_INTERESTED → add to HubSpot "Cold" list, remove from active campaigns.
  • CALLBACK → create a task in HubSpot for a sales rep to call back at the stated time.
  • WRONG_NUMBER / NOT_OWNER → flag in HubSpot as bad data; possibly re-enrich.
  • DNC → add to your suppression list immediately.

Duplicate Zap B with different outcome filters for each case.


Common Zapier gotchas

  • Zapier Tasks usage: Each step counts as a task. A typical workflow here uses 4–5 tasks per call. On a lower Zapier tier, plan around your call volume.
  • Rate limiting: Zapier retries failed actions with backoff. If Volume Reach returns 429 rate_limited or 429 concurrent_limit_exceeded (which can happen during a traffic burst), Zapier retries — no action needed.
  • Idempotency: always include an idempotencyKey derived from the Facebook lead ID. Otherwise a Zapier retry will dial the same lead twice.
  • Time zones: the agent's appointmentDateTimeISO is UTC. If your Google Calendar is in a different timezone, the event will still appear correctly — Google Calendar handles the conversion. Double-check if the user misses their appointment.
  • Secret rotation: if you rotate your Volume Reach API key, update the Authorization header in Zap A → Webhook step.