Service plans you pay for but nobody uses
30 Jul 2026
Service plans you pay for but nobody uses
Every Microsoft 365 seat is a bundle. An E3 licence isn't one product, it's roughly thirty service plans — Exchange Online, SharePoint, Teams, Intune, Power Automate, Viva Engage, Sway, Whiteboard, Bookings, Azure Rights Management, and a long tail nobody in the company can name. You buy the bundle at one price. Most tenants use eight of the thirty. The uncomfortable first fact: turning the other twenty-two off does not reduce your invoice by a cent. The price is per seat, per SKU, and it doesn't itemise. So why look? Because the usage pattern inside the bundle is the cleanest evidence you'll get for three decisions that do move money — and it's the one report almost nobody runs.
What a service plan actually is
In the Graph API, a subscribed SKU has a servicePlans array, and
each user's licence assignment carries a disabledPlans list.
Enabled means the user is entitled and provisioned. Disabled means somebody —
an admin, a group-based licensing rule, or a migration script from 2021 —
switched that component off for that person. Nothing about either state
appears on the invoice.
The three decisions this data actually changes
This one is real money. A user on E3 who was later given a standalone Exchange Online Plan 2, or Power BI Pro, or an Entra ID P1 add-on, is often paying twice for a component already inside the bundle. It happens through group-based licensing rules that overlap, or through a project that bought add-ons for a team without checking the base SKU. The service-plan view is the only place the duplication is visible — the invoice shows two happy line items.
E5 costs about €21 a month more than E3, and almost all of that premium sits in a handful of plans: Defender for Office P2, Entra ID P2, Power BI Pro, audio conferencing, advanced compliance. If nobody on E5 has those plans provisioned, or they're provisioned and dead, you're not buying security — you're buying the idea of it. Same logic one rung down, which is the whole of right-sizing licences per user.
The most expensive version of this: a department asks for a workflow tool, or a form builder, or a whiteboard, and someone signs a third-party contract. Power Automate, Forms, Whiteboard, Bookings and Stream are already sitting in every E3 seat, disabled or ignored. Checking the service-plan inventory before a purchase order is a five-minute query that occasionally cancels the purchase order.
The plans worth checking first
| Service plan | Lives in | Why it's worth a look |
|---|---|---|
| Exchange Online P2 | E3, E5 | Also sold standalone — the classic double-buy. |
| Entra ID P1 / P2 | E3 / E5, Business Premium | Bought as an add-on by tenants that already own it. |
| Intune | E3, E5, Business Premium | Provisioned for users with no enrolled device at all. |
| Power BI Pro | E5 | Standalone Pro licences stacked on top of E5 seats. |
| Power Automate / Forms | every bundle | Owned by everyone, replaced by third-party tools anyway. |
| Viva Engage, Sway, Stream | every bundle | Rarely used, and each is an ungoverned content store. |
| Azure Rights Management | E3, E5 | Disabled somewhere in the past; breaks labels later. |
Where this goes wrong
- Disabling plans to "save money". It doesn't. It only removes capability, and the removal shows up as a support ticket six months later when someone opens a link they can't render.
- Disabling plans at scale by hand. Per-user changes drift instantly. If you want a component off, do it once in the group-based licensing rule, not in 400 individual assignments.
- Reading "enabled" as "used". Provisioning state is not activity. Pair the service-plan inventory with the actual usage reports — app activations, mailbox activity, Teams sessions — or you'll conclude that everything is in use because everything is switched on.
- Ignoring the plans that were disabled deliberately. Some were turned off for a reason: a compliance requirement, a failed rollout, a privacy decision. Find out before you re-enable, and write it down this time.
Getting the list without a two-day export
Done by hand this is a Get-MgSubscribedSku loop, a
Get-MgUserLicenseDetail loop, and a join in Excel against three
separate usage exports — which is why it's done once, badly, the week before a
renewal. GraphPaaS keeps the SKU and
service-plan inventory per tenant alongside the per-user activity it already
collects, so the duplicate-entitlement question and the "is this tier
justified" question are both a filter away rather than a project. It's the same
data set behind
how much
you're wasting on unused Microsoft 365 licences — that article counts the
seats nobody uses, this one counts the parts of the seats you keep.
See every SKU in your tenant broken down to its service plans — and which of them anyone has actually opened.
Audit what's inside your licences →