The licence you keep paying for after the seat goes dark
License waste in Microsoft 365 has two honest layers: seats you can reclaim from hard data today, and a term premium you can model but not read from Graph. Here is how I separate them so the number I quote is defensible.
License waste is easy to overstate and easy to miss. I keep it honest by splitting it into two layers that carry different confidence, and only the first is a number I will assert. This memo sets out the split I use in the ITSailor CSP benchmark.
Last verified: 2026-08-03.
The two layers
Layer one, recoverable now. Dead seats and duplicate or overlapping SKUs, derived from the scan. A disabled account still holding an assigned licence is the clearest case, read straight from Graph. This is measured, not estimated.
Layer two, commitment opportunity. Microsoft New Commerce prices a month-to-month term about 20 percent above the annual term, so moving the right-sized estate to an annual commitment removes roughly 16.7 percent of that bill. The scan cannot see the customer term from Graph, so this is presented as a clearly labelled potential applied to the right-sized estate, never asserted as certain.
Recommendation
Quote layer one as the hard saving and layer two as a modelled potential, in that order, with the arithmetic shown. Right-size first (remove dead and duplicate seats), then price the remaining estate on annual terms. For the market context, LicenseIQ's 2026 playbook puts wasted Microsoft 365 spend at 8 to 22 percent of the estate with up to 35 percent recoverable, which is a useful outside anchor but not a promise about any one tenant.
# The benchmark arithmetic, in the open
currentLicensedMonthly = sum(monthly cost of every account holding a priced licence)
rightSized = currentLicensedMonthly - recoverableNow # dead + duplicate
commitmentSaving = rightSized * (0.20 / 1.20) # ~16.7%
optimizedMonthly = rightSized - commitmentSaving
annualOpportunity = (currentLicensedMonthly - optimizedMonthly) * 12
Trade-offs
An annual commitment trades flexibility for the lower rate, so it is wrong for a seasonal or shrinking headcount. Right-sizing removes seats a manager may want back next month, so pair it with the offboarding evidence rather than a blind sweep. The licensing service is at /services/cloud-licensing-and-procurement.
Where this does not apply
The commitment layer does not apply to a tenant already on annual terms: there is no premium left to remove, so quoting it would double-count. The recoverable layer does not apply where the "dead" seat is a deliberately parked account with a business reason. This is evidence for a procurement decision, not a compliance statement, and the LicenseIQ market figures were not independently re-verified by ITSailor.
Tenant Monitor runs this same recoverable-layer scan every month rather than once, so a seat that goes dark shows up on the next dated read instead of the next annual audit, from Tenant Monitor.
Sources and further reading
Turn the trade-off into a scoped brief.
Share the constraints that differ in your environment. Michal will identify the next check needed before a delivery decision.
Start a scoped briefMore from Ops Log
A CSP partner may not sell to itself or an affiliate: Microsoft names two own-use routes instead
Microsoft's CSP documentation says partners are barred by contract from selling Microsoft or third-party offers to themselves or an affiliate as end customer. The same page names two own-use routes: a Shared Services tenant for Azure, or a separate tenant bought through another CSP partner.
A daily offboarding check can prove closure only as a bound
A leaver check that runs once a day can report closure only as a bound between two runs. A Graph 429, including one inside a batch that returns 200, and a membership read that returns nulls can each make a degraded run look clean, so an absence counts only from a run that read cleanly.
The Azure role called Cost Management Reader is not read-only
Cost Management Reader is described as able to view cost data, yet its action list carries a Microsoft.Support wildcard that includes creating and updating support tickets. The built-in Reader role matches it on every Cost Management feature and cannot write a ticket.