Auto-call hot HubSpot leads with a LiveKit voice agent

The moment a HubSpot contact turns into a sales qualified lead, dial them with your LiveKit voice agent and log the recap to HubSpot and Slack.

Agentic Task
HubSpotLiveKitSlack BotSalesLead EnrichmentNotifications & Alerts
PromptCreate

Build me an agent workflow that fires from an incoming HubSpot webhook whenever a contact's lifecycle stage flips to sales qualified lead (treat the stage value sales_qualified_lead, or the equivalent hot-lead property change we configure, as the trigger signal). On every trigger, immediately place an AI voice callback via LiveKit so the prospect gets a human-quality outreach within a minute or two of raising their hand.

Trigger: HubSpot webhook. The payload will identify a contact id (and may include the property change). HubSpot is on the accepted webhook-source list.

Step 1. Look the contact up in HubSpot using Get Contact by id, requesting at minimum firstname, lastname, phone, company, lifecyclestage, hs_lead_status, and the most recent form submission fields we can pull. Keep that record in scope for the rest of the run.

Step 2. Guardrails before dialing. (a) If the contact has no phone number, do not call. Instead, send a Slack message to the sales channel that says "No phone on record for {name} at {company}, contact link attached" with a link back to the HubSpot record, and stop. (b) Compare the current time against a configurable calling hours window, defaulting to 9am to 6pm local to the contact's timezone (fall back to the workflow owner's timezone if the contact's is unknown). If we are outside the window, do not call. Instead post a Slack message that the lead came in outside calling hours and stop; do not queue for later unless the user asks for that behavior.

Step 3. In LiveKit, spin up the call. First, Create Room with a unique room name (something like sql-callback-{hubspotContactId}-{timestamp}) and metadata that carries the HubSpot contact id, the contact's name, and the lead source so our voice agent worker can read context off the room. Then Create Agent Dispatch against that room to attach our named LiveKit voice agent worker (the agent name is a configurable input). Then Create SIP Participant on our configured outbound trunk to dial the contact's phone number and drop them into that same room; use a participant identity derived from the HubSpot contact id and pass through the contact's display name.

Security nuance to bake into the LiveKit token minting: grants must include roomAdmin for the room-service calls and sip.admin for the SIP dispatch call, tokens must be short-lived (10 minute exp is fine), and we should mint a fresh token per operation rather than reusing a long-lived one. Do not put the API secret anywhere except the signing step.

Step 4. After the call ends, produce a short call summary. Pull the transcript LiveKit produced for the room (via the voice agent worker or whatever LiveKit surface we agreed on), then have the agent draft a 3 to 6 sentence recap covering: who answered, whether they qualified as a real opportunity, next step requested, and any objections. Keep it factual, do not embellish.

Step 5. Fan out the outcome. Call HubSpot Create Note with the recap text and associate it with the contact id from step 1 so it lands on the contact timeline. Then send a Slack message via the sales channel with: contact name and company, whether the call connected, the one-line outcome, and a link back to the HubSpot contact record. If the transcript is empty or the call did not connect, still write the note and Slack message, marked as "no answer" or "voicemail" so the team knows to try again.

Inputs the workflow should expose so I can tweak later: the sales Slack channel, the LiveKit agent name to dispatch, the LiveKit outbound trunk id, the calling hours window and timezone strategy, and the HubSpot lifecycle stage value(s) that count as a hot lead.

Verified operations to use: HubSpot Get Contact, HubSpot Create Note, LiveKit Create Room, LiveKit Create Agent Dispatch, LiveKit Create SIP Participant, Slack Bot Send a Message.

Additional information

What does this prompt do?
  • Watches HubSpot for lifecycle stage changes and fires the instant a contact flips to sales qualified.
  • Dials the prospect with your LiveKit voice agent within seconds so a real conversation starts while they are still on your site.
  • Writes a call recap back to the contact record in HubSpot and posts the outcome to your sales Slack channel.
  • Skips the call and alerts the team when the contact has no phone on file or when the moment falls outside your calling hours.
What do I need to use this?
  • A HubSpot account with the ability to send webhooks when a contact lifecycle stage changes.
  • A LiveKit project with a configured outbound calling trunk and a named voice agent you want to answer the call.
  • A Slack workspace and the channel where your sales team wants call outcomes to land.
  • A calling hours window and time zone rule you are comfortable using as the default guardrail.
How can I customize it?
  • Adjust which lifecycle stage or property change kicks off the call so it matches how your team defines a hot lead.
  • Change the calling hours window, or switch to the contact's local time zone rather than your team's.
  • Swap the Slack channel or format of the recap message, or route different outcomes to different channels.

Frequently asked questions

Do I have to use LiveKit for the voice call?
This prompt is written around LiveKit because it plays nicely with a named voice agent and your own outbound telephony trunk. If you use a different voice provider, start from a version of this prompt built for that tool instead.
What happens if the lead does not have a phone number?
The workflow skips the call entirely and posts a short heads-up in your sales Slack channel so a rep can decide whether to chase the contact another way.
Can I stop it from calling people at 2am?
Yes. You set a calling hours window, and anything triggered outside that window is held or dropped with a Slack note so nobody gets a middle of the night phone call from your business.
Will the call show up on the contact's HubSpot timeline?
After the call wraps, a short recap of the conversation is written as a note on the contact record in HubSpot, so the next rep to open the profile sees the context immediately.
How fast does the call actually happen?
As soon as HubSpot lets us know the contact is sales qualified, we look up their phone number and start the outbound call. In practice it is measured in seconds, not minutes.

Call your hottest leads while they are still on the page.

Connect HubSpot, LiveKit, and Slack once, and Geni will place the callback and log the outcome for you every time a lead raises their hand.