Turn LiveKit call recordings into HubSpot notes and Slack recaps

Every 30 minutes, an agent transcribes finished LiveKit calls, files a clean summary and action items on the right HubSpot contact, and posts a recap to your sales channel.

Agentic Task
LiveKitDeepgramHubSpotSlackSalesOperationsMeeting WorkflowsNotifications & AlertsAI Reports
PromptCreate

Build an agent workflow that runs on a cron every 30 minutes and turns finished LiveKit call recordings into structured sales-call notes in HubSpot, so nobody has to relisten to their own calls.

On each run: call LiveKit List Egress to find egresses that reached status EGRESS_COMPLETE since the last sweep. For each completed egress, pull the recording file URL from the egress location output, the room name, and any stored room metadata (assume the metadata carries a HubSpot contact id and/or the caller's phone number, set at Create Room time).

For each new recording, download the audio and send it to Deepgram Transcribe Pre-recorded Audio with diarization turned on and smart formatting enabled. Then read the transcript and produce: (a) a two to three sentence summary of the call, (b) a bulleted list of action items with owners, (c) a sentiment and next-step signal (e.g. positive / neutral / at-risk plus what should happen next), and (d) any commitments made on the call (dates, amounts, follow-up promises).

Match the transcript to the right HubSpot contact. First try the HubSpot contact id from the LiveKit room metadata. If that is missing, fall back to hubspot.get_contact with idProperty=phone using the caller's phone number from the metadata. If neither resolves a contact, post a Slack alert asking a human to attribute the call by hand, and skip HubSpot writes for this one.

When a contact is matched: use HubSpot Create Note associated with that contact carrying the full summary, action items, sentiment, and commitments. Then use HubSpot Create Task for each action item, with the promised due date if the transcript mentioned one and the owner if named. Then use Slack Send a Message to the sales team channel with a short recap (summary + top action items + link into the HubSpot contact record).

Guardrails to bake in:

1) Dedupe on egress_id via a running record (e.g. a store of already-processed egress ids or a last-processed-at cursor) so we never post the same call to HubSpot or Slack twice, even if the same egress shows up on a later sweep.

2) Skip any egress whose recording is shorter than 30 seconds (voicemail beeps, misdials, quick hang-ups) so we do not clutter HubSpot with noise. Make this threshold easy to change.

3) If no HubSpot contact can be resolved (no metadata contact id AND no phone match), post a Slack alert to the sales channel with the room name, call time, and recording URL, asking a human to attribute the call. Do not write anything to HubSpot in that case.

The workflow assumes LiveKit egress was configured with cloud storage the workflow can pull the recording from (S3 signed URL or a publicly accessible URL). Make the Slack channel, sweep cadence, and minimum-duration threshold configurable at setup time.

Additional information

What does this prompt do?
  • Sweeps every 30 minutes for LiveKit calls that just finished recording and grabs the audio file.
  • Transcribes each recording with speaker labels so reps and prospects are clearly separated in the notes.
  • Writes a short summary, action items with owners, sentiment, and any commitments straight onto the matching HubSpot contact.
  • Posts a one-glance recap to your deal team Slack channel with a link back into HubSpot, and flags calls it could not match to a contact.
What do I need to use this?
  • A LiveKit project with call recording turned on and recordings saved to storage the workflow can pull from.
  • A Deepgram account for transcription with speaker diarization.
  • A HubSpot account where you want notes and follow-up tasks to land.
  • A Slack workspace and the channel where your sales team wants recaps posted.
How can I customize it?
  • Change how often the sweep runs, from every 15 minutes to once a day.
  • Tune the minimum call length so short test calls or hang-ups get skipped.
  • Point the recap at a different Slack channel per team or per deal owner.
  • Adjust the summary style, for example short bullets versus a longer executive brief.

Frequently asked questions

How does the agent know which HubSpot contact a call belongs to?
First it looks for a HubSpot contact id you stored on the LiveKit room when the call started. If that is missing, it falls back to matching on the caller's phone number in HubSpot. If neither works, it posts a Slack alert so someone can attribute the call by hand.
Will the same call ever be logged twice?
No. The agent keeps a running record of every recording id it has already processed, so each call is filed to HubSpot and Slack exactly once even if the sweep runs again.
What happens to very short calls or dropped connections?
Anything under 30 seconds is skipped so voicemail beeps, misdials, and test rings never clutter your CRM. You can raise or lower that threshold when you set the workflow up.
Can I change what goes into the summary?
Yes. The agent produces a short summary, action items with owners, a sentiment and next-step signal, and any commitments the rep made. You can shorten, lengthen, or reshape any of those sections in plain English.
Do I need Deepgram, or can I use another transcription service?
This starter uses Deepgram because it is fast, cheap, and supports speaker labels. You can swap it for another transcription provider you already use when the workflow is set up.

Stop asking your reps to relisten to their own calls.

Connect LiveKit, Deepgram, HubSpot, and Slack once, and Geni files every finished call for you on a 30 minute cadence.