Skip to main content
← Back to glossary
Messaging delivery

Message status lifecycle

Qu'est-ce que Message status lifecycle?

Cette entrée n'est actuellement disponible qu'en anglais.

The message status lifecycle is the ordered set of statuses an outbound message moves through from acceptance to final outcome. On Devotel Orbit the core vocabulary is queued (held platform-side, not yet handed to a provider), sent (accepted by the provider or carrier), delivered (handset receipt confirmed), undelivered (carrier tried but the handset could not take it), failed (retries exhausted with a classified cause), expired (a receipt arrived past the late-arrival window), and submitted_no_receipt (submission accepted but no delivery receipt has come back yet). Every row shows exactly one status, and webhooks fire an event on each transition so integrations can mirror the lifecycle.

More detail

The lifecycle is not a straight line: the platform enforces an allowed-transition DAG with weighted precedence, so out-of-order or duplicate receipts resolve to one answer instead of corrupting the record — a late delivered receipt still supersedes a failed or submitted_no_receipt state, and the operator-driven cancelled and deleted states are absolute floors no carrier callback can move.

Two backward corrections are legal by design: carriers (notably on some routes) emit DELIVERED and later re-emit a failure, so delivered→undelivered and delivered→failed apply; and submitted_no_receipt is provisional, so a genuine receipt that lands afterward overwrites it. Any other regression — a stale sent arriving after delivered — is dropped as a duplicate, not applied.

In Devotel Orbit the exact enum values (dv_message_statuses) surface in the dashboard Delivery Log under Messages → Tools, on the message row returned by GET /api/v1/messages, and on message.* webhook events, which carry the status plus a state_class and is_terminal flag so your consumer knows whether the book is closed.

Status-by-status, the first diagnostic step: queued — work the enqueued checklist on the message-queued troubleshooting page; sent — wait for the receipt, and if none arrives the row promotes to submitted_no_receipt after the grace window; delivered — confirm the recipient actually saw it; undelivered and failed — decode the carrier error class on the message-undelivered-failed page before retrying; expired — the receipt crossed the late-arrival window and no longer counts; submitted_no_receipt — treat it as pending, never final, per the submitted-no-receipt page. The delivery-lifecycle concept maps the full DAG.

Questions fréquentes

Why is my message stuck on queued?
Queued means the hold is on the platform side of the handoff, not the carrier — the row has not been handed to a sender or provider yet. Work the enqueued-empty-states checklist: a filter artifact hiding the row, a queue with no worker draining it, or a gate (quiet hours, consent, sender resolution) you can clear.
Is submitted_no_receipt a final status?
No. It means the provider accepted the submission but no delivery receipt has returned, so the row reports is_terminal: false. A genuine receipt that arrives later still supersedes it — delivered, read, or a classified failure — so never freeze a mirror integration on it.
What is the difference between undelivered and failed?
Undelivered means the carrier attempted delivery and the handset could not take the message — it points at the recipient (number hygiene, unreachable handset). Failed means a dispatch-time or classified carrier failure with retries exhausted — it points at the dispatch or the classified cause the metadata.classified_error_code field names.
Can a later delivery receipt change a status I already saw?
Yes. Status transitions carry weights and two named carrier corrections are allowed backward: a delivered arriving after failed or submitted_no_receipt applies, and a carrier that emits DELIVERED then re-emits UNDELIV moves the row to undelivered. Merge only when the incoming status outranks what you hold, and treat cancelled and deleted as floors no receipt can move.

Build it on Orbit

Voice, messaging, email, video, and AI agents on one platform and one pay-as-you-go bill. Start free — no credit card required.