Case studies

28 years of history, in one record.

Chem-Dry of Richmond had 28 years of customer history spread across an old field service system, a new one and a CRM. Nobody could answer "who have we not seen in a year" without a spreadsheet, so nobody asked. Here is what changed, and what the same history turned up on the way.

ClientChem-Dry of Richmond
TradeCarpet and upholstery cleaning
Footprint3 locations
History28 years, 3 systems
Went firstBring past customers back

What runs

The Monday morning that builds the page.

Every week, without anyone on their team touching it. The whole sequence takes four minutes.

Stitched once

28 years of history from the old field service system, the new one and the CRM, into one record per household.

One customer, one record, back to day one.

Mon 7:00

The list builds itself: customers serviced this month last year who have not been back.

This month, last month, next month, rolling.

Mon 7:00

Opt outs, bad emails, anyone who bought in the last six months, and a hold out group come off automatically.

The hold out is how we know what the list is worth.

Mon 7:04

The list is in the owner's inbox and the send goes out.

Email today; text and calls where the customer has said yes.

Through the week

Bookings land back in the same record. Friday's report shows the week against the same week last year.

The numbers are retrieved, never made up.

28years of history, in one place
3systems it used to live in
~100customers a month who would have been forgotten
1record per household, back to day one

None of this was new spend. It was their own numbers, put somewhere somebody could act on them.

Nobody exports a list on Monday. Nobody writes the follow up at 10pm. The work happens whether anyone remembers it or not.

Monday page · Same page every week

Week of Aug 17 to 23, 2026

Chem-Dry of Richmond · Carpet cleaning · 28 years of history · 3 locations

Built Mon Aug 24, 7:00Against the same week last year, Aug 18 to 24, 2025

1New leads

71last year 34 · +109%Paid search: 50 calls, 21 messages. 60 charged.

2New customers

40last year 29 · +38%First invoice this week. Repeat customers not counted.

3Cost to sell

$6,790Aug to date213 charged leads · $32 a lead$2,670 (39%) of it was spent on people who were already customers.

4Gross margin

From the books, monthlyLands with the accountant's monthly close. Job costs are not split in the CRM yet, so this one waits for the books.
This week against the same week last year
Retrieved from the recordThis weekLast yearChange
Revenue invoiced$32,444$19,826+64%
Jobs invoiced7953+49%
Customers billed7753+45%
Average ticket$411$374+10%
Bookings back in the record95not trackedold system
Revenue invoiced, 2026Same weeks, 2025
What ran this week
  • Win-back list built and sent, 7:00 to 7:04. 95 customers serviced Aug 2025 and not back since; 16 held out as the control.Opt outs, missing emails and anyone who bought in the last 6 months came off automatically.
  • Follow-up series after a job. 26 customers from last week, 12 from five weeks back, 25 from nine.Services beyond carpet cleaning. Nobody lands on two lists in the same week.
  • In-market signals. 7 existing customers showing fresh intent for the services you sell.
  • Every search lead matched to the customer record the day it arrived: 71 leads, 60 charged, 4 of the charged ones were active customers.
What moved the wrong way, and what we did
  • Paid search is buying back your own customers. 83 of 213 charged leads this month were already in the record, $2,670 so far.Existing-customer leads are now flagged in the daily lead digest so the spend question is on the table with a number attached.

Revenue is invoiced revenue by service date and ties to the books to the dollar. Same definitions every week. Numbers are retrieved from the record, never estimated.

Nobody built a spreadsheet

One Monday page, built from Chem-Dry of Richmond's own record and published with their permission. Every number is retrieved, not estimated.

What the same history found

41% of a year's paid search had gone to people who were already customers.

Once every job, call and invoice lives in one record per household, you can ask a question nobody could answer before: was this lead a new customer, or one we already had? For a full year of paid search, the answer was that 41% of the spend went to people who were already on the books.

That is the other thing one record per household does. It does not just tell you who to call. It shows you which money is being wasted, with a figure attached, so the conversation with the ad rep stops being a matter of opinion.

The fix is not to stop advertising. It is to know the difference at the moment the lead arrives, which is what the agent does on the phone and in the text thread.

A text conversation with the Chem-Dry of Richmond agent, which asks whether the caller is a first-time or returning customer
The agent asks the question that decides the attribution, in the first reply, before anyone has been booked.

Where they stand

One page, and it ties to the books.

The same record that builds the Monday list also answers the questions that used to need a bookkeeper and a week's notice: what a job is worth, which services carry the year, and which months historically run ahead.

The Chem-Dry of Richmond dashboard: revenue, average ticket, jobs per working day, collection rate, revenue by service, and a seasonal revenue index
Revenue, average ticket, jobs per working day and collection rate, each against the same window a year earlier, with revenue by service and a seasonal index built from the franchise's own history. Every figure is retrieved from the record, not estimated.

Published with Chem-Dry of Richmond's permission, name and mark included. Every other client's numbers stay between them and the three of us.

Your history is doing this too.

Every business with a few years behind it has a list like this one and a spend question like that one. Send the four numbers and we will tell you what we would run first. The first two steps are free.