No single percentage is right: published guides run from about 7% to 50%. Build yours from what handling materials costs you (returns, waste, card fees, receipt admin, a share of overheads), charge shopping time separately, and slide the percentage down as lines get bigger. ChatGPT or Copilot in Excel can build the calculator.
The catch with those guide figures is that most do not say what the percentage has to cover, or whether it is markup (on cost) or margin (on price). A 25% markup is a 20% margin, and mixing them up quietly costs you money on every job. The useful question is not "which percentage?" but "what does the percentage have to pay for?", and last quarter's receipts answer it.
Markup and margin: the sum that stops quiet under-charging
Markup is the amount you add to cost, as a percentage of cost. Margin is the profit as a percentage of the selling price. Take a part that costs you $100:
| Markup | You charge | Profit margin |
|---|---|---|
| 10% | $110 | 9.1% |
| 15% | $115 | 13.0% |
| 20% | $120 | 16.7% |
| 25% | $125 | 20.0% |
| 30% | $130 | 23.1% |
| 40% | $140 | 28.6% |
| 50% | $150 | 33.3% |
The conversion is margin = markup divided by (100% plus markup). Run it backwards when you have a margin target: to keep a 25% margin you need a markup of 25 divided by 75, which is 33.3%. If a guide says "aim for 25%" and you add 25% to cost, you have a 20% margin, and the missing five points are your fuel, your returns and your Saturday.
Why published markup advice disagrees, and what to do with it
As of November 2026, two calculator pages on the same home-services software vendor's site (Housecall Pro) quote different ranges: a "common" 10% to 20% on its bid calculator, and a "baseline" of 20% to 50% on its service markup calculator, neither limited to materials. A general-contractor guide from another software vendor puts materials at typically 7% to 20%. Those pages are general-purpose calculators, so they cannot know your shopping distance, supplier discounts or return rate.
Treat any published range as a reason to calculate your own, not a number to copy. Another approach skips percentages and charges a flat collection fee for fetching materials. The rule below is a hybrid, with a small sliding percentage for handling risk and a separate time charge for the trip, which suits one-person businesses with mixed jobs.

The Complete Excel Course with AI Integration
From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.
By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner
Buy nowBuilding your percentage from last quarter's receipts
The build-up needs a quarter of data: receipts, job count and a rough shopping log. The figures here are invented, for a one-person business. Last quarter there were 41 jobs, 148 receipt lines and $4,800 of materials bought for customers. Sort the quarter's costs into two groups: handling costs that the markup must cover, and time that you will bill separately.
| Item | Last quarter | Covered by |
|---|---|---|
| Returns and wrong items not refunded | $190 | Markup |
| Offcuts and leftovers written off | $210 | Markup |
| Card fees on the materials part of customer payments | $175 | Markup |
| Receipt logging and admin (about 2.5 hours, valued at $44 an hour) | $110 | Markup |
| Handling subtotal | $685, or 14.3% of $4,800 | Markup |
| Contribution to overheads (your decision: 10% of receipts) | $480 | Markup |
| Markup needed | $1,165, or 24.3% of $4,800 | Markup |
| Shopping runs: 28 runs at 0.75 hours, billed at $65 an hour | $1,365 | Separate time charge |
| Consumables: screws, filler, tape, sandpaper ($410 over 41 jobs) | $10 a job | Sundries allowance |
The contribution to overheads is not a calculation. It is a decision about how much of your van, insurance, phone and software the materials should carry, and 10% is only an example. What the table gives you is a number with a reason behind it, 24.3% across the quarter, instead of a figure borrowed from a web page. A flat 24.3% on every line would be wrong, though, because handling effort does not grow with the price of the part.
A sliding rule with no cliffs
Finding, buying, logging and carrying a $5 part costs about the same effort as a $50 part, so small lines need a bigger percentage and large lines a smaller one. Apply it in bands, like income-tax brackets: each slice of the line's cost carries its own rate.
- The first $25 of each receipt line: 30%
- The next $75 (from $25 to $100): 20%
- The next $400 (from $100 to $500): 12%
- Anything above $500: 8%
| Line cost | Markup | You charge | Effective markup |
|---|---|---|---|
| $5.00 | $1.50 | $6.50 | 30.0% |
| $24.99 | $7.50 | $32.49 | 30.0% |
| $47.40 | $11.98 | $59.38 | 25.3% |
| $100.00 | $22.50 | $122.50 | 22.5% |
| $180.00 | $32.10 | $212.10 | 17.8% |
| $500.00 | $70.50 | $570.50 | 14.1% |
| $780.00 | $92.90 | $872.90 | 11.9% |
Check the bands against last quarter. Using group averages, 90 lines averaging $11 earn $297.00, 50 lines averaging $47.40 earn $599.00, and 8 lines averaging $180 earn $256.80. That is $1,152.80, or 24.0% of the $4,800, against the $1,165 needed. The gap is $12.20, so leave the bands alone and recheck next quarter.
The banded approach matters because the obvious alternative has cliffs. If each band were a whole-line rate (30% under $25, 20% from $25 up, and so on), a part costing $25.00 would sell for less than a part costing $24.99. A spreadsheet built that way produces silly quotes that a customer notices:
| Line cost | Whole-line rate version | Banded version |
|---|---|---|
| $24.99 | $32.49 | $32.49 |
| $25.00 | $30.00 | $32.50 |
| $99.99 | $119.99 | $122.49 |
| $100.00 | $112.00 | $122.50 |
| $499.99 | $559.99 | $570.49 |
| $500.00 | $540.00 | $570.50 |
One job through the rule: hanging and painting a door
Job: hang a new internal door and paint it, half a day on site. The receipts total $152.40 across six lines.
| Receipt line | Cost | Markup | You charge |
|---|---|---|---|
| Internal door | $68.00 | $16.10 | $84.10 |
| Handle and latch set | $24.50 | $7.35 | $31.85 |
| Hinges, pack of three | $11.40 | $3.42 | $14.82 |
| Door stop | $4.20 | $1.26 | $5.46 |
| Primer, 1 litre | $16.80 | $5.04 | $21.84 |
| Satin paint, 1 litre | $27.50 | $8.00 | $35.50 |
| Materials | $152.40 | $41.17 | $193.57 |
Add the two charges that sit outside the markup. The shopping run took 40 minutes, which rounds up to 45 minutes (0.75 hours) at $65 an hour: $48.75. The half-day visit carries a sundries allowance of $12.00. The materials-related total is $193.57 plus $48.75 plus $12.00, which is $254.32. Against receipts of $152.40 that is $101.92 more, and the trip ($48.75) is the largest part of it.
That is the honest cost of a single-trip job, and the customer should see it as three lines, not one. To bring it down, combine one run with another job's parts, keep common parts in the van as stock, or let a customer who wants the lowest price buy the door themselves.
Shopping time and small items: two charges outside the markup
Shopping time is real work, and hiding it inside labour or in an inflated percentage helps nobody. A simple rule: charge from leaving the job to returning to it, in 15-minute blocks, with a half-hour minimum, at your labour rate. If a single run buys for two jobs, split the time in proportion to receipt value. A 45-minute run for jobs with receipts of $60 and $90 gives the first job 18 minutes and the second 27.
Small items are the other leak. Screws, filler, tape, sealant, sandpaper and rags are bought in bulk and used across jobs, so logging each one to a job is fussy and the percentage on them is tiny. Treat anything you buy for stock as overhead and recover it through a sundries allowance. From the quarter above, $410 of consumables over 41 jobs is $10 a job on average, so an allowance of $6 for visits up to an hour, $12 up to four hours and $20 beyond is a reasonable starting point. Check it against your own receipts after a quarter.
A second example shows why a small job needs its own rule. A replacement door closer costs $18.40. The banded markup is $5.52, so the part sells for $23.92. The run took 25 minutes, which hits the half-hour minimum: $32.50. A short visit carries $6.00 of sundries. The customer would see $62.42 for an $18 part. Several answers are fair: offer to pass the part through at cost if the customer buys it, combine the run with another job, or set a minimum materials-and-collection charge you are happy to explain, for example $25. Pick one and apply it every time.
When the customer supplies the materials, the markup disappears but your risk does not. Write "supplied by customer, fitted only" on the job sheet, check suitability before starting, and charge for inspection and unpacking if it takes real time. Say plainly that you cannot guarantee a product you did not choose.
The sheet, tab by tab, with the formulas
Five tabs keep the logic visible. Settings holds the labour rate (B2), the minimum shopping hours (B3, 0.5) and the block size (B4, 0.25). Tiers holds the bands. Sundries holds the allowance. Receipts logs every line. Quote totals one job. Lay out the Tiers tab like this, where the third column is the change in rate at each band edge:
Tiers tab A (from $) B (band rate) C (step)
Row 2 0 30% =B2
Row 3 25 20% =B3-B2
Row 4 100 12% =B4-B3
Row 5 500 8% =B5-B4
Sundries tab A (visit hours from) B (allowance)
Row 2 0 6
Row 3 1.01 12
Row 4 4.01 20
Receipts has these columns: date, job ID, supplier, receipt number, item, quantity, unit cost, line cost (H), markup (I) and sell price (J). Enter one row per item on the receipt, not one per unit. The formulas, with the row 2 versions shown:
H2 line cost =F2*G2
I2 markup =ROUND(SUMPRODUCT((H2>Tiers!$A$2:$A$5)*(H2-Tiers!$A$2:$A$5)*Tiers!$C$2:$C$5),2)
J2 sell price =H2+I2
Quote tab
B1 job ID (typed)
B2 receipt cost =SUMIFS(Receipts!$H$2:$H$500,Receipts!$B$2:$B$500,B1)
B3 materials sell =SUMIFS(Receipts!$J$2:$J$500,Receipts!$B$2:$B$500,B1)
B4 minutes away (typed)
B5 shopping =MAX(Settings!$B$3,CEILING(B4/60,Settings!$B$4))*Settings!$B$2
B6 visit hours (typed)
B7 sundries =XLOOKUP(B6,Sundries!$A$2:$A$4,Sundries!$B$2:$B$4,0,-1)
B8 total =B3+B5+B7
B9 over receipts =(B8-B2)/B2
The markup formula multiplies each band's step by the amount of the line that sits above that band's floor, which is how bracket pricing works in a spreadsheet. XLOOKUP's last argument, -1, means "exact match, or the next smaller item", according to Microsoft's documentation, and Google's help page for XLOOKUP in Sheets gives the same meaning. Excel 2016 and 2019 do not have XLOOKUP, so in those versions replace it with =LOOKUP(B6,Sundries!$A$2:$A$4,Sundries!$B$2:$B$4), which also looks up the next smaller value.
Asking ChatGPT or Copilot in Excel to build it
The sheet is a short job for an assistant if the prompt carries every decision. Paste it into ChatGPT, or into the Copilot pane in Excel with the empty workbook open:
I run a one-person handyman business. Build me a materials pricing sheet for Excel
that also works in Google Sheets. Tabs: Settings, Tiers, Sundries, Receipts, Quote.
Rules:
1. Markup is per receipt line, in marginal bands on the line cost: 30% on the first
$25, 20% on the next $75, 12% on the next $400, 8% above $500. Keep the bands in
the Tiers tab and make the formula read them. No percentages typed into formulas.
2. Round the markup to cents on each line, then add the lines up. Do not round only
the total.
3. Shopping charge: minutes away, rounded up to 15-minute blocks, minimum 0.5 hour,
times the labour rate on the Settings tab.
4. Sundries: look up visit hours. Up to 1 hour $6, up to 4 hours $12, over 4 hours $20.
Keep the values on the Sundries tab.
5. Ordinary formulas only. No AI functions inside cells.
Give me each tab's headers, then every formula with the cell it goes in, then six
test lines with the expected sell price so I can check the sheet.
Both tools can do this, with different habits. In Copilot, choose Plan first so it shows what it will change before it edits, switch to Allow editing (the default) once the plan looks right, and use Chat only mode for questions such as "why does row 14 show $0.00?" that should not alter the workbook. Plan, Allow editing and Chat only are the three mode names on Microsoft's page, and whether Copilot appears depends on your Microsoft 365 subscription. Do not plan around the old =COPILOT() worksheet function, which Microsoft retired on 14 September 2026. A pricing sheet should not depend on an AI call inside each cell in any case, and the pane builds ordinary formulas. In ChatGPT, paste the formulas into your own workbook; on Plus and above, ChatGPT Work can also create a spreadsheet file where file creation has reached your plan, but formulas you can read are easier to audit.
What a first draft usually gets wrong
A typical first answer, made up here to show the pattern, reads each band as a whole-line rate:
=H2*(1+XLOOKUP(H2,Tiers!$A$2:$A$5,Tiers!$B$2:$B$5,0,-1))
That is the cliff version from earlier. The same draft may also type the labour rate straight into the shopping formula, round only the total, or turn a percentage into a margin by dividing cost by one minus the percentage. Run the test lines to catch all of these:
| Test line cost | Expected sell price | Cliff draft gives | What it catches |
|---|---|---|---|
| $5.00 | $6.50 | $6.50 | A margin formula would give $7.14 |
| $24.99 | $32.49 | $32.49 | Top of the first band |
| $25.00 | $32.50 | $30.00 | Cliff at the first edge |
| $100.00 | $122.50 | $112.00 | Cliff at the second edge |
| $500.00 | $570.50 | $540.00 | Cliff at the third edge |
| $650.00 | $732.50 | $702.00 | The band above $500 |
Send the failing results back with "row 3 should be $32.50, you gave $30.00; use banded markup" and the assistant will usually produce the SUMPRODUCT form. Also change the shopping minutes in a test job and watch the charge move in 15-minute steps: 40 minutes should give 0.75 hours and $48.75, and 31 minutes should give 0.75 hours too, because 31 rounds up to 45. For wider spreadsheet help, the ChatGPT and Excel guide covers prompts for building and checking formulas, and the Gemini in Google Sheets tutorial does the same for Sheets users.
Receipts: capture, match and read them with AI
The sheet is only as good as the receipt log, so make logging a habit with three rules. Photograph the receipt at the till, before it goes in a pocket, and name the file with the job ID. Give every line a job ID, or mark it as stock. Record returns as negative lines on the same job, so a refund cancels the markup it earned. Once a week, spend ten minutes matching receipts to jobs and supplier account statements. Your accountant can tell you how long to keep the originals.
An assistant can read the photo into rows, as long as you check the maths. Ask for a control total:
Read this receipt photo into a table with columns: Item, Qty, Unit price, Line total.
Then give the total printed on the receipt and the sum of your line totals.
If they differ, say so and point to the line you are least sure of.
A reply might look like this: the table shows a hinge pack at $1.40 where the receipt says $11.40, and the assistant reports the printed total as $152.35 against its own sum of $142.35. The $10 gap points straight at the misread digit. Without the control total, the markup on that line would have been calculated on the wrong cost and nobody would notice until a customer queried the invoice. Check the receipt for discount lines and multi-buy prices, which assistants often skip. The handyman accounting software comparison covers the tools that capture receipts into your books so you only log once.
Putting the lines on the quote
Customers accept a handling charge when it is stated and consistent. Two layouts work. Itemised shows each part at your selling price, with a line saying "materials supplied at cost plus handling". Summary shows one materials figure, with receipts available on request. Whichever you use, keep the collection run on its own line and never bury it in labour:
Materials (receipts available on request): $193.57
Collection run, 45 minutes: $48.75
Sundries (fixings, filler, sandpaper): $12.00
If a customer asks to see receipts, show them, point to the handling lines and explain what each one covers. Never edit a receipt or round a figure to make it look tidier. If a customer would rather buy the parts, quote labour only and note "supplied by customer, fitted only".
Your price book needs the same discipline for labour. The handyman price book tutorial covers building rates for common jobs, and this rule slots in beside it for materials. For larger contractors comparing markup with margin across whole jobs, the contractor pricing sheet tutorial goes further.
Checking the rule against ten past jobs
Before you quote with the sheet, test it on history. Take ten finished jobs, enter their receipts, shopping times and visit lengths, and compare what the sheet would have charged with what you actually billed for materials. Suppose the sheet would have produced $2,310 across the ten jobs against $1,980 billed, a gap of $330. The shopping charge explains $312 of it, because eight of the jobs involved a run averaging 0.6 hours that nobody had been paying for. The remaining $18 came from the bigger percentage on small lines.
Look at the jobs where the sheet charged a lot more than you did. If one customer would plainly balk, ask whether you would have charged that much anyway, then decide whether the sheet or your instinct is wrong. Each quarter, rerun the build-up table from your receipts, and change the bands only if the result moves by more than a couple of points. The rule is a tool for consistent pricing, not a substitute for judgement, and the point of testing it is that you can explain every number on the quote.
Questions handymen ask about marking up materials
Should I show customers my receipts?
Show them if asked, and design the quote so you are comfortable doing it. List materials at your selling price, add a separate line for the collection run, and keep the handling rule the same on every job. Customers rarely mind a stated handling charge; they mind one that looks hidden or changes between jobs. Never alter a receipt.
Is it fair to charge a higher percentage on small items?
Yes, if you can explain it. Finding, buying, logging and carrying a $5 part takes about as much effort as a $50 one, so the percentage on the small item has to be larger to cover the same handling. A sliding scale keeps big-ticket items competitive while small parts still pay their way.
What if the customer buys the materials themselves?
Quote labour only, write supplied by customer, fitted only on the job sheet, and check the items are suitable before you start. You can charge for the time to inspect and unpack. Say in advance that you cannot guarantee products you did not choose or buy, and keep that wording the same on every job.
How often should I change my markup rule?
Rerun the build-up from your last quarter of receipts every three months, and change the bands only when the result moves by more than a couple of points. Supplier price rises show up in your cost column anyway, but your shopping time and returns can drift, and the quarterly check catches that.
Further reads
- How Much to Charge for a Service Call: Build the Fee From Your Costs — Build the minimum call-out fee that sits beside your materials rule.
- HVAC Markup and Margin: A Worked Check on Past Jobs With AI — The same markup and margin check, run on past heating jobs.
- Plumbers AI: Turn Supplier Price Lists Into a Parts Markup Sheet — Turn supplier price lists into a parts markup sheet.
- How to Check Your Margins Product by Product With AI — Check margins line by line once the sheet has data.
- Handyman Maintenance Contracts for Landlords: Draft Terms With AI — Point a landlord contract at your materials rule.
- How to Price a Fence Job: Can AI Turn Run Length Into a Materials List? — Turn a run length into a materials list before you price it.
- Best AI for a Handyman Business: Seven Tools Worth Trying — Seven AI tools for a one-person handyman business, with what each free tier covers, when to start paying and which ones to skip.
- Handyman Leads: Thumbtack, Angi and Bark Compared on Cost per Booked Job — Thumbtack, Angi and Bark compared on how they charge, what refunds exist and cost per booked job, plus AI prompts to screen leads and reply fast.
- ChatGPT for Handyman Work: Prompts for Quotes, Texts and Reviews — Ten copy-and-paste ChatGPT prompts for a handyman's quotes, customer texts and review replies, each with a sample output and the edits to make.
- Hardscaping Business: Paver Patio Quotes From Site Photos With AI — Quote a paver patio from eight customer photos and three measurements: area, base, pavers, edging and labour lines, a price range, then a site visit.
- Hourly Rate for a Tradesman: Work Out Yours Without Guessing — A four-step method for a tradesman's hourly rate, with a worked plumber example, a crew version, a billable-hours log and an AI check of the maths.
- How to Price Carpentry Work: Test Day Rates Against Job History With AI — Build a day rate, choose day rate or fixed price per job, and let AI test the rate against the last ten jobs you actually did.
- AI for a Handyman Business: Ten Jobs It Can Do Today — Ten jobs a handyman can give to AI, from missed calls to review requests, each with effort, cost and the check that keeps you safe.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: Housecall Pro's handyman bid and service markup calculator pages, Harvest's guide to marking up materials as a contractor, and Microsoft Support and Google Docs help pages for XLOOKUP and Copilot in Excel (checked November 2026). Figures in the examples are illustrations.