Pull the recall list for a practice that has been open fifteen years and look at the phone column. A large share of those numbers were typed in from a clipboard form that asked for "home phone" first, by patients who still had one. Many of those numbers are landlines. A text sent to a landline goes nowhere. The patient never sees the reminder, the front desk never hears back, and the account still pays for the send.
This post is for clinics and for the healthcare platforms that send recall reminders on their behalf. It covers why older records skew toward landlines, how to check line type with the number validation API before a recall run, what Ready's optional landline validation costs ($0.003 extra per segment when it's switched on), and how to move landline patients to a phone recall instead of dropping them. The decision math compares two approaches: leaving validation on for every send, or cleaning the list once.
Why older patient records skew toward landlines
None of this needs a statistic. It follows from how the data got collected:
- Intake forms asked for "home phone" first. Many practice management systems mapped that field to the primary contact number. Mobile was optional, or it went into a second field the reminder tool never reads.
- The patients who've been with the practice longest are often the ones who kept a landline longest. A patient who joined in 2010 and comes in twice a year may never have updated their number.
- Records don't get re-verified. Front desks confirm insurance at every visit. They rarely confirm that the number on file can receive a text.
- Migrations carry the problem forward. When a practice moves to a new EHR or a new texting tool, the phone column is copied over as-is.
The result is a recall list that looks complete, with a number for nearly every patient, but whose real text reach is lower than the row count suggests. How much lower depends on the practice's age and patient mix. You won't know until you check.
What actually happens when you text a landline
Without a line-type check, the platform can't tell that a number is a landline. Unless Ready already knows the number is a landline, the send is attempted and billed like any other segment, and it never reaches a phone. Your reporting may show it as failed or undelivered, but it never shows up as a patient who needs a different channel. In practice those patients fall out of recall without anyone noticing.
The money is the smaller problem. The bigger one is that a patient who was due for a cleaning, a diabetic eye exam or a mammogram follow-up gets no reminder, and nobody on staff knows to call them.
Checking line type with the validation API
Ready's number validation endpoint is a single GET per number:
curl https://api.tryready.com/v1/validate/+12125550199 \
-H "X-API-Key: YOUR_API_KEY" It tells you whether the number is valid and what kind of line it is. The response shape is in the API reference on docs.tryready.com, and each lookup costs $0.003. Read that page before you build against specific fields, because we won't guess at them here.
Platforms usually use the endpoint in two places:
- At intake. When a patient record is created or a phone number is edited, validate it and store the line type in your own system. This catches new landlines before they ever reach a recall list.
- As a one-time sweep. Before the first recall run on Ready, or after migrating a practice in, run the existing list through the endpoint and tag every landline.
If you're a platform with many clinics, each clinic usually sits in its own sub-account with its own numbers and 10DLC registration. The sweep runs per sub-account, and the landline tags belong to that clinic's data.
The other option: landline validation on every send
Ready also offers landline validation as an account setting. It is off by default. When it's switched on, every segment the account sends carries an extra $0.003, and a number the lookup finds is a landline is refused; the text is not charged, though the number check itself can be.
So you pay a small surcharge on the texts that go out, and you stop paying for texts to landlines. It also keeps checking: a number that was a mobile at intake and later turns out to be a landline is caught at send time, with no re-sweep needed.
A pricing note: Ready's Standard rate is $0.0075/segment plus a $0.0045 carrier fee. Landline validation and scrubbing each add $0.003 per segment; both are off by default and billed only on accounts that turn them on.
The decision math: always-on vs clean once
Here is a worked example. It is an illustration with stated assumptions, not data from any real practice.
Assumptions
- 8,000 patients on the recall list
- 25% of the numbers on file are landlines (assumed, so 2,000 landlines and 6,000 mobiles)
- 2 recall cycles a year, each with a reminder and one follow-up, so 4 texts per patient per year
- Every reminder kept under 160 plain characters with no emoji, so each text is 1 segment
Scenario A: no validation at all
- 8,000 × 4 = 32,000 segments a year
- Rate portion: 32,000 × $0.0075 = $240, plus 32,000 × $0.0045 in carrier fees
- 8,000 of those segments go to landlines: 8,000 × $0.0075 = $60 of the rate portion, plus 8,000 × $0.0045, spent on texts nobody reads
- 2,000 patients get no reminder by any channel
Scenario B: landline validation switched on
- Landlines are refused and not charged, so 6,000 × 4 = 24,000 segments go out
- Rate portion: 24,000 × $0.0075 = $180, plus 24,000 × $0.0045
- Surcharge: 24,000 × $0.003 = $72 a year
- Net against Scenario A: you pay the surcharge line above and stop paying the 8,000 landline segments' rate plus 8,000 × $0.0045 for landline sends. At this landline share, always-on validation pays for itself.
Where always-on stops paying
The surcharge applies to every mobile segment. The savings apply only to landline segments. Always-on comes out ahead when:
landline segments × ($0.0075 + $0.0045) > mobile segments × $0.003
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.
Put your own list's landline and mobile segment counts into that line to find your break-even. A practice with an older patient base will often be above that line. A newer practice whose intake form asks for a mobile number first will often be below it.
Scenario C: clean once, then validate at intake
- Run all 8,000 numbers through
GET /v1/validate/:phoneonce and tag the 2,000 landlines - Send recall only to the 6,000 mobiles: the same 24,000 segments as Scenario B, with no $0.003 surcharge
- One-time cost: 8,000 lookups × $0.003 = $40, plus $0.003 for each new patient validated at intake
Scenario C beats Scenario B when the one-time sweep costs less than the surcharge you would otherwise pay. In this example that surcharge is $72 a year. Over three years it's $216. Here the sweep costs $40 once against $120 a year.
The honest tradeoff
| Always-on landline validation | Clean once + intake validation | |
|---|---|---|
| Ongoing cost | $0.003 on every segment sent | None after the sweep |
| Up-front cost | None | One lookup per number on the list |
| Catches numbers that change later | Yes, at send time | Only if you re-sweep |
| Engineering work | Flip a setting | Store line type, filter before send, validate at intake |
| Best fit | Older lists, high landline share, little dev time | Platforms with an intake hook and a stable list |
Lists rot. Patients port numbers, drop landlines and change carriers. A sweep from January is less accurate by the following year. We cover the same decay problem for DNC data in how fast each list source rots and when to re-scrub. If you choose clean-once, put a re-sweep on the calendar. Annually is a reasonable default for a recall list.
Routing landline patients to a phone recall
Tagging 2,000 patients as landlines only helps if someone then calls them. Once they're flagged, they need a different channel, not removal from the list.
A workable setup:
- Split the recall list by line type. Mobiles go to the text campaign. Landlines go to a call list for the front desk.
- Call from the Ready Dialer. Staff click to call from the dial pad in the dashboard (or inside GoHighLevel for connected accounts). A returned call rings the open pad, so a patient calling back isn't lost. Recording and transcripts are available with consent. There's no auto dialing or voicemail drop. A staff member works the list by hand, which suits a recall conversation anyway.
- Budget the minutes. The Dialer is $0.025/min, and each started minute is billed as a full minute. Say each of the 2,000 landline patients gets two attempts averaging 2 started minutes each (assumed): 2,000 × 2 × 2 × $0.025 = $200 per recall cycle. That costs more per patient than a text. Those patients were getting zero reach by text, though, and a booked appointment from a patient who was due is the point of the whole exercise.
- Ask for a mobile number on the call. If the patient wants text reminders, update the number and record their consent properly. Our guide to getting and recording patient consent to text covers what to capture.
Sending the recall text itself
For the mobile half of the list, a single send looks like this:
curl https://api.tryready.com/v1/messages \
-H "X-API-Key: YOUR_API_KEY" \
-H "Idempotency-Key: 6f1c2a90-3b7e-4d1a-9c55-0e2f8b7a1d44" \
-H "Content-Type: application/json" \
-d '{"to": "+12125550199", "body": "Northside Dental: you are due for a checkup. Call 555-0142 or reply to book. Reply STOP to opt out.", "consent_attested": true}' How this request behaves:
- It's one segment. The message is under 160 plain characters with no emoji, so it bills as 1 segment.
- The body carries no clinical detail. It doesn't name the procedure or the condition. Our post on the fields never to put in a patient text explains why the body matters even when the send is legal.
- The
Idempotency-Keyheader blocks duplicates. A retried request won't send the reminder twice. - Quiet hours are enforced. A recall campaign queued at 7 PM for a patient whose local time is past the permitted window is held until it opens. A single inbox or API text is held only if sending reopens within 6 hours; otherwise it is refused with the reopen time and you send it again. A held text is charged only when it actually sends.
- Opt-outs are honored automatically. Opted-out numbers and landlines Ready already knows about are refused and not charged; with landline validation on, numbers not yet checked are looked up too.
consent_attested is your promise that the patient agreed to texts. Ready records that attestation per bulk send and per API send that sets consent_attested. It doesn't store the patient's own opt-in record, so the practice or platform keeps that. Compliance remains the sender's responsibility, and these tools reduce risk rather than remove it. For the wider rules, see healthcare SMS compliance requirements. (A contact who signs up on a Ready-hosted opt-in page is the exception: Ready stores that sign-up, with the time, IP address and exact wording, and support@tryready.com can send you a copy.)
The practical takeaway
An old patient list probably has more landlines than anyone has counted, and every one of them is a patient silently dropping out of recall. Check line type before the run, not after.
- If the landline share is high and you have little engineering time, switch on landline validation and accept the $0.003 per segment.
- If you control intake, sweep the list once with
GET /v1/validate/:phone, validate new numbers as they come in, and re-sweep yearly. - Either way, send the landline group to a phone recall instead of deleting it.
To see the per-segment rate, check pricing. When you're ready to run the numbers on your own list, you can sign up and use the first 20 free one-to-one texts before you register.