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.
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.
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 |
|---|---|
| Jobs, 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.
In-depth business intelligence across every area of your operations
| # | Client | Jobs | Job Value | Avg 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 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.
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 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.
| 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 Jobs, Avg Duration and Unassigned, and that last tile turns red the moment it is above zero.
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 | 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?
Still stuck?
Open Support in the app and send us a ticket, or email the team. A real person reads every one.