Handyman Material Markup: Build a Cost-Plus Calculator With AI

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Handyman Material Markup: Build a Cost-Plus Calculator With AI.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Handyman Material Markup: Build a Cost-Plus Calculator With AI.

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.

Follow me on Instagram@sagnikteaches

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:

Connect on LinkedInSagnik Bhattacharya
MarkupYou chargeProfit margin
10%$1109.1%
15%$11513.0%
20%$12016.7%
25%$12520.0%
30%$13023.1%
40%$14028.6%
50%$15033.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.

Subscribe on YouTube@sagnikteaches

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 thumbnail

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 now

Building 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.

ItemLast quarterCovered by
Returns and wrong items not refunded$190Markup
Offcuts and leftovers written off$210Markup
Card fees on the materials part of customer payments$175Markup
Receipt logging and admin (about 2.5 hours, valued at $44 an hour)$110Markup
Handling subtotal$685, or 14.3% of $4,800Markup
Contribution to overheads (your decision: 10% of receipts)$480Markup
Markup needed$1,165, or 24.3% of $4,800Markup
Shopping runs: 28 runs at 0.75 hours, billed at $65 an hour$1,365Separate time charge
Consumables: screws, filler, tape, sandpaper ($410 over 41 jobs)$10 a jobSundries 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 costMarkupYou chargeEffective markup
$5.00$1.50$6.5030.0%
$24.99$7.50$32.4930.0%
$47.40$11.98$59.3825.3%
$100.00$22.50$122.5022.5%
$180.00$32.10$212.1017.8%
$500.00$70.50$570.5014.1%
$780.00$92.90$872.9011.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 costWhole-line rate versionBanded 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 lineCostMarkupYou 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 costExpected sell priceCliff draft givesWhat it catches
$5.00$6.50$6.50A margin formula would give $7.14
$24.99$32.49$32.49Top of the first band
$25.00$32.50$30.00Cliff at the first edge
$100.00$122.50$112.00Cliff at the second edge
$500.00$570.50$540.00Cliff at the third edge
$650.00$732.50$702.00The 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

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.

Want your pricing rule tested on real receipts?

On a 1:1 call we'll run your last quarter of receipts through a markup rule, see what it would have changed, and decide which parts of the sheet AI should build first.

Book a 1:1 call with me