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.

Deterministic Code
HubSpotVapiGoogle SheetsSlackSalesOperationsLead EnrichmentNotifications & AlertsData Sync
PromptCreate

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.

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.

FAQs

How fast will the call actually go out?
The workflow runs the moment HubSpot fires the new-contact webhook, so in practice the Vapi call is dispatched within a few seconds of the form submission.
What happens if the lead has no phone number?
The workflow checks for a phone number first and quietly skips the record, so you do not waste dials or clutter the audit log.
Can I use my existing Vapi qualification assistant?
Yes. You point the workflow at any assistant id you already have in Vapi, and the workflow passes the lead's first name, source, and campaign in as assistant variables so the opener is personalized.
Does this work with paid ad funnels and landing page forms?
Yes. Any HubSpot form submission or paid-ad lead that creates a new contact will fire the workflow, including custom source or campaign fields.
Where do I see what happened after the call?
The Google Sheet gets a new row per attempt with the Vapi call id, and Slack gets a confirmation with a link to the HubSpot contact so anyone on the team can jump in.

Related templates

Call overdue Xero customers with an AI collections agent

Every weekday at 10am, an AI voice agent phones your most overdue Xero accounts, logs what each customer promised, and reports back to finance in Slack.

LiveKit
Xero
Deepgram
+2
Agentic Task
Local listing health board for every location you manage

See every Google Maps listing you manage on one screen, ranked worst first, with an audit button that writes the fix list for you.

Local Business Data
Google Sheets
App
Win back LiveChat visitors whose chats went unanswered

Every couple of hours we find the chats your team never answered, email those visitors a real reply, and hand the sensitive ones to a support lead.

LiveChat
Gmail
Slack
Agentic Task
Let support send one-off Loops emails without an engineer

Your team picks a template, finds the customer, checks they are safe to email, then sends it, with every send logged where the whole team can see it.

Loops.so
Stripe
Google Sheets
App
Turn Mailjet email clicks into ranked HubSpot follow-ups

Twice a day we spot the people clicking your pricing and demo pages, create a follow-up task for their owner, and post a ranked recap to Slack.

Mailjet
HubSpot
Slack Bot
Agentic Task
Stop cold emails to anyone with a live deal in Pipedrive

Every night at 2am, pull the contacts on your open and won deals and block them from your cold outreach before the next send goes out.

Mailshake
Pipedrive
Google Sheets
Deterministic Code

Stop letting inbound leads go cold.

Connect HubSpot, Vapi, Google Sheets, and Slack once, and every new lead gets a personalized call within seconds.