Win-back board for your quiet Housecall Pro customers
See which past customers are overdue for service and worth the call, ranked by lifetime spend, then text and rebook them without leaving the page.
Build me an app for winning back the Housecall Pro customers who have gone quiet, so slow weeks get filled from my own customer list instead of paid leads. I run a home services business and I open this app when next week's schedule looks thin. It is a browsing surface with a few one-click actions; nothing runs on a schedule.
The main view is a ranked win-back board. Build the row set from Housecall Pro List Customers, and for each customer pull their job history with List Jobs filtered to that customer and their billing with List Invoices. Each row shows: the customer name and city; months since their last visit, worked out from the most recent completed job; what we last did for them, meaning the job type or description on that job; which technician went, by matching the job's assigned employee against List Employees; their lifetime spend, summed from their invoice totals; and a due-for-service flag. Money comes back from Housecall Pro as integers in cents, so divide by 100 before displaying dollars.
The ranking puts high lifetime spend and long-overdue service at the top. Score each customer on both dimensions and sort by the combined score by default, with the option to sort by lifetime spend alone or months since last service alone. Show the reason for the ranking on the row or on hover, for example 'spent $4,120 lifetime, 16 months since last visit, furnace tune-up overdue by 5 months', so I can see why someone sits where they do.
Give me filters across the top of the board: job type, with the options loaded from Housecall Pro List Job Types; a minimum months-since-last-service; and a minimum lifetime spend. Filter selections persist per user between sessions.
The service interval rules live in a Google Sheet I control, read with Get Values. Each row maps a service or job type to an interval in months, for example annual furnace tune-up at 11 months and water heater flush at 12 months. A customer is due for service when the months since their last visit of that type is greater than or equal to the interval for that type. Keeping the rules in the sheet is the point: I can change what 'due' means without a developer. Read the sheet every time the board loads, and give me a refresh button. If a job type has no rule in the sheet, fall back to a default interval I can set in app settings and say so plainly on the row.
Clicking a row opens a detail panel for that customer showing their full service history, every job with its date, type, technician and invoiced amount, plus their contact details from Get Customer and their service addresses from List Customer Addresses.
Every row has a 'write the win-back text' button that starts a background agent scoped to that one customer. The agent reads that customer's service history from Housecall Pro using Get Customer, List Jobs for that customer, and List Invoices, then drafts a short, specific SMS: under 320 characters, warm but plain, referencing the actual equipment we serviced and the date we were last out, naming the technician if it was the same person each time, and ending with a clear ask to book. The agent writes the draft back into the app so the row flips to a 'draft ready' state; I open it, edit the wording if I want, and approve it.
On approval, send the message with the Twilio Send a Message action to the customer's mobile number, from my Twilio number, and show the delivery status on the row along with the failure reason if it does not go through.
Every row also has a 'book it' button. It creates the return visit with Housecall Pro Create Job against that existing customer and one of their existing addresses, using a job type I pick and a note recording which win-back it came from, then schedules it with Update Job Schedule for the date and arrival window I choose. Show the created job and its scheduled time back on the row so I can see the win landed.
Every contact and every outcome is appended to an outreach log tab in the same Google Sheet with Append Values: date, customer name and id, the message that went out, who approved it, the delivery result, and the outcome, meaning booked, replied, no response, or declined. The board reads that log back with Get Values so the same customer is never chased twice.
Three rules need to be built in rather than bolted on. First, only customers with a mobile number on file are textable; customers without one still appear on the board with their full ranking so I can call them, but their text button is disabled with a clear reason shown. Second, an opted-out tab in the Sheet is read with Get Values on every load and those customers are always excluded from texting, with no override anywhere in the app. Third, customers contacted in the last 60 days according to the outreach log are hidden by default, behind a toggle that brings them back into view clearly marked as recently contacted. Put a short line of copy in the app reminding whoever is using it that texting is opt-in and that the mobile-number check and the opted-out list are what keep this compliant.
A few practical notes. Housecall Pro list endpoints are paginated, so page through customers, jobs and invoices instead of assuming a single page. Building the board takes a lot of calls, so load it once, cache it for the session, and give me a visible refresh control with a last-updated timestamp rather than refetching on every interaction. If a customer has no completed jobs or no invoices, still show them with blank values rather than dropping them from the list.
What does this prompt do?
- Ranks every past customer by how long it has been since their last visit and how much they have spent with you, so the calls worth making sit at the top.
- Shows what you last did for each customer, which technician went, and whether they are due for service now.
- Reads your service interval rules from a Google Sheet, so annual furnace tune-ups at 11 months or water heater flushes at 12 months are yours to change without a developer.
- Drafts a short, specific text for any customer that references the equipment you actually worked on and the date you were last out, waits for your approval, then sends it and books the return visit.
What do I need to use this?
- A Housecall Pro account on a plan that includes API access, with your customer, job and invoice history in it
- A Twilio account with a text-capable phone number to send the messages from
- A Google account and a spreadsheet holding your service interval rules, your opted-out list, and the outreach log
- Mobile numbers on file for the customers you want to text, and their permission to text them
How can I customize it?
- Change what 'due for service' means by editing the interval rules in your spreadsheet, no rebuild required
- Set the filters you land on: minimum months since last service, minimum lifetime spend, and job type
- Change the quiet period, 60 days by default, before a recently contacted customer reappears on the board
- Adjust how much the ranking leans on lifetime spend versus how overdue someone is
FAQs
Will this text customers who have asked not to hear from us?
Does it send messages automatically?
Do I need a developer to change what counts as overdue?
What happens to customers with no mobile number?
Will the same customer get chased over and over?
How is lifetime spend calculated?
Related templates
Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.
Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.
Work every return, damage and warranty claim in one queue, with the order, the delivery date and a policy-backed recommendation already on screen.
See exactly which ingredients next week needs based on what you actually sold, adjust anything by hand, then build a one-click grocery cart.
See follower growth, posting cadence, format mix and engagement rate for your brand and every competitor you track, side by side on one board.
Open one screen to see how every service in your Jobber price book actually performed: how often it sold, what you charged, and where prices swing.
Fill slow weeks from the customers you already have.
Your best next job is usually a customer who simply forgot to book again, and you already paid to win them once.