
September 30, 2026 · Mitt Patel · 5 min read
You look at your bank balance and it seems fine. But you can't say which of your 20 flat-rate clients are actually profitable this month and which ones your crew is losing time on. Most owners can't, until a client that used to take two hours starts taking three and nobody notices.
Why this happens
Flat-rate pricing works because it's simple. You quote a client $300 a month, your crew cleans their office once a week, and everyone knows what to expect. The problem is that the job almost never stays the same size as the day you quoted it.
Clients add square footage without saying so. They ask for the inside of the fridge, the blinds, the baseboards. A new crew member takes longer than the one who used to do that route. None of this shows up as a change in the invoice, because the invoice is flat. It only shows up as more hours on the job.
Most cleaning businesses track revenue by client without any trouble, because that's just the invoice list. Very few track labor cost by client, because that means pulling hours from a schedule or payroll app and matching them to the right account. Without that step, your income statement can show a healthy profit margin overall while a handful of specific clients are quietly running at a loss, covered by the clients who are still profitable.
The cost isn't abstract. It shows up as decisions made on bad information: raising prices across the board when only a few accounts need it, turning down new work because you feel "maxed out" when really two clients are eating half your labor budget, or renewing a contract with a client you'd actually be better off letting go.
A worked example
Say you have a client paying you a flat $300 a month for one cleaning a week, four cleanings a month. When you quoted the job, it took your crew 2 hours per visit, so 8 hours a month. At a fully loaded labor cost of $20 an hour, that's $160 in labor, leaving $140 to cover supplies, overhead, and profit.
A year later, the same client is still paying $300. But the visits now run 3 hours each, because the office added a break room and a second bathroom nobody rewrote into the contract. That's 12 hours a month at $20, or $240 in labor. The account that used to clear $140 is now clearing $60, a drop that leaves much less room to cover supplies and overhead.
Nothing about the invoice changed. Nothing alerted you. The only way to see this is to track the hours separately from the billing and compare the two side by side.
How to set it up
- Track crew hours by client, not just by day. Whatever scheduling or payroll app you use, make sure each shift is tagged to the specific client or job, not just logged as hours worked.
- Pull a monthly hours-by-client report. Most scheduling and payroll tools can total hours per client for a given month. If yours can't, a simple spreadsheet where crews log hours against a client name works.
- Calculate your real labor cost per client. Multiply the hours by your fully loaded hourly labor cost, meaning wages plus payroll costs, not just the wage rate.
- Compare that number to the flat fee in QuickBooks Online. Set up each client as a customer in QuickBooks so their monthly invoice total is easy to find, then line it up next to the labor cost you just calculated.
- Flag anything where labor cost has climbed close to, or past, the fee. This is the account to revisit, either by repricing it, shortening the visit, or having a conversation with the client about scope.
- Repeat monthly, not just annually. Hours creep slowly. A quarterly or yearly check catches it too late to act on cheaply.
Mistakes that undo it
- Tracking hours in general, not by client. If your crew logs "8 hours Tuesday" instead of which client those hours went to, you can't isolate the accounts that are drifting.
- Using wage rate instead of fully loaded labor cost. Leaving out payroll costs makes every account look more profitable than it is.
- Only checking this once a year. By the time an annual review catches a drifting account, it may have been unprofitable for months.
- Repricing without a conversation. Clients generally understand that scope changes cost more, but only if you explain what changed, not just a higher invoice out of nowhere.
- Fixing the one bad account and stopping there. If one flat-rate client crept up in hours, others likely have too. This works best as a habit, not a one-time cleanup.
Monthly checklist
- Pull crew hours by client from your scheduling or payroll app.
- Calculate labor cost per client using fully loaded hourly cost.
- Compare labor cost to each client's flat monthly fee in QuickBooks Online.
- Flag any client where labor cost is within striking distance of the fee.
- Decide on next steps for flagged accounts: reprice, adjust scope, or shorten the visit.
- Check your receivables aging report weekly and call anyone past 30 days.
Common questions
How do I know what my fully loaded labor cost actually is?
It includes the hourly wage plus the payroll costs that come with it, such as payroll taxes and any benefits or insurance tied to hours worked. Working through this calculation with someone familiar with your payroll setup can help, since it varies by state and by how your crew is classified.
What if a client won't accept a price increase?
That depends on the client relationship and what else the account offers you, like reliable hours or referrals. Some owners choose to hold the price and shorten the scope instead. The right call depends on the business, not a general rule.
Can QuickBooks Online track labor hours by client on its own?
It can, if your crews log their time by customer in QuickBooks Online or QuickBooks Time. Many cleaning businesses use a separate scheduling or payroll app instead, then bring the monthly totals into QuickBooks to compare against billing.
How often should I actually run this comparison?
Monthly is generally enough to catch drift before it costs much. Some owners with a lot of flat-rate accounts choose to check weekly during busy seasons when scope changes happen more often.
What about recurring invoices that get missed or paid late?
That's a separate but related problem. Setting up recurring invoices in QuickBooks Online with automatic reminders, and checking the receivables aging report every Monday, catches skipped invoices and slow payers before they turn into months of unpaid work.
North Hudson Bookkeeping sets up this kind of client-level tracking for cleaning businesses and keeps it current every month, so the numbers are there when you need to make a pricing decision. The first call is free.
