An error text message code tells you why a carrier or your provider refused or failed to deliver a text. Almost every code falls into one of four buckets: a bad number, a blocked or filtered message, a compliance refusal, or a capacity limit, and each bucket has its own fix.

The specific numbers differ by provider. The causes do not. This guide groups the common codes by cause, gives the fix for each, and shows which ones you can prevent before a send instead of reading about them in a delivery report afterward. We make Ready, so we also explain what our platform refuses up front and where you still have to do the work yourself.

Why you get an error text message on a business send

Every text passes through at least three systems before it reaches a phone: your sending platform, the carrier network it hands off to, and the recipient's carrier. Any of them can reject it, and each reports back in its own vocabulary.

Here is the rough order of failure points:

  1. Your platform refuses the send before it leaves. Typical reasons are an invalid number, an opted-out contact, or a missing registration.
  2. The upstream carrier network rejects it. The usual causes are unregistered 10DLC traffic, a sending rate above your cap, or a number that isn't provisioned for SMS.
  3. The recipient's carrier filters it or can't find the handset. Content looks like spam, the phone is off or out of range, or the number is a landline.

Errors from point 1 are cheap and fast to fix. Errors from point 3 are the ones that quietly eat your deliverability, because carriers learn from patterns over time.

The common delivery error codes and what they mean

The table uses Twilio's numbering because it is the most widely documented set and many developers already know it. Other providers use their own codes for the same conditions, so match on the meaning, not the number.

Code (Twilio numbering)What it meansBucketThe fix
21211Invalid "To" numberBad numberNormalize to E.164 (+1 and 10 digits for US) and validate before sending
21610Recipient has unsubscribedComplianceDon't retry. Suppress the contact everywhere
30001Queue overflowCapacitySlow your send rate to your campaign's per-second limit
30003Unreachable handsetBad number / temporaryRetry once later. If it repeats, treat the number as stale
30004Message blockedFiltered / complianceRecipient blocked you or the carrier blocked the route. Stop sending to it
30005Unknown handsetBad numberNumber is disconnected or doesn't exist. Remove it
30006Landline or unreachable carrierBad numberValidate line type and remove landlines before sending
30007Carrier filtered (spam)FilteredFix content, links and registration. See below
30008Unknown errorUnknownRetry once. If it clusters on one carrier, look for a filtering pattern
30034Unregistered 10DLC numberComplianceRegister the brand and campaign, and attach the number

Temporary vs permanent errors

This distinction decides your retry logic:

  • Permanent (don't retry): invalid number, unknown handset, landline, unsubscribed, blocked. Retrying these does nothing except add more failures to your sending history.
  • Temporary (retry once, with a delay): unreachable handset, queue overflow, unknown error. Phones get switched off and networks hiccup. One retry after an hour or so is reasonable. Five retries in five minutes is not.
  • Fix-first (don't retry until something changes): carrier filtering and unregistered traffic. The same message from the same number will fail the same way.

Filtering errors: 30007 and 30034 deserve their own section

Most "my texts aren't delivering" complaints end up here, and they are the hardest to diagnose because the carrier rarely tells you what it disliked.

Unregistered traffic (30034 and its equivalents)

US carriers expect application-to-person texts from a 10-digit long code to run on a registered A2P 10DLC brand and campaign. Unregistered traffic gets carrier-filtered. That is policy, not bad luck. If you're unclear on what registration covers, our 10DLC explainer walks through it.

On Ready, registration is handled in-app. The monthly cost is $25/mo for registration + $2 per number. There is no setup fee, and the charge at submit is the first month, $25. Most approvals take 2 to 7 days.

Two Ready details matter for this error:

  • 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.
  • 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.

Platforms that register on behalf of their customers can check status with GET /v1/registration. The registration docs cover the flow.

Content filtering (30007)

Registration gets you on the road. It doesn't stop carriers from reading the message. Common triggers include:

  • A link in the first text to a new contact, especially a public URL shortener.
  • A brand-new number sending at volume on day one. Carriers have no history to trust yet.
  • Content that doesn't match your registered use case, such as promotional copy on a campaign registered for account notifications.
  • Spam-pattern wording: all caps, "FREE!!!", or urgency stacked on urgency.

We've written up the specifics in why approved campaigns still get filtered and the ramp schedule for a new number.

The fix for 30007 is almost never "send it again." Change the content, warm the number, or align the campaign use case with what you actually send. Ready's AI message writer includes a spam-filter check that flags risky wording before you send. Treat it as a second pair of eyes, not a guarantee.

Bad-number errors: the cheapest ones to prevent

Codes 21211, 30005 and 30006 all mean the same thing in practice: you tried to text a number that can't receive a text. They are 100% preventable, because the number was bad before you hit send.

Normalize the format

Store numbers in E.164 (+12125550199). On Ready's API, a 10-digit US number is treated as +1, which catches the most common formatting slip. Formatting won't fix a number that's simply wrong, though.

Validate the line type

Landlines can't receive SMS, and lists gathered from web forms often contain office numbers. Ready refuses known landlines up front and doesn't charge for them: a number Ready's own send logs already show as a landline is refused on every account. If you want every send checked against a line-type lookup, landline validation can be switched on per account for $0.003 extra per segment. It's off by default.

You can also check a single number before you store it:

curl https://api.tryready.com/v1/validate/+12125550199 \
  -H "X-API-Key: YOUR_KEY"

The response fields are in the number validation docs. We won't paraphrase them here.

Retire numbers that keep failing

A number that returns "unreachable" every send for a month is effectively dead. Keep a failure counter per contact and suppress after a few consecutive hard failures. Your exact threshold is a judgment call. Somewhere around three is common.

Compliance and capacity errors

Opt-outs (21610 and similar)

If a contact replied STOP, any further send should be refused, and you shouldn't try to work around that. On Ready, inbound STOP and UNSUBSCRIBE are honored automatically and propagate across campaigns, so the contact can't be messaged again. Sends to opted-out and numbers on your Ban list are refused up front and not charged. Platforms can read the list with GET /v1/opt-outs or check one number with GET /v1/opt-outs/:phone (docs).

Quiet hours aren't an error, but they look like one

On Ready, a text sent during the recipient's quiet hours is held and charged only when it sends. If a campaign that went out at 9 AM Eastern to a West Coast-heavy list (6 AM Pacific) shows Waiting, with a line saying some texts are held for quiet hours and when they will send, that's why. Our post on timezone-aware quiet hours explains the logic. 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.

Rate limits (30001 queue overflow)

Carriers cap how fast a campaign can send. These caps are approximate, because carriers publish no official rate card:

  • Per-second rate: roughly 1 to 4 segments per second for a fresh standard campaign with no vetting. Higher use-case tiers get tens, roughly 10 to 75.
  • T-Mobile daily brand cap: about 2,000 messages/day at the lowest trust score, stepping up through ~10,000, ~40,000, ~100,000 and ~200,000.
  • AT&T: throttles per second and per minute rather than with a hard daily cap.

Worked example: at an assumed 2 segments per second, a 10,000-contact campaign of one-segment texts takes about 5,000 seconds, roughly 83 minutes. Count segments, not messages. A 140-character text with one emoji is 3 segments instead of 1, which triples both the time and the cost.

Optional Brand Vetting ($79 Standard / $179 Enhanced, one-time) can raise your trust score. It only moves the daily cap when it crosses a tier, and it doesn't change the per-second rate.

A triage order when errors spike

When failures jump, work through it in this order:

  1. Group failures by code. One dominant code points to one cause.
  2. Group by carrier. Filtering concentrated on one carrier usually means content or reputation, not a bad list.
  3. Check registration status. A lapsed or rejected campaign explains a sudden wall of unregistered-traffic errors.
  4. Diff the content. What changed since the last clean send? A new link, a new shortener, or an emoji?
  5. Check list source. A newly imported list with lots of 30005 and 30006 is a list-quality problem.

For the full checklist, see why business texts aren't delivering.

What the cost side looks like

Prevention is cheap next to exposure. On Ready Standard, a 10,000-contact, one-segment campaign is 10,000 × $0.0075 = $75 plus 10,000 × $0.0045 in carrier fees, all-in excluding the compliance surcharge.

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.

Running the standalone TCPA & DNC Litigator Scrub on that list first costs 10,000 × $0.005 = $50. That's small against TCPA exposure of $500 to $1,500 per text. It reduces risk. It doesn't make you lawsuit-proof, and compliance remains the sender's responsibility.

FAQ

What does "error text message" mean on a business send? It's a delivery failure report. Your platform, a carrier network or the recipient's carrier refused or couldn't deliver the text, and the code tells you which and roughly why.

Should I automatically retry failed texts? Only temporary errors, and only once after a delay. Never retry opt-outs, invalid numbers, landlines or carrier-filtered messages without changing something first.

Why do texts fail even after my 10DLC campaign was approved? Approval covers registration, not content. Links in first messages, a cold number sending at volume, or copy that doesn't match your registered use case can still trigger carrier filtering.

Am I charged for texts Ready refuses? Sends to opted-out numbers, numbers on your Ban list and known landlines are refused up front and not charged. Quiet-hours sends are held and charged only when they actually send.

Does Ready publish its own error code list? We don't reproduce one here. Check the API error docs for exactly what each response returns, rather than relying on a blog summary.

The takeaway

Sort every error into one of four buckets before you touch anything: bad number, filtered, compliance or capacity. Bad numbers and opt-outs should be stopped before a send, not discovered after. Filtering needs a content or registration fix, not a retry. Capacity errors need a slower send rate, not a faster one.

If you want registration, opt-out propagation, quiet hours and landline refusal handled in one place, you can try Ready. The first 20 texts are free one-to-one sends, and to send any text you need a card and a number ($2 a month, the first month charged when you get it).