Back to the build library
Home services
Standard

Estimate to Signed Job

Turn site visits into signed contracts: fast estimate delivery, a follow-up ladder that reacts to views, and deposit collection built into the close.

Industry
Home services
Build effort
Standard
Typical time to launch
2–3 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 home services company does the expensive part of the job first. Someone answers the phone, qualifies the address, drives twenty-five minutes across town, climbs into an attic or onto a roof, measures, photographs, talks the homeowner through options, and drives back. That is a real cost in fuel, labor and a slot that could have held another visit. Then the estimate goes out, and the company's entire follow-through consists of waiting.

Three failures stack on top of each other here. The first is delivery speed: the estimate is written up in the evening, or on the weekend, or on Tuesday when the estimator finally gets to the paperwork, and by then the homeowner has two other quotes sitting in their inbox with earlier timestamps. The second is follow-up, which in most companies is one text two days later and then silence, because nobody owns the estimate after it has been sent and nothing tells them it has gone cold. The third is the close itself. A PDF attached to an email has no accept button, no deposit path and no expiry, so saying yes requires the homeowner to initiate a phone call, which is exactly the friction that lets a competitor who made it easy win the job.

The leak is almost perfectly measurable and almost never measured. Every sent estimate has a known cost already sunk into it and a known value if it closes. A company that sends estimates and closes some unknown share of them, with no view tracking, no follow-up cadence and no recorded loss reasons, cannot tell the difference between losing on price, losing on timing, and losing because nobody called back. Those three have completely different fixes, and only one of them is about price. This build makes the whole path from request to signed contract a tracked pipeline with an owner, a clock and a close mechanism, so the losses become legible and most of them turn out to be fixable without discounting anything.

02

What gets built

Pipeline: Estimate to Signed Job

One card per job opportunity, created at first contact and carried to a signed contract with a paid deposit. Stages advance on events, not on optimism.

  • New Request: inquiry captured from any channel, nothing attempted yet.
  • Contacted: No Reply: at least one outbound touch, no response.
  • Qualifying: two-way conversation running; service type, address zone and scope being established.
  • Out of Area / Not a Fit: outside the service zone, outside the trade, or a job the company does not take. Closed with a reason and a referral where possible.
  • Site Visit Scheduled: an estimate appointment exists on an estimator's calendar.
  • Site Visit Complete: the estimator has been on site; the delivery clock starts here.
  • Estimate Being Built: the one stage with a hard internal deadline attached.
  • Estimate Sent: delivered, not yet opened.
  • Estimate Viewed: opened at least once. A different stage because it warrants different follow-up.
  • In Discussion: homeowner has responded with a question, an objection or a request to change scope.
  • Verbal Yes: agreed but not signed. Deliberately short-lived; a card that sits here is a card at risk.
  • Signed: Deposit Pending: contract executed, money not in.
  • Won: Scheduled: signed, deposit paid, install date on the calendar. The only stage that counts as a win.
  • Lost: Price, Lost: Timing, Lost: Scope / Went Another Direction, Lost: No Response: four separate stages, because collapsing them into one "Lost" destroys the only information the loss contained.

Calendars

  • Estimate Appointment: one calendar per estimator, with drive-time buffers before and after and a slot length matched to the real duration of a site visit for that trade. Set a minimum scheduling notice so the morning's route is not rewritten at 7:40am.
  • Zone-restricted availability: each estimator's calendar carries its own availability by zip zone and day, so Tuesday's bookings cluster in the north zone and Wednesday's in the south. This single piece of configuration recovers more billable hours than any message in this build.
  • Virtual Estimate: a short video-call calendar for jobs that can be scoped from photos and a walkthrough. Separating it means the simple jobs stop consuming drive time.
  • Install / Job Start: capacity blocks by crew and job type, used to offer real start windows at the point of signing rather than "we'll call you to schedule."
  • Follow-Up Call Block: a protected staff block, twice daily, where open estimates get worked by phone. The estimate ladder below creates call tasks that are worthless without a block to work them in.

Custom fields

  • Job basics: service_type, job_scope_summary, property_type, property_age, property_size, occupancy (owner occupied, tenant occupied, vacant), access_notes, pets_on_site
  • Routing: service_address, zip_zone, drive_time_bucket, assigned_estimator, assigned_crew
  • Qualification: urgency (emergency, this week, this month, planning), decision_makers_count, all_decision_makers_present, competing_bids_count, financing_interest, budget_discussed (switch, whether the conversation happened, not the number), insurance_claim, claim_number_on_file, hoa_approval_required, permit_required
  • Estimate mechanics: estimate_number, estimate_sent_datetime, estimate_delivery_hours (computed from site visit complete to sent), estimate_viewed_datetime, estimate_view_count, estimate_last_viewed, options_presented_count, option_selected, estimate_expiry_date, revision_count
  • Close mechanics: contract_status, contract_signed_datetime, deposit_status (not required, requested, paid, waived), deposit_requested_date, deposit_paid_date, balance_terms, install_date, install_window
  • Outcome and attribution: lead_source, source_campaign, referred_by, first_touch_timestamp, first_response_timestamp, lost_reason, lost_to_competitor, reheat_date, review_requested, referral_asked

Tags

  • Stage shorthand: estimate-sent, estimate-viewed, viewed-3-plus, verbal-yes, signed, deposit-paid
  • Handling: needs-site-visit, virtual-ok, out-of-area, emergency, one-decision-maker, financing-interest, insurance-job, permit-job, hoa-job
  • Risk: competing-bids, price-objection, expiry-approaching, stalled-7-days
  • Recycling: reheat-30, reheat-90, seasonal-followup, past-customer

Forms

  • Estimate Request (one per service line, on the site and on each landing page). Name, phone, email, service address, service type, urgency, a short description, optional photo upload, and the SMS and email consent checkboxes. Photos on the request form are worth more than any other field: they let dispatch decide between a virtual and an on-site estimate before anyone drives anywhere.
  • Pre-Visit Scope Questionnaire: sent after the appointment is booked. Property age and size, access and parking, which decision makers will be present, whether there is existing equipment or prior work, and a photo upload prompt. The estimator arrives already knowing what they are looking at, which shortens the visit and improves the estimate.
  • Estimate Acceptance: the close mechanism. Presents the options side by side, captures which option the homeowner chose, takes the signature, and hands straight to the deposit step. One page, no attachment, no phone call required.
  • Scope Change Request: so revisions are captured as a tracked event with revision_count incremented, rather than as a text message the estimator will forget.
  • Loss Reason: internal, one screen, mandatory before a card can be closed. Service type, option selected if any, reason category, competitor name if known, and whether price was the real reason or the stated one.
  • Post-Install Survey: short, gated into the review and referral workflow.

Funnels and landing pages

  • One estimate-request page per service line, each with its own campaign parameter so source_campaign populates automatically and stays attached to the card through to won or lost.
  • A self-scheduling page that shows live estimate-appointment availability filtered by the visitor's zip, so a homeowner at 9pm can book their own site visit into the right estimator's route.
  • An estimate presentation page: the options, the inclusions, what is not included, the warranty, the financing information, and a single accept action. This page replaces the PDF and is the reason the close rate moves.
  • A financing information page, linked from the presentation page, so the payment-structure conversation can happen without a phone call.

BO's role and guardrails

  • BO does: respond to web chat and inbound text instantly, confirm the service address and whether it is inside the service zone, identify the service type, ask the three qualification questions that decide whether a site visit is needed, offer real estimate-appointment slots from the correct zone-restricted calendar, book the appointment, and send the pre-visit questionnaire.
  • BO never: quotes a price, gives a range, estimates how long a job will take, promises a start date, confirms whether something is covered by an insurance claim or a warranty, diagnoses a problem from a description, or agrees to a scope change. Pricing and scope are the estimator's job and the estimate's job.
  • Fixed deflection copy on price: "I can't give you a number without seeing it. Every property is different and I'd rather be accurate than fast. What I can do is get {{estimator}} out there and you'll have a written estimate with options. Does {{slot_1}} or {{slot_2}} work?"
  • Escalation triggers: anything described as an emergency, an active leak, no heat or no cooling in extreme weather, an electrical or gas concern, a structural concern, an insurance adjuster or public adjuster involved, a commercial property, a tenant calling about a landlord's property, a complaint about previous work, or any mention of a lawyer. Each one goes to a named human immediately, with the emergency ones routed to a phone call and not a text thread.
  • Containment: BO answers from the company's own published service list, zones, hours and warranty content. Where the answer is not there, BO says so and books the visit rather than guessing.

Payments and documents

  • E-signature on the acceptance form, with a stored executed copy and a timestamp.
  • Deposit collection immediately after signature, in the same flow, on the same page. The single highest-impact mechanical change in this build. A signed contract with no deposit is a soft commitment.
  • Automatic invoice generation on signature and on job completion, with the balance terms carried from balance_terms.
  • A financing option surfaced at the point of decision rather than mentioned once on a site visit and never again.

Reporting

A board the owner can read in ninety seconds: requests by source, speed to first response, request-to-site-visit rate, site-visit-to-estimate-sent rate with median estimate_delivery_hours, estimate view rate, estimate-to-signed rate, median days from sent to signed, deposit collection rate and days to deposit, won revenue by source and by estimator, and the loss-reason distribution broken out by the four Lost stages.

03

How it runs, step by step

One homeowner, request to signed job

  1. A homeowner submits the estimate request form at 8:15pm from a service-line landing page, uploading two photos. The page's campaign parameter writes source_campaign; the form writes service_type, service_address, urgency = this month, and the consents. A card is created in New Request with first_touch_timestamp.
  2. Within seconds she receives a text acknowledging the request by name and naming the service. first_response_timestamp is stamped; the card moves to Contacted: No Reply. BO is on the thread because it is after hours.
  3. She replies. The card moves to Qualifying. The address geocodes into zip_zone = North, which is inside the service area, so no out-of-area branch fires.
  4. BO asks the qualification set: is it the whole house or one area, how soon are you looking to do the work, and will everyone who is making the decision be there for the visit. She says both she and her husband will be home Saturday morning. decision_makers_count = 2 and all_decision_makers_present = true are written, which is the strongest single predictor of a one-visit close.
  5. BO offers two slots from the North-zone estimator's Saturday availability. She books. The card moves to Site Visit Scheduled and assigned_estimator is set.
  6. The pre-visit questionnaire goes out immediately with a photo prompt. She completes it that night. The estimator now knows the property age, the access route and what equipment is already there before leaving the shop.
  7. Saturday morning: a confirmation text the evening before, and an "on my way, about twenty minutes" text when the estimator starts driving. The second one eliminates the most common cause of a wasted trip.
  8. The estimator completes the visit and marks it done on the card. Site Visit Complete starts the delivery clock, and the internal deadline is now live. The estimate is due within the company's committed window.
  9. The estimate is built with three options and sent as a link to the presentation page, not as an attachment. estimate_sent_datetime, estimate_expiry_date and options_presented_count are written; estimate_delivery_hours computes automatically. Card moves to Estimate Sent.
  10. She opens it ninety minutes later. The view event writes estimate_viewed_datetime and increments estimate_view_count; the card moves to Estimate Viewed and the estimator gets a notification, because a homeowner reading the estimate right now is the best moment anyone will get to call them.
  11. The estimator calls within the hour, while the options are still on screen. She has a question about the middle option's warranty. The card moves to In Discussion.
  12. Two days later estimate_view_count hits 4, which applies viewed-3-plus and fires a high-intent alert. The estimator calls again, answers the last question, and she accepts the middle option on the presentation page.
  13. Signature is captured on the acceptance form, writing option_selected and contract_signed_datetime. The card moves to Signed: Deposit Pending, and the very next screen is the deposit payment, in the same session.
  14. She pays. deposit_status = paid and deposit_paid_date are written. The card moves to Won: Scheduled once an install window is selected from the Install calendar, assigned_crew is set, and the confirmation goes out with the date, the window, the crew lead's name and the prep instructions.
  15. Pre-install communication runs on the install date: a one-week reminder with the prep checklist, a day-before confirmation, and a morning-of arrival window.
  16. After completion, the survey goes out. A strong score routes to a public review and then, separately and later, to a referral ask. A weak score routes to the owner as a service recovery task with no review request sent.

The same homeowner, the paths that do not go straight

  1. She never replies to the first text. The no-reply ladder runs four days across text, email and two call attempts, then closes the card to Lost: No Response with the source and campaign intact.
  2. The address is outside the zone. BO says so immediately rather than booking a visit nobody will drive to, offers a referral if the company has partners, and the card closes to Out of Area / Not a Fit with the zip recorded, which, aggregated over a year, is the cleanest expansion data the company will ever have.
  3. The estimate is never opened. The unviewed branch of the follow-up ladder treats it as a delivery problem first: resend as a different channel, then call to confirm it arrived, before ever treating silence as a no.
  4. Only one decision maker is home. The estimate goes out with a specific invitation to review it together and an offer of a short call with both people, because the real objection in that situation is almost never price.
  5. She signs but does not pay. The deposit chase runs on its own clock with a hard escalation to the owner at seven days, because a card parked in Signed: Deposit Pending is the most expensive kind of false positive on the board.
  6. She says the price is too high. The objection branch does not discount. It re-presents scope options, surfaces financing, and captures lost_reason and lost_to_competitor if she goes elsewhere, then schedules a 90-day reheat, because a meaningful share of price losses are timing losses wearing a disguise.
04

Automations in detail

Workflow 1: Request Capture & Instant Response

Trigger: any of. Estimate request form submitted, web chat started, inbound SMS from an unknown number, inbound call answered, or a form on a partner or marketplace listing.

  1. Match or create the contact on phone number first, then email. Match on service address as a secondary check so a repeat customer at the same property links to their history instead of creating a second record.
  2. Create the card in New Request. Write first_touch_timestamp, lead_source, source_campaign, service_type, service_address, urgency, job_scope_summary.
  3. Geocode the address into zip_zone and drive_time_bucket. Branch immediately: if the zone is outside the service area, jump to Workflow 3.
  4. Branch on urgency. If emergency: ring the on-call phone, send the internal alert, and send the homeowner "Calling you right now. If you don't hear from us in 5 minutes, call {{number}} directly." Skip every nurture step below; an emergency job is won by a ringing phone, not a sequence.
  5. Branch on consent. If sms_consent is true, send the SMS. If not, send the email version and create a call task.
  6. Send SMS immediately, no wait: "Hi {{first_name}}, this is {{company_name}}, got your request for {{service_type}} at {{street}}. I can get an estimator out to take a look. Are mornings or afternoons better for you? Reply STOP to opt out."
  7. Write first_response_timestamp. Move card to Contacted: No Reply.
  8. Branch on hours. Inside business hours: assign assigned_estimator by zone, notify the team channel, and create a call task due in 5 minutes. Outside hours: BO holds the thread and the call task is created for the next business morning at open.
  9. If photos were uploaded, notify the estimator with the photos attached and ask one question on the card: can this be scoped virtually. A yes routes the booking to the Virtual Estimate calendar and saves the drive.

Exit conditions: homeowner replies (hand to Workflow 2), site visit booked, sms-stop, or card closed.

Workflow 2: Qualify and Book the Site Visit

Trigger: homeowner replies on any channel, or answers the outbound call.

  1. Move card to Qualifying. Capture, in this order: confirm the service address, confirm service_type and rough scope, confirm urgency, then ask the decision-maker question.
  2. The decision-maker question is scripted because it is the highest-value question in the build: "When we come out, will everyone who's part of the decision be there? It saves you a second appointment." Write decision_makers_count and all_decision_makers_present.
  3. Ask about competing bids plainly: "Are you getting other quotes? Totally normal. It just helps me know what to include." Write competing_bids_count. Apply competing-bids when it is one or more, which changes the follow-up cadence later.
  4. Branch on scope and photos. Simple scope with usable photos: offer Virtual Estimate slots and apply virtual-ok. Otherwise offer Estimate Appointment slots from the estimator whose zone-restricted availability matches zip_zone, so the booking lands inside an existing route.
  5. On booking: move card to Site Visit Scheduled, write assigned_estimator, and send confirmation SMS: "You're set, {{first_name}}, {{estimator_first_name}} will be out {{day}} between {{window_start}} and {{window_end}}. He'll text when he's on the way." Offer a window, not a to-the-minute time, and then beat it.
  6. If no slot is accepted after two offers: create a call task rather than sending a third list of times. A homeowner who will not pick a slot by text usually has a question they have not asked.
  7. Immediately send the Pre-Visit Scope Questionnaire by SMS and email with a photo prompt.

Exit conditions: site visit booked, out of area, homeowner declines, or hand to Workflow 4 on no reply.

Workflow 3: Out of Area / Not a Fit

Trigger: zip_zone resolves outside the service area, or the service type is one the company does not take.

  1. Apply out-of-area. Send immediately: "Thanks for reaching out, {{first_name}}, {{street}} is just outside the area we cover. I don't want to waste your time, so here's who I'd call instead: {{referral_name}}, {{referral_number}}."
  2. Move card to Out of Area / Not a Fit with the reason and the zip recorded. Do not nurture; do not add to any list.
  3. Log the zip against the service type. The monthly report of out-of-area requests by zip is a genuine expansion signal and costs nothing to collect.
  4. If a referral partner relationship exists, notify the partner with the homeowner's permission only.

Exit conditions: card closed. This workflow runs once.

Workflow 4: No-Reply Ladder

Trigger: card in Contacted: No Reply for 2 hours with no inbound response.

Global conditions: quiet hours 8:00am–8:00pm local; exits instantly on any reply or booking; every step gated on sms-stop.

  1. +2 hours. SMS: "{{first_name}}, still happy to get someone out to look at {{service_type}}. Here's our schedule if you'd rather just pick a time: {{booking_link}}"
  2. +4 hours. Call attempt 1 from assigned_estimator or the office, whichever the company decides owns first contact.
  3. Day 1, 9:00am. Email: subject "Your {{service_type}} estimate". Body names the estimator, says what the visit involves and how long it takes, says the estimate is free and written, and links the self-scheduling page.
  4. Day 1, 3:00pm. Call attempt 2, different time of day on purpose.
  5. Day 3, 11:00am. SMS: "Hi {{first_name}}, did you still want that estimate, or have you handled it already? Either answer is fine, just let me know." Giving permission to say no raises the reply rate and produces a clean loss reason instead of silence.
  6. Day 5. Final email with the self-scheduling link and nothing else to do.
  7. Day 6. Move card to Lost: No Response, keeping lead_source and source_campaign attached. Apply reheat-90.

Exit conditions: any reply, booking, sms-stop, or day 6 reached.

Workflow 5: Pre-Visit Preparation and No-Show Prevention

Trigger: estimate appointment booked.

  1. Immediately: confirmation SMS plus an email carrying the window, the estimator's name and photo, roughly how long the visit takes, what the homeowner should have ready, and the questionnaire link.
  2. Wait 24 hours. If the questionnaire is incomplete, SMS: "{{first_name}}, two quick questions before {{estimator_first_name}} comes out. Takes a minute and makes the estimate more accurate: {{questionnaire_link}}"
  3. T-2 days. Branch on all_decision_makers_present. If false or empty: "{{first_name}}, is there anyone else involved in deciding on this? If so it's worth having them there {{day}}, saves doing it twice." Update the field from the reply.
  4. T-1 day, 5:00pm. SMS: "See you tomorrow between {{window_start}} and {{window_end}}, {{first_name}}. {{estimator_first_name}} will text when he's on the way. Reply R if you need to move it."
  5. Morning of, 7:30am. SMS with the route position: "Morning {{first_name}}, you're {{position}} on {{estimator_first_name}}'s route today, still looking like {{refined_window}}."
  6. On the estimator marking en route. SMS: "{{estimator_first_name}} is on his way: about {{eta_minutes}} minutes out." This one message prevents most wasted trips.
  7. No answer on arrival: estimator taps a button that sends "{{first_name}}, {{estimator_first_name}} is at {{street}} now: give him a call at {{estimator_number}}?" and creates an urgent office call task. Waiting fifteen minutes in a truck in silence is how a route gets destroyed.
  8. If no-show confirmed: apply a no-show flag, send "Sorry we missed you today: want to pick another time? {{booking_link}}", and route to a single rebooking attempt. A second no-show requires a phone confirmation before any estimator drives again, which is a policy the company sets, not the automation.

Exit conditions: site visit marked complete, canceled, or no-show handled.

Workflow 6: Estimate Delivery Clock

Trigger: site visit marked complete.

The company's close rate is tied more tightly to this clock than to its pricing. Pick a delivery commitment, state it to the homeowner on site, and enforce it here.

  1. Move card to Estimate Being Built. Start the clock from the completion timestamp.
  2. Send the homeowner the expectation immediately: "Thanks for your time today, {{first_name}}. {{estimator_first_name}} is putting your options together: you'll have everything by {{commitment_time}}." A stated deadline the company then meets is itself a selling point, and it is free.
  3. Create the build task for assigned_estimator with a hard due time.
  4. At 50% of the committed window: remind the estimator.
  5. At 100% with the estimate not sent: notify the sales manager or owner. No exceptions and no silent extensions. This escalation is the mechanism, and removing it removes the workflow.
  6. At 150%: send the homeowner a short, honest holding message: "{{first_name}}, {{estimator_first_name}} is still finalizing a couple of numbers on yours. You'll have it by {{new_time}}, sorry for the wait.": and escalate again. A homeowner told the truth about a delay stays in the game; a homeowner left in silence calls the next company.
  7. On send: write estimate_sent_datetime, estimate_number, options_presented_count, estimate_expiry_date, and compute estimate_delivery_hours. Move card to Estimate Sent, apply estimate-sent, hand to Workflow 7.

Exit conditions: estimate sent, or job disqualified on site. In which case the Loss Reason form is required before the card closes.

Workflow 7: Estimate Follow-Up Ladder

Trigger: card enters Estimate Sent.

This is the workflow most companies do not have, and the one that produces the largest measurable gain. Its central feature is that it branches on whether the estimate has actually been opened, because an unopened estimate is a delivery problem and an opened one is a decision problem.

  1. Immediately on send. SMS: "{{first_name}}, your estimate's ready. Three options so you can see the trade-offs: {{estimate_link}}. Call or text me with any questions.: {{estimator_first_name}}" Plus the email version with the same link and a plain-language summary of what each option includes and excludes.
  2. On first view event. Write estimate_viewed_datetime, increment estimate_view_count, move card to Estimate Viewed, apply estimate-viewed, and notify assigned_estimator in real time: "{{first_name}} is reading the estimate now." Create a call task due in 60 minutes. This single notification is the highest-conversion moment in the entire pipeline.
  3. Unviewed branch, +4 hours. SMS: "Just checking it came through okay, {{first_name}}, here it is again: {{estimate_link}}"
  4. Unviewed branch, day 1. Call task: confirm receipt by voice. Do not pitch; confirm delivery. If the email bounced or the number is wrong, this is where you find out instead of recording a false loss.
  5. Day 2, viewed or not. SMS: "{{first_name}}, any questions on the options? Happy to walk through the differences in two minutes on the phone if that's easier."
  6. Day 3. Email with the one thing an estimate PDF cannot carry: proof. Photos of comparable completed work, the warranty terms in plain English, what happens on install day, and the financing link. No price change.
  7. Day 4. Call attempt 2, placed in the Follow-Up Call Block.
  8. Day 6. Branch on competing_bids_count. If one or more: "{{first_name}}, if you've got other quotes in hand I'm happy to look at them with you, not to beat a number, just so you can compare what's actually included. The cheap ones usually leave something out." If zero: "{{first_name}}, where did you land on this one?"
  9. Day 8. Branch on estimate_view_count. Three or more views: apply viewed-3-plus, notify the owner, and have the owner or senior estimator make the call personally. Repeat views mean active deliberation, and that call is worth making at a higher level. Zero or one view: treat as low intent and continue the standard ladder.
  10. Day 10. SMS referencing the expiry honestly: "{{first_name}}, your pricing holds through {{estimate_expiry_date}}, after that I'd have to re-check material costs. Want me to lock it in?" Only use this if the expiry is real; a fake deadline is noticed and remembered.
  11. Day 13. The permission-to-close message: "{{first_name}}, I don't want to keep bugging you. Should I close this out, or is it still live?" This message produces more clean answers than any other in the ladder.
  12. Day 15. Move card to the matching Lost stage. The Loss Reason form is mandatory. Apply reheat-90. Hand to Workflow 11.

Exit conditions: acceptance form submitted, card moved to In Discussion or Verbal Yes by a human, homeowner declines, sms-stop, or day 15 reached. Cadence cap: never more than one SMS plus one call in a day, and never two messages in the same hour across workflows.

Workflow 8: Objection and Revision Branch

Trigger: card moved to In Discussion, or a reply matching a price, timing or scope objection.

  1. Price objection. Apply price-objection. Do not discount automatically. An automated discount trains every future homeowner to object. Create a call task, send the financing link, and offer a reduced-scope option as a tracked revision: "{{first_name}}, I can't move the number on that scope, but I can show you a version that fits a different budget. Want me to put it together?"
  2. Timing objection. Capture the real date. Write reheat_date, move the card to a scheduled nurture, and set a task for two weeks before that date. Then actually honor it. A timing objection remembered six months later closes at a rate that surprises most owners.
  3. Scope change. Send the Scope Change Request form, increment revision_count, and restart Workflow 6's delivery clock at a shortened window. A revision is a buying signal and it deserves the same urgency as the original.
  4. Competitor comparison. Create a call task and send the inclusions comparison, never a rebuttal by text. Write lost_to_competitor if the job is lost, because the aggregate of that field is the company's only honest competitive picture.
  5. Decision-maker objection ("I need to talk to my wife"). Offer a scheduled three-way call at a specific time rather than leaving it open: "Want me to hop on a quick call with both of you? I've got {{slot_1}} or {{slot_2}}." An open-ended "let me know" at this point is where the job dies.
  6. At revision_count of 3: escalate to the owner. Three revisions means the scope, the budget or the fit is not what anyone thinks it is, and more revisions will not fix it.

Exit conditions: acceptance, card moved to a Lost stage with a reason, or scheduled reheat.

Workflow 9: Signature and Deposit

Trigger: Estimate Acceptance form submitted, or a human moves the card to Verbal Yes.

  1. On verbal yes. Send the acceptance link within 5 minutes: "Great news {{first_name}}, here's the agreement to sign, takes about a minute: {{acceptance_link}}" Then a reminder at 2 hours, a call task at 1 day, and an owner escalation at 3 days. A verbal yes that stays verbal for a week is not a yes.
  2. On signature. Write option_selected, contract_signed_datetime, contract_status. Move card to Signed: Deposit Pending, apply signed, notify the owner and the scheduler.
  3. Deposit request in the same session. The payment step appears immediately after signature on the same page, not as a separate email later. Write deposit_requested_date, set deposit_status = requested.
  4. If not paid in-session, +2 hours. SMS: "{{first_name}}, just the deposit left and we can get you on the schedule: {{payment_link}}"
  5. Day 1. Email with the invoice attached and the payment link. Day 2. Call task.
  6. Day 4. SMS: "{{first_name}}, I'm holding {{install_window}} for you but I can only hold it a couple more days without the deposit." Only send this if the hold is genuine.
  7. Day 7. Escalate to the owner and release the install slot back to the calendar. A card in this stage with no money is blocking real capacity.
  8. On payment. Write deposit_paid_date, set deposit_status = paid, apply deposit-paid, and hand to Workflow 10.

Exit conditions: deposit paid, homeowner cancels (Loss Reason form required even post-signature. These are the most instructive losses of all), or day 7 escalation resolved by the owner.

Workflow 10: Won: Scheduling and Pre-Install

Trigger: deposit_status = paid.

  1. Offer install windows from the Install calendar filtered by service_type and crew capacity. Write install_date, install_window, assigned_crew. Move card to Won: Scheduled.
  2. Send confirmation: date, window, crew lead's name, what the homeowner needs to do beforehand, how long it will take, and what to expect on the day.
  3. Branch on permit_required. If true, create the permit task with its own due date and tell the homeowner the schedule depends on it. Branch on hoa_approval_required: same pattern, with the submission task owned by a named person.
  4. T-7 days. Email with the prep checklist. Clear access, move vehicles, secure pets, what will be noisy, whether water or power goes off and when.
  5. T-1 day, 4:00pm. SMS confirmation with the arrival window and the crew lead's name.
  6. Morning of. SMS with the refined window, then an on-the-way message when the crew departs.
  7. On completion. Generate the balance invoice per balance_terms, send the payment link, and hand to Workflow 12. Register the warranty and store the executed documents on the card so the next job at this address starts with the full history.

Exit conditions: job complete and balance settled.

Workflow 11: Loss Capture and Reheat

Trigger: card moved to any Lost stage.

  1. Gate the close. The card cannot sit in a Lost stage without the Loss Reason form submitted. If it is missing after 24 hours, task the estimator; after 48, escalate to the owner. Unreasoned losses are how a company convinces itself it has a price problem.
  2. Write lost_reason, lost_to_competitor, and the option that was in play when it died.
  3. Branch on reason. Price → reheat-90. Timing → reheat at reheat_date minus 14 days. Went another direction → reheat-90 plus a seasonal touch. No response → reheat-90, lowest-touch nurture only.
  4. At 30 days (price and competitor losses only). One email, no pitch: "How did the {{service_type}} work turn out?" A surprising share of these jobs were never done, or were done badly.
  5. At 90 days. SMS if consent holds: "{{first_name}}, checking in: did you get the {{service_type}} sorted? If not, I can re-quote at current pricing."
  6. Seasonally thereafter. Two emails a year, tied to the service's season, with real content rather than a re-sent estimate. Any reply reopens a fresh card with the full history attached and lead_source = reheat, so the reheat channel earns its own line in the reporting.

Exit conditions: card reopened, homeowner opts out, or two years elapsed.

Workflow 12: Review and Referral

Trigger: job marked complete.

  1. Wait 1 day: long enough for the homeowner to have lived with the work, short enough to still feel current.
  2. Send the Post-Install Survey as a single question: "How did we do, {{first_name}}, 1 to 5?"
  3. Branch. 4 or 5 → send the review link immediately, while the goodwill is live, and name the crew lead so the review is specific. 1 to 3 → send "Thank you for telling us: {{owner_name}} will call you today." and create an urgent owner task. No review link on a low score, ever.
  4. Wait 7 days after a 4 or 5. Send the referral ask separately, because bundling it with the review request halves both: "{{first_name}}, glad you're happy with it. If a neighbor ever needs {{service_type}}, send them my way: I'll take good care of them."
  5. Wait 11 months. Seasonal maintenance or check-in message, tagged past-customer. The cheapest job a home services company will ever sell is the second one at an address it already knows.
  6. Write review_requested and referral_asked so no homeowner gets asked twice and the rates are reportable by crew and by service type.

Exit conditions: survey answered and routed, or 7 days with no response after one email reminder.

Workflow 13: Pipeline Hygiene and Daily Board

Trigger: nightly, plus a morning digest before the first Follow-Up Call Block.

  1. Flag any card with no activity in 7 days with stalled-7-days and notify assigned_estimator. Flag at 14 days to the owner.
  2. Flag any card in Estimate Being Built past its committed window. The single most damaging stall in the pipeline.
  3. Flag any card in Verbal Yes for more than 3 days, and any card in Signed: Deposit Pending for more than 5.
  4. Flag estimates within 5 days of estimate_expiry_date with expiry-approaching and surface them at the top of the morning list.
  5. Publish the morning digest: new requests overnight, site visits today, estimates due to be sent today, estimates viewed in the last 24 hours and not yet called, and deposits outstanding. Five lines, in that order of priority.
  6. Send the owner a weekly summary: requests by source, median speed to first response, median estimate_delivery_hours, estimate-to-signed rate by estimator, and the loss-reason mix.

Exit conditions: none: runs every day.

Workflow 14: Consent, Opt-Out and Quiet Hours Guard

Trigger: runs ahead of every outbound message above.

  1. STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT: apply sms-stop, set sms_consent = false, remove from every active SMS step, send the single required confirmation. Keep email and call paths alive if those consents stand.
  2. START or UNSTOP: restore consent with a fresh timestamp and source.
  3. HELP: reply with company name, phone number and the opt-out instruction.
  4. Before any send: suppress if the channel consent is not true and fall back to the next consented channel or a call task.
  5. Before any send: enforce quiet hours 8:00am–8:00pm in the homeowner's local time. The one carve-out is a dispatch-critical message on the day of a scheduled visit, an on-the-way text, and even that stays inside the window.
  6. Before any send: enforce the global cadence cap. One SMS and one call per card per day, maximum, counted across every workflow. A homeowner in Workflow 7 and Workflow 11 simultaneously must not receive both.
  7. Suppress all marketing and nurture messaging for any card in an active job stage. A homeowner with a crew in their driveway should not receive a message asking whether they are still interested.

Exit conditions: none. This guard never turns off.

05

What changes

What is different afterwards

  • Every request becomes a card with an owner, a source and a timestamp, so the question "how many estimates are actually live right now" has an answer on a screen instead of in three people's heads.
  • First response stops depending on who is free. Evening and weekend requests, which are usually the highest-intent ones, get answered before the homeowner finishes filling out the next company's form.
  • Estimate delivery becomes a commitment with an escalation behind it. The stall between "we came out" and "here's your estimate" (the quietest and most expensive gap in the business) is now measured in hours and visible to the owner when it slips.
  • Follow-up happens whether or not anyone remembers. More importantly it reacts to behavior: a homeowner opening the estimate for the third time generates a call from a senior person within the hour, which is a moment that previously passed unnoticed every single time.
  • Saying yes stops requiring a phone call. The estimate is a page with options and an accept action, the signature happens on the spot, and the deposit is collected in the same session instead of becoming a second conversation that may never happen.
  • Routes get tighter. Zone-restricted estimator availability means bookings cluster geographically, which gives back drive time that converts directly into additional site visits per day.
  • Losses become information. Four separate Lost stages plus a mandatory reason form turn "we're too expensive" into a distribution, and most companies discover that price is a smaller share of it than they believed, while timing and no-response are larger.
  • Lost jobs come back. Timing losses are re-approached on the date the homeowner actually named, and price losses get a 90-day check-in, because a meaningful share of them never had the work done at all.

Metrics to watch

  • Median speed to first response, by source and by hour of day. Track the after-hours cohort separately.
  • Request-to-site-visit rate: how much of your acquired demand you actually get in front of.
  • Median estimate_delivery_hours, and the share of estimates sent inside the committed window. Watch the 90th percentile, not just the median; the tail is where jobs are lost.
  • Estimate view rate and time from sent to first view. A low view rate is a deliverability or channel problem, not a sales problem, and fixing it is cheap.
  • Estimate-to-signed rate, overall and by estimator, service type and option presented. Segmenting by option tells you whether your middle tier is positioned correctly.
  • Median days from sent to signed, which tells you how long the ladder actually needs to be.
  • Close rate when all decision makers were present versus not. This comparison usually justifies the whole build on its own and makes the case for the scripted decision-maker question better than any argument.
  • Deposit collection rate and median days signed to deposit paid. The in-session share versus the chased share tells you how much the same-page payment step is worth.
  • Loss-reason distribution across the four Lost stages, reviewed monthly. Watch the no-response share. It is the one entirely within your control.
  • Site visits per estimator per day and drive time per visit, before and after zone-restricted availability.
  • Reheat conversion: jobs won from cards previously closed as lost, counted as its own channel with its own cost.
  • Review rate and referral rate by crew, plus the follow-on job rate from past-customer cards.
  • Won revenue by source_campaign, and cost per signed job by source. Cost per lead is a vanity number; this is the one that decides where the budget goes.

Baseline everything for three to four weeks before changing cadence or copy, so a seasonal swing does not get credited to the build.

06

Before you start

Decide these before anything is built

  • Your service zones, as actual zip lists. Every routing branch in this build depends on them, and "we go about forty-five minutes out" cannot be configured.
  • Your estimate delivery commitment: same day, next business day, 48 hours. Pick a number you can genuinely hit, because Workflow 6 enforces it and tells the homeowner about it.
  • Which jobs need an on-site visit and which can be scoped from photos. This decision is worth hours of drive time a week and should be written down per service type, not improvised per call.
  • Your real estimate appointment duration per service type, plus honest drive-time buffers. Calendars built on optimistic durations produce routes that collapse by 11am.
  • Deposit policy: whether one is required, how it is calculated, and who may waive it. The deposit step is the strongest commitment device in the build and a vague policy neutralizes it.
  • Who owns an estimate after it is sent. One named person per card. Shared ownership of open estimates is the default state in most companies and is indistinguishable from no ownership.
  • Your discount authority. Who can discount, by how much, and with what approval. The objection branch deliberately does not discount automatically, so the human path needs a rule.
  • Your option structure. Three tiers beat one number, and the presentation page is built around them. Decide what differentiates the tiers before the page is designed.

Integrations and data

  • Estimating or pricing tool: decide whether estimates are built in the platform or built elsewhere and delivered through it. Either works; what matters is that estimate_sent_datetime and the view events land on the card, since the whole follow-up ladder keys off them.
  • E-signature on the acceptance form, with the executed copy stored on the card.
  • Payment processing for deposits and balances, configured so the payment step can appear in the same session as the signature. If it cannot, you lose most of the deposit-rate gain.
  • Calendar connection for every estimator and crew, with zone-restricted availability configured per estimator rather than one shared pool.
  • Accounting or job-costing system for invoices and balances, so the office is not re-entering won jobs by hand.
  • Review platform connection for Workflow 12.
  • Website and landing pages with the request forms placed and campaign parameters passing through to source_campaign.
  • Existing data. Decide what happens to the open estimates sitting in the current system on day one. Load them with their real sent dates so the ladder picks them up at the correct step, loading them all as new sends an inappropriate first message to people who got their estimate two months ago.

Numbers and messaging registration

  • Provision a main messaging number plus a tracking number per lead source, so lead_source is set by the number that called rather than by what someone remembers to ask.
  • Give each estimator either a dedicated number or a consistent sending identity. Homeowners reply to the person they met, and a thread that arrives from a different number every time reads as spam.
  • Complete A2P 10DLC registration before launch: brand first, then a campaign. Register the customer-care and appointment-reminder traffic separately from promotional traffic. Dispatch and on-the-way messages are the ones you cannot afford to have filtered, so do not mix them into a marketing campaign.
  • Submit the real consent evidence: a screenshot of the estimate request form showing the SMS consent checkbox and its exact wording. Build the form before you register.
  • Start registration in week one: review takes time and it is the most common cause of a delayed launch.
  • Verify the email sending domain (SPF, DKIM, DMARC) before the first send, and warm it if you are importing a large list.
  • Test STOP, START and HELP on every number end to end before any real traffic.

Consent, quiet hours and opt-out

  • Separate, unbundled SMS and email consent checkboxes on every request form, each naming the sender, the message types, the expected frequency and the opt-out instruction. A single box that also accepts the terms of service is not consent to text.
  • Log the consent timestamp and source for every contact. If you cannot produce the evidence, do not send.
  • Capture verbal opt-ins properly: the office reads the disclosure on the call and the workflow records the source as verbal with the call record attached.
  • Enforce quiet hours at 8:00am–8:00pm in the homeowner's local time, through a single guard workflow that every send passes through, so no future workflow can bypass it.
  • Enforce one global cadence cap across all workflows. A homeowner in a follow-up ladder and a reheat campaign at the same time must not receive both.
  • Honor opt-outs per channel, not globally. An SMS opt-out does not end an email relationship, and it does not stop a scheduled call about a job already booked.

Data handling and photographs

  • Site photos and property details are customer property. Decide where they are stored, who can see them, how long they are kept, and whether they may be used in marketing, and get explicit written permission before any photo of a customer's property appears in an advertisement or on the presentation page.
  • Keep payment card details out of the platform entirely. Payments go through the processor's hosted flow; the card number never lands in a custom field or a message thread.
  • For insurance-claim jobs, the claim number and adjuster correspondence go in the designated field and the document store, not in SMS threads.
  • Least-privilege access so estimators see their own cards and the office sees what it needs; two-factor on every account; an access review when a crew member leaves, including removal from the shared messaging number.
  • Call recording carries disclosure and consent requirements that differ by state. Decide before switching it on, and configure the disclosure if you do.

Scope and pricing

Service lines, estimator count, zones, the estimating tool and the payment setup all change this build materially, and the migration of existing open estimates is its own piece of work. This build is scoped per company rather than priced from a list. Book a call and we will walk your actual estimate process, your calendars and your close mechanics before quoting anything.

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