Instant Vapi call for every new HubSpot lead
Kick off a personalized Vapi qualification call the moment an inbound lead lands in HubSpot, with a Google Sheets audit log and a Slack heads-up.
Build me a deterministic code workflow that runs every time a new contact is created in HubSpot and instantly kicks off a personalized Vapi qualification call, then logs it. This is the classic speed to lead pattern for inbound form and paid ad funnels.
Trigger: HubSpot webhook, contact.creation (a new contact was created). The webhook payload will include the contact id and the contact properties for phone, firstname, lastname, email, and any custom lead source or campaign fields (for example hs_analytics_source, hs_latest_source, utm_campaign, lead_source).
Step 1: Read the contact payload. Extract contactId, phone, firstName, lastName, email, source, and campaign. If phone is missing or empty, exit early with a clear log line like "skipped: no phone". If the contact already has a lifecycle stage or lead status equal to disqualified (for example lifecyclestage = other or a custom hs_lead_status = DISQUALIFIED), also exit early with "skipped: disqualified". Do not proceed further in either case.
Step 2: Call Vapi Create Call. Use my qualification assistantId (expose it as a workflow input so I can swap assistants per campaign). Set the customer to the contact's phone number in E.164 format. Use my Vapi phoneNumberId (also a workflow input) as the outbound caller. Pass assistantOverrides.variableValues with firstName, source, and campaign so the assistant's opener can personalize ("Hi {{firstName}}, I saw you came in from {{source}}..."). Capture the returned Vapi call id.
Step 3: Google Sheets Append Values. Append one row to the tracking sheet (spreadsheetId and sheet name are workflow inputs). Columns in order: timestamp (ISO 8601, UTC), hubspot_contact_id, phone, first_name, email, source, campaign, vapi_assistant_id, vapi_call_id.
Step 4: Slack Send a Message. Post to a channel id that is a workflow input. Message body should read something like: "📞 Dispatched Vapi call to {firstName} {lastName} ({phone}) from source {source}. Vapi call id: {vapiCallId}. HubSpot contact: https://app.hubspot.com/contacts/<portalId>/contact/{contactId}". Take portalId as a workflow input so the link resolves for my portal.
Rules: fully deterministic, no LLM reasoning nodes, no branching beyond the two early exits (missing phone, disqualified). Every step should log its inputs and outputs so I can debug from the run history. If Vapi Create Call fails, still write a row to the sheet with vapi_call_id = ERROR and the error message in a notes column, and post a red-flag Slack message so I know a dispatch failed.
Workflow inputs I want exposed: vapi_assistant_id, vapi_phone_number_id, sheets_spreadsheet_id, sheets_sheet_name, slack_channel_id, hubspot_portal_id. Everything else comes from the webhook payload.
Additional information
What does this prompt do?
- Fires the second a new contact is created in HubSpot, so your speed to lead is measured in seconds instead of hours.
- Kicks off a Vapi voice call to the lead using your qualification assistant, personalized with their first name, lead source, and campaign so the opener feels human.
- Appends every attempt to a Google Sheet with timestamp, contact id, phone, source, assistant, and Vapi call id for a clean audit trail.
- Posts a confirmation in Slack with a link back to the HubSpot contact so your team knows a call was dispatched.
- Skips leads with no phone number or a disqualified status, so you do not burn dials on bad records.
What do I need to use this?
- A HubSpot account with permission to send webhooks when a new contact is created.
- A Vapi account with a qualification assistant already configured and a caller phone number.
- A Google Sheets file you want to use as the call log.
- A Slack workspace and the channel you want dispatch alerts posted to.
How can I customize it?
- Swap the Vapi assistant for a different persona per campaign, or pass extra assistant variables like product interest or plan tier.
- Change the skip rules, for example ignore leads outside business hours, from certain countries, or without a work email.
- Repoint the audit log at a different sheet or tab, and add columns like utm_medium or lead score.
- Change the Slack channel or format the message with the lead owner tagged in.
Frequently asked questions
How fast will the call actually go out?
What happens if the lead has no phone number?
Can I use my existing Vapi qualification assistant?
Does this work with paid ad funnels and landing page forms?
Where do I see what happened after the call?
Related templates
Stop letting inbound leads go cold.
Connect HubSpot, Vapi, Google Sheets, and Slack once, and every new lead gets a personalized call within seconds.