"My texts aren't sending" can mean at least five different problems. The text might have been refused before it left your platform. It might have reached the carrier and been filtered. It might be sitting in a hold until morning. Or it might have been delivered to a phone that can't show it. Each one has a different cause and a different fix, so guessing tends to waste a day.
This guide sorts failures by where the text stopped, because that one fact narrows the cause faster than anything else. Then it gives the order to check things in, with the specific places to look if you send through a platform like Ready.
Step one: find where the text stopped
Every text goes through the same path: your app or platform, then the carrier network, then the recipient's phone. A failure at each stage looks different in your message log. Before you change anything, open the message record and see which of these you have.
| What the log shows | Where it stopped | Most likely cause | First thing to check |
|---|---|---|---|
| Refused or rejected immediately, never sent | Your platform | Opt-out, blocklist, landline validation | The contact's opt-out status |
| Queued or held, sends later | Your platform | Quiet hours for the recipient's area | Recipient's local time |
| Sent, then failed or undelivered | Carrier network | Unregistered number, content filtering, invalid or landline number | Registration status, then content |
| Sending very slowly, campaign "stalled" | Carrier network | Per-second throughput or daily brand cap | Your campaign size vs. your limits |
| Delivered, but the person says they never got it | Recipient's phone | Blocked number, spam folder, phone off or full | Ask them to check filtered messages |
If you want to decode the specific numeric codes carriers return for the "sent, then failed" row, our SMS error codes explainer covers them one by one. The rest of this post works through the causes in the order you should rule them out.
Device problems: usually the recipient's, rarely yours
If you text from a business number on a platform, your own phone isn't part of the send path. A dead battery or bad signal on your end won't stop a campaign. Device problems are almost always on the receiving side:
- The recipient blocked your number. The carrier often still reports the text as delivered. You won't see an error.
- The phone's spam filter caught it. iPhones and most Android phones can sort texts from unknown senders into a separate tab. "Delivered" here means it reached the phone, not that anyone saw it.
- The phone is off, out of service or out of storage. Delivery may retry for a while and then fail.
- The number is a landline or disconnected. A landline can't receive SMS at all, and a disconnected number fails at the carrier.
The last item is the one you can prevent. On Ready, GET /v1/validate/:phone tells you whether a number is mobile, landline or disconnected before you text it (see the validation docs). Ready already refuses numbers it has seen as landlines, and an account can switch on landline validation, which adds a send-time lookup for $0.003 per segment. It's off by default, so a landline Ready has not seen goes out and fails at the carrier instead.
If the log says "delivered" and the person insists they have nothing, the gap is on the handset. Our post on what a delivery receipt actually confirms explains why "delivered" and "seen" are different numbers.
Unregistered numbers: the most common cause of mass failure
If every text, or nearly every one, is failing at the carrier, check registration before anything else. US carriers expect business texts from a standard 10-digit number to sit on a registered A2P 10DLC brand and campaign. Unregistered traffic gets carrier-filtered. It doesn't always bounce with a clear error. Often it just stops arriving.
Things to confirm:
- Is the brand registered and approved? Most approvals take 2 to 7 days. A submitted registration is not an approved one.
- Is the campaign approved, and is your sending number attached to it? A number bought after approval has to be on the campaign too.
- Does what you send match the use case you registered? A campaign registered for appointment reminders that sends promos is a mismatch carriers notice.
On Ready, GET /v1/registration returns where your registration stands, and the app shows the same status. Two details matter for troubleshooting:
- 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 sending stopped partway through a month, check whether you crossed that line.
- An account that bought its number before registering sends on Ready's shared registration at the same per-text rate while its own registration is in review. So "in review" shouldn't mean "can't send at all."
Registration costs $25 at submit (the first month). After that it's $25/mo for registration + $2/mo per number. There is no setup fee. Brand vetting ($79 Standard / $179 Enhanced, one-time) is optional and only worth it for higher-volume senders.
Carrier filtering on a registered number
Registered, approved, and texts still vanish? Then the carrier is filtering on content or on volume. Registration gets you onto the road. It doesn't exempt individual messages from inspection.
Content signals
The usual triggers:
- Public link shorteners. Shared bit.ly-style domains are a known filter trigger. See why shared shorteners get filtered for the dedicated-domain fix.
- A link in the first text to a new contact. Carriers trust a conversation more than a cold link.
- Spam-pattern wording. All caps, "FREE!!!", urgency language and money claims.
- Promotional content on a campaign registered for something else.
Content-level blocking after approval is common enough that we wrote a whole post on it. The quick test: send the same message without the link and with plain wording to a few opted-in test phones on different carriers. If the plain version lands and the original doesn't, it's content.
In the app, open Ask AI and pick Spam check: it flags risky wording before you send. It reduces guesswork. It doesn't guarantee a carrier's decision.
Throughput and daily caps
A campaign that "stalls" is often just queued behind a speed limit. Carriers cap segments per second per campaign: roughly 1 to 4 for a fresh standard campaign with no vetting. T-Mobile also caps daily volume per brand by trust score, about 2,000 a day at the lowest tier.
Worked example. Assume a 5,000-contact list, a 200-character message with no emoji (2 segments), and an assumed 2 segments per second:
- 5,000 × 2 = 10,000 segments
- 10,000 ÷ 2 per second = 5,000 seconds, or about 83 minutes
Nothing is broken there. The campaign is simply metered. At the lowest T-Mobile tier, though, T-Mobile recipients beyond roughly 2,000 messages a day wait for the next day's allowance. That looks like a stall if you don't know the cap exists.
Opt-outs and blocklists: refused on purpose
If a single contact's texts are refused instantly and never reach the carrier, the contact has almost certainly opted out. On Ready, inbound STOP and UNSUBSCRIBE are honored automatically. The opt-out applies across every campaign, so a contact who replied STOP to a promo won't get your reminders either.
To check one number, call GET /v1/opt-outs/:phone; it gives the same answer Ready uses before every send. GET /v1/opt-outs lists only this account's opted-out contacts, so use the single-number check before another tool texts someone. Opt-outs and numbers on your Ban list are refused up front and not charged.
Don't try to work around an opt-out by sending from a different number or a different tool. The opt-out belongs to the person, not the number. Texting them anyway is the TCPA exposure that runs $500 to $1,500 per text. If the contact wants to hear from you again, they have to opt back in themselves. The messages docs cover how that's handled.
Missing consent attestation
On the API, every send should carry consent_attested: true. That field is your promise that the recipient agreed to receive texts. Today a send without it still goes out, with a warning in the response; once Ready enforces it, a send without it is refused with 403 api_consent_attested_required, and to a developer that can look like "the API won't send." The fix is to send the field. Only send it, though, when you actually hold that consent. Your store keeps the per-contact opt-in record: when, where and what wording.
Quiet hours: held, not failed
A text sent at 7 AM Eastern to a Pacific number would land at 4 AM. Ready holds campaign and automation sends outside permitted local hours for the recipient's area and releases them later. The log shows them as held or queued, not failed, and they're charged only when they actually send. A one-to-one or API text is held only if the window opens within about 6 hours; otherwise it is refused and you send it again.
If "some texts didn't go out" and every missing one is in the western time zones, this is almost always the reason.
What to check first, in order
Work down this list. Each step rules out a whole category before you touch content:
- Open the message log and note which row of the table above you're in.
- Refused instantly? Check opt-out status, then whether landline validation is on.
- Held? Compare the send time to the recipient's local time.
- Failing at the carrier for nearly everyone? Check registration status and the 500-text pre-registration limit.
- Failing for some contacts? Run those numbers through validation for landlines and disconnects.
- Registered but filtered? Strip links and promo wording, then test on multiple carriers.
- Slow? Do the segment and throughput math before assuming a fault.
- "Delivered" but unseen? Ask the recipient to check their filtered or unknown-senders folder, and whether they blocked you.
One cost note before you hit "resend." Re-sending a whole campaign to fix failures also re-texts everyone who already got it. Repeat the 5,000-contact, 2-segment example on the Standard rate: 10,000 segments × $0.0075 = $75, plus 10,000 × $0.0045 in carrier fees. Scrub and landline validation surcharges come on top if they're switched on. Filter the resend to the contacts that actually failed.
When switching providers won't fix it
Being honest here: registration, content filtering, throughput caps and opt-outs are carrier rules. Twilio, Telnyx, GoHighLevel's LC Phone and Ready all sit under the same ones. If your problem is a shortened link or an unregistered campaign, moving platforms just moves the problem.
What a platform can change is how fast you see the cause. That means:
- registration handled in-app, with a status you can query
- opt-outs that are visible per contact
- validation before you send
- quiet hours enforced for you instead of discovered by you
If you text from a personal phone and the trouble is on that handset, no business platform is the fix. Restart the phone and check your own carrier first.
The short version
Find where the text stopped, then fix that stage. Instant refusals point to opt-outs or consent. Mass carrier failures point to registration. Selective failures point to bad numbers or content. Slow campaigns point to throughput. "Delivered but missing" points to the recipient's phone.
If you want to test this path on a registered setup, the first 20 one-to-one texts on Ready are free (a card on file is required). Use them before you pay for registration. You can start here, or read the quickstart first.