Solar Panel Cleaning Business: Quote and Route Jobs With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Solar Panel Cleaning Business: Quote and Route Jobs With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Solar Panel Cleaning Business: Quote and Route Jobs With AI.

Price each job from your own timed minutes per panel, add a fixed charge for setup, travel and consumables, and set a minimum from your smallest realistic visit. AI helps with the paperwork around that sum: turning customer answers into quote fields, drafting the quote, grouping jobs into route days and writing recurring reminders.

Two mistakes are easy to make. A flat price per panel loses money on small arrays, because the fixed part of a visit is the same for six panels as for twenty. And AI cannot count panels reliably from a photo: OpenAI's own help page says counts of objects in images may be approximate. The panel count has to come from the customer's paperwork, their inverter app or your own count, and the sum, not the AI, sets the price.

Follow me on Instagram@sagnikteaches

Time ten jobs first: the numbers behind every quote

Everything below runs on numbers that only you can supply. Time ten real jobs and write down, for each one, the panel count, how the array was reached, the minutes spent cleaning, the minutes spent on setup and pack-down, and the travel minutes from the previous stop. Averages from those ten jobs beat any rate you copy from a competitor, because they include your pole, your water system and your habits.

Connect on LinkedInSagnik Bhattacharya

The figures in this tutorial are illustrative. They are chosen so the arithmetic is easy to follow, and your own will differ.

Subscribe on YouTube@sagnikteaches
InputIllustrative valueHow you find yours
Cost per working hour$60Wages, van running costs, insurance and tools, divided by productive hours
Target margin on the selling price35%Your decision; it must also pay for quoting, admin and slow weeks
Setup, photos and pack-down15 minutes a visitTime ten visits from arrival to first panel and last panel to departure
Travel allowance on a clustered route20 minutes a visitAverage gap between stops when jobs are grouped by area
Travel allowance when jobs are scattered40 minutes a visitAverage gap when jobs are booked in the order enquiries arrived
Consumables$3 a visit plus $0.25 a panelWater, filter and resin wear, fuel, measured over a month
Minutes per panel, class A (pole from the ground)1.5Your timings on arrays you can reach without going on the roof
Minutes per panel, class B (higher or awkward reach)2.5Your timings on two-storey or steep arrays that need repositioning
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

From timed minutes to a price: the sum, step by step

The method is the same for every job. Add up the minutes (panels times minutes per panel, plus setup, plus travel), turn them into hours, multiply by your hourly cost, add consumables, then divide by one minus your margin. Dividing by 0.65 gives a 35% margin on the price. Multiplying the cost by 1.35 would give a margin of only about 26% of the price, which is an easy way to underprice without noticing.

Here is the main job: 18 panels on a two-storey house, access class B, on a clustered route.

  1. Minutes: 18 panels at 2.5 minutes is 45, plus 15 for setup, plus 20 for travel. Total 80 minutes, or 1.33 hours.
  2. Labour and van cost: 1.33 hours at $60 is $80.00.
  3. Consumables: $3 plus 18 panels at $0.25 is $7.50.
  4. Total cost: $87.50.
  5. Price: $87.50 divided by 0.65 is $134.62, so quote $135. That works out at $7.50 a panel.

Now run the same job when it is not clustered, with a 40-minute travel allowance. The minutes become 100 (1.67 hours), the labour cost $100.00, the total cost $107.50, and the price $165.38, or $165. The only change is where the job sits in your week, and it adds $30 to the price. That $30 is the argument for route clustering, and the reason the route section below matters as much as the quote section.

Break the sum into its two parts and you get a quote you can explain. For class A on a clustered route the price is (1.75 times the panel count plus 38) divided by 0.65, which is a fixed charge of about $58 a visit plus about $2.69 a panel. For class B it is (2.75 times the panel count plus 38) divided by 0.65, the same $58 fixed charge plus about $4.23 a panel. The fixed charge covers setup, travel and the per-visit consumables, and it is why small jobs cannot be priced by the panel.

A price table by panel count and access class

Run the sum for the panel counts you meet most often and keep the results as a table you can read from your phone. These are the illustrative inputs above, rounded to the nearest dollar, on a clustered route.

PanelsClass A priceClass B price
6$75$84
10$85$101
14$96$118
18$107$135
24$123$160

The minimum charge falls out of the table. The smallest job you will realistically accept is six panels on class A. The sum gives $74.62 for it, which rounds to $75, so $75 is the minimum. Any job below that size still costs you the setup and travel, so the minimum protects the day rather than punishing a small customer. Write it on the quote as a "minimum visit charge" so a six-panel customer is not surprised.

Access class C and the jobs to refuse or refer

Class C covers arrays you cannot reach safely with your normal kit, so they need a second person, a hired access tower or a platform. Price these by hand and pass the equipment hire through at cost. A 20-panel example, again illustrative: panels at 3.0 minutes is 60, plus 15 setup, plus 20 travel, so 95 minutes (1.58 hours) with two people at $60 each. That is $190 of labour (count any van cost once, not twice, if your $60 includes it), plus $150 for the equipment hire, plus $8 of consumables, a cost of $348. Divide by 0.65 and the price is $535. Showing a customer that line by line is easier than defending a number that looks high.

Write the refuse-or-refer list before you need it, and put it on the intake form so customers see it early. First Solar's guidelines also say that only trained people who understand the risks of applying water to electrical components should clean modules, and that modules should be cleaned only in open circuit or when the inverter is not running, with dusk to dawn as the recommended window. A rule like that changes which time slots you can offer, which is one more reason to read the manual for the panels you are quoting before you build the route.

  • Cracked or visibly damaged panels, loose cabling or exposed connectors. First Solar's published cleaning guidelines say cracked or broken modules are a shock hazard through leakage currents, with the risk higher when they are wet, and tell cleaners to inspect for cracks, damage and loose connections first. Take photos, do not wet the array, and refer the customer back to their installer.
  • Roofs that need work at height beyond your training, insurance or equipment. Work-at-height rules and insurance conditions vary, so ask your insurer and a qualified adviser before you offer any roof access. The tutorial on roof cleaning with AI photo quotes and safety notes covers how to record those limits.
  • Fragile roof sections and unstable ladder positions. No quote is worth a fall. Decline, or quote only for the part you can reach from the ground.
  • Arrays where the manual forbids your method. More on that next.
  • No usable water supply and no way to bring your own. A tap or a tank is a precondition, so ask.

Read the panel maker's cleaning rules before you quote

Panel manufacturers publish cleaning instructions, and the limits can change which method you can offer. First Solar's FS-Series cleaning guidelines (document PD-5-804, revision 3.4) are a clear example, and they show the sort of thing to look for. They name reverse-osmosis water as giving the best results, allow low-mineral tap water or deionised water, and cap water pressure at 35 bar (500 psi) at the nozzle. They also say the water should not be more than 20 degrees Celsius warmer or colder than the module surface, and rule out abrasive cleaners.

The same document says that for anti-reflective coated modules, wet contact cleaning with squeegees, sponges or cloths is prohibited, and dry cleaning with soft cloths or mops is allowed up to six times a year. It also says rainfall is enough to clear lighter soiling on many installations, which is worth remembering when a customer asks whether cleaning will pay off. That is one maker's frameless modules in a 2017 revision, and most rooftop panels come from other makers whose manuals differ. The habit to copy is the point: put the panel make and model on your intake form, find the manufacturer's current cleaning or maintenance instruction, and keep a one-line note in the customer record covering water type, tools and pressure.

That note then goes into the quote, in plain words ("pure water and a soft brush on a pole; no pressure washing"), so the customer can see you are following the maker's rules and not improvising.

Where AI helps with quotes: intake, flags and the message

Customers describe their arrays in messy ways. AI is good at turning a chatty message and three photos into a tidy intake record, and at spotting what is missing. It is poor at counting, measuring and judging heights, so every number it produces is a prompt to check, not an answer.

Here is an illustrative customer message: "Hi, I'd like a quote to clean my solar panels. They're on the back roof of our bungalow, you can see them from the garden. I think there are about 16. Pigeons have been nesting under them. Dog in the garden. Outside tap by the back door. Thursdays are best." Three photos are attached.

From the customer message and photos below, fill in these fields:
panel count; roof type; storeys; likely access class (A pole from
the ground, B higher or awkward reach, C needs second person or
equipment); obstructions; water supply; pets; preferred day.
Rules: mark any value you inferred from a photo as UNCONFIRMED.
Do not estimate heights or distances. List what is missing and
write the questions to ask the customer, one per line.

MESSAGE:
[paste]
PHOTOS: [attach]

A typical result, illustrative, looks like this:

Panel count: 16 (customer's estimate, UNCONFIRMED; photo appears to
show about 20)
Roof: bungalow, rear roof
Storeys: 1
Access class: A (provisional)
Obstructions: birds nesting under array; dog in garden
Water: outside tap by back door
Preferred day: Thursday
Missing: panel make and model; last cleaned; gate access; parking
Questions: Can you read the panel count from your installation
certificate or inverter app? Is any part of the array above
first-floor height? Is there bird-proofing mesh under the panels?

Two things need your hand. The AI has noticed a mismatch (16 against about 20), but it has not resolved it, and it should not. Leave the field as unconfirmed until the customer reads the count from their paperwork. And "class A (provisional)" is a guess from a single-storey roof, so keep it provisional until you have seen the array or had an answer about height. The nesting birds are a genuine flag: debris and droppings under panels are worth photographing before and after, and you should tell the customer what you find and not diagnose any electrical issue.

Once the fields are confirmed, run the sum in your sheet, then paste the result and the confirmed details into a second prompt that writes the quote.

Write a short, friendly quote message from these confirmed details.
Include: panels quoted for; method in one line; price; minimum
visit charge; what we need from them (tap access, pets indoors);
what we will not do (clean cracked panels; use pressure washers);
the price for each extra panel if the count differs; validity of
30 days. No claims about output or efficiency gains. Under 150 words.
DETAILS: [paste the sheet result and intake fields]

The line about extra panels is the safeguard for the mismatch above. If the customer says 16 and you find 20, the price per extra panel is already agreed, and nobody argues on the driveway.

A spreadsheet that does the arithmetic so AI does not

Ask a chat model for a price and it will give you a confident figure that may be wrong by a few dollars in either direction. Keep the arithmetic in a spreadsheet, where every input is visible and a change to your hourly cost updates every quote at once. A twenty-minute build is enough: a rates table (access class and minutes per panel), a settings block (cost per hour, margin, setup, travel, visit consumables, per-panel consumables, minimum), and one formula per quote row.

=MAX(MinimumCharge,
 ROUND(((Panels*MinutesPerPanel + Setup + Travel)/60*CostPerHour
 + VisitConsumables + PanelConsumables*Panels) / (1 - Margin), 0))

Use named cells for the settings so the formula reads like the sentence above. Excel and Google Sheets both support this. The guide to using ChatGPT with Excel is a good place to learn how to have AI explain or check a formula, which is the right job for it here: ask it to read your formula back in plain English, and to test three panel counts, then compare its answers with the sheet.

Route days: cluster by area, then let a map confirm the times

The earlier $30 difference came from one number, travel. Over a week it adds up. Picture nine booked jobs on a scattered schedule at 40 minutes of travel allowance each, which is 360 minutes. Group the same nine jobs into three area days, at 20 minutes each, and it is 180 minutes. The saving is three hours a week, which at $60 an hour is $180 of cost, or about $277 of price at a 35% margin.

Here are the nine jobs, with on-site minutes already including the 15-minute setup (panels times the class rate, plus 15).

JobAreaPanelsClassOn-site minutes
J1North12A33
J2North18B60
J3North10A30
J4East24A51
J5East14B50
J6East8A27
J7South16B55
J8South20A45
J9South12B45
Group these jobs into three days by area. Each day must stay under
5 hours including 20 minutes travel per job. The on-site minutes
already include setup. Keep any job with a fixed window on the day
the customer chose. Show the arithmetic for each day. Do not guess
drive times between areas: if two jobs on one day are in different
areas, say so.
JOBS: [paste the table, plus any customer day preferences]

The AI will propose North, East and South days, and the arithmetic is simple: North is 123 minutes on site plus 60 of travel, which is 183, about three hours. East comes to 128 plus 60, or 188. South is 145 plus 60, or 205. One failure to watch: the first answer often forgets the setup or the travel, or both, and shows a day as two and a half hours when it is closer to three. That is why the prompt demands the arithmetic, so you can check each line against your own.

The AI cannot know real drive times, so take its day plan into a maps app and check the order on the day's stops. If you use Jobber, its help centre says the route optimiser is available on the Connect, Grow and Plus plans, and it reorders only anytime visits, meaning visits without a set start or end time, up to seven days at a time, run by an admin on the web version and not the mobile app. For cleaning jobs that is often exactly right: book the customer onto a day, leave the time open, and let the software sequence the stops. The same logic runs through the tutorials on gutter cleaning software for reminders and routes and bin cleaning route pricing.

Recurring plans: pricing the discount and the four reminders

Recurring customers cost you less to serve: no new quote, no re-measuring, and they sit on a known route. Offer a modest discount, then test it against a margin floor. Using the main job, the one-off price is $135 against a cost of $87.50. A 10% plan discount brings the price to about $122, and your margin falls from 35% to (122 minus 87.50) divided by 122, which is 28%. If your floor is 25%, the plan clears it. If a deeper discount would push the margin below the floor, the answer is no discount, not a plan that loses money.

Also decide whether a plan is honest for the customer. As the maker's guidance above notes, rain clears light soiling on many sites, so some arrays will not need a second visit in a year. Offering an inspect-and-quote visit instead is better business than a plan the customer will cancel.

The reminders are where AI saves real time. Four short messages cover the cycle: a booking confirmation a week ahead with an access checklist, a day-before arrival window, an after-visit message with before and after photos and the next due month, and a renewal nudge three weeks before the next visit. Ask for them once, with placeholders.

Write four short messages (each under 60 words) for a solar panel
cleaning plan: 1) booking confirmation 7 days ahead with an access
checklist (tap, gate, pets); 2) day-before arrival window with a
weather-reschedule line; 3) after the visit: panels cleaned, photos
attached, one line on anything noticed, next visit due [month];
4) renewal reminder 3 weeks before the next visit with a one-word
reply to confirm. Use [first name] and [your name] as placeholders.
No claims about output, efficiency or savings.

Keep message three factual: what you did and what you saw, such as a nest, a loose clip or debris. Never diagnose electrical faults, and say the customer should contact their installer for anything beyond cleaning. If your field-service app can repeat a job on a schedule and send reminders automatically, let it send and use AI only for the wording, since a missed message is a bigger risk than a plain one.

Three quoting slips to catch before a customer does

  1. The panel count from a photo. The AI reads "about 20" from an image, the quote is built on 20, and the customer's certificate says 16. The first sign is a dispute at the door. The cure is the intake rule above: counts come from paperwork or your own count, and the quote carries a price per extra panel.
  2. The guessed access class. A single-storey photo hides a rear extension with a roof lantern that makes the far panels class C. You find out when the job runs 40 minutes long and the margin quietly disappears. Ask whether any part of the array is above first-floor height, and put a line on the quote that the price can change if access differs from what was described.
  3. The output promise. The AI writes "restores up to 20% more efficiency" in the quote message because that sounds persuasive. Nobody measured that on this array. Strip it, because output depends on soiling, shade, rain and the panels themselves. Invite the customer to note their generation before and after instead, and let them draw their own conclusion.

Checking after a month: quoted minutes against real ones

A quote sheet is a hypothesis about your time. After a month, test it. Keep a simple log of each job: quoted minutes, actual minutes, panels, class and travel minutes. Then compare.

MeasureHow to calculate itWhat a gap means
Minutes per panel, by classCleaning minutes divided by panels, averaged over at least 20 jobs per classIf real time is above the sheet, raise the class rate; below, you may be over-quoting
Setup minutesAverage arrival-to-first-panel plus last-panel-to-departureA rising figure usually means a water or equipment problem, not slow customers
Travel minutes per visitMapped minutes between stops, averaged by weekIf it creeps towards 40, your clustering is slipping
Quote-to-job rateJobs booked divided by quotes sentA very high rate can mean you are too cheap; very low can mean the price or the message is off
Margin on the day(Price minus actual cost) divided by priceAnything under your floor means the sheet needs a new input, not a longer day

Adjust one input at a time and write down the date, so you can see what each change did. If the numbers look good after two or three months, the same sheet is a sensible base for pricing other repeat services too, and the tutorial on pricing commercial window cleaning per pane from your labour follows the same logic with a different unit. For residential jobs, the tutorial on window cleaning quotes from photos shows a customer-photo workflow that applies equally well here.

Pricing and routing questions from cleaners

Should I charge per panel or per visit?

Charge per visit with a per-panel element. Setup, travel and consumables cost the same for six panels as for twenty, so a flat per-panel rate loses money on small arrays and overcharges big ones. Build a fixed visit charge plus a rate per panel by access class, then apply a minimum from your smallest realistic job.

Can AI count the panels from a photo or satellite image?

Not reliably. OpenAI's help page for ChatGPT image inputs says counts of objects in images may be approximate. Use the installation paperwork, the inverter or monitoring app, or your own count on arrival, and let AI do the paperwork around that number instead.

How do I set a sensible minimum charge?

Price your smallest realistic visit using the same sum as every other job: setup, travel, a handful of panels and consumables, divided by one minus your margin. That figure is the minimum. If a customer wants less than that, the visit still costs you the same fixed time.

Is a recurring plan worth offering?

Usually, if you give a modest discount and keep a margin floor. Repeat visits skip the quoting and re-measuring, and a clustered route cuts travel. Check the discounted price still clears your cost plus a smaller margin, and only offer plans where cleaning actually pays for the customer.

Can AI plan my route for the week?

It can group jobs by area and draft a day-by-day order, which is useful as a first pass. It cannot know real drive times, so check the order in a maps app. If your field-service app has route optimisation, use that for sequencing and keep AI for the messages.

Further reads

Sources: OpenAI help pages (ChatGPT image inputs FAQ), Jobber help pages (route optimiser), First Solar FS-Series PV Module Cleaning Guidelines (PD-5-804, revision 3.4).

Want your quotes and routes tidied up?

On a 1:1 call we'll look at how you price jobs today, build the quote sheet around your own timings, and decide which messages and route steps are worth handing to AI.

Book a 1:1 call with me