Guides

Microsoft 365 license reconciliation for MSPs

How to compare the Microsoft 365 licenses each client actually has with what their agreement bills, how often to do it, and how to fix the gaps without surprising the client.

Updated October 22, 2026

Most MSPs resell or manage Microsoft 365 for their clients and bill for it on the client’s agreement: so many seats of Business Premium, so many of Exchange Online. The trouble is that the two numbers live in different places. Microsoft knows how many licenses the tenant has. Your PSA knows how many you bill. Nothing keeps them in step, so they drift.

Microsoft 365 license reconciliation is the routine of comparing the two, per client and per product, and fixing the differences. Done monthly, it is one of the cheapest ways an MSP can stop losing recurring revenue.

Why the numbers drift

  • New starters. A client asks for a new user, a technician adds the license in the admin centre, and the ticket closes. Nobody updates the agreement.
  • Upgrades. A user moves from Business Standard to Premium for Intune or Defender. The license changes; the billing line does not.
  • Add-ons. Visio, Project, extra storage and Teams Phone are bought one at a time and are easy to forget.
  • Leavers. Drift runs both ways. A client who removed seats you still bill for will notice eventually, and that conversation costs more than the seats.
  • Seats bought outside you. Sometimes a client buys licenses directly. They still need managing, and your agreement should say whether that is included.

What to compare

For each client, you want three numbers per Microsoft product:

  1. Purchased: licenses the tenant holds (Microsoft calls these prepaid units).
  2. Assigned: licenses actually given to users (consumed units).
  3. Billed: the quantity on the client’s agreement line.

Whether you bill on purchased or assigned seats is a business decision; write it into the agreement so it is not argued about later. Most MSPs bill on assigned seats for products they manage and on purchased seats for products they resell. Either way, the reconciliation compares billed against whichever count your agreement uses.

Doing it by hand

  1. In each client’s Microsoft 365 admin centre, open Billing › Licenses and note the purchased and assigned count for each product. If you are a partner, Partner Center lists subscriptions across customers, but assigned counts still live in each tenant.
  2. Export each client’s agreement lines from your PSA.
  3. Put both into a spreadsheet, one row per client and product, and add a difference column.
  4. For every row where billed is lower than the count you bill on, decide: update the agreement, or confirm the seat is intentionally free.
  5. For every row where billed is higher, credit or adjust before the client finds it.

For ten clients this takes an afternoon. For forty it becomes the job nobody wants, which is why it tends to slip from monthly to quarterly to “when a client complains”.

Fixing gaps without surprising the client

  • Keep the evidence. Record the count and the date you saw it. “Your tenant had 91 Business Premium seats assigned on the 1st” ends most disputes before they start.
  • Bill forward, not back, unless your agreement clearly allows back-billing. A surprise invoice for six months of missed seats can cost more goodwill than it recovers.
  • Tell the client before the invoice changes. A short note listing the new users and the new monthly total is enough.
  • Close the loop on onboarding. Add “update the agreement” to your new-starter and leaver checklists so the next gap does not open.

How often

Monthly, before invoices go out. License counts change with every hire and leaver, and a gap found the week it opens is a line change; a gap found a year later is an awkward conversation. The same routine applies to managed devices: compare the device count in your RMM with what the agreement bills per device.

How Opcrunch handles it

Opcrunch connects to each client’s Microsoft 365 tenant with a single read-only permission (LicenseAssignment.Read.All) and reads the license counts. Its revenue check compares those counts, and the device counts from your RMM, with the quantities on each agreement line. Each gap shows the client, the product, both numbers, when Microsoft reported them and what the difference is worth per month. You choose whether to bill the new quantity; the change is recorded with its reason, and nothing is written back to Microsoft or your RMM.