Back to blog

deliverability

SMS Deliverability Problems: Why Texts Never Arrive

Diagnose SMS deliverability problems: carrier filtering, 10DLC, content triggers, and number reputation — plus the fix for each. Start free.

Noa

SMS Deliverability Problems: Why Texts Never Arrive

Your platform says the message went out. Your customer says nothing arrived. Nobody got an error. That gap is what SMS deliverability problems look like in practice: US carriers filter suspicious traffic silently, so a blocked text and a delivered text can produce the exact same "sent" confirmation on your end. This guide walks through the four causes behind vanishing texts — carrier filtering, content triggers, number reputation, and volume patterns — and gives you a concrete diagnosis workflow and a fix for each one.

Sent Is Not Delivered: Why Texts Fail Silently

The first thing to understand about SMS deliverability problems is that "sent" and "delivered" are two different events, and the gap between them is where messages disappear.

When you send an SMS, the message passes through several hands: your messaging provider accepts it, hands it to a carrier gateway, the gateway routes it to the recipient's carrier, and the recipient's carrier pushes it to the handset. A message can clear the first two or three steps — generating a "sent" status — and still get dropped at the final carrier without any error flowing back to you.

This is by design. Carriers do not want spammers to know which messages got blocked, because explicit failure signals help spammers reverse-engineer the filters. The side effect is that legitimate senders get the same silence. Your delivery report says the message left the building; it never says whether it walked in the recipient's door.

Delivery receipts (DLRs) make this worse, not better. A DLR is the receiving network's confirmation that a message reached the handset — but carriers generate them inconsistently, some networks fake positive receipts for filtered messages, and international routes often return nothing at all. Treat a "delivered" confirmation as strong evidence and the absence of one as a question mark, never as proof either way.

A message lifecycle with senderZ makes the distinction visible:

| Status | Meaning | |--------|---------| | queued | Accepted by the API, waiting for dispatch | | sent | Handed to the network | | delivered | Delivery confirmed by the receiving side | | failed | Rejected — error_reason explains why |

The pattern to watch for: messages that reach sent but never reach delivered. One or two is noise. A cluster of them — especially to recipients on the same carrier — is the signature of silent filtering.

Carrier Filtering and 10DLC: Why SMS Gets Blocked

The single biggest cause of SMS deliverability problems in the US is the carrier filtering system built around 10DLC registration.

Since 2021, US carriers require businesses sending application-to-person (A2P) SMS from standard 10-digit numbers to register with The Campaign Registry — their brand, their use case, and sample message content. Registered traffic gets a trust score that determines throughput. Unregistered A2P traffic gets throttled aggressively or blocked outright; T-Mobile in particular blocks unregistered A2P traffic rather than merely slowing it down.

Here is the part that surprises people: carriers classify traffic by behavior, not by what you call it. If you send texts through an A2P gateway without registration, filtering starts immediately. If you registered but your actual messages drift from the sample content you declared — say you registered "appointment reminders" and started sending promotions — carriers can flag the mismatch and filter the campaign.

The full registration process, its costs, and its timelines are covered in our guide to what 10DLC is and how to send SMS without it. The short version for troubleshooting purposes:

  • Unregistered + A2P route → expect heavy filtering. This is the default explanation for a brand-new integration where nothing arrives.
  • Registered + low trust score → expect throughput caps, delayed delivery, and partial filtering during volume spikes.
  • Registered + content drift → expect a campaign that worked for months to degrade suddenly.

senderZ approaches this differently: iMessage-capable recipients get their messages over Apple's network, which carrier SMS filters never touch, with SMS as the fallback for everyone else. The comparison numbers are in iMessage vs SMS: deliverability, speed, and open rates.

Content Triggers That Get Texts Blocked

Even fully registered senders lose messages to content filtering. Carrier filters score every message body, and certain patterns raise that score sharply.

Restricted categories (SHAFT-C). The CTIA messaging principles — the industry rulebook US carriers enforce — restrict content involving sex, hate, alcohol, firearms, and tobacco, with cannabis added to the list. This applies even when the business itself is legal. A licensed dispensary or a wine club sending SMS promotions will see filtering regardless of registration status.

Public link shorteners. Links through shared shorteners (bit.ly, tinyurl, and similar) are one of the strongest spam signals in existence, because spammers use them to hide destinations and rotate domains. Use your own branded domain for links, full URLs, or no link at all.

Spam-pattern formatting. ALL-CAPS words, repeated exclamation points, dollar amounts paired with urgency ("$500 NOW!!"), and prize/gift-card language all push a message toward the block threshold. These filters were trained on years of actual spam; if your message resembles that corpus, it inherits its fate.

Identical bodies at scale. Sending the same exact text to hundreds of recipients in a short window looks like a blast, because it is one. Templates with variables — a name, an appointment time, an order number — make each message body unique and dramatically change how filters score the batch.

Here is what a rewrite looks like in practice. The before version trips four separate triggers; the after version says the same thing and trips none:

Before (filtered):

🔥 FLASH SALE!!! Save $200 TODAY ONLY on all packages!
Click here → bit.ly/3xK9zQ2 — don't miss out!!!

After (delivers):

Hi Sam, the spring package you asked about is $200 off
through Friday. Details: https://offers.yourbusiness.com/spring
Reply STOP to opt out.

The rewrite removes the public shortener, the all-caps urgency, the repeated punctuation, and the anonymous blast tone — and adds a name variable so no two message bodies in the campaign are identical.

A practical test: read your message and ask whether a stranger receiving it from an unknown number would tap "Report Junk." Carrier filters are an approximation of that reaction.

Number Reputation and Volume Patterns That Hurt Delivery

Filtering decisions are not made on message content alone. Every sending number carries a reputation, and traffic patterns feed it continuously.

New numbers have no history. A number that was activated on Monday and sends 400 texts on Tuesday matches the exact profile of a spam operation — spammers burn through fresh numbers constantly. Carriers respond by filtering first and observing later. This is why warming matters: senderZ ramps new numbers gradually, starting around 10 new contacts per day in the first week and scaling up over two weeks, so the number builds a normal-looking history before carrying real volume.

Spam reports poison reputation fast. When recipients report a message as junk — via the report button on their phone or by forwarding it to 7726, the carrier spam-reporting shortcode — those reports attach to your sending number. A handful of reports against a low-volume number can be enough to trigger filtering for everyone you text afterward.

Bad list hygiene looks like spamming. A list full of disconnected numbers, landlines, and people who never agreed to hear from you produces high failure rates and high complaint rates — the two metrics filters weigh heaviest. Consent is also a legal requirement, not only a deliverability tactic: the FCC's rules on unwanted texts require prior consent for automated texts to mobile numbers, and honoring opt-outs is mandatory.

Bursts and spikes. Even an established number gets flagged when its behavior changes abruptly — a number that averages 30 texts a day suddenly sending 3,000 reads as compromised or sold. Spread large sends over time instead of firing them in one window.

How to Diagnose SMS Deliverability Problems

When texts are going missing, resist the urge to guess. The status data tells you which cause you are dealing with.

Step 1 — check individual message status. Every senderZ message exposes its full lifecycle:

curl https://api.senderz.com/v1/messages/01JMSGID0EXAMPLE0000000000 \
  -H "Authorization: Bearer sz_live_your_key"
{
  "message_id": "01JMSGID0EXAMPLE0000000000",
  "direction": "outbound",
  "status": "failed",
  "channel": "sms",
  "to": "+15551234567",
  "from": "+15559876543",
  "error_reason": "carrier_error",
  "attempt_count": 1,
  "sent_at": "2026-06-20T17:04:12Z",
  "delivered_at": null,
  "created_at": "2026-06-20T17:04:11Z"
}

An explicit failed with an error_reason is the good case — you know what happened. The full list of reasons is in the error codes reference.

Step 2 — look for the silent-filter pattern in bulk. Pull recent messages and compare sent against delivered:

const res = await fetch(
  'https://api.senderz.com/v1/messages?limit=100',
  { headers: { Authorization: `Bearer ${process.env.SENDERZ_API_KEY}` } }
)
const { data } = await res.json()

const outbound = data.filter((m) => m.direction === 'outbound')
const stuck = outbound.filter((m) => m.sent_at && !m.delivered_at)

console.log(`${stuck.length}/${outbound.length} sent but never confirmed delivered`)

A rising ratio of sent-but-never-delivered messages — with no failed statuses to explain it — points at carrier filtering rather than bad numbers or bad requests.

Step 3 — verify the recipients are reachable at all. Disconnected numbers and landlines masquerade as deliverability problems. Check before you send:

curl https://api.senderz.com/v1/capabilities/%2B15551234567 \
  -H "Authorization: Bearer sz_live_your_key"
{
  "phone_number": "+15551234567",
  "imessage": true,
  "rcs": true,
  "sms": true,
  "carrier": null,
  "line_type": null,
  "recommended_channel": "imessage",
  "cached": false,
  "checked_at": "2026-06-20T17:10:03Z"
}

Step 4 — run a carrier segment test. Filtering decisions are per-carrier, so a healthy aggregate number can hide a blackout on one network. Send the same message to a small set of known-good numbers you control or can verify — one on each major carrier — and compare outcomes:

  • Arrives on two carriers, vanishes on the third → number or campaign is filtered on that specific network.
  • Vanishes everywhere from your platform number but arrives from a personal phone → your sending number's reputation is the problem, not the content.
  • Vanishes everywhere regardless of sending number → the content itself is tripping filters; rewrite and retest.

Step 5 — isolate the variable. If delivery fails broadly, suspect registration or number reputation. If delivery fails only for one campaign, suspect content. If delivery degraded suddenly on a number that used to work, suspect a volume spike or a wave of spam reports. Change one thing at a time — reword the message, slow the send rate, switch the sending number — and measure the delivered ratio after each change.

The whole workflow condenses into a lookup table:

| Symptom | Likely cause | Fix | |---------|--------------|-----| | Nothing delivers from a brand-new integration | Unregistered A2P traffic | Register 10DLC, or route iMessage-first | | sent but never delivered, one carrier only | Carrier-specific number filtering | Segment test, rest the number, slow the ramp | | One campaign fails, others deliver | Content trigger in that campaign | Rewrite: no shorteners, no caps, add variables | | Sudden degradation on a working number | Volume spike or spam-report wave | Throttle sends, review recent complaints | | High explicit failed rate with error_reason | Bad numbers, landlines, opt-outs | Clean the list, check capabilities pre-send |

Fixes That Improve Text Message Delivery

Each cause has a matching fix. In order of impact:

Route around carrier filters where you can. iMessage traffic travels over Apple's network as data — carrier SMS filtering, 10DLC scoring, and content surcharge rules never see it. senderZ checks each recipient and delivers over iMessage first, falling back to SMS automatically when the recipient can't receive it:

curl -X POST https://api.senderz.com/v1/messages \
  -H "Authorization: Bearer sz_live_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+15551234567",
    "channel": "auto",
    "body": "Hi Sam — your appointment is confirmed for Tuesday at 2pm. Reply STOP to opt out."
  }'

The same call in TypeScript:

const res = await fetch('https://api.senderz.com/v1/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.SENDERZ_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    to: '+15551234567',
    channel: 'auto', // iMessage first, SMS fallback
    body: 'Hi Sam — your appointment is confirmed for Tuesday at 2pm. Reply STOP to opt out.',
  }),
})

const message = await res.json()
// { "message_id": "01JMSG...", "status": "queued", "channel": "auto", "estimated_delivery_ms": 2000 }

For a typical US contact list, a large share of recipients are iMessage-capable, which means a large share of your traffic exits the carrier filtering problem entirely.

Fix the content before blaming the pipes. Remove public shorteners, drop the all-caps urgency, personalize with template variables so no two bodies are identical, and keep restricted-category content off SMS. One rewrite is cheaper than a month of reputation repair.

Warm new numbers and respect volume curves. Start small, grow steadily, and avoid bursts. senderZ enforces warming schedules on new numbers automatically, because a filtered number hurts every tenant sharing the pool.

Clean the list and keep consent tight. Verify reachability before campaigns, remove numbers that repeatedly fail, and only text people who agreed to hear from you. senderZ processes STOP replies the moment they arrive and blocks any future send to that contact before dispatch, and marketing messages are held during quiet hours (8pm–8am local time) — both of which keep complaint rates down and reputation intact.

Monitor the delivered ratio continuously. Deliverability is not a one-time setup task. A weekly look at sent-vs-delivered per sending number catches degradation while it is still a dip instead of a blackout.

FAQ

FAQ

Frequently asked questions

Why does my message show sent but the recipient never got it?

Sent means the message was handed to the network; delivered means the receiving side confirmed it. Carriers filter suspicious SMS silently between those two steps, so a blocked message often shows sent forever without reaching delivered. A cluster of sent-but-never-delivered messages is the classic signature of carrier filtering.

How do I know if my number is being filtered by carriers?

Look for a falling delivered ratio with no explicit failures, especially concentrated on recipients of a single carrier, and test messages that arrive when sent from a personal phone but not from your platform number. Those three signs together point at number-level filtering rather than content or list problems.

Do SMS deliverability problems affect iMessage too?

No. iMessage travels over Apple's network as data, so carrier SMS filters, 10DLC registration, and A2P surcharges never apply to it. Apple runs its own abuse protections, so spam behavior still has consequences, but the silent carrier filtering described in this guide is specific to SMS.

Does 10DLC registration fix SMS deliverability problems?

It fixes the registration layer: registered traffic on A2P routes stops being blocked for being unregistered. It does not exempt you from content filtering, number reputation, or volume scoring — registered campaigns still get filtered for spam-pattern content or sudden spikes. Registration is necessary on A2P routes, not sufficient.

How many texts can I send from a new phone number?

Ramp up gradually. A practical warming curve starts around 10 new contacts per day in the first week and scales up over two weeks as the number builds history. senderZ enforces this automatically on new numbers; texting existing contacts who already reply to you carries far less risk than contacting new ones.

How long does it take to recover a filtered number?

There is no published reset timer — carriers do not disclose how their reputation systems decay. In practice, senders see recovery over days to weeks after the offending behavior stops: pause sends, fix the content or volume pattern that caused the filtering, then re-warm the number slowly. If the number was hit with heavy spam reports, replacing it and warming a fresh one is often faster than waiting.


If your texts are disappearing and you would rather not spend a quarter fighting carrier filters, senderZ routes each message over iMessage first with SMS fallback, enforces number warming and opt-outs automatically, and shows you the full delivery lifecycle for every message. Send your first message in minutes with the quickstart, or start a 14-day free trial — no credit card required.

Tagged deliverability sms carrier-filtering troubleshooting

Ready to start sending?

Create your free account and send your first message in minutes.