Back to the build library
Home services
Starter

Instant Quote Request Response

Answer every inbound quote request within seconds with a real next step, so the lead is engaged before a competitor's voicemail ever lands.

Industry
Home services
Build effort
Starter
Typical time to launch
1–2 weeks
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

A homeowner with a leaking water heater does not shop. They open a map, tap three contractors in a row, fill in three quote forms, and hire whichever one talks to them first. A quote request is not a lead to be worked later in the week; it is a race that is usually decided inside the first ten minutes. Most home services businesses lose that race not because they are slow to care but because the request lands in a shared inbox while the owner is under a sink and the office manager is on the phone with a supplier.

What makes it worse is that the replies that do go out are acknowledgements rather than next steps. Thanks for reaching out, someone will be in touch shortly gives the homeowner nothing to act on and nothing to hold onto. It does not confirm the job address, it does not establish whether this is a burst pipe or a kitchen remodel being planned for spring, and it does not get a photo of the actual failure. So the first real conversation happens hours later, starts from zero, and often starts with the homeowner saying they already booked someone else.

The money leaks in three specific places. First, requests that arrive outside office hours get a next-business-day reply, which for an emergency job is the same as no reply. Second, requests with no scope attached get triaged by guesswork, so a technician drives out to a job that was never going to be worth the trip while a high-value replacement sits unanswered. Third, nobody can see where the leak is, because first-response time is not recorded anywhere, so the business has no way to tell whether it loses leads at the reply, at the scoping conversation, or at the estimate. This build fixes the first link in that chain: a reply that goes out in seconds, carries a real next step, and collects enough scope that the human who picks it up is already ahead.

02

What gets built

Pipeline and stages

A single pipeline named Quote Requests. Every inbound request creates an opportunity here, and the stage is the honest answer to "what is this waiting on?"

  • New Request - created the moment a form, call or message arrives. Nothing has gone out yet.
  • Auto-Replied - the instant reply has been delivered and the response clock has been stamped.
  • BO Qualifying - BO is in a live scoping conversation collecting address, service type and urgency.
  • Scope Confirmed - address, service type, urgency and at least one photo or a written description are on the record.
  • Estimate Sent - a human has priced the job and sent it.
  • Won - work authorized.
  • Lost - No Response - the follow-up ladder ran out.
  • Lost - Scope or Fit - outside service area, outside trade, or the homeowner went elsewhere.

Calendars

This build is deliberately light on scheduling - booking the on-site visit is its own system. Two calendars only:

  • Callback Window - 15-minute slots during office hours that BO can offer when a homeowner prefers a phone conversation over typing.
  • Emergency Triage - a round-robin calendar covering the on-call technician, used only when urgency is flagged as emergency.

Custom fields

Create these on the contact record, except where noted. Field names matter because every workflow condition below reads them.

  • service_type - single select: Plumbing, HVAC, Electrical, Roofing, Remodel, Other.
  • job_address - text. The service address, which is frequently not the billing address.
  • property_type - single select: Owner-occupied, Rental, Commercial, HOA or Strata.
  • urgency_level - single select: Emergency today, Within the week, Planning ahead.
  • problem_description - long text, in the homeowner's own words.
  • preferred_contact_method - single select: Text, Call, Email.
  • best_time_window - text, free-form, e.g. "after 4pm weekdays".
  • photos_received - number. Incremented each time an image lands in the conversation.
  • first_response_seconds - number. Stamped once, on the opportunity, by the instant reply workflow.
  • source_channel - single select: Web form, Map listing, Phone, Chat widget, Referral.
  • estimate_sent_on - date. Written when the stage moves to Estimate Sent.
  • lost_reason - single select: Price, Timing, Went elsewhere, Out of area, No response.

Tags

  • quote-request - applied to everyone who enters this system.
  • urgency-emergency, urgency-week, urgency-planning - mirror of urgency_level, used for list building.
  • awaiting-photos - set when BO has asked for an image and none has arrived.
  • scope-complete - set when address, service type and urgency are all populated.
  • after-hours-request - set when the request arrives outside business hours.
  • out-of-area - set when the ZIP code fails the service-area check.
  • revive-90 - set on leads that went cold and are eligible for the long-cycle revive.
  • sms-opted-out - set by the opt-out guard and checked as an exit condition on every outbound workflow.

Forms

  • Quote Request (Short) - the form on every service page and in the map listing. Five fields and nothing more: name, mobile, service needed, job address, what is happening. Every additional field costs completions, and BO collects the rest conversationally.
  • Scope Detail - a longer form BO can send by link when a homeowner would rather type than chat: property type, age of the equipment, access notes, photo upload, preferred time window.
  • Photo Upload - a single-field mobile-first upload page, sent as a short link in SMS. Writes to photos_received.

BO's role and guardrails

BO is the first responder, not the estimator. BO's job is to make the homeowner feel answered and to collect the four things a human needs before pricing: address, service type, urgency, and a photo or description.

  • BO never states a price, a price range, an hourly rate, a call-out fee or a discount. When asked, BO says pricing depends on what the technician finds and offers to get a real figure from the team.
  • BO never promises an arrival time. It can offer a callback window from the Callback Window calendar; it cannot commit a truck.
  • BO never diagnoses. "That sounds like a failed expansion tank" is out of scope. BO describes, records, and escalates.
  • BO hands off to a human immediately on any of: urgency_level set to Emergency today, any mention of gas, smoke, sparking or flooding, an explicit request to speak to a person, or a third unanswered clarifying question.
  • BO stops on receipt of an opt-out keyword and does not resume on that channel.

Numbers and channels

  • One local business number provisioned on the platform, registered for application-to-person SMS, used for all outbound texts and as the reply-to for inbound.
  • Missed-call text-back enabled on that number so an unanswered ring becomes a conversation rather than a voicemail nobody checks.
  • Email sending on an authenticated sending domain with SPF, DKIM and DMARC published, so the instant reply does not land in spam.
  • The chat widget on the website routed into the same conversation thread as SMS, so a homeowner who starts on the site and replies by text is one record, not two.
03

How it runs, step by step

One homeowner, one Saturday morning, from the tap on the form to the authorized job.

  1. 9:04am - the request lands. A homeowner finds the business in a map search, opens the water heater service page and submits Quote Request (Short): name, mobile, "water heater", the job address, and "hot water gone, puddle under the tank". The contact is created or matched on cell number, tagged quote-request, and an opportunity opens in Quote Requests at New Request with source_channel set to Web form.
  2. 9:04am and 20 seconds - the instant reply goes out. An SMS arrives on the homeowner's phone naming the business, naming the problem back to them, and asking the one question that matters most: is this an emergency today, something for this week, or planning ahead. The opportunity moves to Auto-Replied and first_response_seconds is stamped. A matching email goes out with the same three options as tappable links, for the homeowner who gave an email and not a mobile.
  3. 9:05am - the homeowner replies "today, there is water on the floor". BO picks the conversation up, sets urgency_level to Emergency today, applies urgency-emergency, and moves the opportunity to BO Qualifying.
  4. 9:05am - the emergency path fires immediately. Because urgency is Emergency today and the message mentions flooding, BO does not continue qualifying. It tells the homeowner to shut the supply valve if they can reach it safely, says a technician is being notified now, and hands off. The on-call technician gets a call and an SMS with the address and the homeowner's words. This is the whole point of the build: the emergency does not wait for a scoping chat.
  5. 9:07am - the human takes over. The on-call technician replies in the same thread from the business number. The homeowner sees one continuous conversation, not a handoff.
  6. The ordinary path, for contrast. Had the homeowner replied "planning ahead, want to replace it before winter", BO would continue: confirm the job address against the service area, ask property_type, ask the age of the unit, and ask for a photo of the data plate and the tank.
  7. Scope collection. BO sends a short link to the Photo Upload page. Two images arrive, photos_received goes to 2, and BO writes the homeowner's description verbatim into problem_description rather than paraphrasing it.
  8. Scope confirmed. With job_address, service_type and urgency_level all populated and at least one photo on file, the tag scope-complete is applied and the opportunity moves to Scope Confirmed. BO tells the homeowner exactly what happens next and when, naming the business day: "Got it. Someone from the team will price this and text you the figure before end of day Monday."
  9. Internal notification. The estimator gets a single notification containing the four scope fields, the photos and a direct link to the opportunity. They do not have to reconstruct the job from a thread.
  10. Estimate sent. The estimator prices the job and sends it. Moving the stage to Estimate Sent writes estimate_sent_on and starts the follow-up ladder. No one has to remember to chase.
  11. Day 1 follow-up. Twenty-four hours after the estimate, a text asks whether anything in it needs explaining and offers a callback slot from the Callback Window calendar.
  12. Day 3 follow-up. An email restates the scope in plain language, so the homeowner comparing three quotes can see what is actually included rather than guessing at a number.
  13. Day 7 - the decision prompt. A final text asks for a yes, a no, or a "not yet". A no or a non-answer moves the opportunity to Lost - No Response, writes lost_reason, and applies revive-90.
  14. Won. The homeowner replies "book it". The stage moves to Won, the follow-up ladder exits, and the record - address, photos, description, urgency - is already complete enough to hand straight to scheduling.
04

Automations in detail

Seven workflows. Build them in this order - each one assumes the fields and tags from the one before it.

1. Instant Reply and Response Clock

Trigger: form submission on Quote Request (Short), or inbound chat widget message, or inbound SMS to the business number with no open conversation, or missed call on the business number.

Conditions: exit immediately if the contact carries sms-opted-out and no email address is present.

  1. Create or update the contact. Map form fields to job_address, service_type and problem_description. Set source_channel from the trigger.
  2. Apply tag quote-request.
  3. Create an opportunity in Quote Requests at New Request, named with the service type and the street line of job_address.
  4. Wait 0 seconds. There is no delay here on purpose - every second is the product.
  5. Branch on business hours. Inside hours: send SMS - "Hi {{first_name}}, this is {{business_name}}. We have your request about {{service_type}} at {{job_address}}. One quick thing so we route it right: is this an emergency today, something for this week, or are you planning ahead? Reply 1, 2 or 3." Outside hours: apply tag after-hours-request and send - "Hi {{first_name}}, this is {{business_name}}. We have your request about {{service_type}}. The office opens at {{open_time}} and you are first in the queue. If this is an emergency right now, reply EMERGENCY and we will page the on-call tech."
  6. If an email address exists, send the matching email with the three urgency options as buttons.
  7. Move the opportunity to Auto-Replied and write first_response_seconds as the seconds between creation and send.

Exit: on reply, on opt-out, or on stage change to Won or either Lost stage.

2. BO Scope Conversation

Trigger: inbound reply on any channel while the opportunity is at Auto-Replied.

Branches on the reply:

  • 1, EMERGENCY, or any of: flood, flooding, gas, smell gas, smoke, sparking, no heat, burst. Set urgency_level to Emergency today, apply urgency-emergency, hand off to workflow 3, end BO's turn.
  • 2 or "this week". Set urgency_level to Within the week, apply urgency-week, continue below.
  • 3 or "planning". Set urgency_level to Planning ahead, apply urgency-planning, continue below.
  • Anything else. BO asks once more, in plain words, without re-sending the numbered menu.
  1. Move the opportunity to BO Qualifying.
  2. BO confirms job_address and checks the ZIP code against the service-area list. On a miss, apply out-of-area, set lost_reason to Out of area, move to Lost - Scope or Fit, and send - "Thanks {{first_name}} - {{job_address}} sits outside the area our crews cover, so I do not want to waste your time. If that address is wrong, just reply with the right one."
  3. BO asks property_type, then asks for the age of the equipment where service_type is HVAC or Plumbing.
  4. BO asks for a photo: "A photo helps us price this properly instead of guessing. Can you send one here, or upload from {{photo_link}}?" Apply awaiting-photos.
  5. BO asks preferred_contact_method and best_time_window.
  6. When job_address, service_type and urgency_level are all populated: remove awaiting-photos if photos_received is 1 or more, apply scope-complete, move to Scope Confirmed, and send - "That is everything I need. The team will price this and come back to you by {{next_business_day}}."
  7. Notify the estimator internally with the four scope fields, photos and the opportunity link.

Exit: on handoff to a human, on opt-out, on out-of-area, or on reaching Scope Confirmed. BO also exits after three consecutive unanswered questions and raises an internal task instead.

3. Emergency Escalation

Trigger: urgency_level set to Emergency today, or tag urgency-emergency applied.

Conditions: none - this path never waits and is never suppressed by quiet hours, because the homeowner initiated it.

  1. Stop BO on this contact. All further replies route to a human.
  2. Send SMS to the homeowner - "Understood, treating this as urgent. If water is spreading, shut the main valve if you can reach it safely. A technician is being paged now and will call you directly."
  3. Place an outbound call to the on-call technician from the Emergency Triage round-robin. On no answer after 25 seconds, move to the next technician in the rotation.
  4. Send the on-call technician an SMS with job_address, service_type, problem_description verbatim, and the homeowner's mobile.
  5. Wait 5 minutes. If no team member has replied in the conversation, call and text the owner as the final escalation.
  6. Wait 15 minutes. If still unclaimed, post a second alert and raise a high-priority task so the breach is visible in the morning, not invisible forever.

Exit: a team member sends any message in the conversation, or the opportunity moves to Won.

4. Missing Photos Chase

Trigger: tag awaiting-photos applied.

Conditions: exit the moment photos_received is 1 or more, or sms-opted-out appears.

  1. Wait 2 hours, held to quiet hours so nothing sends between 9pm and 8am local.
  2. Send SMS - "Hi {{first_name}}, still need that photo to price your {{service_type}} properly - here is the link again: {{photo_link}}. If it is easier to just describe it, that works too."
  3. Wait 1 day.
  4. Send SMS - "No photo yet, which is fine. I can have someone call you instead and take the details by phone - does {{callback_slot}} work?"
  5. Wait 2 days.
  6. If photos_received is still 0 but job_address, service_type and urgency_level are populated, apply scope-complete anyway, move to Scope Confirmed and flag the opportunity as priced-without-photo so the estimator knows to pad the contingency.

Exit: photos received, stage change past BO Qualifying, opt-out, or completion of step 6.

5. Estimate Follow-Up Ladder

Trigger: opportunity stage changes to Estimate Sent.

Conditions: all waits respect quiet hours. Exit on any inbound reply containing yes, book, go ahead, proceed or approved - and on any stage change.

  1. Write estimate_sent_on to today.
  2. Wait 1 day.
  3. Send SMS - "Hi {{first_name}}, sent your estimate for the {{service_type}} work yesterday. Anything in it you want walked through? Happy to get you on the phone - {{booking_link}}."
  4. Wait 2 days.
  5. Send email restating the scope in plain language: what is included, what is not, what happens on the day. No new price, no discount.
  6. Wait 4 days.
  7. Send SMS - "Last check-in on this one, {{first_name}} - are we a yes, a no, or a not-yet? Any of the three is a useful answer and a no does not offend us."
  8. Wait 2 days. Branch on the reply. Price objection detected (cheaper, too much, expensive, budget): set lost_reason to Price, move to Lost - Scope or Fit, notify the estimator so a human - never BO - decides whether to revise scope.
  9. No reply at all: set lost_reason to No response, move to Lost - No Response, apply revive-90.

Exit: as above, plus opt-out.

6. Speed-to-Lead Breach Alert

Trigger: opportunity created in Quote Requests.

Conditions: internal only - nothing in this workflow reaches the homeowner.

  1. Wait 5 minutes.
  2. If the opportunity is still at New Request, the instant reply did not fire. Notify the owner by SMS with the contact name and a link, and raise a task.
  3. Wait 25 minutes.
  4. If the opportunity is at Auto-Replied with no inbound reply and urgency_level is Emergency today, escalate to the owner by call.
  5. Wait 24 hours. If first_response_seconds is above 120, add the opportunity to a weekly review list so slow replies get examined as a pattern rather than scolded one at a time.

Exit: stage moves past Auto-Replied, or 24 hours elapse.

7. Opt-Out, Quiet Hours and Cold Revive

Trigger A - opt-out: inbound SMS matching STOP, STOPALL, UNSUBSCRIBE, END, QUIT, CANCEL. Apply sms-opted-out, set the contact's SMS consent to declined, remove all other outbound tags, send the single platform confirmation and nothing further on that channel. Email remains available only if email consent is intact.

Trigger B - quiet hours: a global sending window of 8am to 9pm in the contact's own timezone, applied to every workflow above except Emergency Escalation. Messages queued outside the window release at the next window open rather than being dropped.

Trigger C - cold revive: tag revive-90 applied.

  1. Wait 90 days.
  2. Exit if the contact has since become a customer, carries sms-opted-out, or has an open opportunity in any pipeline.
  3. Send SMS - "Hi {{first_name}}, {{business_name}} here. We quoted your {{service_type}} back in {{month}}. Did you get it sorted? If not, I can get a fresh set of eyes on it."
  4. Wait 3 days. On no reply, send one email with the same question and a one-click "not interested" link that applies a permanent suppression tag.
  5. On any reply, create a fresh opportunity at New Request and let workflow 1 run from the top.

Exit: reply, suppression, or completion of step 4. A contact enters the revive path once and only once.

05

What changes

The visible change is that nobody is ever waiting on you to notice them. Every quote request is answered in seconds, on the channel the homeowner used, with a question they can answer in one tap. The invisible change is bigger: by the time a human touches the lead, the address is confirmed, the urgency is known, the problem is described in the homeowner's own words, and there is usually a photo. The estimator stops being a detective.

Triage stops being guesswork. Emergencies get paged to an on-call technician within a minute instead of sitting behind someone's lunch break, and planning-ahead leads stop consuming emergency attention. Out-of-area requests get told so politely and immediately instead of absorbing two phone calls and a wasted drive.

Follow-up stops depending on memory. The estimate ladder runs whether or not anyone remembers, and leads that go quiet land in a named Lost stage with a reason attached rather than evaporating. Within a quarter you have something most home services businesses have never had: a numeric answer to where leads die.

Metrics to watch

  • Median first_response_seconds, by source_channel and by hour of day. This is the headline number. Watch the median, not the average - one slow outlier should not hide a fast system, and one fast outlier should not hide a slow one.
  • Reply rate to the instant message, split inside hours versus after-hours. If after-hours reply rate collapses, the after-hours copy needs work, not the timing.
  • Share of requests reaching scope-complete, and how long that takes from first contact. This measures whether BO's question order is working.
  • Photo attach rate - percentage of Scope Confirmed opportunities with photos_received of 1 or more. Low rates usually mean the upload link is buried too deep in the message.
  • New Request to Estimate Sent conversion, and the time between Scope Confirmed and Estimate Sent. The second number is a human bottleneck, not an automation one, and will be the first thing the data exposes.
  • Estimate Sent to Won rate, and the distribution of lost_reason. A Price-heavy distribution is a pricing or scope-communication problem; a No-response-heavy distribution is a follow-up problem.
  • Emergency escalation claim time - minutes from the urgency-emergency tag to a team member's first message. Any value above five minutes means the rotation is wrong.
  • Out-of-area rate by source_channel. A spike here usually means an ad or map radius needs tightening, and that is cheaper to fix than anything else on this list.
  • Opt-out rate on the business number. Keep this under constant watch; a rising rate means message frequency or relevance is off, and SMS deliverability depends on it.
06

Before you start

Prerequisites

  • A defined service area, written as an explicit ZIP code or zip list rather than "about 40 minutes out". The out-of-area branch cannot work without it.
  • A named on-call rotation with real cell numbers and agreed hours. If nobody owns the emergency path, the emergency path is decoration.
  • Agreed business hours and an agreed after-hours promise. Do not launch the after-hours message until someone has committed to honouring the opening-time queue position it promises.
  • A decision, in writing, on who prices jobs and what their turnaround commitment is. BO's "by {{next_business_day}}" line is a promise the business has to keep.
  • The short quote form live on every service page and in the map listing, with the same five fields everywhere so source_channel comparisons are honest.

Integrations

  • Website forms - either the platform's native form embedded on the site, or the existing site form posted into the platform by webhook. Native is less to break.
  • Google Business Profile messaging, where available, routed into the same inbox so map inquiries are not a separate universe.
  • Google Calendar two-way sync for the Callback Window and Emergency Triage calendars, so a technician's personal commitments block platform availability.
  • Email sending domain authenticated with SPF, DKIM and DMARC records published before the first send. An unauthenticated domain will put the instant email in spam, which is worse than not sending it.
  • Optionally, a connector such as Zapier or Make to push Won opportunities into an existing field-service or accounting system, if scheduling and invoicing live elsewhere.

Number provisioning

  • Provision a local number in the service area's area code. Homeowners answer local numbers and ignore toll-free ones.
  • Complete brand and campaign registration for application-to-person messaging - in the United States this is 10DLC registration, and in other markets the equivalent sender registration. Allow a week or more for approval and do not schedule launch before it clears. Unregistered traffic gets filtered silently, which looks exactly like a broken build.
  • Register the campaign honestly as customer care and conversational traffic, with sample messages matching the copy above, and the opt-in description matching the form's actual consent language.
  • Verify the voice side separately if emergency calls will dial out from the platform, and set up caller ID so the on-call technician's phone shows the business, not an unknown number.

Compliance

  • Consent. The quote form needs clear, unbundled language stating that submitting it means the business may contact the homeowner by text and phone about their request, with a link to the privacy policy. Consent collected for a quote request covers transactional follow-up about that request; it does not cover later marketing blasts, and those need their own opt-in.
  • Opt-out handling. STOP, STOPALL, UNSUBSCRIBE, END, QUIT and CANCEL must all work on every outbound workflow, apply sms-opted-out, and stop sends immediately. Honor them permanently, not for 30 days. Include opt-out instructions in the first message of any sequence a homeowner did not just initiate.
  • Quiet hours. Set the global sending window to 8am-9pm in the contact's own timezone, not the office's. Many jurisdictions set a narrower window, and some restrict Sundays and public holidays - check the rule for every state or region in the service area, not just the home one.
  • Data protection. Job addresses, photos of people's homes and problem descriptions are personal data. Decide how long photos are retained, who can see them, and what happens on a deletion request - and write that into the privacy policy before launch rather than after the first request.
  • Recording. If calls into or out of the platform are recorded, announce it at the start of the call and check whether one-party or all-party consent applies in each jurisdiction served.
  • None of the above is legal advice. SMS, calling and privacy rules vary by jurisdiction and change often - have the client's own counsel review the consent language, retention policy and recording practice before launch.

Scoping the build

What this costs depends on the number of service lines, whether an existing website form has to be preserved, and how complex the on-call rotation is. Book a call at bookings.appbo.io to scope it against the actual business.

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