Guide

Understanding SMS Delivery Receipts and Error Codes

A school board member asks whether every family received the lockdown alert. The honest answer is more complicated than the dashboard suggests, and a district that cannot explain the difference between accepted, delivered and read is going to give an answer it later has to correct.

Last reviewed 2026-08-04 ยท Kastr is pre-launch; we publish dated status rather than logos.

Failure causes districts actually see, and the correct response to each
CauseWhat it meansFix it byAuto-failover to voice?
Unknown or invalid destinationThe number does not exist on any networkData correction — it was never rightNo — voice will fail too
Number disconnected or reassignedWas valid, is not nowRe-verify with the familyNo
Landline, cannot receive SMSThe number is real and not a mobileRoute to voice permanently for this contactYes — the correct case
Handset unreachable or switched offTemporary; carrier will retryWait, then failover if still failingYes, after retry window
Handset memory fullGenuinely still happensNothing; retry laterOnly for urgent sends
Carrier content filteringMessage classified as spamRegistration, links, wording — see belowVoice reaches, but the SMS problem persists
Opt-out on file at the carrierSTOP was sent, possibly years agoRe-permission, or accept itNo — respect the revocation
Throughput throttlingYou exceeded your tier; queued not lostThroughput tier, or stagger the sendNo — it will arrive
Blocked by the subscriberThe family blocked your number specificallyA conversation, not a technical fixConsider it a signal
Expired in the queueValidity period elapsed before deliveryShorter validity for time-critical sendsYes

Specific numeric error codes vary by carrier and by aggregator, so build your policy against the cause, not the code. The column that matters operationally is the last one: a district that fails over to voice on every failure is paying for voice calls to disconnected numbers, and a district that never fails over is silently losing every landline household.

The delivered fallacy

There are three distinct events and dashboards conflate them.

  • Accepted. Your platform handed the message to a carrier and the carrier took it. This proves you sent something. It proves nothing about a family.
  • Delivered. A delivery receipt came back from the network indicating the message reached the handset. This is meaningful and it is not proof of receipt by a person. The handset may be in a drawer, on a shelf, or belong to someone who has had that number for two years since the family gave it up.
  • Read. Does not exist for SMS. There is no read receipt in the protocol. Any dashboard showing a read rate for text messages is inferring it from link clicks, and a link click is a click, not a read.

What a district can honestly tell a board: "We sent to 11,842 contact points. 11,109 returned a delivery receipt from the carrier. 412 failed with a permanent error and are queued for data correction. 321 are pending. We do not know how many people read it, because SMS has no read receipt and any vendor telling you otherwise is inferring."

We hold ourselves to the same standard, and one caveat belongs here rather than in a footnote: our own insights code currently counts messages in a sent state inside the delivered bucket, which is exactly the conflation this page is arguing against. It is a known defect on our list and we would rather write it down than let you find it. Until it is fixed, read our delivered figure as accepted-or-delivered.

The six-step diagnostic for the most common ticket

"I never got the message." This ticket arrives in every district, every week, and the resolution is almost always in the first three steps.

  1. Which number are we actually sending to? Not which number the parent thinks we have. Read back what is on the contact record. Roughly a third of these tickets end here.
  2. Is that number a mobile? Landlines and desk phones sit on contact records for years and no SMS will ever reach them. This is the second third.
  3. Was the contact point in the resolved audience? A guardian who is not attached to the student, or attached with an expired role, is not in the send at all. This is a roster question, not a messaging one.
  4. What does the delivery record say? Failed with a permanent error, failed temporarily, or delivered. If delivered, the message reached a handset and the conversation changes.
  5. Is there an opt-out on file? Often from a previous year, sometimes from a previous vendor, occasionally from a family member who had the phone.
  6. Is this one family or a pattern? One family is data. Fifty families on the same carrier on the same day is filtering, and the fix is registration or message content, not the contact record.

Finding the dead numbers before an emergency does

Run this once a term rather than discovering it during a lockdown.

  • Baseline your permanent failure rate. Take the last three district-wide sends and count contact points that failed with a permanent error every time. That set is your dead list, and in most districts it is between 3% and 12% of contact points.
  • Segment it. Dead numbers cluster — by school, by grade cohort, by enrolment year, by the source of the record. A cluster tells you which intake process is producing bad data.
  • Count households, not contact points. A household with three numbers on file and one working is fine. A household where every contact point fails is unreachable, and that is the number to report.
  • Fix it where the data is created. Correcting a number in the messaging platform without correcting it in the SIS means the next roster sync overwrites your fix. See reaching families who never respond.

Be exact about what Kastr does here: it records validation state on each contact point and it fails over from SMS to voice on terminal failure with the two records linked. It does not automatically detect data-health problems and raise them for you — there is no engine that flags an unreachable household on its own. The baseline exercise above is something you run against the delivery data, not something the product does while you sleep.

Designing the escalation policy

Decide in advance which failures become a phone call, which become a work item, and which are ignored.

  • Automatic voice failover: landline, handset unreachable, memory full, expired in queue. These are cases where a different channel to the same number plausibly works.
  • Work item for a human: invalid destination, disconnected or reassigned. A voice call will fail identically; what is needed is a correction, and the correction belongs in the SIS.
  • Do not escalate: opt-out on file, subscriber block. These are decisions the family made and a phone call is not an appeal.
  • Escalate to the technology department, not the family: content filtering, throughput throttling. Neither is a family problem and both will recur on the next send.

One thing worth saying to a board directly. The question "can you prove the parent received the emergency message" has no clean yes. What a district can prove is that a message was composed, authorised, sent to a specific resolved audience at a specific time, and that the carrier returned a delivery receipt for a given number. Kastr writes each of those events into a per-district append-only audit log, SHA-256 hash-chained so each entry covers the previous one, with UPDATE and DELETE revoked at the database role and no update policy in row-level security — so the record is tamper-evident rather than merely stored. That is a strong exhibit and it is still not proof that a person read a text.

Questions people actually ask

What does a delivered SMS status actually mean?

That the network returned a receipt indicating the message reached a handset. It does not mean a person saw it, and SMS has no read receipt at all. Treat delivered as strong evidence of reach to a device and weak evidence of reach to a human, and describe it that way to your board.

Why do some school text messages show as undelivered?

The common causes are a number that was never valid, a number that has been disconnected or reassigned, a landline on the contact record, a handset that is off or out of coverage, carrier content filtering, an opt-out held at the carrier, or throughput throttling. The response differs for each, which is why an escalation policy has to be written per cause rather than per code.

How can a district tell whether a parent's number is a landline?

Either from the failure cause returned on an SMS attempt, or by running the contact list through a number-type lookup before you rely on it. In practice most districts discover their landlines the expensive way, during an emergency. Once identified, a landline contact point should be permanently routed to voice rather than retried on SMS every time.

Should a failed text automatically trigger a phone call?

For temporary failures and landlines, yes — that is what failover is for, and Kastr does it on terminal SMS failure with the two delivery records linked. For invalid or disconnected numbers, no: the voice call fails identically and you have spent money to learn what you already knew. For an opt-out, never.

Can a district prove that a parent received an emergency message?

Not in the strong sense. What you can evidence is that a message was composed, authorised, sent to a named audience at a recorded time, and that the carrier returned a delivery receipt for a specific number. An append-only, hash-chained audit log makes that record tamper-evident, which is a far better exhibit than a mail-merge log — and it still is not proof that a person read a text.

One price. Every feature. Locked for three years.

$3.50 per student per year under 5,000 students. No tiers, no add-on modules, no per-message fees. Published on the site because you should not have to book a call to learn a price.