SMS Delivery Checklist (First 10 Minutes)¶
When SMS delivery failures occur, follow this checklist to quickly isolate the cause.
Immediate Checklist¶
- Check Phone Number Status: Is the number active?
- Review Opt-out Lists: Is the recipient on a suppression or STOP list?
- Analyze Message Content: Does it contain spam keywords or suspicious URLs?
- Check Rate Limits: Are you exceeding your throughput (MPS) limits?
- Verify Number Format: Is the recipient number in correct E.164 format?
flowchart TD
S["SMS send or delivery failing"] --> C1{"Sender phone number active?"}
C1 -- no --> A1["Reprovision or replace the number"]
C1 -- yes --> C2{"Recipient on a suppression or STOP list?"}
C2 -- yes --> A2["Remove only via proper opt-in flow"]
C2 -- no --> C3{"Content has spam keywords or suspicious URLs?"}
C3 -- yes --> A3["Revise message content"]
C3 -- no --> C4{"Exceeding MPS throughput limits?"}
C4 -- yes --> A4["Throttle to the number's MPS limit"]
C4 -- no --> C5{"Recipient number in E.164 format?"}
C5 -- no --> A5["Correct the number format"]
C5 -- yes --> ESC["Escalate to the SMS Delivery Failures playbook"] Essential CLI Commands¶
# List the phone numbers provisioned on the ACS resource
az communication phonenumber list --connection-string "<your_connection_string>"
# Delivery status is not read from the CLI. Request a delivery report when sending,
# then consume the result through Event Grid (SMS Delivery Report event).
az communication sms send --sender "<from_number>" --recipient "<to_number>" --message "test" --deliveryReport --connection-string "<your_connection_string>"
| Command | Purpose |
|---|---|
az communication phonenumber list | Lists the phone numbers provisioned on the ACS resource. |
--connection-string "<your_connection_string>" | Authenticates the request using the ACS connection string. |
az communication sms send | Sends an SMS, optionally requesting a delivery report. |
--sender "<from_number>" | Sets the provisioned ACS phone number the SMS is sent from. |
--recipient "<to_number>" | Sets the destination phone number. |
--message "test" | Sets the SMS body text. |
--deliveryReport | Enables delivery reporting; the report is delivered via Event Grid, not the CLI. |
Key KQL Queries¶
Run this in Log Analytics to see recent delivery failures and their reasons:
ACSSMSIncomingOperations
| where TimeGenerated > ago(1h)
| where OperationName == "SMSDeliveryReportsReceived"
| where ResultType == "Failed"
| summarize Count = count() by ResultDescription, ResultSignature, PhoneNumber
| order by Count desc
Immediate Triage Questions¶
- Is the failure happening for all carriers or just one?
- Are you sending international messages from a local number?
- Is your ACS resource in a region that supports the destination?
See Also¶
Sources¶
- Azure Communication Services SMS Troubleshooting Documentation
- Global SMS Carrier Best Practices