๐ณ Recipe ยท Licensing & Cost Optimization
Check M365 License Subscription Counts and Usage
Audit subscribed SKUs, consumed seats, and available licenses across your Microsoft 365 tenant
Complexity
Beginner
Impact
read-only + licensing + cost-optimization + reporting
Context
Why This Matters
Microsoft 365 licenses represent a significant recurring cost for most organizations, and running out of available seats can block user onboarding, mailbox creation, and service activation. Periodically reviewing license counts ensures you have headroom for new hires, identifies unused licenses that can be reclaimed or downgraded, and supports budgeting and true-up conversations with your reseller or Microsoft directly.
Run this recipe:
- Before onboarding batches of new users
- Monthly as part of tenant hygiene
- Before subscription renewal to right-size purchases
- When investigating "license assignment failed" errors
Expected Outcomes
After completing this recipe you will have:
- A complete list of every subscribed SKU in the tenant
- The number of prepaid (enabled) units per SKU
- The number of consumed (assigned) units per SKU
- The number of available seats remaining for each SKU
- Visibility into suspended, warning, and locked-out units that may indicate billing issues
Risks & Considerations
Read-only operation โ the Graph endpoint used here does not modify any data, so there is no direct risk. However, keep the following in mind:
- SKU part numbers are cryptic.
ENTERPRISEPACKmeans Office 365 E3,STANDARDPACKmeans E1, etc. Always map them to friendly names before sharing reports. - Free SKUs inflate pools. SKUs like
FLOW_FREEandPOWER_BI_STANDARDoften show 10,000 or 1,000,000 units โ don't treat those as purchased seats. - Trial and grace-period subscriptions appear the same as paid ones. Cross-check with the M365 admin center billing page for actual billing status.
- Do not share raw SKU IDs externally in support tickets without context; they are tenant-agnostic but the consumption counts are sensitive.
Required Permissions
| Permission | Why It's Needed |
|---|---|
| Organization.Read.All | Required to read subscribedSkus for the tenant via Microsoft Graph. |
| Directory.Read.All | Alternative permission that also grants read access to subscribedSkus. |
| License Administrator or Global Reader role | Required for interactive admin center or PowerShell sign-in to view license data. |
The fastest way to get this done โ just ask Dex. Copy the prompt below and paste it into your Dex conversation.
For IT Admins
Paste into Dex CoAdmin