Chase unsold ServiceTitan estimates with personal texts
Every weekday at 8am, quotes that have gone quiet get a specific follow-up text about the actual work you priced, while big jobs go to a rep to call.
Every weekday at 8am, run on a cron schedule and chase the unsold ServiceTitan estimates that are quietly costing us revenue.
Start by pulling candidate estimates from ServiceTitan with List Estimates. I only want estimates that are still unsold and open, with an age between 3 and 30 days. Anything younger than 3 days is too fresh to chase and anything older than 30 days is cold. Skip anything that is already sold, dismissed, or expired.
For each estimate that qualifies, call List Estimate Items to read the line items and understand what work was actually quoted. This detail is the whole point of the workflow, because the follow-up has to reference the real job.
Then find the customer. Use List Customers to resolve the customer on the estimate, then List Customer Contacts to pull their contact methods and pick out the mobile number. If there is no mobile phone contact on file, do not text them and do not guess at a number. Set that estimate aside for the digest instead.
Compare each estimate total against a high-value threshold I can configure, defaulting to $5,000. Estimates at or below the threshold get a text. Estimates above the threshold should never be texted. Post those to Slack with Send a Message in our sales channel, including the customer name, the estimate total, how many days old it is, and a one-line summary of the quoted work, so a salesperson can call personally.
For each estimate under the threshold, write a short follow-up text and send it with Twilio Send a Message. The message has to be specific about the work proposed and reference the actual line items, for example the equipment being replaced, the room involved, or the repair named on the quote. Do not send a generic "just checking in" message. Keep it under roughly 320 characters, use the customer's first name, identify our business by name, keep the tone friendly and low pressure, and end with a clear next step such as replying to get it booked or to ask a question. Include an opt-out line where that is required.
Send at most one message per customer per run. If a customer has several unsold estimates inside the window, pick the single most relevant one, preferring the highest value estimate, and mention only that one. Never send the same customer two texts in the same run.
Finish with a digest posted to Slack using Send a Message, broken into three sections: who was texted and about which estimate, which high-value estimates were escalated for a personal call, and which estimates had no phone number on file so someone can go and fix the contact record. Include the total dollar value sitting in each of the three buckets.
If there is nothing to chase on a given day, still post a short Slack note saying there were no unsold estimates in the window rather than staying silent.
What does this prompt do?
- Finds the estimates that are still unsold and between 3 and 30 days old, so you chase the quotes still in play and leave the decided ones alone.
- Reads the line items on each quote so the follow-up text names the actual work proposed instead of sending a generic "just checking in".
- Looks up each customer's mobile number and sends one short, personal text per customer per run.
- Holds back your biggest quotes: anything above a dollar threshold you set goes to Slack for a salesperson to call, and a closing digest shows who was texted, who was escalated, and which estimates have no phone number on file.
What do I need to use this?
- A ServiceTitan account with your sales estimates and customer contact records
- A Twilio account with a phone number that can send texts
- A Slack workspace, plus the channel where your sales team should get escalations and the daily digest
- A dollar figure for what counts as a high-value quote that deserves a phone call instead of a text
How can I customize it?
- The dollar threshold that decides whether a quote gets a text or gets escalated to Slack for a personal call
- The age window, set to 3 to 30 days by default, that decides which quotes are still worth chasing
- The send time and days, set to 8am on weekdays, plus which Slack channel receives the escalations and the digest
FAQs
Will my customers get spammed with repeat texts?
What happens if a customer has no mobile number on file?
Why text instead of email?
Can I stop it from texting my biggest jobs?
How does it know what the quote was actually for?
Related templates
When your flight moves, your calendar times get corrected automatically and you get a Slack note naming the meetings you're about to miss.
Every 15 minutes, forwarded phishing reports get traced back to the server that really sent them, with a verdict in Slack and the worst senders reported.
Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.
Every Monday, rank the week's matches by expected demand, put the big ones on your venue calendar, and post a rota-ready summary to Slack.
Every Tuesday we pull your best new reviews, draft social captions, email testimonials and product page quotes, then stage them in Notion for approval.
Every weekday morning, unfulfilled orders get an address check: harmless typos fixed automatically, risky addresses held with a note to the customer.
Stop letting unsold estimates go quiet.
Put a consistent follow-up behind every quote you send, and let your team spend their calls on the jobs actually worth calling about.