Start your free 14-day trial Open the demo account Search the whole site
Product DomesticCommercialEnd of tenancyHoliday letsAirbnbWindowsCarpets and upholsteryOne-off and specialistFacilities managementCleaner appRAMSYour websiteInvoicing Everything CleanFlo does →
Compare Cleaning software comparedCleanFlo vs JobberCleanFlo vs ZenMaidCleanFlo vs GetCleanFlowCleanFlo vs ConnecteamCleanFlo vs SweptCleanFlo vs BigChangevs a spreadsheet and WhatsAppCleanFlo vs SqueegeeCleanFlo vs ServiceM8CleanFlo vs Cleenie
Free tools Cleaning Quote CalculatorPrice Per m² CalculatorUK VAT CalculatorProfit Margin CalculatorTrue Cost of a CleanerHoliday Entitlement CalculatorPer-Seat Cost CalculatorContract Tender Calculator All 17 free tools → 16 printable templates →

Building and approving a pay run

A pay run is the moment a fortnight of clocked hours stops being a timesheet and becomes what somebody is owed. It is built from a period, checked, and then approved, and approving it locks the lot.

In the app: Payroll Open CleanFlo
On this page

Pay runs is the last tab of Payroll, subtitled "What each period came to, and what approving it locked." Its ingredients are the hours on the Timesheets tab, any approved mileage, and any expense reimbursement owed. Nothing is built automatically: you pick a period and build the run.

Building one

Two date fields, From and To, and a button that builds the run for that period. Before there is one at all, the tab reads No pay run yet, with the reassurance that matters: "Pick a period and build one. Nothing is locked or paid until you approve it."

Once there is more than one run, a row of chips across the top lets you move between them. Each chip is the period and its status: Draft, Approved, Exported or Paid.

app.cleanflo.io/payroll
Payroll Search everything… ⌘K
Payroll

What each period came to, and what approving it locked.

TimesheetsMileagePay runs
From 17 Aug 2026To 30 Aug 2026 Build this period
17 Aug 2026 – 30 Aug 2026
£2,418.60 · 214h 30m · 5 people
Aisha Nowak 61h 15m basic · 3h 30m overtime · 12.4 miles · £13.20 an hour £862.45
Marek Kowalski 58h basic · 7h 30m holiday · £4.10 expenses · £12.80 an hour £842.90
Joanne Reid 46h 45m basic · £12.50 an hour £584.38
Tomas Silva 37h basic · no pay rate on file
One person has no pay rate on file, so their hours are not in this total. Set their rate on the Staff page and build the run again.
A draft run. The headline is the gross, the hours behind it and the head count; every line underneath shows its own working, so a figure can be checked rather than trusted.

A line names its own working rather than presenting a total on trust: the basic hours, then overtime, holiday and sick where there are any, then approved mileage, then any expense reimbursement, then the hourly rate it was all costed at. The reimbursement is deliberately named on the line rather than folded into the gross, because it is money being paid back rather than earned, and somebody checking the total needs to see the difference.

A dash, never a zero

The run's own headline carries the count as well, so it is never something you have to spot on one row: "One person has no pay rate on file, so their hours are not in this total. Set their rate on the Staff page and build the run again."

The fix is to set the rate on their staff record, then build the period again. The database refuses the approval too, so this is not a warning you can accidentally walk past without being asked.

Approving, and what it locks

Check the lines

Every person, their hours by kind, and the rate each was costed at. This is the last moment any of it can be changed.

Press Approve this run

It does not approve. It asks, and the question is the consequence: "Approving locks every hour in this run. After that a mistake can only be corrected in a later period, never edited here."

Confirm with Yes, approve and lock

CleanFlo confirms with "Approved. Every hour in it is locked now." The run's status becomes Approved and the screen says when.

Where somebody is unrated the wording changes to match what you are actually agreeing to. The warning reads "Approving now leaves those people's hours unvalued in this run. They will not be paid for them here", and the button says Approve anyway rather than Yes, approve and lock. It is allowed, because sometimes a run has to go out and one person's rate is a separate problem. It is never allowed quietly.

A draft you no longer want is removed with Delete draft, which confirms with "Draft deleted." Nothing about the underlying hours is touched: a run is a reading of the timesheet, not the timesheet itself, so deleting a draft and building it again gives you the same figures.

Handing it to your payroll package

Export for payroll appears only once a run is settled, and that restriction is the point: a file built from a draft would be an import of figures still able to change. The database refuses it too.

The sheet is titled Export this pay run and subtitled with the period and one promise: the file is built in your own browser and downloaded, and nothing is uploaded or stored. Pick a Payroll package and press Download the file.

BrightPay
The import format BrightPay expects.
Xero Payroll UK
The import format Xero's UK payroll expects.
Generic CSV
For anything else, and for your accountant to map by hand.

Pay elements go out as separate lines rather than one lump per person, so your package can map basic, overtime, holiday, sick, mileage and reimbursement to its own codes on import. The period is written on every row, which is how you can tell later that you have already imported a given run.

Before you download, the sheet tells you what you are about to get: how many lines, across how many people. After an export the run reads Exported and shows when, and in which format.

Common questions

I approved a run with a mistake in it.
It cannot be edited, by anyone. Correct it as a line in the next period. That is the model rather than a limitation: a locked run is a record of what you agreed to pay, and a record that can be quietly changed afterwards is not worth keeping.
Somebody shows a dash instead of an amount.
They have no pay rate on file. Set it on their staff record and build the period again. CleanFlo will not show a zero for hours somebody actually worked, and it will not approve around it without asking you explicitly.
Why can I not export a draft?
Because the figures in it can still change, and a payroll import of numbers that might move is worse than no import. Approve the run first, which is what fixes those figures as the record.
Does CleanFlo pay anybody or file anything with HMRC?
No. It works out what each person is owed and hands you a file. Paying wages and filing RTI are your payroll package's clean, and CleanFlo does not touch either.
Where do expenses and mileage come into it?
An approved mileage claim and an approved reimbursement both ride out on that person's next run, each named on their line rather than folded into the gross, because they are money being paid back rather than earned.