Guides / Bidding

How to bid a commercial cleaning contract

A janitorial bid is mostly a labor estimate. Get the hours right, load them with your real labor cost, and the price follows. Here is the method SweepMath uses, so you can check every number it gives you.

1. Walk the building and measure cleanable area

Split the building by space type, because each type cleans at a different speed: offices, lobbies and corridors, break rooms, restrooms, and any specialty space. Record cleanable square feet for each. For restrooms, count fixtures (toilets, urinals, sinks) as well.

2. Turn area into labor minutes

ISSA's published method is: square feet ÷ production rate (sq ft per hour) × 60 = minutes. Its example: mopping 1,000 sq ft at 5,355 sq ft per hour takes about 11.2 minutes (ISSA).

Restrooms work better by fixture: fixtures × minutes per fixture. ISSA's example uses 3 minutes per fixture, so a 10-fixture restroom is 30 minutes (ISSA).

Add every area's minutes to get minutes per visit. See the production rates guide for starting rates and their sources.

3. Add supervision, then convert to monthly hours

If a supervisor or lead spends part of each shift inspecting, add that as a percentage of hours. Monthly hours are hours per visit × visits per week × 52 ÷ 12. Using 52 ÷ 12 (about 4.33 weeks a month) avoids under-counting months with five service weeks.

4. Load the wage

The wage is not your labor cost. Add employer payroll taxes, workers' compensation insurance and any benefits as a "burden" percentage. Loaded rate = wage × (1 + burden %). For reference, the BLS reports a May 2025 median of $17.71 per hour for janitors and building cleaners (BLS); use what you actually pay in your market.

5. Add supplies

Either as a percentage of labor cost or as dollars per square foot per month. Track what you actually spend on similar accounts and use that.

6. Set overhead and profit as a share of price

Overhead (insurance, vehicles, office, sales time) and profit are usually expressed as a percentage of the price, not of cost. That gives two prices:

  • Break-even = direct cost ÷ (1 − overhead %). Below this you lose money on every visit.
  • Price at target = direct cost ÷ (1 − overhead % − profit %).

Direct cost is loaded labor plus supplies. Adding a markup to cost instead of dividing by (1 − %) is a common way to end up below your target profit.

7. Check the quote you actually plan to send

Market pressure often pushes the quote below the target price. Before you send it, compute your profit at that price: profit % = (price − direct cost − overhead % × price) ÷ price. Then ask what happens if the crew is 10% slower than planned. If that already puts you near zero, the bid is fragile.

Worked example

This is the sample bid built into the calculator. The inputs are illustrative; replace them with yours.

AreaSizeRateMinutes / visit
Offices14,000 sq ft3,289 sq ft/hr255.4
Lobby and corridors3,000 sq ft5,000 sq ft/hr36.0
Break room800 sq ft2,800 sq ft/hr17.1
Restrooms16 fixtures3 min/fixture48.0

That is 356.6 minutes, or 5.94 hours, per visit; with 5% supervision, 6.24 hours. At 5 visits a week that is about 135 hours a month. With a $17.71 wage, 18% burden, supplies at 5% of labor, 15% overhead and a 12% profit target, the calculator gives a break-even of about $3,490 and a recommended price of $4,065 per month. If the crew runs 10% slower than planned, profit at that price falls to 3.9%. Open the calculator and load the sample bid to see every line.

Estimates are only as good as the inputs. Time your own crews on similar buildings and use those rates when you have them.