Execution Flow
1
Campaign Triggers
At the scheduled time, the campaign begins processing
2
Audience Evaluation
The system queries matching contacts from your audiences
3
Message Queuing
Individual messages are created and queued
4
Delivery
The executor sends messages via your SMS provider
5
Status Tracking
Delivery status is tracked and updated
1. Campaign Trigger
When the scheduled time arrives:- The scheduler picks up the campaign
- Validates configuration (sending list, audiences, creatives)
- Begins audience evaluation
2. Audience Evaluation
The system queries all selected audiences:- Exclude unsubscribed contacts
- Apply frequency capping (skip if sent recently)
- Verify phone numbers are valid
- Filter contacts based on timezone for TCPA compliance (contacts outside permissible sending hours are excluded)
- Exclude contacts currently enrolled in an active Welcome Journey (always applied)
3. Message Queuing
For each contact:- Select the message variant (based on percentage split or ML selection)
- Resolve any placeholders (, personalization)
- Queue the message for delivery
- Set the sendtime
Queue Priority
Messages are processed in order:- FIFO (first-in, first-out)
- All messages from a campaign are queued together
4. Message Delivery
Queued messages are delivered in parallel, grouped by sending list, with each list’s rate limit applied. See Failure Handling for reasons a message might not be delivered.Provider Integration
Each sending list has a provider configuration:Rate Limiting
Your per-list rate limit applies across your whole account, not per campaign:- Configurable per-list rate limits (default 17,000 messages/minute)
- Inter-batch delays to smooth throughput
- Automatic backoff on provider errors
5. Status Tracking
After sending, message status is reported through two fields on each message:Failure Handling
Messages that can’t be delivered are recorded with a failure reason (and a Discord alert, if configured):STALE— Message older than 30 minutes (skipped)BLOCKED_CONTENT— Message contains blocked wordsCONTACT_BLOCKED— Contact is on the block list (unsubscribed)RATE_LIMIT_TIMEOUT— Rate limit window expiredPROVIDER_ERROR— SMS provider returned an errorNO_RESPONSE— No response from provider
Permanent Failures
Messages that fail are logged withfailed status. Common causes include:
- Invalid phone number
- Blocked/blacklisted number
- Carrier rejection (spam)
Alerts
Alerts are sent via Discord when configured. This includes notifications for:- Delivery failures
- Spam complaints
- High error rates
Retry Behavior
The system has built-in recovery mechanisms:- Billing backoff: Billing-blocked messages get 5-minute backoff with a 60-minute TTL before dead-letter
- Interrupted sends: If a delivery attempt is interrupted, the message is automatically picked back up and retried, unless it has passed the 30-minute stale threshold
Delivery Webhooks
When delivery status updates are received, they update the message’s delivery status. The webhook payload looks like this:Execution Timeline
Typical timeline for a 10,000 message campaign:
Actual timing depends on:
- Audience size
- Queue depth
- Provider capacity
Link Tracking
For messages with tracked links:- Original URLs are replaced with short links
- Each short link is registered for click tracking
- When clicked, the link service logs the click
- User is redirected to the destination
Monitoring Execution
Where to Track Progress
View campaign progress:- On the Schedules page, open the Logs tab to see Queued, Processed, and Skipped counts for each run
- Go to Reports > Performance, open the Deliverability tab, and filter by Send Name to see Sent, Delivered, and Failed counts
Metrics
Troubleshooting
Messages not sending
Messages not sending
Check:
- Is the campaign scheduled and not paused?
- Is the sending list active?
- Are provider credentials valid?
- Is there a queue backlog?
High failure rate
High failure rate
Common causes:
- Invalid phone numbers in list
- Provider issues
- Carrier blocks
- Rate limiting exceeded
Slow delivery
Slow delivery
Possible reasons:
- Large queue from concurrent campaigns
- Provider rate limits
- Network issues
Common Pitfalls
Why are contacts being skipped?
Why are contacts being skipped?
Contacts may be skipped during campaign execution for several reasons:
- In-workflow exclusion: A contact already enrolled in an active Welcome Journey is always skipped; this exclusion isn’t configurable.
- Cooldown period: The contact received a message within the schedule’s Skip If Sent Within window (set in hours in the schedule’s Behavior section). Same-message and same-offer cooldowns are configured per account.
- TCPA quiet hours: The send falls outside the contact’s local TCPA-compliant window (typically 8 AM–9 PM in the contact’s timezone).
- Unsubscribed: The contact opted out via STOP keyword and is no longer active on the list.
- Stale message: The message sat in the queue longer than 30 minutes and was dropped to prevent outdated content from being delivered.
Next Steps
Link Tracking
Track clicks and conversions
Discord Alerts
Get notified of issues