Back to the build library
Any industry
Starter

Speed-to-Lead & Missed-Call Text-Back

Answer every inbound lead in seconds and recover every missed call with an automatic text, so no inquiry dies in the gap.

Industry
Any industry
Build effort
Starter
Typical time to launch
3–5 days
On this page
The problemWhat gets builtHow it runsAutomations in detailWhat changesBefore you start
Want this built for you?

Bring your stack to a call and we will scope it against how your business actually runs.

Book a call
01

The problem

Almost every business with inbound demand has the same two holes in the floor, and almost nobody measures them. The first is response latency. A prospect fills in a form at 7:42pm, and the first human reply goes out at 10:15am the next morning, nearly fifteen hours later, by which time the same person has filled in two or three other forms and is already talking to whoever answered first. The lead is not lost to price or to a better offer. It is lost to a queue.

The second hole is the unanswered call. The phone rings while the front desk is with a walk-in, or during lunch, or at 6:05pm. It rings out. Nothing happens next. There is no voicemail left, because people do not leave voicemails any more, and even when they do, nobody transcribes them into a follow-up task. The call simply evaporates. The only trace it leaves is a line in a call log that no one reads, so the business never finds out how many inquiries it declined to answer this month.

Money leaks in three specific places. Paid traffic is the most expensive: every ad click that produces a form fill and then a fifteen-hour silence has been paid for twice. Once to acquire it, once again when the competitor converts it. Referrals are the most damaging, because a referred caller who gets a ring-out assumes the business is unreachable and tells the referrer so. And the quiet one is repeat demand: existing customers who call with a new need, get no answer, and simply go elsewhere without ever registering as a lost lead. This build closes all three by making the first response automatic, instant, and the same every single time, regardless of who is or is not at the desk.

02

What gets built

Pipelines and stages

One pipeline, Inbound Leads, with stages that describe contact state rather than sales mood, so automations can read them reliably:

  1. New Lead: created, no outbound attempt yet. Nothing should sit here longer than two minutes.
  2. Attempting Contact: at least one automated or manual touch has gone out, no reply yet.
  3. Conversation Active: the lead has replied. A human or the AI assistant is mid-thread.
  4. Appointment Booked: a slot exists on a calendar.
  5. Showed: the appointment happened. Set by the confirmation workflow or manually.
  6. Won: closed business.
  7. Unresponsive: the full follow-up ladder ran out with no reply. Not deleted; recycled later into a reactivation wave.
  8. Disqualified: out of area, wrong service, spam, or opted out. Terminal.

Calendars

  • New Inquiry Consult: 30 minutes, round-robin across whoever takes first calls, 15-minute buffer after, minimum 1 hour notice, maximum 14 days out, 6 slots per day cap so the calendar never looks empty or impossible.
  • Callback Window: 15 minutes, used when the lead says “just call me” rather than booking a formal consult. Same team, no buffer.

Custom fields

Create these on the contact record. The first three are what make the build measurable rather than anecdotal:

  • first_touch_at (date/time). When the inquiry arrived.
  • first_response_at (date/time). When the first outbound message actually sent.
  • first_response_seconds (number). The difference. This is the metric the whole build exists to drive down.
  • lead_source_detail (text): form name, ad set, landing page slug, or “missed call”.
  • inquiry_channel (dropdown): Form, Missed Call, Chat Widget, Inbound Text, Referral.
  • service_interest (dropdown): your actual service list. Keep it under eight options.
  • preferred_contact_channel (dropdown): Text, Call, Email.
  • sms_consent (checkbox) and sms_consent_at (date/time): written at the moment of capture, never backfilled.
  • consent_source (text). The exact form or keyword that produced consent. This is your audit trail.
  • missed_call_from (phone) and missed_call_at (date/time).
  • after_hours_queued (checkbox): set when a touch is held for quiet hours.
  • touch_count (number): outbound attempts in the current follow-up ladder.
  • ai_handoff_reason (text): why the assistant stopped and escalated.
  • sla_breached (checkbox): first response took longer than five minutes.

Tags

Tags drive entry and exit; keep them few and mechanical: new-inbound, missed-call, web-form, chat-widget, ai-engaged, human-takeover, booked, no-reply-ladder-complete, after-hours, sms-stop, do-not-contact.

Forms

  • Request a Call: five fields only: first name, mobile, email, service interest, and a consent checkbox. Every additional field costs you fills; ask the rest in conversation.
  • Chat widget capture: name and mobile before the thread starts, so a drop-off is still a lead.

The AI assistant

BO, the platform assistant, runs the first conversational layer on text and chat. Its job is narrow by design:

  • Role: acknowledge instantly, confirm what the person needs, qualify on at most three questions (what service, where they are, how soon), and get a booking link accepted. That is all.
  • Guardrails: never quote a price, a fee, or a discount; pricing is scoped per build and belongs on a call. Never give clinical, legal, or financial advice. Never promise a specific person, outcome, or timeline. Never send more than five outbound messages without a reply. Never message outside quiet hours. Hand off to a human immediately on any of: a pricing question asked twice, an explicit request for a person, an angry or distressed tone, a mention of an emergency or urgent symptom, a legal or complaint word, or any message it cannot classify.
  • Handoff mechanics: on escalation, write ai_handoff_reason, apply human-takeover, remove ai-engaged, and notify the on-duty owner. The assistant goes silent on that thread until a human releases it.

Numbers and channels

  • One dedicated local number as the business line, with the existing landline forwarded into it so the platform can see every ring.
  • Call routing to a ring group with a 20-second timeout, then a whisper message identifying the lead source to whoever picks up.
  • Call recording on, with the appropriate announcement, where your jurisdiction requires consent.
  • SMS and MMS enabled on the same number so the text-back arrives from the number people just dialled. This single detail drives reply rate more than any copy change.
  • Email as a parallel, lower-priority channel for anyone without a mobile.
03

How it runs, step by step

One lead, end to end

  1. 6:07pm. A prospect searches, lands on the service page, and taps the call button. The front desk has gone home. The line rings for 20 seconds in the ring group and nobody answers.
  2. 6:07pm + 45 seconds. The missed-call workflow fires. A contact is created or matched on the calling number. inquiry_channel is set to Missed Call, missed_call_at is stamped, the missed-call and new-inbound tags are applied, and an opportunity is created in Inbound Leads → New Lead.
  3. Immediately after. A text goes out from the number they just dialled: an apology for the miss, a question about what they need, and a statement that a reply here reaches a real person. Because the message originates from the dialled number, it lands in the thread they expect. first_response_at is stamped and first_response_seconds computes to under 60. The opportunity moves to Attempting Contact.
  4. 6:09pm. They reply: “Hi, wanted to ask about an appointment this week.” The reply trigger moves the opportunity to Conversation Active, applies ai-engaged, and stops the no-reply ladder before it ever starts.
  5. 6:09pm. BO answers within seconds, confirms the service in one question, and offers the two nearest available slots from the New Inquiry Consult calendar as a link.
  6. 6:12pm. They ask what it costs. BO does not answer with a number. It says pricing depends on what they actually need and that the consult is where that gets scoped, then re-offers the slot. If they ask a second time, BO stops, writes ai_handoff_reason = “pricing asked twice”, applies human-takeover, and pings the on-duty owner.
  7. 6:14pm. They book Thursday 10:00am. The booking trigger moves the opportunity to Appointment Booked, applies booked, removes ai-engaged, and cancels every pending follow-up step.
  8. 6:14pm. A confirmation text and email go out together, each containing the time, the address, a reschedule link, and what to bring.
  9. Wednesday 10:00am. A 24-hour reminder text asks for a one-word confirmation. A reply of “yes” is logged on the record; anything else routes to the front desk as a task.
  10. Thursday 8:00am. A 2-hour reminder with the address and a parking note.
  11. Thursday 10:00am. The appointment happens. The front desk marks it Showed, which is also what starts the review build if you have it running.
  12. The alternative branch. If no reply had ever come, the no-reply ladder would have run four touches across seven days. A next-morning text, a same-day email, a human call task on day three, and a final “closing the file” text on day seven, then dropped the opportunity to Unresponsive with no-reply-ladder-complete, making it eligible for a reactivation wave 90 days later rather than a deletion.
04

Automations in detail

WF-01 · Inbound Form Speed-to-Lead

Trigger: Form submitted: Request a Call (also chat widget capture, as a second trigger on the same workflow).

Entry conditions: contact does not have tag do-not-contact; mobile field is non-empty.

Actions, in order:

  1. Set first_touch_at = now; inquiry_channel = Form; lead_source_detail = form name plus referring page; sms_consent = true and sms_consent_at = now only if the consent checkbox was ticked; consent_source = form name.
  2. Add tags new-inbound, web-form.
  3. Create opportunity in Inbound Leads → New Lead.
  4. Branch on time of day. If local time is between 08:00 and 20:00, continue. Otherwise set after_hours_queued = true, add tag after-hours, and wait until 08:00 local before continuing.
  5. Branch on sms_consent. If true, send SMS. If false, skip to the email step.
  6. Send SMS: “Hi {{first_name}}, it’s {{business_name}}, got your inquiry about {{service_interest}} just now. Quickest way to sort this is a short call. Here are the next open times: {{booking_link}}. Or reply here and I’ll help.”
  7. Set first_response_at = now; first_response_seconds = difference from first_touch_at; increment touch_count.
  8. Move opportunity to Attempting Contact.
  9. Create a call task for the on-duty owner, due in 5 minutes, titled “Call new lead, {{first_name}}, {{service_interest}}”.
  10. Internal notification to the team channel: name, service, source, and the thread link.
  11. Wait 3 minutes.
  12. Send email (plain, from a real person’s address, no template graphics): subject “Following up on your inquiry”, body restating the inquiry, the booking link, and a direct phone number.
  13. Wait 5 minutes. If the opportunity is still in Attempting Contact, hand the contact to the WF-03 no-reply ladder.

Exit conditions (all steps): contact replies on any channel; tag booked, sms-stop, or do-not-contact is added; opportunity reaches Appointment Booked, Won, or Disqualified.

WF-02 · Missed-Call Text-Back

Trigger: Call status = no answer, busy, or voicemail, on the business number, direction inbound.

Entry conditions: call duration under 10 seconds of connected talk time; calling number is not an existing staff number; contact does not have sms-stop or do-not-contact; no missed-call text sent to this number in the last 4 hours (prevents a loop when someone redials three times).

Actions, in order:

  1. Find or create contact by phone number.
  2. Set inquiry_channel = Missed Call; missed_call_from and missed_call_at; first_touch_at = now if empty; lead_source_detail = “missed call”.
  3. Add tags new-inbound, missed-call.
  4. Create opportunity in Inbound Leads → New Lead (skip if an open opportunity already exists).
  5. Branch on hours. Inside 08:00–20:00 local: continue immediately. Outside: send the after-hours variant instead, which sets expectations rather than promising a call back tonight.
  6. Wait 45 seconds. This matters, firing instantly can collide with a staff member who picked up on the last ring, and the pause also stops the text arriving before the caller has lowered the phone.
  7. Condition: if the call was answered or returned in those 45 seconds, exit.
  8. Send SMS from the dialled number. Business hours: “Sorry we missed your call. This is {{business_name}}. We’re with someone right now. What can we help you with? Replying here reaches a real person.” After hours: “Sorry we missed you: {{business_name}} here, we’re closed for the evening. Reply with what you need and we’ll come back first thing. If it’s easier, grab a time directly: {{booking_link}}.”
  9. Set first_response_at, compute first_response_seconds, increment touch_count, move to Attempting Contact.
  10. Wait 10 minutes, then create a call-back task for the on-duty owner if still no reply.

Exit conditions: any inbound reply; outbound call connected to that number; sms-stop; booked.

WF-03 · No-Reply Follow-Up Ladder

Trigger: Opportunity has been in Attempting Contact for 15 minutes with touch_count ≥ 1.

Actions and waits:

  1. Wait until 09:00 next business day. SMS: “Morning {{first_name}}, still happy to help with {{service_interest}}. Easiest is to pick a time that suits: {{booking_link}}.” Increment touch_count.
  2. Wait 6 hours. Email: subject “Did I catch you at a bad time?”: three short lines, booking link, direct number.
  3. Wait 2 days. Create a manual call task, due same day, titled “Attempt 3: call {{first_name}}”. Notify the owner.
  4. Wait 2 days. SMS: “{{first_name}}, I don’t want to keep chasing you. Want me to hold a time, or should I close this off for now? Either answer is fine.” This message gets disproportionate replies because it gives permission to say no.
  5. Wait 3 days. SMS: “Closing your inquiry off for now. If anything changes, just text this number and I’ll pick it straight up.”
  6. Add tag no-reply-ladder-complete; move opportunity to Unresponsive; set a recontact-eligible date 90 days out so the record feeds a future reactivation wave rather than being deleted.

Quiet-hours rule on every step: if the step would send between 20:00 and 08:00 local, hold it until 08:00. Never send on the lead’s behalf at 2am; it reads as spam and generates complaints that threaten your number.

Exit conditions: any reply on any channel, booked, sms-stop, do-not-contact, stage change to Disqualified or beyond Attempting Contact.

WF-04 · Reply Capture and AI Handoff

Trigger: Inbound SMS, chat message, or email reply from a contact tagged new-inbound.

Actions:

  1. Remove all pending steps in WF-01, WF-02, WF-03 for this contact.
  2. Move opportunity to Conversation Active; add tag ai-engaged.
  3. Branch on message content. If the message contains STOP, UNSUBSCRIBE, CANCEL, END, QUIT, or OPT OUT → route to WF-06 and stop. If it contains an escalation word (emergency, urgent, pain, lawyer, complaint, refund, manager) → skip the assistant, apply human-takeover, set ai_handoff_reason, notify the owner by push and SMS, and stop.
  4. Otherwise hand the thread to BO with the booking calendar, the service list, and the guardrails above. Cap: 5 outbound messages without a reply, then escalate with ai_handoff_reason = “no reply after 5 assistant messages”.
  5. If the assistant has been silent on a thread with an unanswered inbound message for 10 minutes, escalate to a human regardless of reason. No lead should ever be left mid-sentence.

WF-05 · Booking Confirmation and Reminders

Trigger: Appointment booked on New Inquiry Consult or Callback Window.

  1. Move opportunity to Appointment Booked; add booked; remove ai-engaged; cancel all follow-up steps.
  2. Immediately: SMS + email confirmation. “You’re booked: {{appointment_time}} with {{business_name}}, {{address}}. Need to change it? {{reschedule_link}}.”
  3. Wait until 24 hours before start. SMS: “Reminder: {{appointment_time}} tomorrow. Reply Y to confirm or use {{reschedule_link}} if you need a different time.” A reply of Y/yes/yep writes a confirmed flag; anything else creates a front-desk task.
  4. Wait until 2 hours before start. SMS with address and arrival note.
  5. Wait until 15 minutes after end. If the appointment is still unmarked, create a task: “Mark showed or no-show: {{first_name}}”.
  6. On no-show: move to Attempting Contact, send “Sorry we missed you today: want to pick another time? {{booking_link}}”, and re-enter WF-03 at step 3.

Exit: appointment canceled, contact opted out, opportunity marked Won or Disqualified.

WF-06 · Opt-Out, DND and Compliance

Trigger: Inbound message containing STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, OPT OUT, or REMOVE (match case-insensitively, trim whitespace, match the whole word).

  1. Set SMS do-not-disturb on the contact; set sms_consent = false; add tags sms-stop and do-not-contact.
  2. Remove the contact from every active workflow.
  3. Send one final confirmation only: “You’re unsubscribed from texts from {{business_name}}. You won’t hear from us here again.” Then nothing, ever, on that channel.
  4. Move any open opportunity to Disqualified with reason “opted out”.
  5. Log the opt-out with timestamp. Never clear this flag through an import or a bulk edit; only an explicit new opt-in from the contact should reverse it, and that writes a fresh sms_consent_at and consent_source.

Also handle HELP: reply with the business name, what the messages are, and how to stop. Carrier-level opt-outs should be mirrored into the tag so your own reporting matches reality.

WF-07 · Response-Time Breach Alert

Trigger: Opportunity created in New Lead.

  1. Wait 5 minutes.
  2. Condition: first_response_at is still empty.
  3. Set sla_breached = true. Notify the owner directly: “Speed-to-lead breach: {{first_name}} has been waiting 5 minutes with no first response. Source: {{lead_source_detail}}.”
  4. Wait 25 minutes. If still no response, escalate to the manager.

This workflow produces no customer-facing message. Its only job is to make the failure visible on the day it happens rather than in a quarterly review. Watch the count of breaches weekly; if it is not trending to zero, something upstream is misconfigured.

05

What changes

What is different afterwards

  • Response time stops depending on staffing. The first touch is identical at 9am Monday and 9pm Saturday, because no human is in the path. Lunch breaks, sick days and school holidays stop costing leads.
  • Missed calls become conversations. A ring-out used to end the interaction; now it starts a text thread on the number the person already dialled, which is the single highest-reply-rate channel most businesses own and almost none use.
  • The pipeline becomes true. Because stage changes are automated off real events (a reply, a booking, a ladder running out) the board reflects what happened rather than what someone remembered to drag.
  • Nothing goes to the bin. Unresponsive leads land in a named stage with a recontact date, which is the raw material for a reactivation campaign later.
  • Failures become visible. The breach alert turns “we’re usually pretty quick” into a number somebody owns.

Metrics to watch

  • Median and 90th-percentile first_response_seconds, split by channel. Median will collapse almost immediately; the 90th percentile is where the real problems hide.
  • Breach count: opportunities with sla_breached = true, weekly. Target is zero, and the trend matters more than the level.
  • Missed-call recovery rate: of contacts tagged missed-call, the share that reply, and of those, the share that book. Track both; a high reply rate with low booking means the copy or the calendar is the constraint, not the trigger.
  • Reply rate per ladder step: this tells you which of the four touches is carrying the ladder and which you can cut. Step 4, the permission-to-say-no message, usually earns its place.
  • New Lead → Appointment Booked conversion, and the time between them.
  • Show rate on confirmed versus unconfirmed appointments. This quantifies what the 24-hour reminder is worth.
  • Stage aging: anything sitting in Attempting Contact past the ladder length means a workflow is not exiting correctly.
  • Opt-out rate per 1,000 messages sent. Watch this as a health signal; a rise means volume, timing, or relevance has drifted and your number is at risk.
  • Assistant handoff reasons, grouped. The most common reason tells you exactly what to fix next in the conversation design.
06

Before you start

Prerequisites

  • A decision on who the on-duty owner is for each part of the week. Automation removes the delay on the first touch; it does not remove the need for a human to answer at step three.
  • Your real service list, short enough to be a dropdown, and your service area, so the assistant can disqualify out-of-area inquiries without a human.
  • Live availability on the calendars. A booking link that offers nothing is worse than no link at all.
  • Agreement that no price goes into any automated message. Pricing is scoped per build and belongs on the call. The booking link is the answer to a pricing question, not a number.

Integrations and provisioning

  • Provision a dedicated local number inside the platform, voice and SMS/MMS enabled, in the same area code as the business.
  • Forward the existing published line into the platform number so every ring is observable. Keep the published number on your website and listings; do not swap it for a tracking number and break your listings.
  • Configure the ring group with a 20-second timeout (long enough to be answered, short enough that the caller has not given up) and set the voicemail greeting to tell people a text is coming.
  • Website: install the form and the chat widget, pass the referring URL and ad parameters into lead_source_detail.
  • Calendar sync two-way with each team member’s working calendar, so personal commitments block slots automatically.
  • Email sending domain authenticated with SPF, DKIM and DMARC before the first send, or your follow-up emails will not be seen.

SMS consent and registration

  • A2P 10DLC registration is not optional. Register the legal entity (brand) and each messaging campaign before you send. Expect this to be the long pole in the launch (days, sometimes longer) so start it on day one while you build everything else.
  • Your campaign registration must describe the real use case (appointment and inquiry follow-up) and your submitted sample messages must match what the workflows actually send. Mismatches get campaigns rejected or throttled.
  • Every entry point must carry explicit consent. Put a plain, unticked checkbox on each form with language naming the business, the kind of messages, that frequency varies, that message and data rates may apply, and how to stop. Store what they agreed to and when in sms_consent_at and consent_source.
  • The missed-call text-back relies on the caller having initiated contact. Treat it as conversational, keep it responsive rather than promotional, and never follow it with marketing content unless the person separately opted in to that.
  • Publish a privacy policy and SMS terms at linkable URLs before registration; you will be asked for them.
  • Honor STOP mechanically, not manually: WF-06 must exist before the first send, and nothing should be able to clear a do-not-contact flag by import.
  • Quiet hours: hold all automated sends to 08:00–20:00 in the contact’s local time, and check your own jurisdiction, which may be stricter. Build the hold into every workflow rather than trusting send times to be sensible.
  • Keep a single source of truth for suppression across SMS and email so an opt-out on one channel is at least visible on the other.

Where regulated data is involved

  • If you operate in healthcare or any other setting handling protected health information, get the platform covered by an executed business associate agreement before any real patient data enters it, and confirm which modules are in scope.
  • Keep clinical detail out of automated messages entirely. Automated texts should reference an appointment and a location, never a condition, a medication, a result, or a department that implies a diagnosis. “Reminder: your appointment tomorrow at 10:00” is safe; naming the service is often not.
  • Do not let the AI assistant discuss symptoms, results, or treatment. The escalation word list exists for exactly this. Any clinical content ends the automated thread and routes to a person.
  • Restrict who can see conversation threads and recordings by role, turn on audit logging, and set a retention period you can actually defend.
  • Confirm your call recording announcement meets the consent rules in every jurisdiction you take calls from, not just your own.
  • None of this is legal advice: have your own counsel review the consent language, retention periods, and recording practice before launch.

Build it with us.

Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.

Book a call