docs: add message statuses documentation#568
docs: add message statuses documentation#568FredShred7 wants to merge 2 commits intochatwoot:mainfrom
Conversation
…#430) Replace broken www.chatwoot.com/docs/contributing-guide/other/* URLs with correct developers.chatwoot.com/contributing-guide/* paths, and fix the email-channel/setup link to point to the current email channel docs page.
Adds a new page explaining the four outgoing message statuses (sent, delivered, read, failed), what each means, per-channel support, and an FAQ addressing common agent questions. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
muhsin-k
left a comment
There was a problem hiding this comment.
Thanks for putting this together — the page structure, copy, and FAQ are in great shape. The main concern is that the channel support table has several factual errors when checked against the actual Chatwoot codebase. These are the kinds of things that will send agents chasing nonexistent behavior, so I'd like to get them right before we merge.
Channel support table — discrepancies vs. code
| Channel | PR claim | Code says | Note |
|---|---|---|---|
| Twilio SMS | Delivered: No, Read: Yes | Delivered: Yes, Read: No | Twilio::DeliveryStatusService accepts sent/delivered/failed/undelivered. SMS protocol doesn't have read receipts — the read status in the enum is accepted but never actually emitted for SMS. |
| Bandwidth SMS | Delivered: No, Read: Yes | Delivered: Yes, Read: No | Sms::DeliveryStatusService handles message-delivered and message-failed only (see app/services/sms/delivery_status_service.rb:19). |
| Delivered: Yes, Read: No | Delivered: No, Read: Yes | Webhooks::InstagramEventsJob has SUPPORTED_EVENTS = [:message, :read] — the PR has this row inverted. |
|
| Telegram | Delivered: No, Read: No | Matches, but worth calling out | Correct — Telegram has no delivery/read pipeline in the code. |
| Line | Delivered: No | Partially — see note | Line::SendOnLineService optimistically marks the message delivered right after the send succeeds (not a real provider receipt). If we're documenting user-visible behavior, Line actually shows delivered; if we're documenting real delivery confirmations, No is accurate. Worth a footnote either way. |
| Failed: No | Yes | Email::SendOnEmailService rescues send exceptions and marks the message failed. The FAQ entry 'Email messages never show a Failed status' is also incorrect as a result — it's bounces/async failures that aren't fed back, not all failures. |
Other notes
- Table rendering: 'Not supported' is 13 characters and will force some columns wider than others — consider a shorter marker like 'No' / '—' for consistency with the rest of the docs.
- TikTok row: I'd double-check this one separately. The codebase handles
im_send_msg/im_receive_msg/im_mark_read_msg, but 'Delivered' isn't a distinct event — might belong in the 'No' column. - Unrelated link migration: The
www.chatwoot.com/docs/...→developers.chatwoot.com/...link changes incontributing-guide.mdxandconversation-continuity-using-sendgrid.mdxare a good cleanup, but they're unrelated to the 'add message statuses docs' scope. Happy to keep them bundled, but flagging in case you want to split for a cleaner history. - FAQ copy on 'Failed' + resend: The 'no one-click resend' answer is accurate today, but let's confirm that's still the product direction before it lands in user-facing docs.
Once the table is reconciled with the code this will be ready to go. Thanks again for picking this up — the FAQ section especially is going to save support a bunch of back-and-forth.
|
@FredShred7 Thanks for this the page structure and FAQ are really solid. One blocker before merge: the channel support table doesn't match what the code actually does. Quick audit:
Also worth double-checking TikTok (no distinct "delivered" event in the webhook handler, just send/receive/read). Once the table is reconciled with the code this is good to go 🙌 |
Adds documentation explaining message statuses (sent, delivered, read, failed) and channel support for delivery/read indicators.
Includes:
Resolves #427