¶ Classify the symptom
Decide whether the report points at API, web, connector, queue, database, Redis, Spaces, Cloud API, or WhatsApp-device behavior.
Operations
Triage the symptom, then pick the system. First identify the affected surface, confirm deploy and queue state, classify the channel, and write down the evidence before making changes.
Golden rule
Known production reports usually separate quickly once you know whether the failure is API, web, connector, queue, database, Redis, Spaces, Cloud API, or WhatsApp-device behavior.
First ten minutes
Use this flow before deep code reading. It preserves the original troubleshooting order while making each handoff explicit.
Decide whether the report points at API, web, connector, queue, database, Redis, Spaces, Cloud API, or WhatsApp-device behavior.
Prefer known commands and RCA pages before opening code. The operations runbook has first moves for stuck sends, tags, deploys, connector CPU, Cloud API routing, and history or media timeouts.
Read DigitalOcean deployment status and component logs. If a rollout is stuck, do not stack another deploy on top of it.
Inspect stuck sends, scheduled messages, broadcasts, media, and avatar work before assuming the application path is broken.
Confirm whether the affected channel is Baileys, Cloud API, or coexistence. Routing behavior and failure modes differ sharply between them.
Write probes, timestamps, IDs, logs, and conclusions in the relevant issue, runbook, or SHIPPED.md entry.
Route by system
Use the observed symptom to choose the next inspection point. A fast, accurate owner beats a wide search.
Requests fail, permissions look wrong, message rows do not match UI state, or server logs show validation and status errors.
One browser shows stale state, optimistic bubbles disagree with the server, or realtime recovery depends on refetch and cache state.
Baileys sockets flap, sends depend on paired-device reachability, media work piles up, or WhatsApp ids appear before API status lands.
Jobs are waiting, delayed, failed, or missing for sends, scheduled work, broadcasts, media download, re-upload, or avatar probes.
Rows disagree with expected tenant, contact, channel, message, migration, or identity evidence state.
Socket fan-out, queue metadata, locks, rate limits, or send-guard evidence are absent, stale, or expiring earlier than expected.
Media fails to load, encrypted object metadata is missing, copies lose envelope metadata, or retry windows disagree with UI behavior.
Cloud API cannot address @lid or @g.us, devices sleep, companion fan-out misses, or offline queue flushes arrive late.
Deployment and queue
Before changing code or retrying a release, compare component health with background work. Split-version serving, a stalled rollout, or a queue backlog can mimic product defects.
Evidence packet
After a connector deploy
Run a DB query for disconnected channels with status_detail of no live socket (connector heartbeat) and disconnected_at at or after the deploy time.
If the query returns rows, inspect connector and API logs for boot reconciliation complete, channel lock acquired after waiting for another instance, and would have demoted / held back by the post-boot grace window.
Re-request connect through the request_connect path, or press Connect in the UI. Run recovery code from apps/api with DATABASE_URL and REDIS_URL from the prod env, and avoid running with ENV=production.
Roll the API first, since it understands started_at, then deploy the connector. Either order is wire-safe, but verify the logs and the DB check after the connector deploy.