Skip to main content
Version: Latest

10. Inbox / Conversation

10.1 Conversation Lifecycle​

A conversation is created automatically the first time a webhook message arrives from a given wa_id with no existing open conversation (see §8.2) — there is no manual "create conversation" endpoint. Status, priority, pin, and archive state are independent flags tracked on WhatsAppConversationDto/WhatsAppConversationDetailsDto (see §6.3).

10.2 Notes​

Internal-only annotations on a conversation, never sent to the customer. Author-only edit enforcement is applied service-side. See §6.4 WhatsAppNoteController.

10.3 Tags​

Tenant-wide labels, optionally marked IsSystem (protected from edit/delete). Applied per-conversation via AssignTag/RemoveTag, both logged to the conversation timeline. See §6.6 WhatsAppTagController.

10.4 Saved Replies​

Reusable canned responses, personal or tenant-shared, with an optional /shortcut for composer autocompletion. Bilingual via Title/FTitle (an intentional exception to the platform's usual Name/FName convention). See §6.5 WhatsAppSavedReplyController.

10.5 Timeline​

A single append-only audit trail per conversation — every assignment, transfer, close/reopen/archive/pin, tag add/remove, and note add is logged as a WhatsAppConversationEventType entry. See §6.7 WhatsAppTimelineController and §16 Appendix for the full enum.

10.6 Media​

Inbound media (images, documents, audio, video) is referenced by Meta's MediaId; the backend always proxies the actual bytes through GetMediaInfoAsync/DownloadMediaAsync — the Meta CDN URL is never exposed to a frontend client. Outbound media is sent as a public URL inside a template component parameter, not as an uploaded binary (this integration has no outbound media-upload capability — see §3.2).

10.7 Reply Flow​

Two distinct reply mechanisms, gated by Meta's own 24-hour customer-service window rule:

  • Free-text reply (SendReply) — only within 24 hours of the customer's last inbound message (CanSendFreeText on the conversation DTO signals this to the frontend).
  • Template reply (SendTemplateReply) — always available, using an approved template, regardless of window state.

See §5.7 Reply From Inbox for the full sequence.

10.8 Tenant Credentials in the Inbox Context​

The Inbox system always uses the platform's own WhatsApp Business number (WhatsAppCloudApiOptions), not a per-tenant number — every inbound customer conversation and agent reply flows through the same Meta Cloud API credentials configured at the platform level. Tenant-scoped credentials (WhatsAppOperationalSettings) are used exclusively by the Communication module for outbound business document sends, a separate flow that does not create Inbox conversations. This is a structural distinction worth remembering: a customer replying to an invoice sent via the Communication module will not appear in the Inbox unless the platform's own number is also the number that customer is messaging.