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.

App
Housecall ProTwilioGoogle SheetsSalesMarketingContent GenerationLead Enrichment
PromptCreate

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?
No. The app reads an opted-out list from your spreadsheet every time the board loads and permanently excludes those people from texting, with no override in the app. It also only offers the text button for customers who have a mobile number on file.
Does it send messages automatically?
No. Every message is drafted for one specific customer and waits for you to read it, edit it, and approve it. Nothing goes out until you press send.
Do I need a developer to change what counts as overdue?
No. The service intervals live in your Google Sheet, one row per service type. Change 11 months to 10 for furnace tune-ups, save the sheet, refresh the board, and the due-for-service flags update.
What happens to customers with no mobile number?
They still appear on the board with their full history and ranking so you can call them, but the text button is turned off with a clear note explaining why.
Will the same customer get chased over and over?
No. Every contact and outcome is written to an outreach log in your spreadsheet, and anyone contacted in the last 60 days is hidden by default. You can toggle them back into view, and they are clearly marked when you do.
How is lifetime spend calculated?
It adds up the invoices on that customer's record in Housecall Pro, so it reflects everything you have actually billed them, not just their most recent job.

Related templates

Review desk for portal forms your team still fills in by hand

Stage a batch of filings overnight, then approve each completed form from a screenshot before anything is ever submitted.

Kernel
Google Sheets
Slack Bot
App
Audit what Intercom's Fin AI actually resolved before you pay

Review every conversation Fin closed as resolved, judge which ones actually stuck, and see what the gap is worth against your bill.

Intercom
Google Sheets
Slack Bot
App
Returns and warranty claim desk that follows your policy

Work every return, damage and warranty claim in one queue, with the order, the delivery date and a policy-backed recommendation already on screen.

Kustomer
Shopify
Google Sheets
App
Turn last week's cafe sales into this week's grocery order

See exactly which ingredients next week needs based on what you actually sold, adjust anything by hand, then build a one-click grocery cart.

Instacart
Square
Google Sheets
App
Benchmark your Instagram account against rival brands

See follower growth, posting cadence, format mix and engagement rate for your brand and every competitor you track, side by side on one board.

Instagram
Google Sheets
Google Docs
App
Find the services you're underpricing in your Jobber price book

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.

Jobber
Google Sheets
App

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.