Start your free 14-day trial
Product Job Scheduling & RotasInvoicing & BACSHealth & SafetyStaff Mobile AppAnalytics & Reporting
Solutions Commercial CleaningDomestic CleaningEnd of TenancyFacilities ManagementWindow Cleaning
Free tools Cleaning Quote CalculatorPrice Per m² CalculatorUK VAT CalculatorProfit Margin CalculatorTrue Cost of a CleanerHoliday Entitlement CalculatorContract Tender CalculatorClient Lifetime Value All 14 free tools →
Learn How to start a cleaning businessHow to price cleaning jobsHow to win cleaning contractsHealth & safety for cleaners CleanFlo vs JobberCleanFlo vs ZenMaid
Browse all guides

Reading your reports

Reports is eight tabs over the same data, each answering one question about the last week, month, quarter or year. Nothing on it is editable. It is the read-only end of the product.

In the app: Reports Open CleanFlo
On this page

Everywhere else in CleanFlo you are putting information in. Reports is the one screen that only gives it back. The page is titled Reports & Analytics, subtitled "In-depth business intelligence across every area of your operations", and it carries exactly two controls in its header: the date range, and Print.

Four ranges, and nothing else

The range control is a row of four buttons, not a dropdown. In order: Last 7 days, Last 30 days, Last 90 days and Last 12 months. Last 30 days is where the page opens.

Last 7 days Last 30 days Last 90 days Last 12 months
The whole date control. There is no fifth button, no calendar icon and no way to type a date, so a report for one specific week in March is not something this screen can produce.

The second absence matters just as much. There is no comparison against a previous period. No "vs last month", no percentage deltas, no up and down arrows. Every tile on this page is a flat number for the window you chose. The stat cards are the same component the Dashboard uses, and on Reports they are deliberately given no change value, so the footer of each tile is its caption and nothing more. There are no sparklines either.

One more thing to know before you read any figure on this page: the range does not filter everything. Three things are filtered by it, and four are not.

Filtered by the date rangeAlways company-wide
Jobs, by their scheduled dateClients
Invoices, by when they were createdStaff
Incidents, by when they occurredInventory
Audits

So the Inventory tab shows your stock as it stands right now whichever range button is pressed, and Total Clients is every client on your books rather than the ones who booked something in the last week. That is the right behaviour for both, but it surprises people the first time they press "Last 7 days" and the client count does not move.

The eight tabs

Under the header sits one tab strip, and only the tab you are looking at is loaded. In order: Overview, Financial, Sales, Operations, Staff, Clients, Inventory and Health & Safety.

Overview
Am I making money and is the work getting done. Revenue collected, jobs completed, what is outstanding, and who your busiest clients are.
Financial
Where every invoice stands. Collected, awaiting, overdue and draft, with the full ledger underneath.
Sales
Are the quotes turning into work. Conversion rate, average quote value, why the ones you lost got away, and how long the open ones have been waiting.
Operations
Is the schedule working. Completion rate, average job duration, which days are busiest, and anything still unassigned.
Staff
Who is doing the work. Jobs per cleaner, estimated hours, completion rate per person.
Clients
Who is worth having. Jobs, revenue received and work booked, per client, with the last visit date.
Inventory
What is about to run out. Healthy, low and out, by category, with an attention list.
Health & Safety
Whether you are compliant. Audit completion, incidents by severity and type, and the score they produce.
app.cleanflo.io/reports
Search everything… ⌘K Reports
Reports & Analytics

In-depth business intelligence across every area of your operations

Last 7 days Last 30 days Last 90 days Last 12 months Print
OverviewFinancialSalesOperationsStaffClientsInventoryHealth & Safety
Total Revenue
£8,240
Paid invoices in period
Jobs Completed
132
Of 147 total jobs
Outstanding
£4,180
Sent & overdue invoices
Active Clients
11
Clients with activity
Revenue Trend
Paid invoices over time
Mar 26 Apr 26 May 26 Jun 26 Jul 26 Aug 26
Top Clients by Activity
Most jobs booked in period, by job value rather than money received
Export
#ClientJobsJob ValueAvg per Job
1 Riverside Homes 38 £3,230 £85.00
2 St Marks Medical Centre 24 £2,880 £120.00
3 Bay View Offices 19 £1,900 £100.00
4 Harbour Lettings 14 £1,050 £75.00
5 Trelawney Court 9 £765 £85.00
The Overview tab on the default range. Four flat KPI tiles, the revenue bars, and the top clients table. Note that no tile carries a change arrow: the caption under each figure is the whole footer.

The Sales tab

Sales sits between Financial and Operations in the tab strip — the one tab on this screen reading quotes rather than invoices. It opens with four KPI tiles: Conversion Rate, Average Quote Value, Outstanding and Declined. Like everywhere else on Reports, none of them carries a direction arrow: there is nothing here to compare against either.

Conversion Rate
38%
9 of 24 quotes
Average Quote Value
£612.40
24 quotes issued
Outstanding
6
£3,180.00 awaiting response
Declined
5
£2,940.00 lost
The top of the Sales tab. Four flat KPI tiles, same as every other tab on this screen.
Conversion Rate
Accepted quotes divided by quotes actually issued — sent, accepted, declined or expired. A draft never counts on either side of that fraction: it was never put in front of a client, so it was never a chance to win or lose.
Average Quote Value
The mean value of every issued quote in the period, whatever became of it afterwards — a read on how big the work you are chasing tends to be, not a forecast of revenue.
Outstanding
Quotes still sitting at Sent, with nobody having said yes or no yet — a count and the money they add up to.
Declined
Quotes turned down in the period — a count and the money that went with them.

Below the KPI row sit two panels side by side. Quote Status is a donut of every issued quote by outcome — Accepted, Outstanding, Declined, Expired — with a legend underneath giving each a count and its share of quotes issued. Why quotes are lost takes only the declined ones and groups them by the reason given at the point of decline, most common first, each again a count and a share — this time a share of quotes declined, not of quotes issued.

Quote Status
24 quotes issued
9 Accepted 6 Outstanding 5 Declined 4 Expired
Why quotes are lost
5 declined this period
2 Price too high 1 Chose another company 1 No longer needed 1 No reason given
Quote Status and Why quotes are lost, side by side beneath the KPI row. Shown here as plain counts; on the real screen each row also carries its percentage.

The reason list is the same five options offered wherever a quote gets declined, in the app or from the client's own link: Price too high, Chose another company, No longer needed, Bad timing and Other. A quote declined before this list existed, or declined without one being picked, is not dropped or spread across a blank key — it collects in its own bucket labelled No reason given.

Quotes Outstanding by Age buckets whatever is still sitting at Sent by how long it has been waiting for a reply: 0–3 days, 4–7 days, 8–14 days and 15+ days, counted from when the quote was sent rather than when it was drafted.

Quotes Outstanding by Age
How long each open quote has been waiting for a response
0–3 days 4–7 days 8–14 days 15+ days
Quotes Outstanding by Age. A bar sitting in the 15+ bucket is the clearest single thing on this tab worth acting on — old enough that a phone call, not another wait, is what moves it.

Underneath sits the Quote LedgerQuote, Client, Status, Amount and Issued, sortable on every column, with the same ghost Export CSV button as the Invoice Ledger. Two things worth knowing about it: it lists every quote in the period, drafts included, even though Conversion Rate above excludes them entirely; and the exported file carries a sixth column, Decline Reason, that never appears in the on-screen table.

Quote Ledger
All quotes in selected period
Export CSV
QuoteClientStatusAmountIssued
#QT-2026-041 Riverside Homes Accepted £480.00 02 Aug 2026
#QT-2026-040 Bay View Offices Sent £360.00 30 Jul 2026
#QT-2026-039 Harbour Lettings Declined £290.00 25 Jul 2026
#QT-2026-038 Trelawney Court Draft £210.00 12 Jul 2026
1–10 of 19 12 Export CSV
The Quote Ledger on the Sales tab. That Draft row is real — the ledger lists every quote in the period regardless of status, even though the KPI tiles above only ever count the ones actually sent.

Revenue and job value are two different numbers

The Clients tab keeps two money columns deliberately apart, and it is the single most useful distinction on this screen once you notice it.

  • Revenue is money you have actually received: the total of that client's paid invoices.
  • Job value is the price of the work booked in the period, whether or not it has been invoiced, let alone paid.

The Client Directory spells it out in its own subtitle: "Revenue is money received on paid invoices; job value is the work booked in this period". A client whose job value is high and whose revenue is low is either not being invoiced or not paying, and finding out which is the point of noticing.

Satisfaction by location

Sitting beneath the Client Directory is a second table, Satisfaction by Location, subtitled "Rolling average of client ratings this period, against the same length of time before it". It averages the star ratings a client leaves against a completed job through the client portal, grouped by Location, for whichever range button is pressed — Reports has never rolled ratings up this way before it.

Rating
The average to one decimal place, with the number of ratings it is built from alongside it — 4.8 (12) — or, for a location with jobs in the period but nothing rated yet, the plain words No ratings recorded rather than a false zero.
Trend
That average against the equal-length period immediately before it: Improving in green, Declining in red, or a dash. The dash covers two different cases on purpose — the average genuinely has not moved, or one side of the comparison has no ratings to average at all — because a trend needs two real numbers, not one against a gap.
Satisfaction by Location
Rolling average of client ratings this period, against the same length of time before it
LocationRatingTrend
Riverside Homes 4.8 (12) Improving
St Marks Medical Centre 4.5 (9) Declining
Bay View Offices 4.9 (6)
Harbour Lettings No ratings recorded
Satisfaction by Location on the Clients tab. Harbour Lettings has jobs in the period but nothing rated, so the Rating column says so in words rather than reading a false zero, and its Trend is a dash rather than a guess.

The same figure follows a location to its own page. Open a site under Locations and its header carries a rating chip reading, for example, 4.6 satisfaction (90d) alongside the property type and address — a fixed trailing ninety days rather than whatever range Reports happens to be set to, because the location page has no range picker of its own to borrow one from.

The operational tabs

Operations and Staff are the two tabs to read when the money looks fine and the week still feels wrong. Operations opens with Completion Rate, Total Jobs, Avg Duration and Unassigned, and that last tile turns red the moment it is above zero.

Jobs by Day of Week
Completed jobs only
Sun Mon Tue Wed Thu Fri Sat
132 Completed 9 Scheduled 3 In Progress 2 Cancelled 1 Unassigned
"Jobs by Day of Week" counts completed jobs only, and always draws all seven bars starting at Sunday. A flat Friday against a heavy Monday is a rota problem, not a demand problem.

Underneath sits Jobs by Team Member, whose columns are Staff Member, Total Jobs, Completed, Cancelled and Completion Rate. Jobs with nobody against them collapse into a single row literally called "Unassigned", so that row is a workload figure and a warning at the same time.

The Staff tab is the same population read the other way round. Its Total Hours Logged tile is captioned "Estimated from durations", and the word estimated is doing real work: these are the durations set on the jobs, not clocked time. Top Performer shows a first name only.

Every table behaves the same way

There are ten tables across the eight tabs and they share one set of manners, so learning them once is enough.

  • Ten rows a page. The pager is hidden entirely at ten rows or fewer, and reads "1–10 of 24" on the left with "1 / 3" between the arrows.
  • Sorting is client-side over the whole row set, not just the visible page. Click a header to sort ascending, click again for descending. A few columns are deliberately not sortable: the Status column on the inventory attention list, and the Description column on the incident log.
  • Every card header carries a ghost Export button. The exceptions are the invoice ledger and the quote ledger, whose buttons both read Export CSV.
  • The export button is disabled whenever the table is empty, so you cannot download a file with only headers in it.
  • On a narrow screen each row becomes a card, titled by its first named column.
Invoice Ledger
All invoices in selected period
Export CSV
InvoiceStatusAmountIssue DateDue Date
#INV-2026-014 £408.00 14 Aug 2026 28 Aug 2026
#INV-2026-013 Overdue £1,260.00 02 Jul 2026 16 Jul 2026
#INV-2026-012 Sent £340.00 28 Jul 2026 11 Aug 2026
#INV-2026-011 Draft £85.00
1–10 of 26 123 Export CSV
The Invoice Ledger on the Financial tab. Overdue is computed live from a sent invoice whose due date has passed, so "Sent" here means sent and not yet late.

Each panel is also its own error boundary. If one query fails, that panel alone is replaced with "We could not load this", the reason, and a Try again button. The rest of the tab keeps working, and changing the range over data already on screen keeps the old result visible rather than flashing skeletons at you.

The printed report, section by section

Print does not print the screen. It builds a separate document, in a fixed light palette with one section to a page, and hands it to your browser's print dialog. Choosing "Save as PDF" there is how you get a file to email. The button is disabled while any of the seven underlying queries is still loading, so you cannot print half a report.

The cover carries the CleanFlo wordmark, the title Business Analytics Report, and three meta lines: "Period:" with the range label, "From:" with the start date, and "Generated:" with today. Every page after it is footed with the report name and range on the left and the generation date on the right.

Business Analytics Report
Period: Last 30 days · From: 15 Jul 2026 · Generated: 14 August 2026
1 Executive Summary Eight figures over two grids: revenue collected, jobs completed, active clients, active staff, then outstanding, overdue, average job duration and compliance.
2 Financial Overview Collected, awaiting, overdue and draft, then the invoice table. Capped at 25 rows, and omitted entirely with no invoices.
3 Operations Completion rate, total jobs, average duration and unassigned, then every staff member unpaginated with an hours estimate.
4 Client Directory Total clients, active and average revenue, then every client with jobs, last job, job value and revenue.
5 Inventory Status Total, healthy, low and out, then every item ordered worst first. The status pill prints as the short forms Out, Low and OK.
6 Health & Safety Compliance rate, total incidents, open and closed, a compliance ring, a severity breakdown, and the full incident table.
The six sections of the printed document, in order. This is the artefact to hand an accountant, a bank or a prospective client, because unlike the screen it says in writing which period it covers.

The compliance figure, and when it says nothing

The Health & Safety tab's Compliance Rate is completed audits divided by all audits. It is tinted green at 80 and above, amber at 60 and above, and red below that. What it never does is default to 100%.

With no audits recorded at all, the tile reads an em dash rather than a number, the caption reads "No audits recorded yet", and the ring beside it draws no arc. A brand new account is not compliant by default, and the screen refuses to imply that it is. The heading below the ring switches with the rate: "Excellent Compliance", "Good Standing", "Needs Attention" and "Action Required".

Common questions

Why does the Sales tab show "—" instead of a percentage sometimes?
Because no quotes were issued in that date range at all, which is a different thing from a 0% conversion rate. Zero out of zero is not zero percent, so the tile says so in words — No quotes in this period — rather than showing a number that would read as a real, and much worse, result.
Can I compare this month against last month?
Not on this screen. Reports has no comparison period and no percentage change indicators of any kind. The nearest thing available is the Revenue Trend and Monthly Revenue bar charts, which show one bar per month so you can read the shape yourself, or exporting two CSVs and comparing them in a spreadsheet.
Why does the Inventory tab ignore the date range?
Because stock is a present-tense fact rather than something that happened in a window. Only jobs, invoices and incidents are filtered by the range. Clients, staff, inventory and audits are always company-wide, whichever button is pressed.
Why is my revenue lower here than on the Dashboard?
Total Revenue on Reports counts paid invoices inside the chosen range only, and the default range is the last 30 days. The Dashboard figure covers a different window. Switch to "Last 12 months" before comparing the two.
How do I get the report as a PDF to send to my accountant?
Press Print and choose "Save as PDF" as the destination in your browser's print dialog. There is no separate download button, because the document is generated for printing rather than stored as a file.