Snow is the service that hides the most cost in your book. The truck idles. The salt bag empties faster than expected. The plow blade amortizes against a short season. The same property that's a 20-minute mow in July is a 90-minute push in February with three treatment passes and a sidewalk crew you contracted out.
Two ways to price it: per-push (per event) or per-season (flat contract). Each makes sense in different situations. Each has math most contractors skip. This article walks through both, with worked examples, so you can quote your next snow account with eyes open.
The two pricing models, in plain English
Per-push pricing: you charge the customer every time you plow. Simple: no event, no invoice. Customer pays the true cost of the winter; you carry zero seasonal risk on volume.
Per-season pricing: you quote a flat number for the entire winter. Could be $1,200 for a residential driveway with unlimited pushes, or $8,500 for a commercial lot. Customer pays the same regardless of how many events. You carry the volume risk (heavy winter eats your margin; light winter is pure profit).
Both are common in the trade. The right answer depends on who you're quoting (residential vs commercial), how predictable your region's winters are, and how risk-averse the customer is.
Per-push pricing: the math
Same five-cost framework I've covered for other landscape services, with snow-specific inputs.
Cost inputs for a per-push quote:
- Crew labor at burden: same effective rate as your mowing crew. Snow crews are usually 1 person per truck, so divide accordingly.
- Drive time labor: round-trip, costed at the same rate. Snow events often come at night or early morning when traffic is light, so drives are usually faster than summer rates, but the labor cost is still real.
- Truck fuel during the push: separate from drive fuel. The truck loads the engine when plowing, burning roughly 1.5x normal-driving consumption.
- Salt or magnesium chloride cost: per-bag price × application rate × paved sqft. This is the killer line item most contractors underestimate.
- Plow + spreader equipment recovery: per-push amortization of the plow blade, spreader, and any push-only attachments. Short useful life (3-5 years for a residential plow), so the per-push number is meaningful.
- Overhead allocation: same monthly overhead divided across your winter visit count. Winter visit count is much lower than summer (maybe 30-60 events per truck per winter in most US zones), so per-event overhead is higher than per-mow overhead.
Worked example: residential driveway, 1,000 sqft paved area
Job inputs:
- Paved area: 1,000 sqft
- Crew: 1 person, 1 truck
- On-property push time: 25 minutes
- One-way drive: 15 minutes
- Salt application: 30 lbs at $0.40/lb
- 1 treatment pass
Cost math:
- Push labor: 0.417 hr × $26.40 = $11.01
- Drive labor: 0.5 hr × $26.40 = $13.20
- Truck fuel (drive + push): $5.50
- Salt: 30 lbs × $0.40 = $12.00
- Plow + spreader recovery: $4.00
- Winter overhead allocation: $32.00
- Total cost: $77.71
Per-push price targets:
- 50% margin: $77.71 ÷ 0.50 = $155.42
- 55% margin (snow risk premium): $77.71 ÷ 0.45 = $172.69
- Round to $165 per push for a 50% margin sweet spot
Snow contractors target higher margins (50-65%) than mow margins (35-45%) for two reasons. First, the work is physically harder and happens at uncomfortable hours. Second, the season is short and volume is unpredictable: heavy winter or light winter, your fixed costs don't change, so the per-event margin has to absorb seasonality.
Per-season pricing: the same cost, multiplied by expected events
Per-season math starts with the same per-push cost number and multiplies by your region's historical event count. The harder part is the customer-protection math: you need to quote at a price that's fair on average but protects you on a heavy year.
Step 1: figure out your event count distribution
Pull your region's historical snow event data. Most US Midwest zones see 12-22 plowable events per winter. Coastal zones see 4-12. Mountain zones see 30+. Your number is a range, not a single figure.
Three numbers to land on:
- Low: events in a mild winter (you make great margin)
- Expected: average season (your target margin lands here)
- High: heavy winter, 90th percentile (your margin can't go below zero here)
Example for a typical Wisconsin winter:
- Low: 10 events
- Expected: 16 events
- High: 24 events
Step 2: quote at expected, validate at high
Same 1,000-sqft residential driveway as before. Per-push cost was $77.71.
- Expected season cost: 16 × $77.71 = $1,243.36
- 50% target margin on expected: $1,243.36 ÷ 0.50 = $2,487 per season
- Round to $2,500 per season
Now validate at high: 24 events × $77.71 cost = $1,865 of cost against $2,500 of revenue = 25% margin in a heavy winter. That's thinner than the 50% target but still positive: the contract is defensible.
Validate at low: 10 events × $77.71 = $777 of cost against $2,500 of revenue = 69% margin in a mild winter. The customer covered the contractor's seasonal risk, and the contractor banked the upside.
Step 3: structure the payment schedule
Most per-season contracts bill in installments: November 1, December 1, January 1, February 1, March 1. Five equal payments of $500 against the $2,500 contract.
Why this works:
- Customer's budget is predictable: they know December's snow bill before the first flake falls
- Cash flow is steady: you're not waiting for events to generate income
- If you over-deliver (heavy winter), you don't bill more, customer feels treated fairly
- If you under-deliver (light winter), you don't bill less, you covered fixed cost and earned the upside
When to pick per-push
- Customer is risk-tolerant or unsophisticated: they want to pay only when it snows
- You're new to a route or region: you don't have enough event history to bid a season confidently
- The job is one-off or unpredictable scope: driveways that change ownership often, properties under renovation
- Residential where the customer is price-sensitive: "I only pay when I need to" is an easier yes than a seasonal contract
When to pick per-season
- Commercial accounts: HOAs, retail chains, property managers nearly always want a budgetable line item
- High route density: locking in the route lets you optimize equipment + crew schedule for the season
- You have multi-year history in the region: you can confidently bid expected event count
- You want predictable winter cash flow: five equal installments beat unpredictable per-event invoicing
Commercial: the same math, bigger inputs
Commercial snow is per-season almost always. The math is identical to residential, just scaled.
Example: 25,000 sqft retail parking lot, 1 crew member with skid steer + truck, 60 minutes per push including 2 treatment passes, 500 lbs of salt per event.
- Push labor (1 person, 1 hour, $26.40): $26.40
- Drive labor (15-min one-way, 1 person): $13.20
- Truck + skid fuel during push: $18
- Salt (500 lbs × $0.32/lb bulk rate): $160
- Equipment recovery (skid steer is the big one): $12
- Overhead allocation: $32
- Per-push cost: $261.60
Per-push price at 55% margin: $475. Per-season (16 expected events): $475 × 16 = $7,600 per winter. Customer pays $1,520/month × 5 months. Big jump from residential, but the math is the same and the margin protects you against a heavy winter that pushes 22+ events.
The salt cost trap
One pitfall worth calling out: salt cost varies wildly based on when you buy it.
Buy in October and you're paying maybe $0.30/lb. Buy in late January when everyone's out and you're paying $0.60+/lb. If you bought the season's supply in October, your real cost per pound is $0.30 regardless of what the market does. If you buy on-demand, your real cost is whatever you pay at each restock.
Always price contracts using your locked-in fall purchase price. If you run out mid-season and have to buy emergency salt, that's on you, not the contract. Build a small buffer into the per-season price to cover that risk if you don't pre-buy.
What I'd quote, and why
My default for residential is per-season. Customers love the budget predictability and I love the steady cash flow. Per-push as a backup for customers who explicitly ask.
My default for commercial is per-season, with a clearly-documented scope (lot, sidewalks separate, treatment thresholds, response time) so nothing's ambiguous when the season starts.
Either way, the underlying math is the same: real per-push cost, target margin, multiply by realistic event count. Run it for every property the same way and your book runs in the black even on unpredictable winters.
Run both models in one sheet. Enter the property and inputs once and see per-push and per-season side-by-side.
Related reading: 5 hidden costs killing your landscape margin for the underlying cost framework that applies to mowing, fert, and snow. And how to price landscape jobs for the full pricing playbook.