Debugging Bots
When a bot doesn’t do what you expected, the answer is almost always in one of three places: the status timeline, the terminal webhook, or a timeout that fired. This page shows where to look and how to get from a symptom to a fix.
Start at the dashboard
The All Bots view lists every bot in your workspace with its platform, start time, duration and status.

- Filters. Narrow by date, platform (Google Meet, Zoom, Teams, WhatsApp) and status.
- Search. Paste a
bot_id, bot name or meeting URL. - Events. Opens the Bot Event Reference, a quick glossary of webhook events. CSV exports the current list.
- Status badge. Hover it to see the raw API status. A
Stoppedbot shows as Completed, and a bot that was never admitted shows as Not Allowed.
Click any row to open its detail page.
Read the bot detail page
The bot detail page (Meeting timeline, transcript, and logs) shows everything MeetStream knows about one session.

- Bot ID and status badge. The current status. While the bot is live, the top bar also offers Pause recording or Resume recording and a stop action.
- Meta bar. Started At, Stopped At, Bot Name, Meeting Code, Duration and Platform.
- Recording preview and Audio preview. Play the recording in the browser once it is processed.
- Bot status timeline. Every stage the bot went through, with a timestamp and the exact message. This is the same data as
StatusTimelineinGET /api/v1/bots/{bot_id}/detail.
Scroll down to see the post-call stages and the downloads.

- Terminal status. Here
StoppedwithBot stopped via API request. The message tells you why the session ended. - Post-call stages. Processing Audio, Processing Video, Uploading, and (if you requested a post-call transcript) Transcript Ready.
- Final status.
Donemeans post-call processing finished. The Last event line repeats the latest stage. - Meeting Artifacts. Download the video (
.mp4) and audio (.wav), or view the transcript, screenshots and participants.
A healthy session reads: Joining, In Waiting Room, In Meeting, Recording, Leaving, Stopped, Processing Audio, Processing Video, Uploading, Done. In Waiting Room appears even when the host admits the bot instantly.
What a lobby timeout looks like

The gap between In Waiting Room and Not Admitted equals the waiting_room_timeout (600 seconds by default on Google Meet). The timeline labels this stage Not Admitted; the API status is NotAllowed. For the fix, see WaitingRoomTimeout and Google Meet lobby troubleshooting.
The tabs below the timeline
Triage a bot that did not do what you expected
- Find the terminal status. It is the last in-meeting stage in the timeline, or
bot_eventon thebot.stoppedwebhook. - Read the message and
ErrorReason. The message is in the timeline and the webhook.ErrorReason(Google Meet and Teams) is inGET /api/v1/bots/{bot_id}/detail. Zoom bots put the cause in the message. - Look it up in the Bot status and error code reference. Every row links to the fix.
- Check the request in the Raw Data tab if a setting did not behave as expected, and compare it with what each platform supports.
The lifecycle in webhooks
A successful recording bot sends:
Key semantics:
- Exactly one terminal delivery per bot, always with
event: "bot.stopped". Itsbot_eventgives the reason:bot.stopped(normal),bot.kicked,bot.notallowed,bot.deniedorbot.failed. - A kick and a clean exit both report
bot_status: "Stopped", and failure statuses vary in casing (FAILED,ERROR,Failed). Branch onbot_eventto tell them apart. - Clean terminals use
status_code: 200; failure terminals usestatus_code: 500. Failuremessagestrings are prefixed"Error: ..."(unexpected) or"Failed: ..."(handled: validation, timeout, denial) — useful for alert routing. bot.donealways hasstatus_code: 200and fires on every path, streaming-only and never-admitted bots included. It means the post-call pipeline finished, not that every step succeeded, so check the individual artifact events.- On Zoom only,
bot.recording_permission_allowed/deniedfire betweenbot.inmeetingandbot.recording— see Zoom bots.
Deliveries carry an event key and, on most events, a bot_event key (live-verified). They match except on terminals: a lobby timeout delivers event: "bot.stopped" with bot_event: "bot.notallowed" and bot_status: "NotAllowed". Branch on bot_event for the specific reason.
Symptom to cause
Watch it live
Two fast feedback loops while developing:
Or let your agent do it: the MeetStream MCP server exposes bot status, details and transcripts as tools, so Claude can debug a bot session for you.
Status reference
Values you will see in GET /api/v1/bots/{bot_id}/status, /detail and webhooks:
Scheduled · Joining · InWaitingRoom · InMeeting · Recording (timeline only) · RecordingPermissionAllowed · RecordingPermissionDenied · Leaving · Stopped · Kicked · NotAllowed · Denied · Failed · Error · MediaProcessing · Done · MediaExpired · Cancelled
What each one means, which are terminal, and how the dashboard labels them: Bot status and error code reference.
Next steps
- Bot status and error code reference: every status, error reason and message
- Webhooks and Events: full payload reference
- Automatic Leave Configuration: every timeout, range, default and platform
- Set Up Local Server for Webhook
