How Meeting Bots Work
Meeting bots in Agency Hero automatically join your client calls, record conversations, and extract structured intelligence — decisions, action items, risks, and more. This guide explains the full lifecycle: how bots are triggered, how they join and record, what gets captured, how recordings and transcripts are processed, and what happens when things go wrong.
How Meeting Bots Work
Meeting bots are automated recording participants that Agency Hero dispatches to your video calls. They join silently, capture audio and video, and feed that raw conversation into an AI processing pipeline that produces transcripts, summaries, and structured intelligence items — all linked to your workspace.
This article explains how every step works: from the moment a meeting is created to the moment intelligence is available in your workspace.
How a Bot Gets Dispatched
Agency Hero uses a purpose-built bot infrastructure to manage meeting recordings. When a meeting is scheduled, the system creates a bot reservation and dispatches a bot to the call at the right time. You don’t need to do anything manually — the bot is coordinated automatically.
Meeting Sources That Trigger a Bot
Bots are dispatched when a meeting enters the system through any of these sources:
| Source | How it works |
|---|---|
| **Zoom webhook** | Zoom notifies Agency Hero when a meeting is created, started, updated, or deleted. The system processes these events in real time. |
| **Google Calendar sync** | Your connected Google Calendar is synced periodically. New events with video conference links trigger the bot workflow. |
| **Manual creation** | You can create a meeting record directly in Agency Hero. The bot workflow starts immediately. |
| **Manual transcript upload** | You paste or upload a transcript directly — no bot is needed. The system skips bot scheduling and goes straight to AI processing. |
For Zoom and Google Calendar, Agency Hero listens for incoming webhooks or syncs calendar data and then starts the MeetingLifecycleWorkflow — a durable background process (run on Temporal Cloud) that manages everything from bot scheduling through transcript delivery.
The Bot Scheduling Decision
Once a meeting is in the system, the lifecycle workflow decides when to send the bot:
- More than 10 minutes before start — The bot is created with a
join_attime set to 1 minute before the scheduled start. It waits and joins automatically. - Within 10 minutes of start — The bot is created with
join_nowand joins the meeting immediately. - Meeting already started (within 30-minute grace period) — The bot joins immediately, capturing whatever portion of the call remains.
- Meeting started more than 30 minutes ago — The meeting is marked
missed_recordingand no bot is sent. - Meeting never starts (45-minute grace period) — If the meeting doesn’t get a start signal within 45 minutes of its scheduled time, it’s marked
no_show.
Handling Early Starts
If a host starts the meeting earlier than scheduled, Zoom sends a meeting.started webhook. Agency Hero handles this in real time:
- If the bot’s scheduled join time is more than 10 minutes away, Agency Hero patches the bot’s
join_atto the current time. - If the join time is within 10 minutes, the existing bot is cancelled and a new one is dispatched immediately.
- If multiple workspaces share the same meeting link (e.g. agency + client both use Agency Hero), cross-org signaling ensures all of their bots respond to the early start at once.
Handling Meeting Updates and Cancellations
- Time change ≥ 5 minutes — The bot is rescheduled. If it was already close to joining, it’s cancelled and a new one is created.
- URL change — The bot must be cancelled and re-created (the bot system doesn’t support patching the meeting URL after creation).
- Meeting deleted — The bot is immediately cancelled and the workflow is closed gracefully.
What the Bot Captures
Once the bot joins the call, it acts as a silent participant. It captures:
- Audio — Full conversation audio from all participants
- Video — The meeting video feed (multi-participant layout)
- Speaker diarization — Which participant is speaking at each moment
- Participant tracking — Who attended the meeting
- Real-time transcript chunks — The bot begins streaming transcript data during the meeting, enabling real-time processing before the call even ends
The bot appears as a named participant in the video call. Meeting participants can see it is present. It does not speak or interact in the call.
Note: Transcription is processed by Agency Hero’s recording service, producing timestamped, speaker-attributed transcript segments.
Deduplication: One Bot Per Meeting
Multiple bots joining the same call (from retries, duplicate webhooks, or concurrent sources) would be disruptive and wasteful. Agency Hero prevents this with a multi-layer deduplication system:
- reserve-before-create — Before dispatching a bot, the system inserts a reservation row into the database. If two requests race, only one succeeds; the other finds the reservation already exists and backs off.
- URL-based deduplication — Meetings are hashed by their normalized video conference URL. Two meetings with the same link in the same time window are treated as the same meeting.
- V3 deduplication key — Uses nearest-hour rounding so meetings at 2:58 PM and 3:02 PM from different sources are correctly identified as the same event.
The result: no matter how many sources create or update a meeting, exactly one bot joins.
During the Meeting: Real-Time Processing
Agency Hero doesn’t wait for the meeting to end. While the bot is recording, the bot infrastructure streams transcript chunks as they’re generated. These feed into the PostMeetingSummaryWorkflow in real time — so by the time the meeting ends, processing is already underway.
The workflow listens for:
transcript_chunk— An incremental segment of the transcript with speaker labels and timestampsmeeting_ended— The signal that triggers final processingitem_confirmed— A user has confirmed a proposed intelligence item (task, decision, risk, or question)
After the Meeting: Transcript and Recording Delivery
When the meeting ends, the recording service delivers two key payloads:
1. transcript.done
The full, speaker-attributed transcript is delivered. Agency Hero:
- Stores the transcript linked to the meeting record
- Updates the meeting’s
lifecycle_statetoprocessing_transcript - Signals the
PostMeetingSummaryWorkflowto complete final processing - Triggers the
queue-post-meeting-summaryedge function, which starts intelligence extraction
2. recording.done
The video recording is available. Agency Hero:
- Stores a hosted video URL for immediate playback (free for 7 days)
- Schedules an audio download workflow (runs within 24–48 hours) to save a compressed audio version as a long-term fallback
- Schedules a video archival workflow to compress and archive the full video to Agency Hero’s own S3 storage before the 7-day free window expires
- Schedules a cleanup workflow to remove the recording from the bot infrastructure at the 7-day mark (to avoid storage charges)
Recording Playback Over Time
| Timeframe | What You See |
|---|---|
| Days 0–7 | Full video via the recording service (fast, free) |
| Day 7+ | Archived video from Agency Hero's S3 storage |
| If video is cold/restoring | Audio playback with a "Restoring video" message |
Intelligence Extraction
Once the transcript is processed, Agency Hero’s AI extracts structured intelligence items:
| Item Type | What it captures |
|---|---|
| **Action items** | Commitments, deliverables, and next steps with owners |
| **Decisions** | Client approvals, strategy choices, direction changes |
| **Risks** | Concerns, blockers, or red flags raised during the call |
| **Questions** | Open issues that need follow-up |
| **Insights** | Notable signals about client sentiment, relationship health, or strategic context |
Each extracted item includes:
- The exact transcript excerpt it was drawn from
- The speaker and timestamp
- A confidence score
- A status (
proposed→confirmedordismissed)
Items start in proposed state. Your team reviews them and confirms or dismisses each one before they become part of the permanent workspace record.
The Meeting Summary
Alongside individual items, an executive summary is generated: key takeaways, major decisions, critical action items, and overall meeting tone. This summary is permanently linked to the meeting and available for AI-assisted search and context retrieval.
Meeting Lifecycle States
Every meeting has a lifecycle_state that reflects where it is in the pipeline:
| State | Meaning |
|---|---|
| `scheduled` | Meeting is in the system; workflow is running and waiting for start time |
| `bot_scheduled` | Bot has been reserved and is waiting to join |
| `recording` | Bot is actively in the call and recording |
| `processing_transcript` | Transcript received; AI extraction underway |
| `processing_summary` | Summary generation in progress |
| `completed` | All processing done; intelligence available |
| `missed_recording` | Meeting occurred but bot couldn't join in time |
| `no_show` | Meeting never started within the 45-minute grace window |
| `failed` | Unrecoverable error occurred |
Bot Retry and Failure Recovery
Bot failures happen — the host might not admit the bot from the waiting room, or the meeting platform might have a transient issue. Agency Hero handles this automatically:
- Retryable failures — If the bot fails with a retryable error (e.g. timed out in waiting room, no one joined), Agency Hero cancels the failed bot and schedules a new one. Up to 3 retry attempts are made.
- Terminal failures — Some failures cannot be retried (e.g. the host explicitly blocked the bot, recording permission denied). The meeting is marked
missed_recording. - Stale bot detection — If a bot job is more than 6 hours old and still in a non-terminal state, the system treats it as expired and allows a fresh bot to be scheduled.
A background ReconciliationWorkflow runs periodically (approximately every 5 minutes) to catch any meetings that slipped through cracks — for example, meetings whose workflows never started, or bots that failed without properly signaling the main workflow.
Manual Transcript Upload
If a meeting wasn’t recorded by a bot — or if you have an external transcript from another tool — you can upload a transcript manually. This path:
- Bypasses the bot lifecycle entirely
- Creates a meeting record with
source: manual_upload - Directly triggers AI processing (no bot scheduling, no waiting)
- Produces the same intelligence extraction output as a bot-recorded meeting
You can upload to an existing meeting record or create a new meeting at the same time as uploading.
Where Intelligence Goes After Processing
Once a meeting is completed, its extracted intelligence is available across Agency Hero:
Workspace Intelligence Ledger — All items are stored in your workspace’s canonical record, searchable and filterable across all meetings.
Meeting Timeline — Every meeting becomes a node in the workspace history. You can jump to specific moments using transcript timestamps.
AI-Assisted Chat — When you ask the workspace AI a question (like “What did the client say about budget last quarter?”), it searches across meeting transcripts and intelligence items to give grounded answers with source citations.
Task Sync — Confirmed action items can be pushed to external project management tools (Linear, Asana, ClickUp) as tracked tasks with owners and deadlines.
Privacy, Access Control, and Security
- Workspace isolation — Meeting data, transcripts, and intelligence items are scoped to the workspace. Only authorized workspace members can access them.
- Bot announcement — When a bot joins a meeting, it appears as a named participant. Participants can see it is present in the call.
- Recording consent — You are responsible for ensuring all meeting participants consent to being recorded in accordance with applicable laws and your organization’s policies.
- Webhook validation — All incoming Zoom webhooks are verified using HMAC signature validation before processing.
- Row-level security — The database layer enforces organization-scoped access on all meeting tables, preventing cross-organization data access.
- Secure media storage — Audio and video files are served via authenticated edge functions with short-lived signed URLs. There are no publicly accessible recording URLs.
Troubleshooting Common Issues
Bot Didn’t Join the Meeting
- Check that the meeting has a valid conference URL (Zoom/Google Meet link). Bots cannot join a meeting without a join URL.
- If the meeting was created very recently and starts immediately, the system may still be in the scheduling phase. Check the meeting’s
lifecycle_state. - The host may need to admit the bot from the waiting room if the meeting uses a waiting room.
- If this is a recurring pattern, check whether your Zoom or Google Calendar integration is connected and healthy in workspace settings.
Meeting Shows no_show
- The meeting was scheduled but never actually started (or the start signal wasn’t received within 45 minutes of the scheduled time).
- This can happen if the meeting was cancelled last-minute without a cancellation webhook being sent, or if the Zoom integration was temporarily disconnected.
Meeting Shows missed_recording
- The bot couldn’t join after all retry attempts, or the workflow started too late (more than 30 minutes after the meeting began).
- If you have a recording from another source, you can use manual transcript upload to still get intelligence from the meeting.
No Intelligence Items After the Meeting
- Intelligence extraction requires a completed transcript. Check whether
lifecycle_statehas reachedcompleted. - Very short meetings or calls with minimal speech may produce few or no extractable items.
- Items start in
proposedstate — check if they’re awaiting review in the meeting intelligence panel.
Related articles
More resources to help you go deeper.
