All posts
Janitorial · 5 min read

How to bid janitorial contracts without lowballing

How to bid commercial janitorial contracts using production rates, real labor load, and supplies, so you don't win the job and lose money every month.

A

Andres Ponce

August 1, 2026

Most shops lose money on janitorial contracts before the crew ever shows up. They lose it at the bid. Someone eyeballs the building, picks a monthly number that feels competitive, and signs a two-year contract at a price that never covered the labor.

If you want to know how to bid janitorial contracts and actually keep the margin, you build the number from the floor up. Square footage, production rate, labor cost, supplies, then overhead and profit on top. Not a gut feel. A calculation you can defend when the client asks why you’re forty bucks a month higher than the other guy.

Walk the building before you quote

Never bid off a floor plan or a phone call. Walk it.

You’re looking for the stuff that eats hours and never shows up in the RFP. How many restrooms, and how heavily used. Hard floors versus carpet, and how much of each. Entrances that track in salt or mud. Break rooms with a sink full of dishes every night. Stairwells. Elevators. Glass. Whether the trash is centralized or you’re pulling from forty desk-side cans.

Walk it at the time of day you’d actually clean it. A lobby that looks empty at 2pm is a different job at 6pm when three hundred people just left.

Write down the finish level the client expects too. A medical office and a warehouse breakroom are both “clean,” but they are not the same labor. Nail that down now or you’ll argue about it later.

Start with production rates

Production rate is how much square footage one person cleans in one hour for a given task. It’s the backbone of the whole bid.

Rough numbers most janitorial estimators work from: general office space runs somewhere around 3,000 to 4,000 square feet per hour for a standard nightly clean (empty trash, vacuum, spot-clean, wipe surfaces). Restrooms are far slower, more like 300 to 500 square feet per hour because they’re detail work. Hard floor care, stripping and waxing, is slower still and usually priced as a separate periodic line.

Say you’ve got a 40,000 square foot office with 2,000 square feet of restrooms. The open office at 3,500 a hour is about 11.5 hours. The restrooms at 400 a hour are another 5 hours. That’s roughly 16.5 labor hours a night before you’ve touched floors or glass.

Your rates will drift from the textbook once you’ve tracked a few of your own buildings. Track them. Your real production rate on your real crews beats any chart.

Build the labor cost, loaded

Here’s where lowball bids die. People multiply hours by wage and stop.

Your true labor cost is the loaded rate, not the wage. Take the hourly pay, then add payroll taxes, workers’ comp (janitorial comp rates are not cheap), any benefits, and paid time. That’s easily 25 to 40 percent on top of the base wage. A cleaner you pay $15 an hour costs you closer to $19 or $20 loaded.

Then account for turnover. Janitorial has brutal turnover, and every time someone quits you’re paying to hire, train, and cover the shift with someone slower. Build a little of that reality into the rate instead of pretending your crew is permanent.

Take the nightly hours, multiply by nights per month, multiply by the loaded rate. That’s your monthly labor floor. Everything else stacks on that.

Don’t forget supplies and equipment

Supplies are small per night and real over a month. Liners, paper, soap, chemicals, can liners in every size. If you’re providing consumables like toilet paper and hand towels, that’s a real line and it scales with how busy the building is, so ask.

Equipment wears out and needs replacing. Vacuums, auto-scrubbers, buffers, backpack units. Amortize that. A commercial vacuum getting run five nights a week does not last the way the box claims.

Add a slice for supervision and quality checks too. Somebody has to inspect, restock, and handle the callback when the client says the restrooms got missed. That person’s time is a cost even if they’re not scrubbing.

Price per month, not per clean

Commercial janitorial is a recurring contract, so price it monthly and bill it monthly. The client wants one predictable number, and you want steady revenue you can staff against.

Do the math per clean to build the number, then roll it into a flat monthly rate based on the schedule. Five nights a week is roughly 21.5 cleans a month, not 20, and that half-clean adds up over a year. Get the frequency exact.

Keep periodic work separate. Strip and wax, carpet extraction, high dusting, window cleaning. Those are scheduled add-ons with their own price, not something you bury in the nightly rate and hope covers itself. Spell out what’s nightly, what’s weekly, what’s quarterly, and what’s a separate quote.

Protect yourself from scope creep

The RFP will be vague on purpose, and the client will lean on the gaps. “While you’re here” turns into an extra thirty minutes a night that you never priced.

Put the scope in writing, task by task, with frequency. What gets done nightly, what gets done weekly, what’s explicitly not included. When they ask for more, that’s a change order and a new number, not a favor. A clear scope is the only thing that keeps a profitable bid profitable in month eight.

This is easier when the whole account lives in one place. We built janitorial company software around recurring routes and scoped work so a “can you also…” request becomes a logged extra instead of free labor. The same work order and scheduling tools track which sites got serviced and which got skipped, which is the argument you don’t want to have from memory.

Bid the building you walked, load your labor honestly, and hold your scope. That’s the whole job. If you’re staffing recurring janitorial routes and tired of guessing at the monthly number, take a look at how TradelyHQ handles it.

TradelyHQ

Run dispatch, quotes, and invoices from one place

Work order software built for commercial maintenance shops. First call to paid invoice, without the group texts and spreadsheets.

A

Written by Andres Ponce, who runs operations at a commercial maintenance contractor and built TradelyHQ.

Read more from the blog