Skip to content

docs: add message statuses documentation#568

Open
FredShred7 wants to merge 2 commits intochatwoot:mainfrom
FredShred7:docs/message-statuses
Open

docs: add message statuses documentation#568
FredShred7 wants to merge 2 commits intochatwoot:mainfrom
FredShred7:docs/message-statuses

Conversation

@FredShred7
Copy link
Copy Markdown

Adds documentation explaining message statuses (sent, delivered, read, failed) and channel support for delivery/read indicators.

Includes:

  • Status descriptions and behavior
  • Channel support table
  • FAQ for common agent questions

Resolves #427

Frederico Vidigal Simon and others added 2 commits March 23, 2026 20:47
…#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>
Copy link
Copy Markdown
Member

@muhsin-k muhsin-k left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).
Instagram 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.
Email 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

  1. 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.
  2. 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.
  3. Unrelated link migration: The www.chatwoot.com/docs/...developers.chatwoot.com/... link changes in contributing-guide.mdx and conversation-continuity-using-sendgrid.mdx are 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.
  4. 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.

@muhsin-k
Copy link
Copy Markdown
Member

@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:

Channel PR says Code says
Twilio SMS Delivered: No, Read: Yes Delivered: Yes, Read: No (Twilio::DeliveryStatusService — SMS has no read receipts)
Bandwidth SMS Delivered: No, Read: Yes Delivered: Yes, Read: No (Sms::DeliveryStatusService handles message-delivered / message-failed only)
Instagram Delivered: Yes, Read: No InvertedWebhooks::InstagramEventsJob has SUPPORTED_EVENTS = [:message, :read]
Email Failed: No YesEmail::SendOnEmailService marks failed on send exceptions (bounces/async failures are what's not fed back)
Line Delivered: No Technically marked delivered optimistically after send — worth a footnote

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 🙌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Message statuses should be described in the documentation.

2 participants