Bot status codes
The five possible status values for a bot — what each one means, what triggers it, and what your dashboard shows when it's set.
Every bot in CloudLine has a current status. It's decided by the BotMonitor Durable Object on every alarm tick, based on the gap between the last heartbeat and now. Five possible values.
online
The bot is alive and heartbeating on schedule.
Triggered when: at least one heartbeat arrived within the offline threshold window (interval × threshold count).
Dashboard:
- Status ribbon: green
- Status dot: green
- Telemetry tiles: live values
This is what you want to see. A green bot is doing its job.
degraded
The bot is heartbeating, but slow or with quality issues. CloudLine flips to degraded rather than offline because the bot is technically still alive — just not healthy.
Triggered when: heartbeats are still arriving but the most recent gap was longer than the normal interval (e.g. delivery took longer than expected, suggesting a flaky network or a paused process).
Dashboard:
- Status ribbon: yellow
- Status dot: yellow
Optional alert: enable notify on degraded in the Alerts tab if you want to be paged. Off by default — degraded is usually noisy and self-resolves.
NOTE
Most users don't enable degraded alerts. The signal is useful in the timeline view (you can see the wobble) but not actionable per-event.
offline
The bot has missed enough consecutive heartbeats to be considered down.
Triggered when: no heartbeat arrived in interval × offlineThreshold seconds.
- Starter: 60 s × 2 = 120 s (~2 minutes after last heartbeat)
- Pro (with default threshold of 2): 30 s × 2 = 60 s
- Business (with default threshold of 2): 10 s × 2 = 20 s
- Pro/Business can set threshold to 1 (fastest detection) or 3 (more conservative).
Dashboard:
- Status ribbon: red
- Status dot: red
- A new incident is opened in the Incidents table.
- Alert fires to your configured channels (Discord webhook / email).
When a heartbeat lands again, the incident closes, status flips back to online, and the recovery alert fires.
paused
You manually paused monitoring for this bot from the Settings tab.
Triggered when: the bot's isMonitoring flag is set to false. CloudLine still accepts heartbeats and stores telemetry, but does NOT evaluate offline status or fire alerts.
Dashboard:
- Status ribbon: grey with "Paused" label
- Status dot: grey
- No incidents opened during the pause.
Useful when:
- You're doing a maintenance window (e.g. extended deploy) and don't want false-positive alerts.
- The bot is being intentionally taken down for changes.
- You want to keep the bot configured (alert thresholds, webhook URL) without it being monitored.
Resume from the Settings tab whenever you're ready. The alarm tick re-arms within seconds.
unknown
The bot has never sent a heartbeat, or the BotMonitor doesn't have enough information to decide.
Triggered when: bot was created less than one full check interval ago, OR all recent heartbeat data was lost from D1, OR an internal error prevented status evaluation.
Dashboard:
- Status ribbon: grey with "Not enough data" label
- Status dot: grey
This is the initial state for a freshly created bot. Once your first heartbeat lands, it transitions to online. If you see unknown on an existing bot that was previously online, check whether the bot is sending heartbeats — it's the same diagnostic flow as No data showing.
Transitions
| From | To | Trigger |
|---|---|---|
unknown | online | First heartbeat arrives. |
online | degraded | Heartbeat arrives later than expected. |
online | offline | Missed too many heartbeats. Opens an incident. |
degraded | online | Heartbeat arrives on schedule. |
degraded | offline | Continues missing heartbeats. Opens an incident. |
offline | online | Heartbeat arrives. Closes the incident. Fires recovery alert. |
paused | online | You resume monitoring + first heartbeat lands. |
| any | paused | You pause monitoring from the Settings tab. |
A note on the gateway_ok flag
Bot status is about CloudLine's view of the bot. The SDK additionally reports gateway_ok and gateway_stale_sec on each heartbeat — these track whether the bot's connection to Discord is healthy. A bot can be online (heartbeating fine) AND have gateway_ok = false (Discord gateway is dead) at the same time. This is the zombie state — surfaced separately in the Gateway tile.
In API responses
The status appears as a string in API responses:
{
"id": "bot_abc123",
"name": "My Music Bot",
"status": "online",
"lastHeartbeatAt": 1735862400000
}The string values are exactly "online" | "degraded" | "offline" | "paused" | "unknown". Case-sensitive.