Back to The Water Cooler

Software

AI service narratives: what we learned shipping them to 100 pool routes

What worked, what didn't, what customers actually read. Plus the unexpected ways AI catches issues your tech would have missed.

By the Ernie teamJune 7, 202610 min read

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.

What an AI service narrative actually is

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.

What we measured

Six months in across 100 routes (about 18,500 service visits), here's what the narrative did to the metrics we cared about:

  • Email open rate: 41% baseline (chemistry-only report) → 67% with narrative. Customers know there's something worth reading at the top.
  • Photo click-through rate: 9% → 28%. The paragraph mentions what's in the photo ("brushed the steps"), so customers actually click to see.
  • Customer reply rate: 1.2% → 3.4%. Not all positive, but the volume of "quick question about what you said" replies went up. This is good. It's customers engaging.
  • "Where's my report" calls per 100 visits: 4.1 → 1.6. Customers who get a narrative report seem to actually notice it arrived. The non-narrative baseline customers were treating the email as bills-and-noise and not registering it.
  • 30-day customer churn: 1.8% → 1.4%. Small but real. Probably a sliver of customers who would have churned out of inattention now feel like there's a relationship there.

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.

What surprised us

Two things we didn't plan for.

The AI caught stabilizer creep we'd missed

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.

Customers started reading the chemistry table

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.

The two failure modes

Failure 1: Hallucinated chemistry it never saw

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.

Failure 2: Tone that sounded like nobody

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.

The customer-trust dividend

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.

What we're deliberately NOT using AI for

A note on the not-yet list. These are the places where we ran experiments and decided to pull back.

  • Pricing decisions. We tried using AI to suggest service price points for new accounts. It was bad. The model didn't know the local market, the customer's willingness to pay, or the operator's capacity. Pricing is judgment, not pattern matching.
  • Technical diagnosis. "Your heater is making a grinding sound" + AI is a great way to recommend the wrong repair. Diagnosis stays on the tech. The model can describe what the tech logged, not guess what's wrong.
  • Customer billing disputes. When a customer pushes back on an invoice, the owner needs to handle it. AI-generated dispute responses are the fastest way to lose the customer entirely. The model is allowed to summarize a visit history for the owner's reference, not draft the response.
  • Chemical dosing recommendations. We have AI flag "your alkalinity is low" but we don't let it say "add 4.2 lbs of sodium bicarbonate." The dosing call lives with the tech because it depends on pool volume, current pump schedule, customer presence, and a dozen other things the model can't see.

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.

Bottom line

  • Email open rate jumped from 41% to 67% with narratives. "Where's my report" calls dropped 60%.
  • The AI flagged real chemistry trends (CYA creep, calcium drift) that techs missed in roughly 1.3% of all visits.
  • Hallucinated chemistry was the worst early bug. Constrain the prompt to logged values only and run a post-gen check.
  • Tone presets matter more than you'd think. Most residential customers want their tech to sound like their tech.
  • The retention dividend is real: customers who understand their water chemistry stay longer and accept more add-ons.
  • Stay disciplined about what AI does and doesn't do. Summarize, don't diagnose. Describe, don't prescribe.

Want Ernie to handle this for you?

Up to 60 days free. $24.99/mo. Up to 5 techs. No card required to start.

Start your free 60-day trial