Skip to content
5 min read

Microsoft 365 Seats Not Billed? How MSPs Stop Seat Drift

Seat drift happens when a user is added or removed in the Microsoft 365 admin portal, but the client's contract in the PSA tool is never updated. The gap is easy to miss and can run for months. Measure it by comparing licensed users with contracted seats for each client, then fix the process: one system owns the count, onboarding updates billing, and a regular check catches differences before the invoice goes out.

Key takeaways

  • Seat drift happens when two systems hold the same number and only one of them gets updated.
  • You can measure your own gap in an afternoon by comparing five clients' tenants with their PSA contracts.
  • Pick one system as the source of truth for billable seats, and make the other follow it.
  • Add a billing step to onboarding and offboarding, then reconcile every week instead of once a quarter.

A new hire starts at a client on Monday. A tech adds them to Microsoft 365 before lunch and assigns a license. Nobody opens the PSA ticket to change the contract, so the client is billed for 40 seats while the tenant now has 41. The difference is one seat. Repeat that across 60 clients over a year and you have a real margin problem that nobody has put a number on.

How common is this?

No public study we could find counts MSPs with seat drift specifically, so we will not invent a percentage. The closest published data comes from license vendors. CoreView, which sells Microsoft 365 license management, analyzed Office 365 use across about five million enterprise users in 2020 and found that 56% of licenses were not fully used. That figure includes licenses that were inactive, underused, oversized or unassigned, so it is not the same as billing drift. A later CoreView estimate, based on hundreds of health checks, put unused or unassigned licenses at 10 to 20%.

Those numbers describe license waste inside companies, not missed invoices at MSPs. What they do show is that license counts drift from actual use almost everywhere. An MSP managing dozens of tenants has more places for that drift to hide.

Why the numbers drift apart

Your license count lives in at least two places. The tenant, whether it is Microsoft 365, Google Workspace or an endpoint tool, shows what is in use. The PSA, such as ConnectWise, Autotask or HaloPSA, shows what the client agreed to pay for. Each change happens in one tool, and the other is updated by hand, if at all.

Usually the cause is not carelessness. Techs are busy, the change happens in a different portal, and nothing in the process forces the second update. When the process depends on someone remembering, the numbers will drift.

Signs you have this problem

  • For at least one client, the active user count in the tenant is higher than the contracted quantity in the PSA.
  • Onboarding and billing updates happen in different weeks, or the billing update is sometimes skipped.
  • Someone exports user counts by hand before each invoice run.
  • A client asks why the invoice does not match the user list they can see.
  • A renewal or audit turns up a seat count that nobody expected.

What the drift costs

Here is a simple way to size it. Take the number of unbilled seats, multiply by what you pay for each license and the margin you planned on top, then multiply by the number of months the gap went unnoticed. For example, five unbilled seats at a planned margin of $20 each is $100 a month, or $1,200 a year, for one client. Repeat that across the clients with gaps.

Industry estimates for billing losses are broader and mostly come from vendors. One summary of research by MGI Research and Aria Systems puts typical billing inefficiency at 3 to 7% of annual revenue for service providers. A vendor case study from Gradient describes one MSP that found about $3,000 in unbilled services soon after connecting its PSA. It shows how quickly a single check can pay for itself.

How to measure your own gap

You do not need a survey to know if this affects you. Set aside one afternoon and do this:

  • Pick the five clients with the most users.
  • For each one, export the active licensed users from the tenant's admin portal.
  • Pull the contracted quantity for the same client from your PSA.
  • Subtract. Each difference is either billing you are missing or an agreed exception, such as a shared mailbox or a trial license.

Write down the total. That number is more useful than any industry statistic, because it is yours. If the total is zero, repeat the check for your ten largest clients before you relax.

Example: how a missed seat adds up over six months

  • Month 1
    $40
  • Month 2
    $100
  • Month 3
    $200
  • Month 4
    $300
  • Month 5
    $440
  • Month 6
    $600
Between two and eight seats go unbilled over six months. The margin lost builds up faster than any single month suggests.

Calculated at a planned margin of $20 per unbilled seat per month.

Best practice: fix it in three layers

You do not need a new platform to start. You need three habits that people will actually follow.

  • Decide which system owns the number. Most MSPs treat the PSA contract as the billing record and the tenant as the usage record. Write that down, so everyone knows which one wins when they disagree.
  • Add a billing step to onboarding and offboarding. A user is not provisioned until the contract quantity is updated, or the ticket is marked as pending billing. This one step prevents most drift.
  • Reconcile on a schedule. Once a week, compare active licensed users in each tenant with the contracted quantity, and flag every difference. Small gaps can be fixed quickly. Gaps that keep coming back point to a process problem.
The goal is not a perfect audit. It is that a missed seat gets caught in the same week it happened.

The weekly reconciliation loop

  1. 01Pull active licensed users from each tenant
  2. 02Pull contracted seats from the PSA
  3. 03Compare the two and flag every difference
  4. 04A person approves each change or fixes the record
  5. 05Update billing before the next invoice run
Five steps and one owner. The approval step is the one teams skip first, so keep it on the calendar.

The weekly loop, in order.

Where automation helps

A manual check works for ten clients. At fifty, it becomes a job of its own. A scheduled job can read license counts from the tenant's API and contract quantities from the PSA's API, compare them every night, and send a short list of differences to the person who approves invoices.

At Asauvia, we build this kind of reconciliation for MSPs. The comparison is the easy part. The careful work is in the rules: which differences to report, which to ignore, and how a change gets approved before it reaches a client's bill. A person stays in the loop for every change to an invoice.

A typical first engagement starts with read-only access to your tenants and PSA. In the first week we run the comparison for your clients and agree the exception rules with you. By the end of the second week you have a weekly report and an approval step. We do not change tenants or contracts without your sign-off.

Before you start, check what your tools allow. Most major platforms expose license and user data through an API, but access and permissions depend on your plan.

  • #MSP
  • #Microsoft365
  • #PSA
  • #ManagedServices
  • #MSPBilling

Sources

  1. Betanews: More than half of Office 365 licenses are not being fully exploited (CoreView study, 2020)
  2. CoreView: Managing Microsoft 365 licenses datasheet (10–20% unused or unassigned)
  3. ITEuropa: Fixing the hidden revenue leak in MSP billing
  4. Gradient: How 15 minutes turned into $3,000 (vendor case study)
Before you ask

Questions worth
answering upfront.

See every question we get asked
How do I find unbilled Microsoft 365 licenses?

Export the active licensed users for each tenant and compare the count with the contracted quantity in your PSA. Do this for every client at least once a month. Once the comparison is automated, it becomes a routine check rather than a multi-day project.

How much money can seat drift cost an MSP?

It depends on how many seats are missed, the margin you planned on them and how long the gap goes unnoticed. Multiply the unbilled seats by your monthly margin per seat and by the number of months. Measuring five of your largest clients will give you a number that is more useful than any industry average.

Do I need to replace my PSA tool to fix this?

Usually not. The fix is a process change plus a reconciliation step. Your PSA can stay as the billing record. Replacing it only makes sense if it cannot hold or expose the contract data you need.

Is it safe to give a tool access to tenant license data?

It can be, if the access is read-only, limited to licensing data and logged. Ask for the exact permissions a tool needs before you grant them, and review those permissions once a year.

Keep reading

All posts

Let's solve
something together.

Tell us what you're building, improving, or automating. We'll come back with a plan, not a pitch.

NDA before any scoping conversation

This blog uses Google Analytics to count visits and see which articles are read. If we show ads, it also uses Google advertising cookies. Nothing is set until you choose. You can change your mind at any time from Cookie settings in the footer. Read our cookie policy.