How to Handle Material Price Increases Without Losing Margin
The short answer: A material price increase only costs you money in the window between when you quoted a job and when you bought the material. Close that window three ways: put an expiration date on every quote, add a short escalation clause for anything you cannot buy today, and price jobs off what the material actually cost you rather than last year's list price. CRMb recalculates the weighted average cost of every item each time you receive a purchase order, so the cost that lands on a job is the cost you actually paid.
Most contractors discover a price increase the same way: the invoice from the supply house does not match the number in the bid. By then the job is sold, the customer has a signed price, and the difference comes straight out of margin.
Where the money actually leaks
There are only four moments a price increase can hurt you, and each has a different fix.
Between quote and acceptance. You bid a job in March, the customer signs in June, and copper moved 14% in between. This is the most common and the most preventable leak. It is fixed with a date, not a clause.
Between acceptance and purchase. The customer signed, but you have not bought the material yet, and the job starts in five weeks. This is what escalation clauses and deposits exist for.
Between purchase and use. You bought at the old price and the item sits on the shelf. This one is not a loss, but it distorts the next job if you price from today's list instead of the average cost of what you are holding.
Silently, on every job, forever. Your item costs were entered once and never updated. Every quote since then has been built on a number that is quietly wrong. This is the expensive one, because nobody notices it.
Fix one: put an expiration date on every quote
An undated quote is an open offer. Some customers will hold one for a year and expect you to honor it.
Standard windows by trade:
| Work type | Typical quote validity |
|---|---|
| Service and repair, small jobs | 14 to 30 days |
| Residential remodel, landscaping | 30 days |
| Commercial, long lead-time material | 7 to 15 days |
| Anything with volatile commodities (copper, lumber, steel, fuel) | 7 to 10 days |
The wording is one line, placed on the quote itself where the customer will read it before signing:
This quote is valid for 30 days from the date issued. After that date, pricing is subject to current material costs and must be re-confirmed in writing.
Short windows are not aggressive. They are honest. A seven-day window on a copper-heavy job is a truer promise than a ninety-day window you intend to renegotiate. Send quotes as a link the customer can open and sign the same day, so the window is realistic rather than theoretical, and follow up before the window closes instead of after.
Fix two: write an escalation clause you can actually enforce
An escalation clause lets you pass on a documented increase between signing and purchase. It is normal in commercial work and increasingly accepted in residential work, but only if it is specific.
A clause fails when it is vague. "Prices subject to change" is not enforceable in any useful sense, and it reads as a blank check to the customer. A clause that holds up has four parts:
- Which materials it covers. Name them. "Copper pipe and fittings, lumber, and steel." Not "materials."
- A trigger threshold. Usually 5% or 10% above the quoted unit cost. Small moves are your risk to absorb, and saying so builds trust.
- Documentation. You supply the supplier invoice or written quote showing the change. No documentation, no adjustment.
- A cap or an exit. Either a ceiling on the total increase, or the customer's right to cancel and pay for work completed. A clause with no exit is the one customers refuse to sign.
A workable version:
If the unit cost of copper, lumber, or steel required for this project increases more than 10% above the cost used in this quote, the contract price will be adjusted by the documented difference on those materials only. Supplier documentation will be provided. If the total adjustment exceeds 5% of the contract price, the customer may cancel and pay only for work completed and materials already purchased.
The alternative to a clause, and often the better one on smaller jobs, is to just buy the material. A deposit that covers material at signing removes the exposure entirely, because you convert cash into inventory at a known price on day one. No clause needed.
Fix three: price from what you paid, not from a list
The quiet version of this problem has nothing to do with any single price spike. It is item costs that were entered when you set up the system and never touched again.
If your quoting catalog says a fitting costs $4.10 and your last three purchase orders came in at $5.35, every quote you have written since is understating cost by 30% on that line. Multiply by a few hundred lines and the margin you think you are earning is fiction.
Weighted average cost is the standard fix. When you receive stock at a new price, the on-hand cost becomes the blend of what you were holding and what you just bought:
You hold 100 fittings at $4.10 and receive 200 more at $5.35. New average cost is ((100 × 4.10) + (200 × 5.35)) ÷ 300 = $4.93.
That $4.93 is what should hit the next job, because it is what the stock on your shelf actually cost. Not the old price, which flatters your margin, and not the new price, which overstates it.
CRMb does this arithmetic on receipt. Receive a purchase order against a supplier and the average cost for that item at that location is recalculated automatically. Pull the material onto a job and the job's material cost is the current average, per location, so a truck loaded last quarter and a warehouse restocked yesterday are not pretending to be the same number. Read more on average cost for job materials.
When a supplier sends a price increase notice
Increase letters arrive with a date and an assumption that you will absorb it. You have more room than the letter implies.
Buy ahead of the effective date, but only what you will turn. A price increase is a real reason to stock up and a terrible reason to overstock. Material sitting on a shelf for eight months costs you cash, space, and shrinkage, which usually exceeds the increase you avoided. Buy to your normal reorder points, not to the size of your nerve.
Ask what is actually changing. Increases are rarely uniform across a catalog. Get the line-level detail and you will often find the items you buy most were barely touched.
Check your second and third supplier. Not to switch on price alone, since supplier reliability is worth real money, but because a competing quote is the only leverage that reliably works.
Update your catalog the same week. The increase becomes a margin problem the moment a quote goes out at the old cost. Update costs before the next bid, not at year end.
Then decide what to pass on. You do not have to move sell prices by the same percentage. Look at the item's share of a typical job. A 12% increase on a material line that is 20% of job cost is a 2.4% hit to that job, which may be worth absorbing to hold a customer, or may be worth a quiet across-the-board adjustment. Decide with the number in front of you rather than by reflex.
Verify it worked
The point of all of this is that quoted cost and actual cost stay close. After a quarter, compare them on finished jobs.
Pull the material cost you quoted against the material cost the job consumed. A consistent gap in one direction is not bad luck, it is a stale catalog or a quote window that is too long. A post-job profitability review makes that gap visible per job, and CRMb reports show margin against real material cost and real punched labor hours rather than the estimate you started with.
FAQ
How long should a contractor quote be valid? Thirty days is the common default for residential work, and 7 to 15 days is normal when the job leans on volatile commodities like copper, lumber, steel, or fuel. Match the window to how fast your inputs move, and state it on the quote rather than in a separate terms document.
Is a price escalation clause enforceable? It is far more likely to hold when it names specific materials, sets a percentage trigger, requires supplier documentation, and gives the customer either a cap or a cancellation right. Vague "prices subject to change" language is weak and reads badly to customers. Contract enforceability varies by state and by contract type, so have your standard terms reviewed by an attorney licensed where you work.
Should I raise prices on a job I already quoted? Not inside a valid quote window. That is the promise you made. Outside the window, or where a signed escalation clause applies, re-price with documentation attached and explain it before you invoice, never on the invoice.
What is weighted average cost and why use it for materials? It blends what you paid across every receipt of an item, so the cost charged to a job reflects the actual mix of stock on hand. It is simpler to run than FIFO for most service businesses and it stops old purchase prices from flattering your margin.
How often should I update material costs in my catalog? Any time a purchase order is received at a different price. If your system recalculates cost on receipt, this is automatic and the question goes away. If you keep prices in a spreadsheet, quarterly is the practical minimum, and monthly during a volatile stretch.
Should I buy in bulk to beat an increase? Only within what you will consume in a normal stocking cycle. Carrying cost, cash tied up, and shrinkage on slow-moving stock routinely outrun the increase you were trying to avoid.
Getting started with CRMb
Material price increases are only expensive when they are invisible. The fix is not clever contract language, it is knowing what your material actually costs on the day you quote.
CRMb keeps purchasing and job costing on one record. Purchase orders go to suppliers and receive into stock, and receiving recalculates the weighted average cost per item per location. Pull material onto a job and the job carries the real cost, not a list price. Quotes and invoices share the same catalog, and the public share link lets a customer sign the same day so your validity window stays honest. Crew hours punched in Punch flow into the same job, so margin reports read off real labor and real material together.
Start a 14-day free trial at crmb.io, receive one purchase order, and watch what happens to the cost on your next quote.