Microsoft 365 CSP billing doesn't work on clean monthly totals. Every seat change mid-cycle generates a prorated charge for the partial period, and if your client billing doesn't reflect that, you're quietly under-recovering every month it happens.
How proration works
When a seat is added partway through a billing cycle, Microsoft charges for the remaining days in that cycle rather than a full month. The same applies in reverse when a seat is removed, the charge stops from that point rather than continuing to the end of the cycle. Over a month with several changes for the same client, you can end up with multiple partial-period charges instead of one clean total.
A worked example
Say a client has 7 licensed seats at the start of the month. On the 12th, they add one seat, bringing the total to 8. On the 20th, they remove one, back to 7. Microsoft's invoice for that client will show three separate charge periods: a full-cycle charge for the base 7 seats, a partial charge for the extra seat from the 12th to the 20th, and the 7-seat rate continuing after. None of that maps cleanly onto "charge the client for 7 seats this month," and if that's what your invoice says, you've under-billed for the eight days of the extra seat.
Why this gets missed
- Most PSAs bill a flat monthly rate per contracted seat, not a prorated one
- Mid-cycle changes are often made directly by end users or admins, without notifying billing
- Distributor invoices list dozens of prorated lines per client, easy to skim past
- The amounts per change are usually small, a few pounds, easy to dismiss individually
Individually small, but multiplied across every client with any seat churn during the month, this becomes one of the most consistent sources of MSP revenue leakage.
Two ways to handle it
Bill exactly what was prorated
Pass the exact prorated amount through to the client. This is the most accurate approach and protects margin fully, but it means invoices vary slightly month to month, which some clients find harder to reconcile against their own budgets.
Bill a flat rate with a reconciliation step
Keep client invoices predictable at a flat per-seat rate, but track the prorated variance separately and true it up periodically, or accept a small planned margin buffer to absorb it. This requires knowing exactly how much variance you're carrying, which means tracking it, not guessing at it.
Catching it automatically
Either approach depends on actually knowing what Microsoft charged for each prorated change, which means reading the CSP billing data directly rather than relying on a rounded PSA contract figure. The Microsoft 365 integration in MSPBilling.cloud reads this data automatically and flags any prorated charge that hasn't been reflected in client billing, as part of full billing reconciliation.
