Pool Service Report Template: AI Summaries and Chemistry Alerts

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Pool Service Report Template: AI Summaries and Chemistry Alerts.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Pool Service Report Template: AI Summaries and Chemistry Alerts.

A pool service report should show the date, the technician, every water reading next to its target, what was added, the jobs completed, equipment notes, photos and anything the customer must do. AI can turn the technician's notes into a plain-English summary and write the alert when a reading falls outside your bands, but the technician decides every dose.

Keep the flagging and the writing apart. A formula or your pool app compares each reading with its band and gives the same answer every time; the AI then writes a calm paragraph around the result. Asking a chat assistant to judge thirty customers' numbers by eye is where the odd wrong flag creeps in.

Follow me on Instagram@sagnikteaches

What one visit should leave on the record

The report a customer sees is a trimmed copy of an internal record. Build both from the same fields, so the summary can never mention something the record does not hold. Some firms show what was added to the water but not how much; decide once and apply it to every customer.

Connect on LinkedInSagnik Bhattacharya
FieldExample entryWhy it earns its place
Visit detailsTuesday, 10:42 to 11:09, [first name]Settles "did you actually come?" in ten seconds
Water clarityClear, slight film at the waterlineThe one reading a customer can check with their own eyes
Free chlorine2.5 ppm (parts per million)The sanitiser doing the work, and the number customers ask about most
Combined chlorine0.2 ppmUsed-up chlorine behind the strong "pool smell" and sore eyes; high values mean the water needs treating
pH7.5Affects comfort and how well the chlorine works
Total alkalinity100 ppmHow firmly the pH holds steady between visits
Cyanuric acid40 ppmThe stabiliser that shields chlorine from sunlight; usually tested every few visits, not every one
Calcium hardness, saltLast tested three weeks ago: 320 ppm, 3,100 ppmSlow-moving readings, so record the date as well as the value
Added this visitLiquid chlorine and pool acid, amounts as measuredBilling, stock control and a trail if a problem follows
Work completedSkimmed, brushed, vacuumed, baskets emptied, filter pressure checkedThe ticks the customer is paying for
EquipmentFilter gauge at 14 psi (10 when clean), pump quiet, salt cell cleanA rising filter pressure warns you of a clogged filter before it becomes a call-out
PhotosWaterline, equipment, anything unusualEvidence that helps both sides
For the customer"Please keep leaves out of the skimmer lid"One clear action, or the words "nothing needed"
Next visitRetest pH on WednesdayContinuity if a different technician covers the route

One rule prevents the most common AI error later. A reading that was not taken is recorded as "not tested", never left blank and never marked "ok". Blank cells are what a summary quietly smooths over.

Subscribe on YouTube@sagnikteaches

Set the bands before any AI sees a reading

A band is a minimum and a maximum for each reading, and it belongs to you, not to the AI. Start from the equipment maker's instructions and the pool surface maker's advice, then adjust for the sanitiser the pool uses, because stabiliser changes how much free chlorine is needed. For commercial or public pools, the health code that applies to them sets the binding limits, and your insurer may have its own view.

Public-pool codes are a sensible place to borrow a structure from, because many of them pair an ideal band with a wider allowed band for each reading. A common pattern allows pH from 7.2 to 7.8 with 7.4 to 7.6 as the ideal, and asks for at least 2 ppm of free chlorine when a stabiliser is in the water, with 10 ppm as the ceiling. Calcium hardness is often targeted at 200 to 400 ppm and cyanuric acid at 30 to 50 ppm, but the cyanuric acid ceiling varies from one code to the next, and 100 ppm is a common maximum. Spas have their own numbers, so treat all of this as an example of the structure, not a rulebook, and check each figure against the code or the equipment maker's guidance that applies to your pools.

That ideal-and-allowed structure converts neatly into three tiers. Green means inside the ideal band, amber means allowed but not ideal, red means outside the allowed band. Here is an illustrative table for a stabilised chlorine pool, using typical figures and a cyanuric acid ceiling of 90 ppm, a little tighter than that common maximum. Swap in your own numbers.

ReadingGreenAmberRed
Free chlorine2 to 5 ppmAbove 5 up to 10 ppmBelow 2 or above 10 ppm
Combined chlorineUp to 0.4 ppmNo amber band; one limitAbove 0.4 ppm
pH7.4 to 7.67.2 to 7.3 or 7.7 to 7.8Below 7.2 or above 7.8
Total alkalinity80 to 120 ppm60 to 79 or 121 to 180 ppmBelow 60 or above 180 ppm
Calcium hardness200 to 400 ppm150 to 199 or 401 to 1,000 ppmBelow 150 or above 1,000 ppm
Cyanuric acid30 to 50 ppm51 to 90 ppmAbove 90 ppm

Codes tend to cap cyanuric acid rather than set a floor, but below 30 ppm chlorine burns off quickly in sunlight, so you may decide to treat a low reading as amber. That is your call, and it is exactly the kind of call the table exists to record.

What each colour triggers matters more than the numbers. Green: nothing happens, and the report says "within our target range when we left". Amber: the office sees it in a morning digest and the summary says it was outside range and what the technician did. Red: an immediate text to the owner or dispatcher, the technician phones the customer from the pool, and no AI-written message reaches the customer until a person has read it. The summary never says "safe". A reading describes one moment, and swim advice is the technician's to give.

The Complete Excel Course with AI Integration thumbnail

The Complete Excel Course with AI Integration

From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.

By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner

Buy now

Let a formula do the flagging

If your pool app already flags out-of-range readings, use that. Skimmer's feature pages describe Office Alerts for readings out of range, late starts, skipped stops and failed payments, with the triggers and recipients set by you, plus a Service Email that can carry readings, dosages, ticked checklist items and photos to the customer. Photos there must be taken inside the app, not uploaded from the camera roll, which keeps an old picture out of today's report. Jobber's checklists can record chemical readings and treatments and send the finished checklist to the client. Apps like these supply the data and the flags; AI supplies the sentences. Prices and fit are compared in the pool software comparison.

Some apps also include a dosing calculator that suggests amounts from the readings, as Skimmer does on its Scaling Up plan. That is a measuring aid the technician uses on site, and it is a different thing from an AI summary. Neither replaces the technician's judgement about what the pool in front of them needs.

If you run on a spreadsheet or a form, the flag is one formula per reading. Put the bands on a second sheet called Targets, with the ideal band in columns B and C and the allowed band in columns D and E, so changing a band changes every flag. Row 2 holds free chlorine, row 3 pH and row 4 cyanuric acid.

Visits sheet: A date | B pool | C free chlorine | D pH | E cyanuric acid | F chlorine flag | G pH flag | H stabiliser flag

Targets sheet: B2=2, C2=5, D2=2, E2=10 | B3=7.4, C3=7.6, D3=7.2, E3=7.8 | B4=30, C4=50, D4=0, E4=90

F2: =IF(C2="","NOT TESTED",IF(OR(C2<Targets!$D$2,C2>Targets!$E$2),"RED",IF(OR(C2<Targets!$B$2,C2>Targets!$C$2),"AMBER","ok")))
G2: =IF(D2="","NOT TESTED",IF(OR(D2<Targets!$D$3,D2>Targets!$E$3),"RED",IF(OR(D2<Targets!$B$3,D2>Targets!$C$3),"AMBER","ok")))
H2: =IF(E2="","NOT TESTED",IF(OR(E2<Targets!$D$4,E2>Targets!$E$4),"RED",IF(OR(E2<Targets!$B$4,E2>Targets!$C$4),"AMBER","ok")))

Free chlorine of 0.5 comes back RED, 6 comes back AMBER, 3 comes back ok, and an empty cell comes back NOT TESTED. The prompt in the next section receives those words, not the thresholds, so the AI never has to decide whether one number is bigger than another. If you would like Gemini to help build the sheet itself, these Google Sheets prompts are a start.

From the technician's notes to the customer's paragraph

On site, the technician does what they already do: enters the readings, ticks the jobs, takes two or three photos and adds a short note about anything unusual, typed or dictated. That note is the raw material. The summary prompt below gets the flagged readings, the ticks and the note, and nothing else.

You are drafting a pool service report for a customer. Use only the data below.

Rules
1. Write 3 to 6 short sentences in plain English. Warm and calm, no exclamation marks. Say "we".
2. Mention each reading that was taken, with its target. If a reading is marked NOT TESTED, say it was not tested this visit. Never fill a gap, and never write "all readings normal" unless every reading was taken and is ok.
3. For anything marked AMBER or RED, say it was outside our target range and repeat only what the technician's note says about it. Do not suggest causes or doses, and do not say whether anyone can swim.
4. List the work completed exactly as ticked.
5. Finish with one line starting "For you:". Use the technician's customer action if there is one, otherwise write "For you: nothing needed."
6. Do not add anything that is not in the data.

DATA
Date: Tuesday
Technician: [first name]
Pool: residential, stabilised chlorine
Readings: free chlorine 0.5 ppm (target 2 to 5) RED; combined chlorine 0.2 ppm (up to 0.4) ok; pH 7.9 (target 7.4 to 7.6) RED; total alkalinity 110 ppm (80 to 120) ok; cyanuric acid NOT TESTED (target 30 to 50)
Work ticked: skimmed, brushed, vacuumed, baskets emptied, filter pressure checked (14 psi)
Technician's note: Cloudy after the weekend storm. Treated the water, pump left running. Retest Wednesday.

An illustrative output, after the AI has followed those rules:

Hello [first name],

Here is your pool report for Tuesday. The water was cloudy after the weekend storm. Free chlorine was 0.5 ppm against a target of 2 to 5, and pH was 7.9 against a target of 7.4 to 7.6, so both were outside our target range when we arrived. [Technician's first name] treated the water, left the pump running and will retest on Wednesday. Combined chlorine and alkalinity were within range. Cyanuric acid was not tested this visit. We skimmed, brushed and vacuumed the pool, emptied the baskets and checked the filter pressure (14 psi).

For you: nothing needed.

Read it as the office would. Every number matches the data, the missing reading is admitted, and nothing is said about swimming. The rules exist because first drafts without them tend to add three things: a cause ("common after heavy rain", which the note never said), a verdict ("should be fine to swim by this evening") and a tidy-up ("all other readings were normal", which hides the untested stabiliser). Delete any of those on sight and tighten the rule that allowed it.

A quiet week shows the other end. With every reading green, the same prompt gives something like this, which is all a customer needs:

Hello [first name], your pool report for Tuesday: the water was clear and every reading we took was within our target range when we left (free chlorine 2.5 ppm, pH 7.5, alkalinity 100 ppm). We skimmed, brushed and vacuumed, emptied the baskets and checked the filter pressure. For you: nothing needed.

Alerts people will actually act on

An alert is only useful if the person who receives it knows what to do and trusts that it is rare enough to matter. Three tiers, each with a named recipient, usually work better than one alert for everything.

TierTriggerWho hears and whenWhat AI may draft
GreenEvery reading taken is inside its ideal bandNobody; the weekly digest counts theseThe customer summary
AmberA reading is allowed but not ideal, or one has gone untested for three visits runningThe office, in a morning digest the next working dayThe summary, plus a one-line plan for the next visit
RedA reading is outside the allowed band, the water is visibly cloudy or green, a pump or filter has failed, or a stop was skippedThe owner or dispatcher and the technician, by text within minutesA customer message, held until a person approves it

The red text to the office should be short enough to read on a ladder: "Pool 14: free chlorine 0.5 (minimum 2), pH 7.9. [Technician's first name] on site, phoning the customer now." The customer message follows only after the technician has spoken to them, so the first the customer hears is a person, not a paragraph.

Watch the amber rate. If more than about one visit in five turns amber, either the bands are too tight or something is drifting across the route. Pools fed with stabilised chlorine tablets, for instance, gain cyanuric acid over a season, so a stabiliser flag appearing on dozens of pools in summer is a pattern, not dozens of separate problems. The answer is a policy decision for you and your technicians, not forty alerts. Add a cooldown as well: do not re-alert for the same pool and reading on consecutive visits unless it got worse.

Once a week the sheet can list pools with two or more amber or red flags on the same reading in the last four visits. Let a formula build that list, then let the AI turn it into a short digest for the owner. That is the one place where AI looks across visits, and it still only describes what the formulas found.

Where AI goes wrong on pool notes

These are the failures worth designing against. None needs a clever model to avoid; each needs a rule or a habit.

FailureHow it shows up (illustrative)Fix
Smoothing a gap"All readings normal" when cyanuric acid was not testedRule 2 in the prompt, and the NOT TESTED label in the data
Invented cause"Probably a heavy bather load" when the note mentions no swimmersRule 3; delete any "because" the note does not contain
Swim advice"Safe to swim after 6 pm"The summary reports readings only; swim advice comes from the technician by phone
Number slips7.9 becomes 7.0, or 0.5 becomes 5Paste the flagged table, and spot-check numbers against the app
Reading a test strip from a photoThe AI reads a strip photographed in shade as pH 7.2; the technician read 7.8 at the poolNever; the technician enters the number from the kit or a syncing tester
Alarming tone"URGENT: your water is unsafe"Tone rule in the prompt, and red messages held for a person to read
Personal data in the promptFull name and address pasted with every visitUse a first name or job number; the AI does not need the rest

A 60-pool route, before and after

Take a two-person firm with 60 weekly stops that writes a short summary for every customer. Before the change, the office re-types each technician's notes into a message at about three minutes a stop. That is 180 minutes, or three hours, every week.

After the change, the readings already flow through the flag formulas, so the office only reviews. Suppose nine of the 60 visits come back amber or red. Reading and correcting those nine at four minutes each takes 36 minutes. Spot-checking five of the 51 green drafts against the record at two minutes each takes ten. Sending the batch takes about five. The total is roughly 51 minutes, so the saving is a little over two hours a week, which is about nine hours a month. These figures are illustrative; yours depend on how many exceptions your route produces.

The AI itself is almost free. A $20-a-month chat plan is plenty. Even through an API, a small model at list prices of $1 per million input tokens and $5 per million output tokens costs about a fifth of a cent for a report of 700 tokens in and 300 out. Sixty reports a week for a year is about 3,120 reports, or roughly $7. The cost that matters is the reviewing, so spend your effort on the review rules rather than on shopping for a better model.

Roll it out in four steps. In week one, standardise the fields and the "not tested" rule without any AI. In week two, add the flag formulas and watch the amber rate. In week three, run the AI summary for the office only, comparing every draft with the record. In week four, start sending to customers, beginning with the greens and holding reds for a phone call. If you also want the reports to feed your reviews, the pool marketing tutorial shows where a clean report leads next.

Pools with a logbook: keep the record untouched

Commercial and public pools often have to keep a log of readings with times and the operator's name, in a format the rules for that pool specify. The AI summary never replaces that log and never edits it. Keep the original entries with their timestamps exactly as entered, and treat the customer summary as a derived document. If a contract with a commercial customer names a reporting format, that format wins over your template, and you can still send your summary as a cover note.

The same discipline helps on homes. If a customer disputes a visit months later, the record, with times, readings, ticks and photos, answers it. A well-written paragraph does not.

Checking it worked after a month

Four checks, once a month, take about half an hour.

  • Missed flags: pick 20 green visits at random and recompute the bands by hand. The target is zero misses, and one miss means fixing the formula before sending anything more.
  • Edit rate: count how many drafts needed more than a word changed. If it stays high after the second week, tighten the prompt rules rather than editing forever.
  • Customer questions per report: a good report answers the question before it is asked. A rise in "what does this mean?" messages tells you which line to rewrite.
  • Same-day delivery: count the share of reports sent the day of the visit. If that slips, the review step is the bottleneck, not the AI.

The same notes-to-report pattern works for heating and cooling service reports and for pest control visits, where what must stay manual is spelled out for another trade. Pool work adds one feature those do not have: a reading that changes by the hour, which is why the report always says what the water was doing when you left.

Questions pool owners and technicians ask about AI reports

Can AI read a photo of a test strip or a digital tester?

Do not rely on it for the number. Strip colours shift with light and timing, so a photo taken in shade can read differently from the same strip in sun. The technician types in the reading from the kit or a tester that syncs to the app. Keep the photo as evidence of what the strip or screen showed, and let a person enter the value.

Should customers see every reading?

Most want a status line, the readings next to their targets and one action line. Owners who watch their water closely like the full table; others only read the first sentence. Pick one layout for every customer, keep the full record internally, and make sure the summary never mentions a number that is not in the record.

Which AI should I use for the summaries?

ChatGPT, Claude and Gemini all write a good short paragraph, and paid plans cost about $20 a month. Choose on privacy and sharing rather than cleverness. Keep customer names and addresses out of prompts, use first names or job numbers, and on consumer plans check the model-training switch in the privacy settings.

What about salt pools and spas?

Give each its own bands. A salt pool adds a salt reading tied to the cell maker's range, and spas run different chlorine limits; many public-pool codes set a higher chlorine minimum for spas than for pools. Set them up as separate pool types in your sheet so a spa is never flagged against a pool's bands.

Further reads

Sources: Skimmer's pricing and technician feature pages, Jobber's pool service software page, and the chemical limits tables of several public-pool codes, used here only as examples of band structure.

Want pool reports that write themselves, safely?

On a 1:1 call we'll look at your current visit notes, set the green, amber and red bands, and decide whether your pool app or a simple sheet should do the flagging before AI writes a word.

Book a 1:1 call with me