MSP profit margins are earned or lost one contract at a time. Contract gross margin is a month's contract revenue minus the direct cost of delivering it, divided by that revenue. The worksheet below runs it on a live contract: included hours, logged time, overage, and expenses.
This guide comes from the team behind SherpaDesk, a helpdesk and professional services automation (PSA) tool a small IT team can run alone. Two founders who ran their own MSP have built it since 2001.
To start now, jump to the contract margin worksheet and its TXT download.
What Is Contract Gross Margin?
Definition
Contract gross margin is the share of one contract's monthly revenue left after the costs of delivering it. Those costs are technician hours at loaded cost, tools you pay for that client, and other direct costs such as parts and travel.
Net margin goes further: net income divided by sales. Rent, admin, sales, and insurance come out first. That's your accountant's profit-and-loss statement.
The contract is where you can act. A company-wide 40% can hide one client at 60% and another at 15%, and you can only reprice or bill overage one contract at a time.
Owners also disagree about what goes into cost. In one r/msp thread about a 34% margin, one commenter said, "I think that 34% margin is pretty good at that small size, with an employee." Another pushed back that the poster was "including labor in your calculation, but salaries come from gross profit," and put their own managed services "around 70% gross margin." Same number, two readings. In this worksheet, technician labor is a direct cost.
MSP Profit Margins: What Neutral Data Shows
Few published figures on MSP profit margins say who was measured. Two recent sources do, and neither measures a small MSP's contract.
| Who was measured | Measure | Result |
|---|---|---|
| MSPs surveyed for Informa's 2026 MSP 501 report (600+ in the data set) | EBITDA margin of at least 6% | 89% of MSPs |
| Same sample | EBITDA margin above 15% | 42% of MSPs |
| 64 US public companies, computer services | Gross margin | 24.26% |
| Same 64 companies | Net margin | 4.45% |
| 5,994 US public companies, all sectors | Net margin | 9.74% |
Published January and September 2026.
The MSP 501 figures come from firms that applied to Informa's ranking with verified profit-and-loss data; Ingram Micro sponsored the report. EBITDA is operating income with depreciation and amortization added back, a company number earned after overhead. In our reading, it sits closer to net margin than to contract margin. The public-company figures come from NYU Stern's margin tables, with data as of January 2026.
Treat both as company-level context, not targets for a contract. Compare a contract with its own history, run through the same worksheet.
The Contract Margin Worksheet
One sheet per client per month. Letters A to S match the steps below.
CONTRACT MARGIN WORKSHEET
One client, one contract, one month
Client: [name]
Contract: [type, e.g. monthly fee with included hours]
Month: [month and year]
REVENUE
A. Monthly fee, without resold licenses ...... $[ ]
B. Overage hours invoiced .................... [ ] h
C. Overage rate per hour ..................... $[ ]
D. Overage revenue (B x C) ................... $[ ]
E. Expenses invoiced, with markup ............ $[ ]
F. Contract revenue (A + D + E) .............. $[ ]
HOURS
G. Included hours in the contract ............ [ ] h
H. Hours counted against the allowance ....... [ ] h
I. Other hours logged on the contract ........ [ ] h
J. All hours logged (H + I) .................. [ ] h
K. Overage not invoiced (H - G - B, min 0) ... [ ] h
DIRECT COST
L. Loaded cost per hour ...................... $[ ]
M. Labor cost (J x L) ........................ $[ ]
N. Other direct costs, billed or not ......... $[ ]
O. Tools you pay for this client ............. $[ ]
P. Direct cost (M + N + O) ................... $[ ]
RESULT
Q. Gross profit (F - P) ...................... $[ ]
R. Contract gross margin (Q / F x 100) ....... [ ] %
(if F is 0, skip R and report Q in dollars)
S. Overage left unbilled (K x C) ............. $[ ]
How To Fill In The Worksheet, Field By Field
Fill it in after the month's invoice run, from your helpdesk's time entries.
-
Total the month's contract revenue (A to F)
Add the monthly fee, the overage you invoiced, and the expenses you billed, markup included.
Common mistake: adding resold licenses or standalone hardware sales to the fee. Resale has its own margin and can hide a contract that loses money on labor.
-
Total every hour logged against the contract (G to J)
Line H is every hour drawn against the included allowance, including chargeable hours past it. Line I is every other hour spent delivering the contract, such as rework that doesn't count against the allowance. Count every tech, owner included. A non-billable hour costs you the same as a billable one. As one r/msp owner put it: "The math is easy. It all comes down to the accuracy of the tracked hours."
Common mistake: counting only the hours past the allowance as H. Then K reads zero when overage went unbilled.
-
Find the overage that never reached the invoice (K)
Take H, subtract included hours, then subtract the overage hours you invoiced. Anything left is chargeable time the client never paid for. The formula assumes one overage rate and no rounding or discounts; otherwise take D from the invoice and K from unbilled entries. Our billable hours tracking guide covers that review.
Example: 19.5 hours against a 16-hour allowance, 2 overage hours invoiced: 1.5 hours never billed.
-
Set your loaded cost per hour (L)
Median pay for computer support specialists was $30.24 an hour in 2025. Wages were 70.0% of private-industry employer compensation costs in June 2026. Our estimate applies that all-industry wage share to one occupation: $30.24 ÷ 0.70 = $43.20 an hour.
Common mistake: costing hours at the wage. If your techs log only part of their paid week to clients, divide their monthly cost by hours logged instead. Our MSP challenges guide builds the full budget for one tech.
-
Add the costs that aren't labor (N and O)
Line N is every other direct cost of the contract this month, billed or not: parts, travel, a courier. Line O is the tools you pay for this client: RMM, backup, and security seats. For a shared tool, divide its bill by clients or seats.
Common mistake: entering only the costs you invoiced. A part you forgot to bill still cost you money.
-
Divide (P to S)
Direct cost is labor plus other direct costs plus tools. Gross profit is revenue minus direct cost. Gross profit ÷ revenue × 100 is the contract gross margin. S, K × C, is overage you worked but never billed. If revenue is zero, report gross profit in dollars instead.
Filled-In Example: An Accounting Office Contract
Say you run a contract for a 25-user accounting office. The fee is $2,000 a month with 16 included hours and overage at $125 an hour. In October your techs logged 21.5 hours: 19.5 against the allowance and 2 of rework that didn't count against it. You invoiced 2 overage hours and one replacement switch, bought for $180 and billed at $216. You also pay $210 a month for this client's tool seats.
| Line | Value |
|---|---|
| A. Monthly fee | $2,000.00 |
| D. Overage revenue, 2 h × $125 | $250.00 |
| E. Expenses invoiced | $216.00 |
| F. Contract revenue | $2,466.00 |
| J. All hours logged | 21.5 h |
| K. Overage not invoiced, 19.5 − 16 − 2 | 1.5 h |
| M. Labor cost, 21.5 h × $43.20 (our estimate) | $928.80 |
| N. Other direct costs (the switch) | $180.00 |
| O. Tools for this client | $210.00 |
| P. Direct cost | $1,318.80 |
| Q. Gross profit | $1,147.20 |
| R. Contract gross margin | 46.5% |
Line S is the one to act on: 1.5 hours × $125 is $187.50 of overage left off the invoice. Bill it, and revenue becomes $2,653.50 and gross profit $1,334.70. The contract gross margin moves from 46.5% to 50.3% without a new client or a price change.
Run your own contract below with lines F and P.
Contract gross margin, one month
(revenue − direct cost) ÷ revenue × 100. Your numbers stay in the browser.
A non-billable hour costs you the same as a billable one.
Subscribe to the SherpaDesk Blog.
Get Tips for Running IT With a Small Team.
Loading form…
The form couldn’t load. Please try again.
Or start your free trial →SHERPADESK · FREE TRIAL
Resolve tickets.
Turn time into revenue.
Bring support tickets, billable time, and invoicing into one place. Built for small IT teams and MSPs.
- 14 days free
- No credit card required
After your trial, keep your first agent free forever.
SHERPADESK · LIVE DEMO
See tickets, time,
and billing work together.
Walk through ticketing, time tracking, and billing with a product specialist. See how SherpaDesk fits the way your team works.
- 15 minutes
- Your workflow, your questions
A live walkthrough tailored to your team.
What A Low Contract Margin Tells You
Stop at the first row that matches.
| Signal on the sheet | What to check | Where the fix lives |
|---|---|---|
| K above zero | Billable hours past the cap that no invoice line carries | Review uninvoiced entries before every invoice run |
| J above G three months running | Whether the extra hours were in scope, repeat incidents, or rework | The scope and price review in your managed services agreement |
| I a large share of J | Which tickets carry non-billable time, and why | Document the fix that keeps coming back |
| N at or above E | Parts and travel billed at cost, or not billed | A written markup, and a billing check on parts |
| O rising, A flat | Tool seats added without a price change | A pass-through clause for per-seat tools |
| M above A | Labor alone costs more than the fee | Reprice from your hours; see managed services pricing |
The first row is a billing fix. The second needs a client conversation; our QBR template shows how to present the hours.
Prepaid Blocks, Hourly And Retainer Contracts
Prepaid block of hours. Set A and G to zero, enter the hours drawn this month as B and the block rate as C, so D is the month's revenue. One r/msp member described the problem: "Client doesn't use hours/money & then complains as to why they're billed as much." Write the expiry and rollover rule into the agreement before the block sells.
Hourly. Set A and G to zero, enter invoiced hours as B and your rate as C. H is every chargeable hour logged, so K and S still show hours you worked and didn't bill.
Retainer plus hourly. The retainer goes in A and the hourly work in B to D. G is the hours the retainer covers, or zero if it buys availability.
Run The Worksheet From Your Helpdesk Data
How this works in SherpaDesk
Hours, overage, and expenses on one contract
On a Flat + Hourly contract, the fee covers its included hours, and hours past them bill as overage at the contract's rates. You get an alert as the included hours run out, and overage can move into a new prepaid pack.
Your techs log time as billable or non-billable, and expense items can carry a markup. Uninvoiced time and expenses collect in "Ready to Invoice" by contract. The Time Log Detail Report and Time Log Export support XLSX, and the Contract Detail Report shows prepaid-pack hours remaining.
A helpdesk and PSA a small IT team can run alone. No contract. No implementation project. No dedicated admin.
Base Camp is $45 per agent per month ($40 billed annually). The first agent is free, forever, and the trial is 14 days free with no card.
Who this isn't for
If you need a full profit-and-loss statement, overhead allocation, or a valuation of your MSP, this worksheet stops at the contract; that's work for your accountant. And if you want monitoring in the same product: we don't build RMM. We integrate with yours, and the stack stays yours.
Frequently Asked Questions
What is a good profit margin for an MSP?
We found no neutral survey that sets a contract gross margin target for small MSPs. At company level, 42% of MSPs surveyed for Informa's 2026 MSP 501 report had EBITDA margins above 15%, and 89% had at least 6%. For contracts, set the target from a quarter of your own sheets (benchmarks).
Is a 20% profit margin high?
As a net margin, yes. Across 5,994 US public companies, net income was 9.74% of sales in NYU Stern's January 2026 data, and 4.45% for 64 in computer services. As a contract gross margin, 20% leaves little room. Rent, admin, sales, and the part of your own pay not already costed as ticket hours still come out of it.
How does an MSP make money?
On a contract like the one in our example, from three lines: the monthly fee, overage hours billed above the included hours, and expenses billed with a markup. Licenses and hardware resold on their own earn a separate margin, so keep them off the service worksheet. Parts used to deliver the contract, like the example's switch, go in both E and N (worksheet).
Should the owner's own hours count as labor cost?
Yes. Log your own hours on the contract and cost them at what you'd pay a tech for the same work. Leave them out, and a contract you service yourself looks better than it is until the day you hire. Pay for your selling and admin time stays in overhead, so it isn't counted twice.
How often should I run the worksheet?
Monthly, for every contract, after the invoice run, so invoiced overage and expenses are final. Before a renewal or a quarterly review, compare each contract with its last three months, so one heavy month doesn't read as a trend (signals).
Patrick co-founded SherpaDesk and has led it as CEO since 2013. He has worked with IT service providers since 1998, first on network projects for schools and government offices, then on the helpdesk software their technicians use every day.




