Win-back board for your quiet Housecall Pro customers

By General Input

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.

Integrations

  • Housecall Pro
  • Twilio
  • Google Sheets

Type

App

Categories

  • Sales
  • Marketing

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads