Mark up stock materials 15 to 20 percent, drop to about 10 percent on big-ticket items the homeowner can look up on a phone, and never go under 10 on anything you buy, haul and stand behind. Published advice runs from 7-20% (Method) to 30-50% in the Bay Area (Truitt & White), and the spread exists because nobody agrees on what the markup is paying for. Here is the answer: it pays for handling the material, not for running your company. On a $5,400 bathroom material package, the supply-house trips, the delivery charge, the leftovers and six weeks of price drift cost about $490 before you earn a dollar on it. Mark that package up 10 percent and you broke even.
What does a material markup actually have to cover?
The cost of getting the right material to the site and living with it afterwards. Buying time, delivery, the price moving between the day you quote and the day you buy, and the partial boxes nobody takes back. Waste belongs in your quantities, not here. If the tile needs 10% extra for cuts, order it and charge for it as tile.
Here is the arithmetic on a mid-range bathroom, with $5,400 of material in it.
| What the markup pays for | How it's worked | Cost |
|---|---|---|
| Supply-house trips | 3 trips x 1.5 hours x $55 burdened hour | $248 |
| Yard delivery charge | One drop for the tile and board | $75 |
| Price drift, quote to purchase | $5,400 x 7.8% a year x 6 weeks | $49 |
| Leftovers you can't return | Opened thinset, a partial box of tile, cut trim | $120 |
| Total | $492 (9.1% of the materials) |
Only one line there is sourced. The drift rate is the national figure: prices for inputs to residential construction rose 7.8% in the year to August 2026, per BLS producer price data reported by NAHB, with softwood lumber up 13.0% and wire and cable up 19.6%. The rest are placeholders. Put your own trips and your own burdened labor rate in, and your yard's delivery fee.
The point survives any reasonable substitution. At a 10% markup, $540 comes in against $492 of handling. You made $48 on $5,400 of material. At 20%, $1,080 comes in and $588 of it is real.
Why not raise the material markup high enough to cover overhead?
Because materials are the wrong thing to hang overhead on. NAHB's 2026 Cost of Doing Business Study puts remodelers' operating expenses at 23.6% of revenue (Eye on Housing). That is the truck, the insurance, the office and the Saturdays spent writing estimates. Try to recover it through the materials line and two kinds of job break.
The labor-heavy one. A $2,300 drywall repair has maybe $300 of board, mud and tape in it. Recovering 23.6% of $2,300 through that $300 would take a 181% markup. Nobody charges that, so the job goes out carrying almost none of your overhead, and you only find out at tax time.
The material-heavy one. A cabinet swap with $14,000 of boxes in it, marked up 30%, puts $4,200 on a line the homeowner can check against the cabinet showroom's own quote. You will lose that job, or have the conversation standing in the kitchen while they scroll.
Overhead belongs on the hour, where it tracks the thing that actually consumes it. That's the argument in what overhead costs per field hour. Let the material markup do its narrower job and it becomes easy to defend.
One more trap. A 20% markup is 16.7% of the material price, not 20%, for the reason set out in markup vs margin. Judge the result by margin.
Should you mark up big-ticket items less than small ones?
Yes. The handling cost barely moves with the price of the item. A $4 box of screws takes the same trip as a $400 faucet. So the percentage should fall as the ticket rises. This is a recommendation, not a survey:
| What it is | Examples | Markup |
|---|---|---|
| Small parts and consumables | Screws, caulk, supply lines, shims | 25-35% |
| Stock materials | Tile, backer board, drywall, lumber, trim | 15-20% |
| Items the homeowner can look up | Vanity, faucet, toilet, appliances | About 10%, or a flat handling fee |
| Special order, non-returnable | Custom cabinets, windows, slab counters | 10-15%, paid for before you order |
Thirty percent on a $4 box of screws is $1.20. Nobody has ever questioned it. Twenty percent on a $2,800 range is $560, and the homeowner will find the range on a big-box app before you are out of the driveway. Once they have caught one number they don't like, they read every other line looking for the next one.
The special-order row matters most. A custom item that arrives wrong, or that the homeowner changes their mind about, is yours to eat unless the contract says otherwise. Collect the money for it before the order goes in. The markup on it is small because the risk is covered by the deposit, not by the percentage.
What if the homeowner wants to buy the materials?
Say yes and price it as labor only, with the terms written down. Arguing is worse. A homeowner who has already decided you are padding the tile will not un-decide it because you explained freight.
The terms that protect you:
- Material on site and checked three working days before the start date. Not the morning of.
- Shortages and mismatches are theirs. Flooring and tile come in shade lots, and a closeout bought 10% short is often not available again in the same lot. The day your crew finds that out, the job stops.
- Your warranty covers the installation, not the product. A cracked vanity top they bought is a return trip at your service rate.
- A handling line stays on the estimate. You still unload it, check the counts, and haul the packaging away. That's real hours, and it was the thing the markup was paying for.
Leave the rest of the price alone. Homeowner-supplied jobs are fine when the labor price was right to begin with. They only hurt the contractor who was using the material markup to make the labor price work.
Does sales tax change how you mark up materials?
In many states it changes what "cost" means, so check your own state's rules. Texas is a clear example because the Comptroller spells it out for residential repair and remodeling.
On a lump-sum contract, you pay sales tax on materials when you buy them and charge the customer none. The tax is part of your cost, so mark up the taxed number. Forget it at the Texas maximum combined rate of 8.25% (Comptroller) and the $5,400 package above is really $5,846 of cost. That missing $446 is nearly the whole handling cost from the first table.
On a separated contract, you buy on a resale certificate and collect tax from the customer "on the amount you charge for the materials", which the Comptroller says must be at least what you paid. The materials line and your markup on it are now visible to the homeowner, separate from labor. That is the strongest case for the tiered table: when the homeowner can see the material number, it has to be one you'd say out loud.
What this misses
The handling table is illustrative. Three trips, a $75 delivery and $120 of leftovers are plausible for one bathroom in one market, not measured. A shop with a yard account that delivers free, or one that stocks common materials in a trailer, has a lower handling cost and can run a lower markup.
Regional ranges are real. The 30-50% Bay Area figure comes from a yard selling to contractors there, where every hour costs more. Don't import it into Tulsa, and don't dismiss it in Oakland.
The price index is national. Your yard's prices lag the index by weeks and carry its own margin, so the 7.8% is a sense of direction, not a number to bill with.
Tax law is state by state. Texas is used here because its rules are published plainly. Several states treat contractors as the consumer of materials no matter how the contract is written.
The part that decides whether any of this works is the materials line existing at all, split from labor, on every estimate. BidWalk writes each line with labor and material separated as you walk the room, so the markup lands on the materials and the hours carry the overhead.