Back to the build library
Any industry
Standard

Quote and Proposal Follow-Through

Every quote gets an owner, a deadline and an automated chase until it is answered yes or no, so nothing sits in limbo.

Industry
Any industry
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

Ask any owner how many open quotes they have out right now and watch what happens. Most cannot answer. Some will open a spreadsheet that was last accurate in the spring. A few will name the two big ones they are personally worried about and have no idea about the other nineteen. The quote is usually the most expensive document the business produces. It consumes a site visit, a measure-up, a specification, pricing work, and often the most senior person's afternoon, and it is the document with the least process attached to it. It gets emailed, and then it enters a void.

Three specific failures happen in that void, and each one costs money independently. The first is delay in producing it. A customer who asked on Monday and receives a quote on Friday has spent four days collecting alternatives, and the business that answered first is now the incumbent. The second is the absence of a chase. Nobody owns the follow-up, so it happens once, awkwardly, about a week later ("just checking in on that quote") and then never again, because a second unanswered chase feels like begging. Quotes are not usually lost to a competitor; they are lost to indecision that nobody interrupted. The third is the absence of an ending. The quote neither closes nor dies. It sits in the pipeline as a maybe for months, inflating the forecast, and the real answer (which was often "we went with someone else in week two") is never recorded, so the business never learns why it lost.

Underneath all three is a single structural gap: the quote has no owner, no deadline and no expiry. A document with no expiry date generates no urgency on either side, so the customer has no reason to decide today and the business has no trigger to act. Meanwhile the quotes that are quietly dead are still counted as live, which makes the pipeline worthless as a forecast and makes the honest conversation about capacity impossible. The fix does not require a better quote template or a smoother closer. It requires that every quote is assigned to a named person within minutes, produced against a clock, delivered with a visible expiry, chased on a defined ladder across more than one channel, and forced to a yes, a no or a documented reason, so that an unanswered quote becomes a system failure rather than a normal Tuesday.

02

What gets built

Pipeline and stages

A single Quotes and Proposals pipeline, with stages that describe where the decision is rather than where the paperwork is. Every stage has an owner and an expected dwell time, and anything exceeding it surfaces on a daily board.

  1. Request Received: somebody asked for a price. Target dwell: minutes.
  2. Qualifying and Scoping: gathering what is needed to quote accurately. The stage where most delay actually hides.
  3. Site Visit or Call Booked: where the work cannot be quoted remotely.
  4. In Preparation: assigned, clocked, and due. Target dwell measured in hours, not days.
  5. Quote Sent: delivered, with an expiry date on the face of it.
  6. Viewed: the customer has opened it. A materially different state from Sent, and treated as such.
  7. Question Raised: they came back with something. The highest-probability stage in the pipeline and the one most likely to be handled slowly.
  8. Revision Sent: a new version is out, with its own version number and expiry.
  9. Verbal Yes: agreed in principle, not yet signed. Dangerous to leave here; this stage has the shortest permitted dwell time in the build.
  10. Won: Signed: signature captured.
  11. Scheduled: deposit handled where applicable and a start date in the calendar. Terminal and good.
  12. Lost: Reason Known: a no, with a recorded cause. Commercially almost as valuable as a win.
  13. Expired: No Decision: the chase ladder completed with no answer. Honest, and it leaves the forecast clean.
  14. Not Now: Future: real but genuinely later, with a dated re-entry.

Calendars

  • Site visit and measure-up calendar: with travel buffers and territory rules, booked directly from the intake form so the visit is in the calendar before the first conversation ends.
  • Quote walkthrough calendar: short slots used to present a quote live rather than email it cold. A walked-through quote closes markedly better, and the slot is offered in the delivery message itself.
  • Quote preparation blocks: recurring internal appointments held for whoever prepares quotes, so preparation competes for protected time rather than for leftovers.
  • Job start calendar: provisional start dates attached at the Verbal Yes stage, which converts an abstract decision into a date the customer can picture.

Custom fields

  • quote_number (text) and quote_version (number): version everything. Two unnumbered quotes in one inbox is how disputes start.
  • quote_requested_at (date/time). The start of the clock that matters most.
  • quote_owner (user). One named person. Never a team, never empty.
  • quote_due_by (date/time). The internal deadline to send, set automatically from job_complexity.
  • job_complexity (dropdown: Simple (same day, Standard) 48 hours, Complex, 5 days), drives the preparation SLA.
  • quote_sent_at (date/time) and time_to_quote_hours (number): calculated. The single most diagnostic number in the build.
  • quote_amount (currency) and quote_band (dropdown: Small, Mid, Large, Major). The band, not the figure, drives the chase cadence and who chases.
  • quote_expires_at (date/time): mandatory. A quote without one does not get sent.
  • quote_viewed_at, quote_last_viewed_at (date/time) and quote_view_count (number). Behavioral signal, and the fastest way to tell a deliverability problem from a decision problem.
  • decision_maker_name (text) and decision_maker_confirmed (checkbox), quoting the wrong person is a silent, common and total waste.
  • decision_due_date (date/time): when they said they would decide. Asked for explicitly, in their words.
  • chase_count (number) and last_chase_at (date/time): the cap fields.
  • chase_channel_last (dropdown: Email, SMS, Call, Voicemail, In person), so the ladder rotates channels instead of repeating one.
  • objection_type (dropdown: Price, Timing, Scope unclear, Need approval, Comparing quotes, Finance or payment terms, Trust or references, Technical question, Other).
  • competitor_named (text) and lost_reason (dropdown: Price, Timing, Went elsewhere, Scope changed, Project canceled, Lost contact, Never a fit, No decision made).
  • revision_count (number): watch this. Beyond two revisions, the problem is usually scoping, not pricing.
  • signature_requested_at and signed_at (date/time).
  • deposit_required (checkbox), deposit_requested_at and deposit_paid_at (date/time).
  • scheduled_start_date (date) and handover_complete (checkbox).
  • quote_source (dropdown), where the request came from, so win rate can be read by channel.

Tags

quote-requested, quote-scoping, quote-in-prep, quote-overdue-internal, quote-sent, quote-viewed, quote-hot, quote-unopened, quote-question-raised, quote-revised, verbal-yes, quote-won, quote-lost, quote-expired, quote-chase-cap-hit, deposit-outstanding, awaiting-signature, decision-maker-unconfirmed.

Forms and documents

  • Quote request form: short, with conditional logic by service type. It captures what is genuinely needed to scope, asks who makes the decision, asks when they need it done by, and ends on a site-visit booking calendar rather than a thank-you page.
  • Scoping checklist: an internal form the preparer completes, which exists for one reason: to stop a quote being sent with a gap in it that generates a question and three days of delay. Photographs, measurements, access notes, constraints.
  • The quote or proposal document itself: built from a template in the platform's document and e-signature module so it is trackable, versioned, signable on a phone, and filed against the pipeline card automatically. The expiry date, the scope, the exclusions and the payment terms appear on the face of it.
  • One-tap decision prompt: the asset that makes the chase ladder work. Three buttons: Go ahead, I have a question, Not for now. No login, no form. A tap on any of the three ends the chase, and the third one is the whole point: it gives the customer a dignified way to say no, which is far better than silence.
  • Objection capture form: reached from "I have a question", writing objection_type on tap and routing to the right owner.
  • Lost-reason form: one question, used on the no path and when a quote expires, writing lost_reason and competitor_named.

BO's role and guardrails

  • BO covers the front and the edges of this build, never the middle. At the front: acknowledging a quote request within seconds, capturing scope answers, confirming who the decision maker is, and booking the site visit. At the edges: answering process questions after delivery: "is the VAT included", "how long would it take", "what's the lead time", "can you do it in March". From the knowledge base and from what is written in the quote.
  • BO chases on schedule, in the approved words, and routes every substantive reply to quote_owner.
  • Guardrails. BO never quotes a price, never estimates a price, never discounts, never negotiates terms, and never interprets scope. Any message touching price, discount, payment terms, contract language, liability or a complaint goes to the owner immediately with the thread attached. BO never states what is included or excluded beyond quoting the quote document verbatim. BO never promises a start date the calendar has not reserved.
  • Escalation rules. Any pricing or negotiation question, any mention of a competitor's offer, any dissatisfaction, any legal or contractual question, any request for a person. Hand off, tag the card, create a task due in two hours during business hours.
  • BO's knowledge base needs the service list, typical lead times, the service area, what is standardly included and excluded, the payment terms as written, and an explicit refusal list. Everything commercial stays with a human.

Numbers and channels

  • The existing business number for all SMS chases, so the message lands in the same thread as the original conversation.
  • Email for the quote delivery, the document link and anything containing terms.
  • Phone: the chase ladder includes real calls, not just messages, because on larger quotes the call is what closes and no sequence of texts substitutes for it.
  • Voicemail drop for unanswered calls on the ladder, followed by an SMS with the same content, so the message lands even when the call does not.
  • Payment links for deposits, sent by SMS and email, so acceptance and payment can happen in one sitting on a phone.
  • Internal channel: Slack or Teams for new requests, overdue preparations, hot view activity and every win and loss, because quote work is team work and the board needs to be visible.
03

How it runs, step by step

One quote, end to end

  1. Tuesday, 11:04am. A quote request arrives through the website form. The card is created at Request Received, quote_requested_at is stamped, quote_source is written, and quote_owner is assigned by round robin within the relevant territory. Nothing waits for a human to notice.
  2. 11:04am. An acknowledgement goes out inside sixty seconds, and it does something more useful than thanking her: it states who owns it by name, when the quote will arrive, and asks the two questions needed to scope accurately. Simultaneously the internal channel lights up and the owner gets a task.
  3. 11:09am. She replies with photographs and answers. BO writes them to the card, asks the two remaining qualifying questions, confirms she is the decision maker: decision_maker_confirmed = true, and asks when she needs the work done, writing decision_due_date. The card moves to Qualifying and Scoping.
  4. 11:12am. Because the photographs show the job needs measuring, BO offers two site-visit slots. She takes Thursday morning. The card moves to Site Visit Booked and the reminder ladder for that visit starts.
  5. Thursday, 9:40am. The visit happens. The surveyor completes the scoping checklist on a phone: measurements, access notes, two photographs, one constraint. job_complexity is set to Standard, which sets quote_due_by to Saturday 9:40am, 48 hours out. The card moves to In Preparation.
  6. Thursday, 2:15pm. The quote is built from the template, carrying quote_number, quote_version 1, and a visible quote_expires_at 14 days out. time_to_quote_hours calculates to 27, comfortably inside the SLA, and recorded so it can be managed rather than guessed at.
  7. Thursday, 2:16pm. Delivery goes out on two channels at once: an email with the document and a short summary of what it covers, and an SMS saying it has landed with a direct link. The SMS exists because the email may sit unread for a day, and the first hours are when interest is highest. The message also offers a 15-minute walkthrough slot. The card moves to Quote Sent.
  8. Thursday, 2:31pm. She opens it. quote_viewed_at is stamped, quote_view_count becomes 1, and the card moves to Viewed: which quietly tells the owner the quote arrived, rendered, and was read, ruling out the three dullest reasons quotes go quiet.
  9. Friday, 8:50pm and Saturday, 9:10am. She opens it twice more, the second time on a different device. quote_view_count hits 3, the quote-hot tag is applied, and the owner is told to call on Monday morning rather than waiting for the scheduled chase. Repeat viewing without a reply almost always means an unspoken question.
  10. Monday, 9:30am. The owner calls. She asks whether the work can be split into two phases. That is a scope question, not a price objection: objection_type = Scope unclear, the card moves to Question Raised, and a revision task is created with a 24-hour deadline.
  11. Monday, 4:00pm. Version 2 goes out, phased, with its own expiry and revision_count = 1. The old version is superseded in the document module so there is exactly one live quote. The card moves to Revision Sent and the chase ladder restarts from the beginning. A new version is a new decision.
  12. Wednesday, 11:00am. Chase 1 on the new version: a short SMS with the three-button decision prompt. She taps Go ahead.
  13. Wednesday, 11:01am. The card moves to Verbal Yes, every pending chase is canceled, and the signature request goes out immediately: within one minute, not the next working day. signature_requested_at is stamped and a provisional start date is held in the job calendar.
  14. Wednesday, 11:40am. She signs on her phone. signed_at is stamped, the card moves to Won: Signed, the deposit request goes out with a payment link, and the internal channel announces the win.
  15. Wednesday, 3:20pm. The deposit clears. deposit_paid_at is stamped, the provisional start date is confirmed as scheduled_start_date, the card moves to Scheduled, and the operational handover fires: job created, team notified, customer sent what happens next and who will be in touch.
  16. The alternative ending. Had she never answered, the ladder would have run five contacts across both channels plus a call and a voicemail over fourteen days, sent one honest expiry message, applied the lost-reason form, moved the card to Expired: No Decision, removed it from the forecast, and dropped her into a 90-day nurture with a dated re-entry. The quote would have ended, which is the entire point of the build.
04

Automations in detail

WF-Q1 · Quote Request Intake, Assignment and Acknowledgement

Why: the request is the only moment where the business has the customer's full attention and none of their patience spent. Everything that happens in the next five minutes determines whether this becomes a quote or a statistic.

Triggers: quote request form submitted; inbound call tagged as a quote inquiry; chat or social DM classified by BO as a price request; an inbound email matching quote keywords; a lead-form submission from a connected ad platform.

Actions, in order:

  1. Create the card at Request Received; stamp quote_requested_at; write quote_source and quote_number from a sequence.
  2. Assign quote_owner immediately: round robin within territory or service specialism, respecting who is on shift. Every branch after this depends on a named human existing, so the workflow must never exit here with the field empty. If no owner is available, assign the fallback user and flag it.
  3. Branch on business hours. In hours → proceed. Out of hours → send the out-of-hours acknowledgement with a specific promised time ("first thing tomorrow, before 9:30") and queue the owner's task for the start of the next working day. A vague "we'll be in touch soon" is worth nothing.
  4. Send the acknowledgement within 60 seconds. SMS where consent exists, email otherwise: "Thanks {{first_name}}, got your request for {{service_type}}. I'm {{quote_owner_first_name}} and I'll be looking after this. You'll have your quote by {{quote_due_by}}. Two quick things so I can price it properly: {{question_1}} and {{question_2}}?"
  5. The two questions are the whole trick. An acknowledgement that asks something converts a form submission into a conversation; one that only thanks them ends it. Ask the two that most often cause a delayed or wrong quote in this business.
  6. Post to the internal channel and create a task for quote_owner, due in 15 minutes during business hours.
  7. Hand the thread to BO for scope capture, decision-maker confirmation and (where the service needs it) site-visit booking. Write decision_maker_name, decision_maker_confirmed and decision_due_date.
  8. Move to Qualifying and Scoping, or Site Visit Booked where a visit is required.
  9. Wait 2 hours. Condition: no response to the qualifying questions. Send one nudge. Wait until next morning. Still nothing → create a call task for the owner. Three unanswered attempts → move to Not Now: Future and stop. Never prepare a speculative quote for someone who will not answer two questions; it is the most reliable way to waste senior time.

Exit: scoping complete and in preparation; or unresponsive after three attempts.

WF-Q2 · Preparation SLA and Internal Escalation

Why: this is where the real delay lives, and it is invisible because it is internal. Most businesses chase customers hard and never chase themselves.

Trigger: card enters In Preparation, or the scoping checklist is completed.

Actions:

  1. Set quote_due_by from job_complexity: Simple → same working day; Standard → 48 working hours; Complex → 5 working days. Count working hours, not calendar hours, or every Friday request is overdue by Monday.
  2. Create the preparation task for quote_owner with that due date, and block time in their quote-preparation calendar.
  3. Wait until 50% of the SLA has elapsed. Not sent → reminder to the owner only. Quiet, internal, no drama.
  4. Wait until the SLA elapses. Not sent → add quote-overdue-internal, notify the owner and their manager in the internal channel, and. This is the important part: message the customer before they notice: "{{first_name}}, I said you'd have this by {{quote_due_by}} and I'm running behind. You'll have it by {{new_time}}, apologies for the delay." A proactive apology costs almost nothing and preserves the quote. Silence past a promised date is what loses it.
  5. Wait 24 hours past SLA. Still not sent → escalate to the owner of the business, and reassign if quote_band is Large or Major. A major quote sitting unprepared for two days past its deadline is a commercial incident, not an admin lapse.
  6. Blocker branch: where preparation is waiting on the customer (a measurement, a document, an access arrangement) move to Qualifying and Scoping, pause the SLA clock, and run a three-step chase on the missing item. Do not let a customer-caused delay show as an internal failure, and do not let it hide as no delay at all.

Exit: quote sent; reassigned; or closed as unresponsive.

WF-Q3 · Quote Delivery and Read Confirmation

Trigger: quote document marked ready to send.

Pre-send conditions: block the send if any fail: quote_expires_at is populated; quote_amount is populated; quote_version is set; the recipient is the confirmed decision maker or the decision maker is copied; scope and exclusions are present; payment terms are present.

Actions, in order:

  1. Stamp quote_sent_at; calculate time_to_quote_hours; set quote_band; add quote-sent; move to Quote Sent.
  2. Send the email: the document link, a three-line summary of what it covers, the expiry date written as a date, and one line on what happens if they say yes. Attach nothing that cannot be opened on a phone.
  3. Wait 2 minutes. Send the SMS: "{{first_name}}, your quote for {{service_type}} is in your inbox and here: {{quote_link}}. It's valid until {{quote_expires_at}}. Happy to walk you through it: I've got {{slot_1}} or {{slot_2}} if that's easier than reading it."
  4. Offer the walkthrough every time. A quote explained live closes better than a quote emailed, and the offer itself signals confidence.
  5. Wait 4 hours. Condition: quote_viewed_at still empty and the email shows no open. Treat this as a delivery problem before treating it as a decision problem: send a plain-text version from a different template, and create a task for the owner to confirm the email address by phone. A quote that never arrived is the most expensive and most common failure in this build, and it is invisible unless you look for it.
  6. On first view: stamp quote_viewed_at, add quote-viewed, move to Viewed, and notify the owner in the internal channel. A quote being read right now is the best moment there will ever be for a call.
  7. Continue to WF-Q4 and WF-Q5 in parallel.

Exit: quote viewed, or the delivery-failure branch resolved.

WF-Q4 · The Chase Ladder

Why it is built as a ladder: one follow-up is not a chase, and five of the same email is harassment. The ladder works because it rotates channel, changes the question each time, and has a published ending.

Trigger: card in Quote Sent or Viewed with no decision.

Global conditions checked before every step: no decision recorded; chase_count under 5; last_chase_at more than 36 hours ago; quote not expired; no opt-out; decision_due_date has not been given as a later date. If the customer said they would decide on the 20th, the ladder pauses until the 20th and resumes then. Chasing before a date they gave you is the fastest way to be told no.

Cadence by quote_band. Small and Mid: days 2, 5, 9, 13 and expiry. Large and Major: days 1, 3, 6, 9, 12 and expiry, with a higher proportion of calls and the owner personally on at least two steps. Bigger decisions need more contact, not less. The instinct to leave big quotes alone is exactly backwards.

Actions, in order:

  1. Chase 1: day 2, SMS, soft and specific. "Hi {{first_name}}, just checking the quote came through alright: anything you want me to run through? {{quote_link}}" Set chase_channel_last = SMS; increment chase_count.
  2. Chase 2: day 5, phone call by the owner. Not a message. The script has one job: find the objection. "I'm not chasing for a decision. I just want to make sure the quote actually answers what you need." On no answer: voicemail, then the same content by SMS. Never two voicemails.
  3. Chase 3: day 9, email with the decision prompt. Subject: "Quote {{quote_number}}, where would you like to leave it?" Body: three buttons: Go ahead, I have a question, Not for now. The third button is what makes this step work. Most silence is not indecision; it is reluctance to say no. Give people a courteous exit and a large share of them take it, which converts dead pipeline into a recorded loss with a reason attached.
  4. Chase 4: day 13, SMS with the expiry. "{{first_name}}, quote {{quote_number}} expires on {{quote_expires_at}}. If you'd like it held or updated, just say, and if the timing's wrong, no problem at all, tell me when to come back."
  5. Chase 5: expiry day, the honest close. "That's quote {{quote_number}} expired today, {{first_name}}. I'll stop chasing you. It's all yours if you want to pick it back up: {{quote_link}}. One tap tells me why it wasn't right, which genuinely helps us: {{lost_reason_link}}" Then stop. There is no sixth message.
  6. Continue to WF-Q8.

Rules that keep this from becoming nagging: never send two chases in the same day; never chase outside 09:00–18:00 local on a working day; never chase a contact who has given a decision_due_date in the future; never send the same wording twice; and cap at 5 contacts enforced by chase_count in the field, so a revision cannot silently stack a second ladder on top of the first.

Exit conditions: any decision; any question raised; a revision issued (which restarts the ladder at chase 1 with a fresh count); expiry reached; opt-out.

WF-Q5 · View-Behavior Triggers

Why: view data converts a blind chase into an informed one. The same silence means three completely different things depending on whether the quote was never opened, opened once, or opened five times.

Trigger: quote document viewed.

Actions and branches:

  1. Increment quote_view_count; stamp quote_last_viewed_at.
  2. First view within 2 hours of sending → notify the owner immediately: "{{first_name}} is reading quote {{quote_number}} now." A call inside that window is the highest-converting action available anywhere in this build.
  3. View count reaches 3, or two views from different devices → add quote-hot, create a priority call task due within 4 hours, and notify the internal channel. Repeated reading without a reply nearly always means an unasked question (commonly about price, phasing or timing) and the person is far more likely to voice it on a call than in writing.
  4. A view by a new recipient, or a forward detected → the quote has reached someone else. Set decision_maker_confirmed = false, add decision-maker-unconfirmed, and have the owner ask, plainly and without awkwardness, who else is involved. Then send a version written for that person.
  5. No view 48 hours after sending → add quote-unopened, verify deliverability, and resend by a different channel. Do not advance the chase ladder's tone while the quote may still be unread; escalating pressure on someone who never received the document is both futile and annoying.
  6. A view after the chase ladder has gone quiet, or after expiry → reopen the card, notify the owner, and reach out the same day: "Saw you were looking at that quote again, {{first_name}}, want me to refresh it?" A re-view is a buying signal regardless of how old the quote is.

Exit: decision recorded.

WF-Q6 · Objection Routing and Revision Control

Trigger: "I have a question" tapped; BO classifies an inbound reply as an objection; or the owner logs one from a call.

Actions:

  1. Write objection_type; add quote-question-raised; move to Question Raised; cancel every pending chase; create a task for quote_owner due in 2 working hours.
  2. Branch on objection_type:
    • Price → owner only, by phone, never by automated message. The brief is to understand the comparison before changing anything: what are they comparing against, and is it the same scope. A reflexive discount against an unexamined comparison is the most expensive habit in any quoting business.
    • Timing → confirm whether it is their timing or yours. Their timing → set decision_due_date, pause the ladder, move to Not Now: Future with a dated re-entry. Your timing → check the calendar for a genuine alternative before replying.
    • Scope unclear → revise, do not explain. If the quote generated this question, the document is at fault, and the same gap is costing you quotes you never hear back about. Fix the template as well as the quote.
    • Need approval → the real work is enabling the internal champion. Send a one-page summary written for the approver, offer to join a call, and ask for the approver's name and the decision date. Update decision_maker_name.
    • Comparing quotes → no discount. Send the comparison aids. What is included that is commonly excluded, warranty, references, insurance, timescale, and ask directly what would make the decision easy. Record competitor_named.
    • Finance or payment terms → route to whoever is authorized to discuss terms, send the approved options only, and never improvise a payment plan in an automation.
    • Trust or references → send references, credentials, insurance, and recent work. This objection is cheap to answer and frequently decisive.
    • Technical question → route to the technical owner with a 4-hour SLA. BO answers nothing technical it cannot quote from the document verbatim.
  3. On any revision: increment quote_version and revision_count; set a fresh quote_expires_at; supersede the previous version in the document module so exactly one quote is live; resend through WF-Q3; restart the chase ladder with chase_count reset.
  4. At revision_count of 3: stop revising and escalate to the owner of the business. Three revisions means the scope was never agreed, and the next version will not fix that either. Have the conversation instead.
  5. Wait 24 hours after any objection is logged. Condition: no response from the owner recorded → escalate to their manager. An unanswered objection is a lost job; this is the most urgent queue in the build.

Exit: revision issued; objection answered and the ladder resumed; or moved to a terminal stage.

WF-Q7 · Win Path: Verbal Yes to Scheduled

Why the urgency: the gap between a verbal yes and a signature is where more revenue is lost than anywhere else in this pipeline. Enthusiasm decays in hours, competitors are still in play, and an unsigned yes is not a sale. This workflow measures its own steps in minutes.

Trigger: "Go ahead" tapped; owner logs a verbal acceptance; or a signature is returned.

Actions, in order:

  1. Move to Verbal Yes; add verbal-yes; cancel every pending chase; notify the internal channel.
  2. Within 1 minute, send the signature request. Same day is not good enough. "Brilliant, {{first_name}}, here it is to sign, takes about a minute on your phone: {{signature_link}}. Once that's in I'll confirm your start date." Stamp signature_requested_at; add awaiting-signature.
  3. Hold a provisional start date in the job calendar immediately and name it in the message. A date makes the decision concrete and creates a reason to sign now.
  4. Wait 4 hours. Unsigned → one SMS nudge. Wait until next morning. Unsigned → call task for the owner. Wait 2 days. Unsigned → escalate; a verbal yes that has not signed in 48 hours has usually met an obstacle nobody has named yet, and it needs a conversation rather than another link.
  5. On signature: stamp signed_at; move to Won: Signed; add quote-won; file the executed document against the card; announce the win internally with quote_band, quote_source and time_to_quote_hours, so the team sees which sources and which response times are producing wins.
  6. Deposit branch where deposit_required is true: send the payment link by SMS and email within 2 minutes of signature, while they are still holding the phone. Stamp deposit_requested_at; add deposit-outstanding. Wait 1 day → reminder. Wait 3 days → call task. The start date stays provisional and is explicitly described as provisional until the deposit clears. Never let an automation take payment without the authorization the customer actually gave.
  7. On payment: stamp deposit_paid_at; confirm scheduled_start_date; move to Scheduled; release the provisional hold into a confirmed booking.
  8. Operational handover: create the job, notify the delivery team with the scope and the scoping-checklist attachments, and send the customer a short what-happens-next message naming their contact and the date. Set handover_complete.
  9. Wait 2 days. Send the onboarding sequence or the pre-start checklist. A won quote that goes quiet between signature and start date generates cancellations.

Exit: scheduled and handed over; or signature abandoned and escalated.

WF-Q8 · Loss, Expiry and Reason Capture

Why you must force an ending: an unresolved quote is worse than a lost one. It inflates the forecast, occupies attention, and teaches the business nothing. The purpose of this workflow is to convert silence into a recorded outcome.

Trigger: "Not for now" tapped; owner logs a loss; or quote_expires_at passes with no decision.

Actions:

  1. On an explicit no: reply within the hour, graciously and with no attempt to reopen: "Thanks for telling me, {{first_name}}, genuinely appreciated, it's better than wondering. If it helps us improve, one tap: {{lost_reason_link}}. Best of luck with it." A business that takes a no well is the business people come back to.
  2. Write lost_reason and competitor_named from the form or the owner's note. Move to Lost: Reason Known; add quote-lost; remove from the forecast.
  3. On expiry with no answer: move to Expired: No Decision, add quote-expired, set lost_reason = No decision made, and expire the quote in the document module so the price genuinely stops being live. A quote that is still honourable six months later is an open-ended commitment nobody agreed to.
  4. Branch on lost_reason:
    • Price → no counter-offer by automation. Flag for the monthly pricing review; a pattern across many losses is useful, a reflexive discount on one is not.
    • Timing or Project canceled → move to Not Now: Future, set a dated re-entry from what the customer said, and continue to WF-Q9.
    • Went elsewhere → record competitor_named and send one short, unbitter message asking what tipped it. The answers to this question are the cheapest competitive intelligence available, and people answer it surprisingly often.
    • Scope changed → offer to requote once, with a clear deadline.
    • Never a fit → feed back to whoever owns lead qualification. This is an acquisition problem being reported through the quoting process, and the fix is upstream.
    • Lost contact → check for a bad phone or email address first. A meaningful share of these are data failures rather than decisions.
  5. At 7 days after the loss: create a task for the owner to make one personal follow-up call on Large and Major losses only. Nothing else; this is relationship work, not a second chase.
  6. Add to the long-cycle nurture audience, and continue to WF-Q9.

Exit: terminal, with a reason recorded. A card leaving this build without a lost_reason is a reporting defect and should appear on the weekly hygiene flag.

WF-Q9 · Long-Cycle Nurture and Dated Re-Entry

Why: a large share of lost quotes were never a no, only a not-yet. The difference between a business that captures those and one that does not is whether a date was written down.

Trigger: card enters Not Now: Future, Lost: Reason Known or Expired: No Decision.

Actions:

  1. Set a dated re-entry from what the customer actually said ("after the summer", "next budget year", "once we've moved") stored in decision_due_date. Where they gave nothing, default to 90 days.
  2. Enroll in a light nurture: one useful message a month, maximum. Completed work similar to theirs, a seasonal note, a genuine change in service or availability. No quotes, no discounts, no "just checking in".
  3. On the re-entry date: create a task for the original quote_owner (the same person, who remembers them) to make one personal approach: "{{first_name}}, you mentioned {{timing_reason}} when we spoke in {{month}}, is now a better time? Happy to refresh the quote." One attempt, by a human, referencing what they said. This single task converts better than any sequence in this workflow.
  4. If they re-engage: create a new quote card with a new quote_number, linked to the old one. Never resurrect an expired quote at its old price; prices move and reviving a stale figure is how a win becomes a loss-making job.
  5. Seasonal and trigger-based re-entry: where the service is seasonal, re-enter the audience ahead of the season rather than on a fixed interval.
  6. Hard stop: two unanswered annual cycles → remove from nurture and archive. Set a retention rule for quote documents and personal data, and apply it automatically.

Exit: re-engaged into a new quote; or archived.

WF-Q10 · Daily Quote Board and Weekly Reporting

Why: the build's value compounds only if somebody looks at it every morning. This workflow makes the pipeline unignorable.

Trigger: scheduled, 08:00 each working day, and 08:00 Monday.

Daily actions:

  1. Post the board to the internal channel, in four sections: overdue internally (past quote_due_by, not sent). Always first, because it is the only section the business fully controls; hot (quote-hot or viewed in the last 24 hours); objections unanswered past 24 hours; verbal yes unsigned past 24 hours.
  2. Create or re-raise one task per item, assigned to the named owner, with the stage dwell time shown so age is visible rather than inferred.
  3. Flag every card with no quote_owner, no quote_expires_at, or no decision_maker_confirmed. These three gaps account for most of the quotes that quietly vanish.

Weekly actions:

  1. Email the owner the digest: quotes requested, sent, won, lost and expired; median and 90th-percentile time_to_quote_hours; win rate by quote_band, by quote_source and by quote_owner; objection and loss-reason distribution; average chase_count on wins versus losses; and the count of cards sitting past their stage dwell limits.
  2. Report win rate against time_to_quote_hours bands. This is usually the single most persuasive chart the build produces, and it tends to settle the internal argument about whether speed matters.
  3. Flag any owner whose median preparation time is materially worse than the team's, and any service type whose revision_count runs high. The latter is a template or scoping problem, not a sales one.
  4. Forecast hygiene: list every quote still counted as open past its expiry date. Force each one to a stage. A forecast containing dead quotes is not a forecast.

Exit: runs indefinitely.

05

What changes

What is different afterwards

  • Every quote has a named owner within a minute of the request. Not a team, not an inbox. The most common reason a quote is never produced is that nobody was ever specifically responsible for producing it.
  • Preparation runs against a clock. The internal SLA, the half-way reminder and the proactive apology mean the business chases itself before it chases the customer, which is where most of the recoverable delay actually sits.
  • Every quote has an expiry date. That single field creates a reason for the customer to decide and a trigger for the business to act, and it stops stale prices being honourable forever.
  • The chase happens five times, across channels, without anyone feeling awkward about it. Because it is scheduled, varied and capped, it stops being a personality trait of whoever is most persistent.
  • Silence gets converted into answers. The three-button prompt (and particularly the "not for now" button) turns dead pipeline into recorded losses with reasons attached.
  • View data replaces guesswork. You know whether the quote was delivered, read once, or read five times, and you act differently in each case. Chasing an unopened quote harder is replaced by fixing the delivery.
  • The verbal-yes gap closes to minutes. Signature request inside a minute, provisional date held immediately, deposit link within two minutes of signing. This is where the build most often pays for itself.
  • The pipeline becomes a forecast you can trust. Quotes end. They are won, lost with a reason, or expired. Nothing lives in limbo inflating the number.
  • You learn why you lose. lost_reason, objection_type and competitor_named turn a year of anecdotes into a ranked list, and the answer is frequently scoping or speed rather than the price everyone assumed.

Metrics to watch

  • Median and 90th-percentile time_to_quote_hours, by service type and by owner. Watch the 90th percentile hardest; the median hides the handful of catastrophically slow quotes that do most of the damage.
  • Win rate banded by time to quote. The most decisive chart in the build. Plot it once and the argument about response speed usually ends.
  • SLA breach rate on preparation, and the share of breaches where the customer was told proactively. The second number is a culture measure as much as a process one.
  • Delivery confirmation rate: the share of sent quotes with a recorded view within 48 hours. A persistent gap here is a deliverability or wrong-address problem masquerading as a conversion problem.
  • Quote view count distribution, and win rate by view count. Repeat viewers convert well when called and poorly when left alone, which is exactly what the hot branch exists to exploit.
  • Answer rate: the share of sent quotes reaching any explicit decision rather than expiring. This is the headline measure of whether the build is doing its job, and it should climb sharply in the first month.
  • Average chase_count on wins versus losses. If wins consistently take four contacts and your old process managed one, that comparison is the business case.
  • Chase-step attribution: which rung of the ladder produced the decision. Expect the call at step 2 and the three-button prompt at step 3 to carry more weight than the rest; prune accordingly.
  • Objection distribution and time-to-answer on objections. An objection unanswered for a day is close to a lost job; track the queue, not just the volume.
  • Verbal-yes-to-signature time, and the share of verbal yeses that never sign. A rising gap here is the most urgent warning the build produces.
  • Signature-to-deposit time, and deposit outstanding past the start date.
  • Revision count per quote, and win rate by revision count. High revision counts with low win rates point squarely at scoping or at the template.
  • Loss-reason distribution, reviewed monthly, with each reason assigned to a named owner. Price losses go to the owner, scope losses to whoever writes the template, speed losses to operations.
  • Win rate by quote_source, so lead-generation spend is judged on quotes won rather than inquiries received.
  • Forecast accuracy: quotes expected to close in a month against those that did. This becomes measurable for the first time once quotes are forced to end.
06

Before you start

Prerequisites

  • A decision on who owns quotes. Named people, with territory or specialism rules and shift cover. The round-robin cannot assign to a role that does not exist.
  • Agreed preparation SLAs per complexity band, in working hours, signed off by the people who will be held to them. An SLA nobody agreed to is an SLA nobody meets.
  • A quote template that is complete. Scope, exclusions, assumptions, payment terms, validity period, and what happens next. Every gap in the template becomes an objection, a revision and a week of delay: fixing the document is cheaper than automating around it.
  • An agreed validity period per service type, and the discipline to honor the expiry. If expired quotes are quietly honoured, the field stops meaning anything and the urgency it creates disappears.
  • A scoping checklist for each service, so quotes are not sent with the gap that generates the question.
  • Clarity on who may discuss price and terms. This decides BO's guardrails and the objection routing. Write it down before building.
  • Signature and deposit policy settled: what is signed, by whom, whether a deposit is taken, and what the terms are.
  • Capacity awareness. A functioning chase ladder increases won work. Confirm the delivery side can absorb it before switching the ladder on at full cadence.

Integrations and provisioning

  • Document and e-signature module configured with the quote template, version control, view tracking and a mobile-friendly signing flow. View tracking is what WF-Q5 runs on; without it half the build is blind.
  • Payments: Stripe, Square, PayPal or Authorize.net. For deposits and payment links, tested on a phone, and with the authorization the customer gives for a stored card clearly scoped.
  • Accounting sync (QuickBooks or Xero) so accepted quotes become invoices without retyping, and deposits appear in the books.
  • Two-way calendar sync (Google Calendar, Microsoft 365 or Outlook) for site visits, walkthrough slots, preparation blocks and provisional start dates.
  • The existing business number for SMS chases, with call recording where permitted and lawful, since the chase ladder includes real calls.
  • Authenticated email sending domain (SPF, DKIM and DMARC) before the first send. Quotes that land in spam are the most expensive deliverability failure a business can have, and they look exactly like lost deals.
  • Branded short-link domain for quote, decision-prompt and payment links. A payment link on a generic shortener gets treated as fraud by both carriers and customers.
  • Slack or Microsoft Teams for the daily board, the overdue alerts and the hot-view notifications. This build generates time-sensitive internal signals and email is where they die.
  • Ad platform conversion import (Google Ads, Meta Ads) so won quotes, not form fills, are what the ad accounts optimize toward.
  • Field service, estimating or industry software: decide which system owns the quote document and sync one way only. Two systems producing quote numbers is a dispute waiting to happen.

SMS registration, consent and timing

  • Complete A2P 10DLC brand and campaign registration before sending. Quote delivery and chase messages are best registered as customer care or notification traffic, since they follow a direct request, but register honestly and submit samples matching what WF-Q3 and WF-Q4 actually send.
  • Capture SMS consent on the quote request form itself, with an unticked box naming the business, the message types, that frequency varies, that rates may apply, and how to stop. Requesting a quote is not blanket consent to be texted; asking at the point of request is both cleaner and almost never refused.
  • Quiet hours: chases go out 09:00–18:00 local on working days only, never at weekends, never on public holidays. Maintain a holiday calendar per location.
  • Honor STOP mechanically and make an opt-out stop the chase ladder as well as the channel, then tell the owner, because a quote with no permitted channel left needs a human decision, not silence.
  • Cap chases at 5 in the field, via chase_count, not by counting steps, so a revision cannot stack a second ladder on the first.
  • Respect a stated decision date. If the customer says they will decide on a date, the ladder pauses until then. Chasing inside a window you were given is the fastest way to turn a probable yes into a no.
  • Record call consent where recording is used, in line with the rules of the jurisdiction, which differ on whether one party or all parties must consent.

Commercial and compliance considerations

  • A quote may be a binding offer. How long it stands, what happens if it is accepted after expiry, and what the stated terms commit you to are legal questions, not design ones. Get the validity wording, the terms and the acceptance mechanism reviewed by the client's own counsel before the first quote goes out.
  • Electronic signatures have formal requirements that vary by jurisdiction and by contract type, and some documents cannot be signed this way at all. Confirm the signing flow, the audit trail and the record retention with counsel.
  • Deposit, cancellation and cooling-off rules frequently apply to consumer contracts, including mandatory cancellation periods and specific pre-contract disclosures. Where a cooling-off period applies, build it into the win path rather than discovering it after a dispute.
  • Never let an automation take a payment beyond the authorization the customer actually gave, and never store card details outside the payment provider.
  • Keep every version. Superseded quotes, the executed document and the audit trail of who sent what and when should be retained and filed against the card. Most quote disputes are resolved by version history.
  • Where regulated services are involved (healthcare, finance, insurance, legal) pricing communications, disclosure requirements and permissible claims are governed by sector rules; and where protected health information is involved, get a signed business associate agreement covering the platform in place first and keep quote messaging clinically silent.
  • Set a retention period for quote documents and for the personal data of prospects who never converted, and apply it automatically.
  • None of the above is legal advice. Have the client's own counsel review the validity wording, contract terms, signature flow, deposit and cancellation policy, and recording practices before launch.

Template work, document configuration and scope are quoted per account rather than off a list. Book a call at bookings.appbo.io to review your current quote document and where the time is actually going.

Field notes

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