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:
- 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).
- Create a Voice Agent and save its
- 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
- New Zap → Trigger app: Facebook Lead Ads.
- Event: New Lead.
- Connect your Facebook account.
- Select the Page + Form you want to listen to.
- 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
- Action app: Webhooks by Zapier.
- Event: Custom Request.
- Configure:
- Method:
POST - URL:
https://api.volumereach.com/api/v1/public/calls - Data Pass-Through:
false - Data: paste JSON:
Replace the{ "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" }<insert ...>placeholders by clicking the "+" button and selecting the field from Step 1. - Headers (add two):
Authorization:Bearer vr_live_...Content-Type:application/json
- Method:
- Test — Zapier POSTs to Volume Reach. Expected response:
201withcall.id. - 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
- New Zap → Trigger app: Webhooks by Zapier.
- Event: Catch Raw Hook (not "Catch Hook" — we need raw bytes for signature verification).
- 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-Signatureheader using Zapier's Code step (JavaScript). See webhooks.md#verifying-signatures for the algorithm.
Step 4 — Filter: only act if extraction.wantsAppointment is true
- Add action: Filter by Zapier.
- Condition:
data > extraction > wantsAppointment(Text) exactly matchestrue. - Condition (AND):
data > extraction > appointmentDateTimeISO(Text) exists.
Step 5 — Action: Google Calendar → Create Detailed Event
- App: Google Calendar.
- Event: Create Detailed Event.
- Connect your Google account.
- 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
- App: HubSpot.
- Event: Update Contact.
- Search: by email (
data.extraction.contactEmail). - Map:
Lifecycle Stage→Sales Qualified Lead.Last Volume Reach Call Outcome(custom property) →data.outcome.Last Volume Reach Call Summary(custom long-text property) →data.extraction.summary.Appointment Scheduled→data.extraction.appointmentDateTimeISO.
Step 7 — Action (optional): Slack → Send Channel Message
Notify the sales team in real time.
- App: Slack.
- Event: Send Channel Message.
- Channel:
#sales-leads. - 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
- Submit a test Facebook lead (use your own phone number).
- Within 10 seconds, your phone should ring.
- 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".
- Hang up.
- 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_limitedor429 concurrent_limit_exceeded(which can happen during a traffic burst), Zapier retries — no action needed. - Idempotency: always include an
idempotencyKeyderived from the Facebook lead ID. Otherwise a Zapier retry will dial the same lead twice. - Time zones: the agent's
appointmentDateTimeISOis 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.