Skip to main content
Every message in Trackly SMS passes through a series of states from creation to final delivery (or failure). Understanding these states helps you troubleshoot delivery issues and build reliable integrations.

State Diagram

Message States

StateTerminal?Description
queuedNoMessage is in the send queue, waiting for the executor to claim it
sentNoExecutor submitted the message to the SMS provider
deliveredYesProvider confirmed delivery to the recipient’s handset
undeliveredYesProvider attempted delivery but the carrier reported failure
failedYesHard failure — provider rejected the message or a system error occurred
droppedYesMessage was removed from the queue before sending (see drop reasons below)
orphanedYesMessage had no valid sending list — removed from queue and recorded to dead-letter

Drop Reasons

When a message is dropped, the status_detail field contains the reason.
ReasonDescription
staleMessage sat in the queue longer than 30 minutes and was discarded
blocked_contentMessage body matched a prohibited content filter (crypto, phishing, bank names)
contact_blockedRecipient is unsubscribed or blocked on the sending list
inactive_listThe sending list is no longer in active status
billing_expiredAccount billing is invalid and the message exceeded the 60-minute retry window
webhook_not_configuredBYOC (bring-your-own-carrier) list requires a webhook endpoint but none is configured
orphanMessage had no sending_list reference — likely a data integrity issue

Executor Pipeline

The message executor processes queued messages through a 10-step pipeline.
  1. Poll queue — Coordinator queries QueuedTextMessage for unclaimed messages older than 10 seconds, sorted by send time, in batches of up to 50,000
  2. Group by list — Messages are grouped by sending_list for per-list processing and rate limiting
  3. Validate list — Check that the sending list exists and is in active status; drop messages for inactive or missing lists
  4. Billing preflight — Verify the account has valid billing (payment method, no payment failures, free tier limit not exceeded); back off retryable messages 5 minutes or drop after 60-minute TTL
  5. Claim messages — Atomically claim a batch of messages using a unique claim token to prevent duplicate processing across VMs
  6. Filter stale — Discard messages queued longer than 30 minutes (STALE_THRESHOLD_MINUTES)
  7. Filter blocked content — Run message body through the blocked words checker; drop matches with BLOCKED_CONTENT status
  8. Filter blocked contacts — Check recipients against ListContactBlock (unsubscribed/blocked contacts); drop matches with CONTACT_BLOCKED status
  9. Send via provider — Submit messages to the SMS provider (Infobip, Twilio, CM) in batches with per-list rate limiting (default 17,000 messages/min)
  10. Record results — Insert RawMessage records, delete from queue, update MessageSent status, and track billing (segments sent per account)

Webhook Events

Provider delivery reports update message status asynchronously after sending.
Message StateWebhook EventDescription
deliveredmessage.deliveredCarrier confirmed delivery to handset
undeliveredmessage.undeliveredCarrier reported delivery failure
failedmessage.failedProvider rejected the message
The sent state is set immediately when the provider accepts the message. Final delivery status arrives via webhook, typically within seconds.

Timing

ThresholdValueDescription
Queue pickup delay10 secondsMessages must be at least 10 seconds old before the executor picks them up
Stale message cutoff30 minutesMessages in the queue longer than this are dropped as stale
Billing retry backoff5 minutesMessages for accounts with billing issues are retried after 5 minutes
Billing block TTL60 minutesAfter 60 minutes of billing failure, messages are permanently dropped
Stale claim recovery10 minutesClaims held by crashed workers are released after 10 minutes
Cache refresh2 minutesIncremental cache refresh for accounts, lists, and billing configs
Full cache reload1 hourComplete cache rebuild as a safety net

Next Steps

Data Model

Entity relationships

Compliance

Opt-out handling and TCPA