Series · 7 parts Published July 1, 2026

Missed-call text-back

When a call to the business goes unanswered, the customer is left listening to a dial tone — and a good number of them just ring the next shop down the list. This is the design of a small serverless system that turns a missed call into an instant, friendly text back: it matches the caller to any known customer, sends one SMS in the business’s voice with a booking link, threads any reply to the right person, and escalates anything urgent or unanswered to a human. It sends exactly one text per missed call, honours quiet hours and STOP opt-outs, and never spams. Seven posts on the same system — one diagram at a time — with an engineering reference at the end.

  1. 01

    A missed-call text-back on AWS for a few dollars a month

    The whole system on one page — the missed-call webhook, caller matching, a one-text-back composer, two-way reply routing, and a no-reply escalation sweep, plus the guardrail that it sends exactly one text and never spams.

  2. 02

    How a missed call gets caught

    How a missed call becomes a job — the provider webhook, signature checks, the one-text-back dedup window, quiet hours and STOP opt-out, and matching the caller’s number to a known customer before anything is sent.

  3. 03

    How a text-back gets composed

    How a text-back gets composed — the single Bedrock call handed only the facts it may use, the booking link and FAQ, the one-message-per-call rule, and why the model never decides whether or to whom to send.

  4. 04

    How a reply gets routed

    How a reply gets routed — inbound texts threaded two-way to the right person or queue, matched back to the original missed call, with urgent or unmatched messages escalated to a human rather than auto-answered.

  5. 05

    How an unanswered call-back gets escalated

    How an unanswered call-back gets escalated — the EventBridge Scheduler sweep that finds text-backs with no reply after a set window, and hands the caller to a person to ring back rather than letting the thread go cold.

  6. 06

    What the missed-call text-back costs

    A line-by-line monthly cost at about $2.20 for roughly 150 missed calls, where the money actually goes (outbound SMS and one Bedrock call), and what the bill looks like at ten times the volume.

  7. 07

    Engineering reference: the missed-call text-back architecture

    The same system drawn for engineers — the Lambda inventory, the webhook Function URL, the EventBridge escalation sweep, DynamoDB tables and key schema, SNS and SES, IAM scope, the Bedrock model id, and the region.

What is a missed-call text-back?
It is a small serverless system that watches for calls the business couldn’t answer. When the telephony provider fires a missed-call webhook, the system matches the caller’s number to any known customer or order and, within seconds, sends one friendly SMS back — “Sorry we missed you, text here or book at <link>” — written in the business’s voice. Replies thread two-way to the right person, and anything urgent or unanswered is escalated to a human. A missed call stops being a lost customer and becomes a conversation.
How much does it cost to run?
About $2.20/month at a typical small-business volume of roughly 150 missed calls a month. There is no always-on compute, so the bill is almost entirely usage-priced — the outbound SMS and one small Bedrock call per text-back are the main lines, and the only real fixed cost is Secrets Manager for the provider keys. At ten times the volume (around 1,500 missed calls a month) the bill lands near $14, because the fixed lines don’t move.
Which AWS services does it use?
Lambda (Python 3.14, arm64) behind a single Function URL for the provider webhook, DynamoDB on-demand for calls and threads, EventBridge Scheduler for the no-reply escalation sweep, SNS for outbound SMS and SES for escalation email, SQS with a dead-letter queue, Secrets Manager for the provider keys, CloudWatch Logs with 7-day retention, AWS Budgets, and Bedrock (Claude Haiku 4.5 via Global cross-Region inference) to compose each text. No API Gateway, no NAT Gateway, no always-on compute. One region, eu-west-2.
How fast does the text go out?
Within seconds of the missed-call webhook arriving, during opening hours. The provider fires the webhook the moment a call goes unanswered; the system verifies it, checks for duplicates and opt-outs, matches the caller, composes the message with one Bedrock call, and sends. Outside opening hours the text is held and released when quiet hours lift, so nobody gets a 2am text — but the caller still hears back first thing, before they’ve chased anyone else.
Does it use AI?
Only to write the wording. Bedrock’s Claude Haiku 4.5 fires once per missed call to compose a single short SMS in the business’s voice, and it is handed the facts it may use — the caller’s name if known, the business name, and the booking link — with instructions to use only those. The trigger (the missed-call webhook), the caller matching, the dedup, the quiet-hours and opt-out checks, and the routing are all deterministic Python. The model never decides whether to send, who to send to, or what link to include.
Can it spam people or text the wrong person?
No. It sends exactly one text-back per missed call — repeat rings from the same number inside a short window collapse to a single text — and it honours quiet hours and STOP opt-out, so anyone who has texted STOP is suppressed permanently and nobody is texted overnight. It only texts the number that actually called. Anything it can’t match, anything that reads as urgent, and any text-back that goes unanswered are handed to a person; the system never cold-texts, never chases, and never acts on its own beyond that single reply.
All posts