If you're asking "why are my text messages not delivering," the cause is usually one of six things: an unregistered or rejected 10DLC campaign, carrier filtering on your content or links, landlines or dead numbers on your list, contacts who opted out, sends waiting for the recipient's quiet hours to end, or a new number sending too much too soon. Each one leaves a different trace in your message statuses, so you can usually find the cause in a few minutes instead of guessing.
This post is the checklist we'd run, in the order we'd run it. The first three items explain most failures. The last three are less common but easy to miss because some of them aren't failures at all.
Read the status before you change anything
Before you rewrite a message or buy a new number, look at what actually happened to the texts that didn't arrive. In Ready, every message carries a status and, when it fails, error detail from the carrier or from us. You can see this in the Inbox, on the text itself, or pull it with GET /v1/messages (it pages with before_id). The current list of statuses and error codes is in the messages API docs. We won't copy it here, because it changes and a stale list does more harm than none.
The useful distinction is where the text stopped:
- Refused up front by Ready. The text never left. Opt-outs and numbers on your Ban list are refused before sending, and you aren't charged for them. Numbers Ready has already seen as landlines are refused too, on every account.
- Held. The text is waiting for the recipient's quiet hours to end. It sends later and is charged only when it sends. An API text that would wait more than 6 hours is not held: it is refused.
- Rejected or failed downstream. The carrier or the handset side turned it away. The error detail tells you whether it was filtering, an invalid number or something else.
- Marked delivered but never seen. This is the hardest case. A delivered status is what the carrier reported, and some filtering is silent. We cover the gap in why your 98% delivered rate can mislead you.
| What you see | Likely cause | Where to check |
|---|---|---|
| Most or all texts fail, across every contact | Registration missing, pending or rejected | GET /v1/registration, the registration page in the app |
| Some messages fail, others from the same number go through | Content or link filtering | Error detail on the failed messages; compare their bodies |
| Specific contacts fail every time | Landline, disconnected or invalid number | GET /v1/validate/:phone |
| Refused before sending, not charged | Opt-out or blocklist | GET /v1/opt-outs/:phone |
| Sitting in a held state | Quiet hours in the recipient's area | Message status; it sends when the window opens |
| Fine at low volume, failures climb as you scale | New number, low trust tier, per-second limits | Send volume per day vs your campaign's limits |
1. Your 10DLC registration is missing, pending or rejected
US carriers filter unregistered business traffic on 10-digit numbers. If nothing is getting through, start here.
On Ready, an account can send up to 500 texts a month before it registers, at its normal per-text rate. After that it has to register. If you bought your number before registering, you send on Ready's shared registration at the same per-text rate while your own registration is in review. Most approvals take 2 to 7 days.
What to check:
- Not registered yet. Registration is brand plus campaign. There's no setup fee. The charge when you submit is the first month, $25. After that the monthly cost is $25 for registration + $2 per number.
- Rejected. The usual reasons are sample messages that don't match the use case, missing opt-in language, or content in the restricted categories (sex, hate, alcohol, firearms, tobacco, often shortened to SHAFT). We walk through a rewrite that passes in 10DLC rejected for SHAFT.
- Approved, but for the wrong use case. If you registered reminders and now send promotions, carriers can treat the mismatch as a reason to filter.
2. Carriers are filtering your content or links
This is the most common cause when some messages from a registered number arrive and others don't. Registration gets you onto the road. It doesn't stop carriers from inspecting each message.
Usual triggers:
- Public link shorteners. Shared shortener domains are used by spammers too, so carriers distrust them as a group. A dedicated branded domain is the fix, as covered in shared bit.ly links get your texts filtered.
- A link in the very first text to a new contact. Starting with a plain text and sending the link after they've engaged usually helps.
- Promo patterns. All caps, stacked exclamation marks, "FREE", "act now", and urgency combined with money language.
- Restricted content. Anything in the SHAFT categories, or cannabis, loans and debt relief, can be filtered even on an approved campaign.
Ready's AI message writer includes a spam-filter check that flags these patterns before you send. It reduces risk but doesn't guarantee anything. Carriers change their filters without notice, so test any new template on a few internal phones before a campaign goes out.
3. You're texting landlines, dead numbers or bad formats
If the same contacts fail every time while everyone else receives your texts, the problem is the numbers, not the message.
Common culprits are landlines collected from web forms, numbers that were disconnected or reassigned since you collected them, and badly formatted entries. The API expects E.164 format (+12125550199). A 10-digit US number is treated as +1, but a stray extension or a missing digit won't be.
You can check a number with GET /v1/validate/:phone, which reports whether it's mobile, landline or disconnected. There's more in our phone number validation API guide. Landline validation on sends is an optional extra of $0.003 per segment, off by default. With it switched on, every number is looked up at send time and landlines are refused, not just the ones Ready has already seen.
A worked example, with stated assumptions. Say you have a 10,000-contact list. We'll assume 6% of the numbers are dead and the message is 2 segments.
- Wasted segments: 600 numbers × 2 segments = 1,200 segments.
- Wasted cost on Standard: 1,200 × $0.0075 = $9 in per-segment charges, plus 1,200 × $0.0045 = $5.40 in carrier fees, $14.40 in all.
- The bigger cost: a high failure rate is a signal carriers watch, and it affects the deliverability of every other text on that number.
Ready's all-in prices per segment include the carrier fee but not screening: Scrub lists and Number validation, the two switches in Settings under Compliance, each add $0.003 per segment when switched on, shown as screening on your bill, and both are off by default. Unless you turn the opt-out footer off, the first text to each contact, and one again from time to time, also gets "Reply STOP to opt out" and your business name if the message does not already have them, so a text close to the segment limit can bill one more segment.
Cleaning the list once is cheaper than paying that every month.
4. The contact opted out
If a text was refused before it left and you weren't charged, check opt-outs first. When a contact replies STOP or UNSUBSCRIBE, Ready records it and blocks that number across every campaign on the account, not just the one they replied to.
Use GET /v1/opt-outs/:phone for one number or GET /v1/opt-outs for this account's opted-out contacts (the single-number check also covers numbers that list leaves out).
The usual surprise is a contact who says "I never opted out." Often they replied STOP to a different campaign months ago. If they now want your texts, they have to opt back in themselves. Don't remove the block for them. Honoring opt-outs is the sender's legal responsibility, and the block is there to protect you.
5. The text is held for quiet hours, not failed
A text sitting in a held state hasn't failed. Ready holds sends that fall outside permitted local hours, based on the recipient's area, and releases them when the window opens. You're charged only when the text actually sends. Campaigns, drip campaigns and automations wait up to 24 hours for the window; a one-to-one or API text is held only if the window opens within 6 hours, otherwise it is refused and must be resent; a one-to-one reply to someone who texted you in the last 24 hours goes out at any hour.
The classic case is a 9 AM Eastern campaign. That's 6 AM in California, so West Coast contacts get their texts hours later, which can look like a delivery problem when you check at 9:15. If your list covers several time zones, expect the campaign to arrive in waves. Quiet hours reduce TCPA exposure; they don't make you immune to it.
6. A new number is sending too much too soon
If a fresh number delivers fine for the first few hundred texts and then failures climb, look at volume. Carriers trust new numbers less, and limits apply even after registration:
- Per-second rate. A fresh standard campaign with no vetting typically gets about 1 to 4 segments per second. Higher use-case tiers get tens per second, roughly 10 to 75. These are approximations, since carriers publish no official rate card.
- T-Mobile daily brand caps. These depend on trust score. The lowest tier is about 2,000 messages a day, and the higher tiers are roughly 10,000, 40,000, 100,000 and 200,000. AT&T throttles per second and per minute instead of setting a hard daily cap.
- Segments are counted, not messages. One emoji cuts a segment to 70 characters, so a 140-character text with one emoji is 3 segments instead of 1. A 2,000-message campaign with emoji can therefore be 6,000 segments against your limits.
The fix is to ramp up gradually over a week or so, as laid out in the 7-day ramp that builds carrier trust. Brand vetting ($79 Standard / $179 Enhanced, one-time) can raise your trust score. It only moves your daily cap if the new score crosses into a higher tier, and it doesn't change your per-second rate. Most senders don't need it.
Run the checks in this order
- Registration. Is it approved, and for the use case you're actually sending?
- Opt-outs and refusals. Were the texts refused before sending and not charged?
- Quiet hours. Are the texts held rather than failed, or were they refused because the window was too far off?
- Number validity. Do the same contacts fail every time?
- Content and links. Do some templates fail while others arrive?
- Volume. Did failures start when you scaled up?
Steps 2 and 3 take seconds to check and rule out the cases that aren't really failures. Step 5 is where most of the remaining time goes.
FAQ
Why are my texts delivered to some people but not others? If it's the same message, check those numbers first: validate them and look up their opt-out status. If it's different messages from the same number, compare their content and links, because carriers filter message by message.
Does a "delivered" status mean the person got the text? It means the carrier reported it as delivered. Some filtering is silent, so a text marked delivered can still go unseen. A low reply rate on a template that used to perform well is often a sign of this.
Am I charged for texts that don't go out? Opt-outs and numbers on your Ban list are refused up front and not charged. Texts held for quiet hours are charged only when they send. On Standard, a sent segment is $0.0075 plus a $0.0045 carrier fee.
How long does 10DLC approval take? Most approvals take 2 to 7 days. If you bought your number before registering, you can send on Ready's shared registration at the same rate while yours is in review.
Will a new number fix my delivery problems? Usually not. A new number starts with less trust than the old one, and if the cause was content, list quality or registration, the same problem follows you to the new number.
The practical takeaway
Texts that don't arrive almost always leave a trace. Read the status before you change anything, rule out the cases that aren't real failures (opt-outs, quiet-hours holds) first, then work through registration, number validity, content and volume.
If you're setting up on Ready, use the first 20 free texts (one-to-one sends) to test your templates on your own phones before you register. Then register and ramp volume gradually. You can create an account here, and the API quickstart covers your first API send.