
Most roofing companies price the same job the same way in February and July. That's leaving money on the table half the year and losing money the other half. Your costs move with the calendar — crew availability, production rate, material lead times, callback risk — and if your bid sheet doesn't move with them, your margin absorbs the difference.
This isn't about gouging in August. It's about pricing what the work actually costs to deliver in that month, in your market. Here's how to build a rate calendar that holds up.
Four things swing seasonally, and they compound:
Think in four pricing periods, not twelve months. Set a base margin and adjust from there.
Late winter / early spring (the hungry window). Backlog is thin, crews want hours, suppliers are pre-price-increase. This is your volume period, not your margin period. Take work at your floor margin to hold your crew together — but never below it. A crew you keep employed in March is a crew that doesn't leave you in June. Price at base margin, occasionally base minus 2–3 points for a job that fills a hole in the schedule.
Peak season (late spring through early fall). Demand exceeds your capacity. Every job you take costs you a different job. That's the definition of a situation where you raise price. Add 5–10 points over your base margin and let the low-margin work go to somebody else. If your close rate in July is above 50%, you are underpriced — full stop. Peak season close rates in the 25–35% range mean you're bidding correctly.
Storm response (whenever it hits). Materials tighten, labor goes to whoever pays most, and out-of-town crews flood the market. Your costs genuinely spike. Price on replacement cost of labor today, not what you paid last month. Also: write shorter price-validity windows. A 30-day bid in a post-hail market is a promise you may not be able to keep.
Deep winter (the discipline period). Some work should be priced to not win. A steep-slope tear-off in January in a freeze-thaw climate deserves a premium that reflects short work windows, heated storage, longer dry-in, and elevated callback risk — typically 10–20% over your summer number for the same scope. If the customer takes it, you're covered. If they wait until spring, you got a spring job. Both outcomes are fine.
Seasonal pricing fails when the contract doesn't back it up. Three clauses earn their keep:
These aren't fine print to hide. Walk the customer through them. A contractor who explains why a February install carries a different number than a June install sounds like a professional. A contractor who quietly pads the number and gets asked about it sounds like something else.
The lazy move in slow months is to cut price. The better move is to sell the advantages you actually have:
For commercial, push the conversation toward capital planning. Building owners set budgets in fall for the following year. A roof assessment and budget number delivered in October is how you get a signed spring job in January instead of bidding against five others in April.
Here's the practical version. Take your standard bid template and add two seasonal inputs:
Keep them separate. Cost adjustments protect you from losing money. Margin adjustments capture what the market will pay. Mixing them into one fudge factor is how you end up unable to explain your own number.
Then track it. At year end, pull every job by month and look at estimated hours versus actual, and estimated margin versus realized. Your multipliers will be wrong the first year. They'll be close the second year. By year three you'll know your own seasonal cost curve better than anyone bidding against you — and that's the whole advantage.
The contractors who survive lean years aren't the ones who bid lowest in spring. They're the ones who priced summer correctly enough to fund it.