Software
What worked, what didn't, what customers actually read. Plus the unexpected ways AI catches issues your tech would have missed.
The original hypothesis was simple. Customers don't read the chemistry table on their service report. They read the paragraph at the top, if there is one. Most pool service software doesn't generate one, so the customer just sees a wall of numbers and checkboxes, deletes the email, and forgets they have a pool guy until the bill comes.
We thought we could fix this with a short generated paragraph. Take the chemistry the tech logged, the visual checks, and any notes, and turn it into three or four sentences that sound like a conscientious technician explaining what they saw. We launched it in late 2025 and watched it run on 100 active routes for six months. Some of what we expected showed up. Some surprising things happened. And two ways it failed taught us a lot about what AI is and isn't good at in a service workflow.
This is what we found. No marketing gloss, including the parts that didn't work.
On a service visit, the tech logs the inputs in our app: pH, free chlorine, total alkalinity, calcium hardness, cyanuric acid, salt (if applicable), water temp, plus a checklist (baskets emptied, brushed, vacuumed, filter pressure, equipment notes). Maybe a few photos.
Before they hit "complete visit," the system takes those inputs and generates a short paragraph. A typical one reads:
Visited today at 11:42 AM. Water looks clear and the pH came in slightly low at 7.2, so I added 12 oz of soda ash to bring it back toward 7.5. Free chlorine is healthy at 2.1 ppm. Salt cell output looks good. Skimmer baskets were heavier than usual, a lot of oak debris this week. Brushed the steps and vacuumed the deep end. Filter pressure is holding at 14 PSI, no backwash needed this visit.
The customer gets that paragraph in their service email, with photos, and the chemistry table is below for whoever wants to dig in.
Six months in across 100 routes (about 18,500 service visits), here's what the narrative did to the metrics we cared about:
The numbers are above what we predicted. The biggest surprise was the "where's my report" reduction, which is a real cost saving for the operators because every one of those calls is 4–7 minutes of office time, often during the day when the owner is trying to be on a route.
Two things we didn't plan for.
When you ask a language model to summarize a chemistry reading, it doesn't just narrate the present visit. It contextualizes against the visit history we feed it. Around month two we started getting reports with sentences like:
Cyanuric acid is now reading 92 ppm, up from 68 at the start of the season, which is normal for a chlorine-tab system but is approaching the range where the chlorine starts to lose effectiveness. We may want to plan a partial drain in the next few weeks if it climbs another 10 ppm.
The tech's eyes had glossed over the CYA reading because each individual visit was in range. The system caught the slope. Across the 100 routes we saw the AI flag this kind of creeping-trend issue (CYA, calcium hardness, gradually rising TDS) in about 4% of visits, roughly 740 catches over the test period.
Some of those were the AI being overly cautious. The tech checked and said "yeah, that's normal seasonal drift, no action needed." But maybe a third of them were legitimate early warnings. The kind of thing where catching it now means a partial drain next visit, not an emergency drain after the customer's algae bloom in August.
We thought the narrative would replace the table. Instead the table became referenced. When the paragraph says "pH came in slightly low at 7.2," the customer scrolls down to see what the "normal" range is. Within three months we had 30% of customers visibly engaged with their own water chemistry. Owners told us they started getting questions like "why does my pH always drop?" which led to real conversations about plaster age, fill water alkalinity, and bather load.
Customers who understand why their chemistry behaves the way it does are massively more retention-loyal than customers who just see numbers and trust the tech. That's the unintended dividend.
Early on, when we let the model fill in context, it would sometimes write things like "phosphates are starting to creep up, may need a treatment soon" when the tech had not run a phosphate test that visit. The model knew phosphate testing existed and was being "helpful." This terrified us. A customer reading that and asking the tech about it next week is a bad moment.
Fix: we constrained the prompt so the narrative can only reference values that were explicitly logged that visit. If phosphates weren't tested, phosphates don't appear in the paragraph. We also added a post-generation pass that checks each chemistry number mentioned against the actual reading. Anything that doesn't match gets dropped. Hallucinations have gone from "occasional" to effectively zero over the last four months.
The default tone was too formal. Real techs don't write "the swimming pool was observed to be in satisfactory condition." They write "pool looks good, did a quick brush of the steps and the deep end vacuum." Owners told us the AI version made the report feel corporate, which is the opposite of what most residential customers signed up for.
Fix: per-organization tone presets. The owner picks "casual," "professional," or "formal" once at setup. Casual is the default now and reads like an actual tech wrote it: contractions, occasional "heads up," comfortable with mentioning the weather. Formal is available for commercial accounts where the customer expects a report that reads like an inspection summary.
Six months in, the operators using narratives are telling us the same story in different words. Their customers know what's going on with their pool now. That shows up in renewals, in fewer disputes about pricing, and in a quieter inbox.
Specifically: customers who get narratives are 31% more likely to accept a service add-on recommendation (filter clean, salt cell replacement, equipment repair) when it's proposed. The data isn't mysterious. The customer already trusts the report because it's been explaining itself for six months. When the tech then says "hey, your filter pressure has been climbing and it's time for a deep clean," the customer has been gradually learning what filter pressure means.
This is what good software is supposed to do: turn a transactional service into a relationship. More on the philosophy behind it.
A note on the not-yet list. These are the places where we ran experiments and decided to pull back.
The general rule we've settled on: AI summarizes things that happened. It does not decide things that haven't happened yet. That distinction has held up well across six months of production use.
Up to 60 days free. $24.99/mo. Up to 5 techs. No card required to start.
Start your free 60-day trial