Field Operations Industry, chapter 19 of 26
Customer Communications
Texts, email and calls to customers: consent by purpose and channel, opt-out keywords, quiet hours, 10DLC and short codes, and reminders you can take back.
A field operations business talks to its customers more than almost any other kind of company. There's the welcome after the sale, a reminder before every visit, a heads-up when the technician is on the way, a note when the work is done, the invoice, the receipt, the failed payment, the survey, the review request, and the marketing on top. Most of it goes by text message, because that's what people read. That makes the messaging system one of the most legally exposed parts of the platform, and one of the easiest to get subtly wrong. A reminder for a visit that was cancelled yesterday, a 6 a.m. text, or a STOP that only stopped half the messages is a complaint at best and a lawsuit at worst.
Three problems run through everything here. The legal one is consent and timing: who agreed to what, on which channel, and when you're allowed to send. The deliverability one is that carriers filter business texting aggressively, and they decide what gets through. The correctness one is that a message is a statement about the state of the world, scheduled ahead of time, and the world changes before it goes out.
Three Kinds of Message, Three Kinds of Consent#
Every message has a purpose, and the purpose decides what consent it needs. The wireless industry's own guidelines, CTIA's Messaging Principles and Best Practices, split business texting three ways:
- Conversational: the customer texted first and you reply. No further permission is expected.
- Informational: the customer gave you their number and asked to be contacted. CTIA's examples are appointment reminders, welcome texts and alerts, and the customer needs to have agreed to texts for that specific purpose when they gave you the number.
- Promotional: anything with a sales or marketing promotion. CTIA expects the customer to have agreed in writing first, and it warns that adding a call to action, like a coupon code, to an informational text can make it promotional.
Email has a parallel split under CAN-SPAM. The FTC's guide separates commercial content from transactional or relationship content, which facilitates an agreed-upon transaction or updates a customer about an ongoing one, and it stresses that the law reads the transactional category narrowly. Phone calls are a third channel with their own rules, and a customer who's happy to get texts about their appointment may not want a call from the sales floor.
So consent isn't a flag on the customer. It's a matrix: for each contact point (one phone number, one email address), and for each purpose (transactional, marketing, calls), a current state and the history of how it got there.
| Contact point | Transactional | Marketing | Calls |
|---|---|---|---|
| Mobile number | Opted in at sale | Opted out by STOP | Opted in at sale |
| Email address | Opted in at sale | Unsubscribed in email | Not applicable |
Keep the history as append-only records: each change writes a new record with the state, the source (the agreement signed at the door, a web form, a keyword reply, a staff change on a call, an API), the evidence (the consent language shown, the form version, the inbound message), and who or what made it, and closes the previous one. "Why did we text this person on March 3rd?" has to be answerable from the record, years later, and an overwritten boolean can't answer it.
Templates carry the purpose too. Every template declares whether it's transactional or marketing, and the safe default is marketing: a template nobody classified is treated as the stricter kind until someone marks it transactional on purpose. Classify the template, not the send, so the decision is made once by someone who read the copy.
Opt-Out: Keywords and Everything Else#
The FCC rewrote the rules on revoking consent for robocalls and robotexts in 2024. Under 47 CFR 64.1200(a)(10), a consumer can revoke consent by any reasonable method, and the request has to be honored within a reasonable time not to exceed ten business days. A reply using the words stop, quit, end, revoke, opt out, cancel or unsubscribe is a revocation by definition, and other wording counts if a reasonable person would read it as one. Paragraph (a)(12) allows one confirmation text, which may only confirm the opt-out and may not market anything; sent within five minutes, it's presumed to fall within the consumer's consent.
CTIA asks for the same behavior from the carrier side: support opt-out by text, call or email; send one final confirmation; send nothing after it; and read normal-language requests ("please opt me out") along with the standard keywords, without being thrown by capitalization or punctuation.
One part of the FCC's rule is still pending. The "revoke all" provision would make a STOP in reply to one kind of message revoke consent for all of a sender's automated messages, including unrelated ones. Its effective date was pushed back, most recently by order DA-26-12 in January 2026, to January 31, 2027. Build for it now:
- STOP stops everything on that number by default. A customer who replies STOP to a marketing text and then misses their appointment reminder is unhappy, but a customer who replies STOP and keeps getting texts is a violation. Default to all purposes, then let them restore what they want.
- Offer granular restores.
STARTrestores transactional messages;START MARKETING,START CALLSandSTART ALLrestore the rest. Say so in the confirmation, briefly, without marketing. - Don't double-confirm. On short codes and toll-free numbers, the carrier or messaging provider often answers STOP itself. If yours does, don't send a second confirmation for a keyword opt-out; do send one when the change came from somewhere else (a call to the service center, the portal).
- Listen to the provider too. When the messaging API rejects a send because the number has unsubscribed at the carrier level (Twilio returns a specific error for it), record that as an opt-out, the same as a keyword.
- Email unsubscribes stop marketing, not service. CAN-SPAM requires honoring a commercial opt-out within 10 business days and keeping the mechanism working for at least 30 days after the message. An unsubscribe link in a marketing email should stop marketing and calls and leave invoices and appointment notices alone, because those are transactional and the customer still needs them.
- Publish the change. A consent change is an event every system that might send something reacts to, and the sales floor's dialer needs it as much as the reminder service.
Keep a separate exclusion list for contacts the business has decided not to message for its own reasons: a legal dispute, a deceased customer, a number confirmed to belong to someone else. It's not consent and shouldn't be mixed with it; an exclusion can block automated messages while still allowing a person on staff to send one by hand.
Quiet Hours#
The federal rule for telephone solicitations is 8 a.m. to 9 p.m., local time at the called party's location (47 CFR 64.1200(c)(1)). States add their own, and they're stricter. Florida's Telemarketing Act prohibits commercial telephone solicitation calls before 8 a.m. or after 8 p.m. in the called person's time zone, and Florida's separate telephone solicitation statute counts text messages as telephonic sales calls. Other states restrict particular days, Sundays most often, and state holidays. Debt collection has its own version: Regulation F presumes contact before 8 a.m. or after 9 p.m. at the consumer's location is inconvenient (Collections & Retention).
Strictly, most of these rules are about solicitations, and an appointment reminder isn't one. Apply a window to every text anyway. A reminder at 6:15 a.m. is legal and still the kind of thing that ends in an opt-out, and treating everything the same way removes a whole class of "was this one marketing?" arguments.
- Keep windows as data. A default window, then overrides per state with days of the week, start and end times, and effective dates, plus a holiday calendar per state. Laws change, and a deploy shouldn't be needed to follow them.
- Decide where the customer is. The area code is a poor guide; people keep their numbers when they move. Use the service address's time zone (every address should already carry one, per Customers, Accounts & Properties), a carrier lookup when you have no address, and when they disagree, the window that satisfies both.
- Defer, don't drop. A message that falls outside the window waits for the next opening and then goes, unless it's gone stale by then (see below). A deferred reminder that would arrive after the appointment should be dropped and recorded as skipped.
- Make bypass explicit and rare. Some messages can't wait: the technician is on the way now, a storm cancelled today's route. A per-template bypass flag, audited, beats a general override someone leaves on.
Senders: Short Codes, 10DLC and Toll-Free#
US carriers sort business texting by the kind of number it comes from, and each kind has its own registration:
- 10DLC is a normal 10-digit local number used for application-to-person messaging. It requires registering a brand (the legal business, its tax ID and contacts) and each campaign (the use case, sample messages, and how opt-in, opt-out and help work) with The Campaign Registry, usually through the messaging provider. Carriers approve the registration and set your throughput from it.
- Short codes are 5- and 6-digit numbers leased through their own program and provisioned per carrier. They're built for volume and are what most people recognize as "a company texting me".
- Toll-free numbers can text too, with a verification process of their own.
Register separate campaigns for separate purposes (appointment notifications, billing, marketing), because carriers vet each one against what it says it sends. CTIA's opt-in confirmation for recurring messages should include the program name, how to reach customer care, how to opt out, that messages recur and how often, and any fees; and a HELP reply should return the program name and a way to reach a person.
Then expect sends to fail, and decide in advance what each failure means. Messaging providers return specific error codes, and the useful design maps each code to a policy:
| Failure | Action |
|---|---|
| Recipient unsubscribed at the carrier | Mark opted out |
| Not a mobile number, or a landline | Block the number for text permanently; it can still get calls or email |
| Short code not supported by the recipient's carrier | Fall back to a 10DLC number for that recipient for a period |
| Temporary carrier failure, repeated | Block for a period, and clear on the next success |
| Unknown | Record and keep sending |
Scope each policy to what's actually broken: the phone number, the sending number, or the account. Track consecutive failures per number, so one bad day doesn't disable a customer, and look numbers up before the first send where you can, so a landline entered at the door is caught before it fails.
Inbound texts need routing too. "Reply 1 to reschedule" only works if something reads the reply in the context of the last message sent to that number, and inbound from unknown short codes is almost always spam.
Reminders Are Promises You Can Take Back#
A reminder is composed at one time and delivered at another. Scheduled a week ahead, it says "your service is Tuesday between 8 and 12", and by Tuesday the visit may have been rescheduled, cancelled, moved to another window, or released from the route by a storm. The design rule: every scheduled message is linked to the thing it's about, and every change to that thing retracts it.
- Associate every message with the customer, the account, and the appointment, subscription or invoice it's about, so a change to any of them can find its queued messages. The same associations give each customer a complete timeline of what was sent.
- Retract on events. Appointment cancelled, rescheduled, released or deleted; subscription frozen or cancelled; contact removed; account deleted. Each deletes or cancels matching queued messages, as its own idempotent handler.
- Check again at send time. Events get lost and handlers have bugs. Before sending, re-read the appointment and the consent state and skip, with a recorded reason, if either changed. Retraction keeps the queue clean; the send-time check is what keeps it correct.
- Deduplicate by subject and template. One "7 days before" reminder per appointment, enforced by a unique key, so a replayed event can't queue a second one.
- Only follow up on what the customer heard. Send a "your appointment was cancelled" text only if they were told about the appointment in the first place; a cancellation notice for a visit they never knew about just confuses them.
- Send to the right person. A household has several people (Customer Self-Service); service notices go to the account's owner, or whoever is designated for them, on their primary mobile number.
The reminder set most field businesses converge on: confirmation when booked, a reminder days ahead and the day before, an on-the-way message when the technician starts driving, a same-day change notice when the window moves, a no-show or not-serviced message with a way to rebook, and a completion message with the service summary.
The Send Pipeline#
Put every outbound message through one pipeline, whatever triggered it:
- Render the template with its variables. Mark variables that are secrets (one-time codes, login links) so staff screens show them masked; the customer's timeline is visible to customer service, and a login link in it is a login.
- Resolve the recipient from the account and the message's purpose.
- Check consent for that contact point, purpose and channel, then the exclusion list.
- Choose the sender (short code, 10DLC number, email domain), applying any fallback policy.
- Schedule into the next allowed window.
- Queue and send, with a small fixed number of attempts. A rate-limit response from the provider requeues the message a minute later without using up an attempt; a permanent failure goes to the policy table above.
- Record delivery events as they arrive (accepted, sent, delivered, undelivered, failed for texts; delivered, opened, clicked, bounced, unsubscribed for email) and roll them up into one status per message: sent, failed, skipped or still processing.
A message that was skipped, for consent, quiet hours or a stale subject, is a result, not an error. Record it with the reason, because "why didn't I get a reminder?" is one of the most common questions customer service gets.
Data That Must Never Speak#
The most dangerous messages are the ones nobody meant to send. A data import, a backfill, a migration from a legacy system (Migrating Off a Legacy System) or a bulk correction creates appointments, agreements and invoices by the thousand, and every one of them looks like a real event to the reminder service. Ten minutes later a hundred thousand customers get a welcome text for a service they've had for six years.
- Mark where events come from. Events produced by an import carry a source that notification handlers ignore. Don't rely on handlers remembering to check: make "don't notify" the default for any source that isn't live customer activity.
- Seed what must exist directly. Migrated appointments still need their future reminders. Create those queued messages directly, tagged as seeded, rather than replaying events and hoping the side effects are right, and make the tag purgeable so a bad seed can be removed without touching real messages.
- Make non-production quiet. Staging and test environments send to an allowlist of internal numbers, addresses and domains, and record everything else as a no-op that would have gone out. The no-op record is useful: it shows what production would have sent.
Paper Still Counts#
Some customers want a paper invoice, some notices are better sent by mail, and some states expect mail for particular collection or cancellation notices. Treat mail as another channel: the account has a mailing address separate from the service address (people pay for service at a rental or a parent's house), a per-subscription preference for mailed invoices, and a print-and-mail provider (Lob and PostGrid are examples) that renders the document, mails it and reports tracking events. Mail returned as undeliverable marks the mailing address bad, the same way a bounce marks an email.
After the Visit: Surveys and Reviews#
The completion message is the best moment to ask how it went. The common measure is the Net Promoter Score: one question, how likely the customer is to recommend you from 0 to 10, with 9 and 10 counted as promoters, 0 to 6 as detractors, and the score being the percentage of promoters minus the percentage of detractors, from -100 to 100.
- Trigger on completion, not on a calendar, so the survey is about a visit the customer remembers, and link the response to that visit, its technician and its service center.
- Throttle per customer. A customer on monthly service shouldn't be surveyed monthly. Survey vendors usually enforce a contact frequency of their own as well.
- Route detractors to a person. A low score with a comment is a service problem with a name attached; send it to the service center as a follow-up task the same day.
- Treat survey and review requests as their own purpose. They're not reminders; decide whether they need marketing consent and classify the templates accordingly.
What This Means for the System You Build#
- Consent per contact point, purpose and channel, as append-only history with source and evidence.
- Templates classified by purpose, defaulting to the stricter class.
- STOP that stops everything by default, granular restores, one confirmation, and provider-reported opt-outs recorded the same way.
- Quiet hours and holidays as data per state, evaluated in the recipient's local time, deferring rather than dropping.
- Registered senders per use case, and a failure-code policy table scoped to number, sender or account.
- Every scheduled message associated with its subject, retracted on change and rechecked at send time.
- One send pipeline with attempts, rate-limit handling and a recorded reason for every skip.
- Imports that can't notify, seeded messages that can be purged, and a no-op sender outside production.
References#
Specifications
- 47 CFR 64.1200 (Cornell LII), the 8 a.m. to 9 p.m. calling window, revocation by any reasonable means within ten business days, the opt-out keywords, and the one confirmation text within five minutes
- FTC: CAN-SPAM Act: A Compliance Guide for Business, commercial versus transactional or relationship content, 10 business days to honor an opt-out, and a mechanism that works for 30 days
- Florida Statutes 501.616, commercial telephone solicitation only between 8 a.m. and 8 p.m. in the called person's time zone
- Florida Statutes 501.059, telephonic sales calls defined to include text messages
- 12 CFR 1006.6 (Cornell LII), Regulation F's presumption that contact before 8 a.m. or after 9 p.m. is inconvenient
Reference
- CTIA: Messaging Principles and Best Practices (PDF), conversational, informational and promotional messages, opt-in confirmation contents, and opt-out handling
- Greenspoon Marder: FCC extends waiver on revocation of consent rules, the revoke-all provision delayed to January 31, 2027 by order DA-26-12
- The Campaign Registry, brand and campaign registration for 10DLC messaging
- Qualtrics: How to calculate Net Promoter Score, promoters, passives, detractors and the score's range
In practice
- Twilio: Messaging error and warning codes, provider error codes to map to delivery policies