Ask a group of contractors how they price materials and you'll hear three different answers: "I pass them through at cost," "I add 10%," and "it depends." Only one of those is actually a pricing strategy.

Sourcing materials takes real time and carries real risk. You research suppliers, place orders, drive to the distributor, check deliveries, handle returns, and float the cost on your credit card until the client pays. Treating materials as a simple pass-through ignores all of that. And pricing them by feel — a random 10% on some jobs, nothing on others — means you're leaving money on the table or losing it depending on the day.

This post gives you the benchmark range by trade, the formula to apply it, and the specific situations where your standard markup needs to be higher.

Why Materials Need Their Own Markup

Material markup isn't a gouge. It's compensation for real costs that most contractors never explicitly account for:

  • Your time to source them. Comparing prices across suppliers, calling for stock checks, placing orders, and chasing late deliveries all burn billable hours you can't recover on labor.
  • Carrying cost. You pay the supplier before the client pays you. On a $3,000 material order with net-30 payment terms from the client, you're fronting that money for weeks — sometimes longer on phased jobs.
  • Price risk. Between the day you quote and the day you order, lumber prices move. Supply chain disruptions happen. Your fixed-price quote is on the hook for the difference.
  • Handling and storage. Materials that sit in your truck or shop cost space and risk damage. That cost belongs somewhere in your pricing.
  • Returns and waste. Not everything ordered gets used. Leftover materials, wrong items, and cutoffs are a cost of doing business that gets absorbed somewhere — or should be built in from the start.

None of these are captured in your labor rate. Material markup is the line that covers them.

Material Markup Benchmarks by Trade

Material markup varies by trade for a simple reason: trades with high-value specialty materials (electrical components, HVAC equipment) command different margins than trades with commodity materials (paint, basic lumber). Here are typical ranges for small-to-mid-size contractors:

TradeTypical Material Markup Range
Plumber25 – 50%
Electrician20 – 40%
HVAC technician15 – 35%
General / remodeling contractor15 – 30%
Flooring installer15 – 25%
Landscaper (hardscape / plants)15 – 30%
Painter10 – 20%
Interior designer (furnishings)20 – 40%
Photographer (prints / products)50 – 100%+

Plumbers and electricians mark up materials aggressively because they stock and carry specialty parts at all times — that inventory cost is real. Painters and GCs who work primarily with commodity materials (paint, drywall, lumber) typically run tighter markups because margins are thinner on generic materials and clients can more easily price-check them.

If you've been using a flat 10% across the board, you're almost certainly leaving $3,000 – $10,000 or more per year on the table depending on your material volume.

The Material Markup Formula

The formula is simple. Apply your markup percentage to your supply cost:

Client price = Supply cost × (1 + markup rate)

Example: You're an electrician. Your supply cost for a panel upgrade job is $1,200. You use a 35% material markup.

$1,200 × 1.35 = $1,620 billed to client

Your gross margin on materials alone: $420 on $1,620 = 25.9%

One important distinction: a 35% markup and a 35% margin are not the same number. A 35% markup means you added 35% on top of cost. A 35% margin means 35% of the selling price is gross profit — which requires a higher markup rate to achieve. This is the same math behind why contractors consistently underprice jobs when they confuse markup with margin.

To hit a 35% margin on materials, the formula flips:

Client price = Supply cost ÷ (1 − 0.35) = Supply cost × 1.538

For the same $1,200 order: $1,200 ÷ 0.65 = $1,846 — about $226 more than a 35% markup would generate. Know which number you're targeting before you build your pricing.

Material Markup on Time-and-Materials Jobs

On time-and-materials contracts, materials appear as a separate billed line item. That's a feature, not a problem — clients expect to see it and the billing structure makes your markup visible and defensible.

T&M material markup is typically explicit in the contract: "Materials billed at cost plus 20%." The range for T&M work:

  • Service and repair trades (plumbing, electrical, HVAC): 20–40% on T&M is standard and widely accepted
  • Remodeling and general contracting: 15–25% is common; GCs sometimes use flat handling fees on large custom orders
  • Specialty trades (tile, flooring, millwork): 20–30%, higher for hard-to-source or custom materials

On fixed-price jobs, material markup is baked into the total — clients don't see a separate line. The markup still needs to be there in your cost calculations; it just isn't presented as a distinct line on the quote.

When Your Standard Markup Isn't Enough

Certain situations justify a higher material markup than your baseline:

Rush or short-notice orders. Ordering materials on two days' notice often means paying full retail or expedited shipping. Mark up accordingly — or add a rush surcharge explicitly.

Low-volume specialty orders. Ordering three custom tiles for a bathroom repair means you can't negotiate quantity pricing. The cost per unit is higher, so your markup can reasonably be too.

Materials with significant storage requirements. If a job requires you to hold materials in your truck or shop for weeks before installation, the carrying cost is real. Build it into your markup or add a staging fee.

High price-volatility categories. Lumber, copper wire, and steel have historically seen multi-month swings of 20–40% or more. On large orders in volatile categories, either add a materials escalation clause to your quote or increase your markup to create a buffer. Your quote validity language should address this for any quote that stays open longer than 30 days.

When a Client Wants to Supply Their Own Materials

This comes up more often than contractors expect, usually because the client found something on sale or wants a specific product. Your options:

Accept it with a labor rate adjustment. If clients supply materials, you lose your material margin. Make sure your labor rate for that job reflects that reality. Some contractors charge a 10–15% premium on labor for client-supplied materials to offset the lost revenue — and to offset the risk.

Decline. This is a legitimate business decision. Many contractors won't install client-supplied materials for liability and warranty reasons: if the product fails, the question of who's responsible gets complicated fast. If you do allow client-supplied materials, address warranty in writing — your labor warranty typically does not cover failures caused by client-supplied products.

Charge a handling fee. If you're willing to install client-supplied materials but will still be managing delivery, storage, and coordination, a flat handling fee of $75 – $200 per order is reasonable and not unusual.

Frequently Asked Questions About Material Markup

Do I have to disclose my material markup to clients?

On fixed-price jobs, no. You present a total price; clients don't need a line-by-line cost breakdown including your margins. On T&M contracts, your markup rate is typically spelled out in the agreement ("materials billed at cost plus 20%"), so clients will know it. In either case, what you pay for materials and what you charge is your business — the same way a restaurant doesn't disclose food cost to diners.

What's a reasonable material markup for a small contractor?

For most service trades, 20–35% is a defensible range. If you're buying specialty parts at distributor pricing and reselling them with expert installation, 35% is not aggressive — it's appropriate. If you're reselling commodity lumber at Home Depot pricing with no value-add, 10–15% is more realistic. The key is that the number should be deliberate, not arbitrary.

Should material markup cover overhead costs?

No — and this is a common mistake. Your overhead rate should be applied to your full direct cost base (including materials at supply cost). Material markup is a separate layer that generates gross margin on the materials themselves, not a substitute for overhead recovery. If you're using material markup to cover overhead, you're underpricing labor and misreading your real margins.

How do I handle material prices that changed since I quoted?

Two ways to protect yourself: first, include a materials price validity clause in your quote — "Material prices valid for 30 days from date of quote." Second, for large material orders, consider a brief price escalation clause that allows you to adjust if supply costs increase more than 5–10% before the order is placed. Most residential clients will accept this language when you explain why it's there.

Should I mark up every material, or only major purchases?

Mark up everything, including fasteners, adhesives, caulk, and consumables. The aggregate adds up fast. Many contractors use a simplified approach: standard markup on all tracked materials, plus a "miscellaneous materials" line covering small consumables at a flat rate ($25 – $75 depending on job size) rather than tracking every tube of caulk. Either approach works as long as you're not letting small costs disappear into your margin silently.

The Bottom Line

Materials are not a favor you do clients by passing them through at cost. They're a revenue line with real associated costs: your time, your risk, your cash, and your storage. Mark them up accordingly.

Pick a consistent percentage by trade and job type. Write it into your quoting process so it applies automatically — not job by job based on gut feel. The contractors who do this typically see a 5–15% increase in gross revenue per job without touching their labor rate at all.

At PRISM, you set your material markup rate once and it applies to every quote automatically. Paste in a client's message, and PRISM prices materials, labor, and overhead together — so the number you send is the number you actually need.