What is missed-call text-back, and is it worth building?
The smallest useful agent there is: one trigger, one sentence, and a list of things it must refuse to do. Most of the work is the refusals.
By Eugene Romanov·Published
The short answer
Missed-call text-back is one rule: a call ended without being answered, so send that number a text. There is no model in the first version, and that is the point, because the value is in the speed rather than the wording. What decides whether it works is the trigger your phone system gives you, what the text says, and the refusals: never twice, never at night, never to a number you just dialed.
SHT-02What drives the number
The whole agent is a trigger and a template
Nothing here needs a language model to be useful on day one. You need an event that fires when a call ends unanswered, the caller's number, and one sentence of text. Everything past that is refinement: naming the business, offering a time, routing the reply into a record. Vendors sell this as an AI product, and the AI part, if you ever add one, is reading the reply rather than sending the text. Start with the template. If the templated version changes nothing about your week, a generated version will not either, and you will have paid per token to find that out. The cheapest test of this idea is a human sending the same sentence by hand for a fortnight.
Where the trigger comes from, in code that actually runs
In the wallpaper contracting CRM the dialing instructions are assembled in app/api/twilio/voice/route.ts, and they attach one status callback to the call, subscribed to the single completed event, which fires once the call reaches a final state and carries whichever one it was: answered, no answer, busy, failed or canceled. That detail matters, because a call which never produced a recording still fires it, and an unanswered call is exactly that case. app/api/twilio/call-status/route.ts receives it and maps the state into a bucket, no answer, busy, or a dead number for an outright failure or for a call that connected and dropped inside a second. It refuses a request whose signature does not verify with a 403, and otherwise answers 200 even when its own work throws, so a fault on our side never becomes a retry storm. That handler is where a text-back rule would hang.
In that system the direction runs the other way, and the send is a person's click
Being exact about what exists. The missed call in that code is a call the business placed that nobody answered, not a call that came in. The text that follows it is a template named sms_missed_call in app/api/va-outreach/route.ts, sent through the carrier's REST API, and it is triggered from the dialing screen by a person rather than by the status webhook. Nothing joins the two automatically. So every piece of the inbound version exists and is proven separately, and building it means wiring them together and adding the refusals below. Any studio showing you a diagram should be willing to say which arrows are code today and which are the proposal. On this page, these are the proposal.
Most of the work is the refusals
The rule that fires is easy. The rules that decline are what keep it from embarrassing you. Do not text a number the system itself just dialed. Do not text the same number twice for one call. Do not text outside waking hours in the caller's own time zone. Do not text a number already marked as do not contact. There is a good precedent in that repository: the status handler refuses to auto-mark a lead as a dead number when its public rating and review count say it is a real business, after a check found ten leads wrongly auto-paused that way. The shape is the same, a rule that declines to act on weak evidence, and it is the part no demo ever shows you.
Cadence, if it ever becomes more than one message
A text-back that grows into a sequence needs the discipline the follow-up engine already has. In lib/followups/sequences.ts each step's delay is counted in business days and measured from the previous step rather than from day zero, so nothing lands on a Saturday and a slipped step does not compress the ones behind it. Subject variants are chosen by a stable hash of the lead's id, so the same person always sees the same version even if a sequence restarts, which is the only condition under which comparing variants means anything. A personalized step falls back to the generic one when the data it needs is missing, rather than sending a sentence with a hole in the middle of it.
The paperwork first, and the case for buying nothing
In the United States, texting from a business number goes through A2P 10DLC registration, which wants a real legal entity behind it, and that paperwork is usually the long pole rather than the code. Consent and quiet hours are not optional either. Given that, buy an off-the-shelf missed-call tool if you only want the text and you are content for the conversation to live in the vendor's app. Buy nothing if your missed calls are few enough to return by hand within the hour, because a person calling back beats a text every time. Build it into your own system when the reply has to become a record, and only once you have counted the calls.
SHT-03The options, side by side
What each route actually costs you.
| Option | Price | Timeline | The trade-off |
|---|---|---|---|
| Your phone system's own auto-reply | Often already inside the plan you pay for; check before buying anything | Same day | The fastest possible start. The reply lands in a mailbox nobody owns, and you cannot tell which texts turned into work. |
| Off-the-shelf missed-call text-back tool | Monthly subscription quoted by the vendor, usually per number | Same week, once registration clears | Running almost immediately. Your conversation history lives in their product, and moving it into your own records later is a project of its own. |
| Built into your own CRM | Inside a custom CRM from $2,000 over 30 to 45 days, plus your own carrier account for numbers and messages | 30 to 45 days, plus registration you do not control | The text, the reply and the record are one thing and you own all three. Slower, and pointless while there are no records for a reply to land in. |
| Nothing, and a person calls back | $0 | This afternoon | Better than any text while the volume is small. It stops working in the week nobody has the time, which is usually the week it matters. |
SHT-04In this hub
What does an AI agent cost, and what should it be allowed to do?
Two separate numbers: what it costs to build, and what it costs to keep answering. Most quotes only mention the first.
AI voice agent, answering service, or voicemail?
All three answer the phone. They differ in what exists five minutes after the caller hangs up, and that is the only part worth choosing on.
AI receptionist for contractors: what it costs and what it should never do
The interesting question is not whether it can answer the phone. It is what happens to the call afterwards, and what the thing is not allowed to decide on its own.
Leads arrive in WhatsApp. How to stop losing them
The messenger is not the problem. The problem is that a conversation is not a record: it has no status, no owner, and no yesterday you can go back to.
A2P 10DLC: why your business texts do not arrive without an EIN
It is not a setting and not a checkbox. It is registering your company with the US carriers, and either it is done or the messages are filtered.
SHT-05General notes
The questions people actually ask.
- N01What is missed-call text-back?
- An automatic text to any caller whose call ended without being answered, usually within seconds. It is the smallest useful automation in a service business because it needs one event, one phone number and one sentence, and because the caller is still holding their phone when it arrives.
- N02Does it need AI?
- No, and the first version should not have any. The trigger is a status from your phone system and the message is a template. A model only earns a place later, reading the replies and sorting the ones that want a callback from the ones that do not, which is a different feature with a different failure mode.
- N03What should the text actually say?
- Who you are, that you saw the missed call, and one concrete next step. Keep it to two lines and make the next step something the caller can do from the same screen, such as replying with a time. A message that only apologizes gives the caller nothing to do and gets no reply.
- N04Do I need A2P 10DLC registration for this?
- In the United States, yes, for texting from a business number, and it wants a real legal entity behind the registration. That paperwork is usually the slowest part of the whole project, so start it before the build rather than after, and assume it will take longer than the code did.
- N05What stops it texting somebody twice or at three in the morning?
- Rules written before the feature ships, not afterwards. One send per call, none to a number the system itself just dialed, none outside waking hours in the caller's time zone, and none to a number marked as do not contact. Those refusals are most of the engineering, and a demo will never show you one.
- N06Should the text come from my main business number?
- It should come from a number the caller recognizes, which usually means the one they just dialed. If your calls and your texts run on different numbers, the caller sees a stranger replying to a call they made, and the response rate reflects that.
- N07Is it worth building if I only miss a few calls?
- Probably not. Count last month's unanswered calls and multiply by what a booked job is worth to you before spending anything. If the answer is small, returning the calls by hand is better, and the honest recommendation here is to keep the money.
SHT-06Evidence
The systems this argument comes from.
Everything above was learned building these. Each sheet names the business, what the trade's arithmetic actually is, and the file in the repository that proves the capability. No client revenue and no client's customers appear on any of them.

