A $15 wage is never $15. Add employer taxes, workers' comp, liability and the hours you pay for but nobody is on site, and you get the number you should actually be bidding from. Free, and nothing you type leaves your browser.
| Base wage | — |
| Payroll taxes | — |
| Workers' comp | — |
| General liability | — |
| Benefits & other | — |
| Cost per paid hour | — |
| Loaded rate per worked hour | — |
The last two lines differ because holidays and PTO are paid hours with nobody on site. Your cost has to be recovered over the hours that are actually worked.
Ask a cleaning contractor what labor costs them and most will say the wage. It is the number they negotiated, the number on the offer letter, and the number they carry in their head when a customer asks for a price.
It is also wrong by 25–45%, every time.
The moment someone is on payroll you owe employer-side payroll taxes — 7.65% for Social Security and Medicare, plus federal and state unemployment. You owe workers' compensation, and janitorial classification codes are not cheap, because this trade involves wet floors, chemicals and ladders. You carry general liability. If you offer benefits, uniforms or a phone allowance, those are real dollars per hour too.
Then there is the part almost nobody prices: paid hours nobody works. Six holidays and five PTO days is 88 paid hours a year with no one in the building. You still owe that money, and the only place it can come from is the hours that are worked — so your true rate per worked hour is higher again.
None of this is optional or unusual. It is simply what employing people costs, and the contractors who quote off the raw wage are not cheaper than their competitors — they are just absorbing the difference out of their own margin, usually without realising it.
The loaded rate is an input, not an answer. It goes straight into the bid.
The janitorial bid calculator asks for a loaded labor rate. This is that number. Using the raw wage there will produce a price that looks competitive and quietly loses money.
Run your existing contracts through the contract profitability check with the loaded rate instead of the wage. Accounts that looked fine often turn out not to be.
The workers' comp and liability defaults here are placeholders. Your declaration pages have the real rates, and in this trade they are the difference between a healthy margin and a thin one.
Comp rates move with your claims history and state rules; wages move with the market. A loaded rate calculated two years ago is not the rate you are paying now.
It is the standard full-time year — 40 hours across 52 weeks. This calculator uses it to work out what share of paid hours are actually productive. Part-time staff have the same rate; only the annual totals change.
Then payroll taxes and workers' comp are the subcontractor's problem, and their invoice rate is closer to your true cost. Verify they genuinely carry their own comp and liability, and understand that misclassifying employees as contractors is an expensive mistake in this industry.
Not in the base rate. Price the standard scope at the loaded rate, then handle overtime as its own cost when a job requires it. Burying expected overtime in the base rate hides which accounts are actually causing it.
No. It is a straightforward arithmetic model to get you a defensible working number. Your accountant and your insurance broker have the exact figures for your business.
All free, all in your browser, none of them ask for an email.
These tools are single screens of DayPorter, a CRM built for one trade: commercial cleaning. Your loaded rate saves once and applies to every bid, bids save against the building they belong to, and won contracts roll up into monthly recurring revenue. It all stays on your phone.
See what DayPorter does →