Why a text failed
Every text you sent and got is in Reports → Logs with its status, and you can click a failed one to see why, in plain words.
Reports has three tabs. Texts shows delivery rates, engagement and a Why texts failed list that counts failures by reason for the dates you pick. Calls shows dials, Connect rate, Talk time, Conversations, How calls ended and Dials by rep. Logs lists every text and call, one per row. Reports fill in after your first send. In Logs, switch between Texts and Calls, search by contact, number or message, pick a Period, and filter by Status (Outcome for calls) and Channel (SMS, MMS or iMessage for texts, Phone or FaceTime Audio for calls), and by Sub-account if you have them. Filtered to failed texts, the same Why texts failed list counts them by reason. Click Export CSV to download up to 50,000,000 rows. To get an alert when texts start failing, see alerts.
#Common reasons
| What the log says | What to do |
|---|---|
| Out of sending credit | Top up in Settings → Billing and turn on Auto top-up. Nothing was sent. |
| Bad or rejected number, or the number was deactivated | The number is wrong or no longer in service. Remove it from your list. |
| Held because earlier texts to this number didn’t deliver | With Number validation on, Ready skips a number whose earlier texts keep failing. Check the number with the contact. |
| Landline | Landlines can’t get texts. Remove the number from your list, or call it instead. |
| Opted out | The contact opted out, for example by texting STOP. Only they can opt back in, by texting START or UNSTOP. |
| Too many texts to this person | This person got a lot of texts from you in the last hour, so the carrier is holding new ones. It usually clears within a couple of hours. |
| Carrier flagged your content as spam | Reword it with fewer links and less pushy language, then send again. |
| Couldn’t confirm the number’s time zone | Not sent, and you weren’t charged. Ready couldn’t tell this number’s time zone, which happens with toll-free and some VoIP numbers, so it couldn’t check legal texting hours (quiet hours). Nothing resends it. Check the number with the contact. |
| Number not linked to your registration, or the carrier refused your sending number | Email support@tryready.com and we’ll fix the number’s registration. |
Whether a failed text is charged: see Billing.
#Send a failed text again
Ready resends some failed texts itself, only certain kinds and only inside their windows: Failures Ready resends for you lists which ones and when. Don’t resend one while Ready still might, or the person gets it twice and you pay twice.
A resend is billed like the first send. It stays the same message, with the same id: its status goes from failed back to queued, then to delivered or failed.
Reason (error_reason) | Send it again? |
|---|---|
Expired, undeliverable or rejected (expired, undeliverable, rejected) | Not yet: Ready may resend it. If it’s still failed 6 hours after you sent it (24 for drip and automation texts), Ready won’t, so send it again yourself. |
Temporary failure (temporary_failure) | Yes, later. Ready doesn’t resend it. |
The person’s prepaid plan has no credit (recipient_out_of_credit) | Yes, a day later, once you’ve checked it’s still failed. By then they may have topped up. Ready may resend some of these itself. |
Phone off or out of coverage, blocked by the person’s carrier, number rejected or can’t get texts, or not delivered with no reason (recipient_unreachable, recipient_blocked, recipient_destination_rejected, recipient_cannot_receive_sms, invalid_destination, carrier_delivery_failed) | No. Check the number with the contact. |
Flagged as spam (carrier_filtered_content) | Reword the text first. |
Held by Ready before sending (blocked_before_send, with blocked: true) | No. It was never sent. Fix or remove the number, and leave it out of your delivery rate. |
The recipient’s number is on a network or in a country your numbers can’t text (sender_network_not_provisioned) | No. Check the country code; if the number is right, email support@tryready.com. |
#Count failures from the API
Each failed message has error_reason, a cause that doesn’t change, and error_detail, a sentence to show a person. Count and match on error_reason, because the wording of error_detail can change. If no specific cause was recorded, you get a general or unknown reason instead.
To count a campaign’s failures, keep the message_id of each send. Read every page of List messages using next_before_id, or keep each message’s latest outcome from webhooks, and don’t count a repeated webhook as a new failure. status=failed returns failed and rejected texts. status=undelivered returns older undelivered or expired ones.
See also: the API reference for this page.