We paid three times to text a landline. Here is the two-line fix.
An appointment reminder retried a landline three times and billed us for each attempt. Validate the number when it is typed in, not when the message fails.
By Chen Deng · OxOne, Calgary AB
- Time20 minutes
- You needYour SMS provider console
- StopsPaying to retry the impossible
Check the number at the point of entry, and stop retrying on the carrier errors that mean “this will never work” — a landline does not become a mobile on the second attempt.
Real entry from our own SMS log this month: the same appointment reminder sent to the same Calgary number three times in ninety seconds, each one failing with error 30006, each one billed.
30006 means “landline or unreachable carrier.” Somebody had entered their office landline in the mobile field. No amount of retrying fixes that, and every retry costs money and delays the queue.
The two failures worth knowing
| Code | What it actually means | Retry? |
|---|---|---|
30006 | Landline or unreachable carrier. Permanent — this number will never receive a text. | Never |
30003 | Unreachable handset. Phone off, out of coverage, or the number is dead. | Once, hours later |
Most SMS code treats every failure the same way and retries blindly. That is where the waste comes from.
Fix it where the number is typed
The real fix is not in the sending code, it is in the form. Every major SMS provider has a lookup endpoint that tells you the line type — mobile, landline, VoIP — before you ever send anything. Call it when the customer submits the booking form, and if it comes back landline, say so on the spot: “That looks like a landline — we cannot text appointment reminders to it. Is there a mobile we should use?”
The customer fixes it in two seconds. Nobody discovers it three weeks later when a reminder silently fails.
Then fix the retry logic
Wherever your retries live, they should look like this:
- Permanent errors (landline, invalid number, unsubscribed) — never retry. Flag the record so a human corrects it.
- Temporary errors (handset unreachable, carrier congestion) — retry once, hours later, not seconds.
- Log every failure with its code somewhere you actually look. Ours only surfaced because someone went through the log by hand.
One more thing in the same log
The failed messages opened with Hi john,, — two commas, lowercase name. Somebody typed “john,” into a first-name field and the template added its own comma.
✗ What went out
Hi john,,
✓ Four lines of code later
Hi John,
Trim whitespace and trailing punctuation off name fields on the way in, and capitalise the first letter when you render. It is four lines of code and it is the difference between a message that looks like it came from a person and one that looks like it came from a broken database.
Every one of these came out of work we actually did. If you would rather not do it yourself, book a free 30-minute diagnostic and we will tell you which of these your business is losing money to.