How to read 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.
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, 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.
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 range | Always company-wide |
|---|---|
| Cleans, by their scheduled date | Clients |
| Invoices, by when they were created | Staff |
| Incidents, by when they occurred | Inventory |
| 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, cleans 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 clean duration, which days are busiest, and anything still unassigned.
- Staff
- Who is doing the work. Cleans per cleaner, estimated hours, completion rate per person.
- Clients
- Who is worth having. Cleans, 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.
In-depth business intelligence across every area of your operations
| # | Client | Cleans | Clean Value | Avg per Clean |
|---|---|---|---|---|
| 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 |
- Reports in the sidebar opens this screen.
- Last 30 days is the main action on this screen.
- New, in the title bar on every screen, adds a clean, client, quote, invoice and more.
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
- 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.
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.
Underneath sits the Quote ledger, Quote, 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 | Client | Status | Amount | Issued |
|---|---|---|---|---|
| #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 |
Revenue and clean 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.
- Clean 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; clean value is the work booked in this period". A client whose clean 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 clean 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 cleans 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.
| Location | Rating | Trend |
|---|---|---|
| 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 | , |
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 Cleans, Avg Duration and Unassigned, and that last tile turns red the moment it is above zero.
Underneath sits Cleans by Team Member, whose columns are Staff Member, Total Cleans, Completed, Cancelled and Completion Rate. Cleans 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 cleans, 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 | Status | Amount | Issue Date | Due Date |
|---|---|---|---|---|
| #INV-2026-014 | Paid | £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 | – | – |
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.
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?
Can I compare this month against last month?
Why does the Inventory tab ignore the date range?
Why is my revenue lower here than on the Dashboard?
How do I get the report as a PDF to send to my accountant?
Previous: How to manage your plan and bill
Did this answer your question?
Good. Back to the app, then.
Sorry about that. Tell us what you were looking for and a person will answer it.
Still stuck?
Every message is read by a person on the CleanFlo team.