Outbound texting is easy. It is the replies that decide whether this channel makes your business better or worse. A customer who texts back and hears nothing has learned something about you that no campaign will unlearn. Some industries feel this harder than others — a property manager ignoring a maintenance text has a different problem from a shop ignoring a stock question.
Set the expectation in the message
You do not have to answer instantly. You have to be honest about when you will. A single line — 'we reply 9–5, Mon–Fri' — converts an unanswered text from a failure into an understood wait.
Route by intent, not by keyword soup
const STOP_WORDS = new Set(["stop", "unsubscribe", "cancel", "end", "quit"]);const HELP_WORDS = new Set(["help", "info"]); export async function routeInbound(from: string, text: string) { const words = text.trim().toLowerCase().split(/\s+/); const first = words[0]; // 1. Compliance first, always, before any product logic. if (STOP_WORDS.has(first)) return optOutAndConfirm(from); if (HELP_WORDS.has(first)) return sendHelpCard(from); // 2. Known short answers to a question you asked. const pending = await pendingPromptFor(from); if (pending && pending.accepts.includes(first)) { return resolvePrompt(pending, first); } // 3. Everything else is a human. Do not guess. return assignToHuman(from, text);}Do not over-automate the middle
The temptation is to keyword-match your way through every reply. It fails badly, because real messages are 'hey can I bring the car in a bit later actually' rather than 'RESCHEDULE'. Automate the two ends — compliance keywords and answers to prompts you explicitly asked for — and let a human read the rest.
One thread per customer, forever
From the customer's side there is one conversation with your business, spanning years. Your system should match that. Threading by campaign or by ticket produces the experience of talking to an organisation that does not remember you, which is exactly what people choose a small business to avoid.
Staffing patterns that work
- One owner per shift. Shared inboxes with no owner get the worst response times of any arrangement, because everyone assumes someone else has it.
- Reply from the business, sign with a name. 'It's Dave' at the end of a message does most of the relationship work for free.
- Batch, do not hover. Three sweeps a day at fixed times beats constant partial attention, as long as your stated response time reflects it.
- Escalate out of the channel. Anything past two or three exchanges is a phone call. Say so and call.
What to log
Every inbound and outbound message, with timestamps, against the customer record. Not for analytics — for the day someone says 'I told you I needed it Friday'. Having the thread is the difference between a resolvable disagreement and an unresolvable one.
And keep consent state updated from this handler, not from a separate admin screen someone remembers to use.
Next step
Generate a tagged link for whatever you send next with the UTM builder, see what this looks like in your industry, or compare the services that can send it on the providers page.