4 Ways to Monitor License Usage in Microsoft 365

Discover four ways to monitor license usage in Microsoft 365 to track assignments and usage across your organization at scale
The author of the article Chris Shuptrine
Aug 2025
4 Ways to Monitor License Usage in Microsoft 365

Keeping Microsoft 365 licenses in check can feel messy. You’re juggling costs, compliance, and adoption while seats, service plans, and assignments shift every week.

This guide shows practical ways to see who has what, who uses it, and where waste hides at scale. We’ll cover admin center reports, Entra ID group-based licensing insights, PowerShell and Microsoft Graph, and usage analytics you can export for ongoing tracking.

Table of Contents

Use Microsoft 365’s UI

Here, you’ll use the Microsoft 365 admin center to see how many licenses you have, how many are assigned, and who has them.

Open the Microsoft 365 admin center

Sign in with an admin account. You will land on the Home page.

Go to Billing > Licenses

  • In the left navigation, select Billing, then Licenses.
  • You will see each product with counts like Assigned, Available, and Expiring soon. This matches Microsoft’s “View your licenses in the Microsoft 365 admin center” guidance.
  • If Available is low or zero, plan to reclaim or add seats before you need to onboard someone.

Drill into a product to see who is using seats

  • Select a product name on the Licenses page.
  • Open the list of licensed users for that product. Use search and filters to find users or groups.
  • Need to confirm what a user has? Select a name to view their details, then check the licenses shown for that person.
  • Microsoft covers these screens in “Assign licenses to users in the Microsoft 365 admin center.”

Check from the user side for a clean picture

You have two spots to verify usage by user:

  • Users > Active users: filter the view by Licensed or Unlicensed to see who is consuming a seat or who needs one.
  • User details: open a user and select Licenses and apps to see which products are assigned.
  • To keep a record, select Export users on the Active users page. Choose the current view so the Licensed column is included.

Watch renewals and seat counts on Your products

  • Go to Billing > Your products.
  • Pick a subscription to see total seats, assigned seats, renewal date, and status. This aligns with Microsoft’s “View your products and services” doc.
  • If you are often at or near full usage, consider adjusting seat counts here before a renewal crunch.

Make license checks part of your routine

  • Weekly quick check:
    • Open Billing > Licenses and confirm Available seats for your key products.
    • Open Users > Active users, filter to Unlicensed, and clear any pending assignments.
  • Monthly deeper check:
    • Export the Active users list and compare to your headcount or team roster.
    • Review Your products for upcoming renewals or trial expirations.

Use Torii

Instead of managing Microsoft 365 directly, you can leverage Torii, a SaaS Management Platform, to track license use in Microsoft 365. SMPs combine all your SaaS subscriptions in one place, giving you a single, trustworthy view across your entire toolset.

To monitor Microsoft 365 license usage from Torii, follow these steps:

1. Sign up for Torii

Contact Torii to request a free two-week proof-of-concept.

2. Connect your Microsoft 365 account to Torii

Once your Torii account is active, connect Microsoft 365 to Torii (assuming you already have a tenant). See the setup guide here: Here are the instructions for the Microsoft 365 integration.

3. Search for Microsoft 365 within Torii

Use the search bar at the top of the Torii dashboard to find Microsoft 365. That will take you to the Microsoft 365 app page, where you can review key details such as license counts, total spend, next renewal date, and more.

torii and microsoft 365

Or, chat with Eko

Torii’s AI copilot, Eko, lets you pull up Microsoft 365 details inside Torii using natural-language chat. Click the Eko icon in the bottom-right corner of the dashboard, then ask it to locate Microsoft 365 information. The results will appear directly in the chat window.

using eko to monitor license usage in microsoft 365

Use Microsoft 365’s API

Here, you’ll use Microsoft Graph to pull license inventory, see who holds each SKU, and check activity trends. No portals, just API calls you can automate.

Get an app-only access token

You’ll call Microsoft Graph with application permissions. In the Graph docs, see “Get access on behalf of your application.”

  • Required application permissions:
    • Directory.Read.All (for subscribedSkus and users)
    • Reports.Read.All (for Reports endpoints)

Example token request with client credentials (v2.0 endpoint):

curl -X POST https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-D "client_id={client_id}&client_secret={client_secret}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&grant_type=client_credentials"

Save the access_token for the next calls:

TOKEN="{access_token}"

Pull your tenant’s license inventory

Use Microsoft Graph v1.0 GET /subscribedSkus. The docs explain the response fields, including SKU IDs, product codes, and counts.

Example curl is:

curl -s https://graph.microsoft.com/v1.0/subscribedSkus \
-H "Authorization: Bearer $TOKEN"

What to look at:

  • SkuId and skuPartNumber identify the product.
  • prepaidUnits has your purchased quantities:
    • Enabled
    • Suspended
    • Warning
    • ConsumedUnits is how many are assigned.

Quick math idea: available = prepaidUnits.enabled - consumedUnits.

See who holds each license

Use GET /users with select fields for assignedLicenses. The Microsoft Graph “List users” docs cover these properties and paging.

First page example:

curl -s "https://graph.microsoft.com/v1.0/users?\$select=id,displayName,userPrincipalName,assignedLicenses,assignedPlans&\$top=999" \
-H "Authorization: Bearer $TOKEN"

If you need to filter by a specific product, use the SKU’s GUID from /subscribedSkus and an advanced query. The docs note you must add ConsistencyLevel and $count for collection filters.

Example curl is:

SKU_ID="{guid_from_subscribedSkus}"
curl -s -G https://graph.microsoft.com/v1.0/users \
-H "Authorization: Bearer $TOKEN" \
-H "ConsistencyLevel: eventual" \
--data-urlencode '$count=true' \
--data-urlencode '$top=999' \
--data-urlencode '$select=displayName,userPrincipalName,assignedLicenses' \
--data-urlencode "$filter=assignedLicenses/any(x:x/skuId eq $SKU_ID)"

Paging:

If the response includes @odata.nextLink, call that URL until it stops to get all users.

Map product codes and service plans

The /subscribedSkus response also includes servicePlans for each SKU. The Graph docs for subscribedSkus explain plan IDs and names.

  • Helpful fields:
    • SkuPartNumber. A human-readable product code, like ENTERPRISEPREMIUM.
    • ServicePlans[].servicePlanName and provisioningStatus show what services a SKU enables and whether they’re provisioned.

Example curl is:

curl -s https://graph.microsoft.com/v1.0/subscribedSkus?\$select=skuId,skuPartNumber,servicePlans \
-H "Authorization: Bearer $TOKEN"

Compare inventory to assignments

You now have:

  • Total purchased and consumed from GET /subscribedSkus.
  • Which users hold which SKUs from GET /users.

Line them up by skuId:

  • For each skuId, check consumedUnits against your list of users filtered by that skuId.
  • If consumedUnits is higher than expected, re-run the user filter to spot duplicates or stale assignments.

License assignment tells you consumption. Activity reports help you see if those seats are used. The Microsoft Graph Reports API docs cover these CSV reports.

Examples:

30-Day active user counts across services:

curl -s -L "https://graph.microsoft.com/v1.0/reports/getOffice365ActiveUserCounts(period='D30')" \
-H "Authorization: Bearer $TOKEN"

Microsoft 365 Apps monthly active users:

curl -s -L "https://graph.microsoft.com/v1.0/reports/getMicrosoft365AppsUsageUserCounts(period='D30')" \
-H "Authorization: Bearer $TOKEN"

These return CSV streams. Join this data with your SKU consumption to spot licenses that are assigned but not active.

Schedule and alert with only the API

  • Poll /subscribedSkus daily to track consumedUnits.
  • Use the filtered /users call per skuId to list assigned users.
  • Pull one or two Reports endpoints to compare activity vs assignments.
  • If consumedUnits nears prepaidUnits.enabled, trigger your alert. The Graph docs cover rate limits and best practices so you can schedule calls without throttling.

Key Graph doc endpoints to use:

  • GET /subscribedSkus
  • GET /users with assignedLicenses and advanced queries
  • Reports: getOffice365ActiveUserCounts, getMicrosoft365AppsUsageUserCounts

Use Claude (via MCP)

You can also retrieve this data directly in Claude using the Model Context Protocol (MCP). Claude is Anthropic’s AI assistant and a ChatGPT alternative.

To check Microsoft 365 license usage right from Claude, follow these steps:

1. Set up Torii

Follow the above Torii steps to connect your Microsoft 365 account to Torii.

Generate an API key from the Settings page.

2. Set up MCP in Claude

Here are the Torii MCP instructions. There is also a blog post on the topic.

Install the Claude Desktop app, then add the following to your claude_desktop_config.json:

{
    "mcpServers": {
        "Torii MCP": {
            "command": "env",
            "args": [
                "TORII_API_KEY=YOUR_API_KEY",
                "npx",
                "@toriihq/torii-mcp"
            ]
        }
    }
}

Create this API key in Torii’s Settings.

3. Chat with Claude

Once connected, you can interact with your Torii environment directly in Claude. For example, ask it to review your Microsoft 365 setup-how many licenses you hold, total spend, upcoming renewal dates, and similar insights.

torii mcp with microsoft 365

Frequently Asked Questions

To check Microsoft 365 license usage, open the Microsoft 365 admin center: Billing > Licenses, drill into a product to view assigned users, verify Users > Active users and export the current view. Alternatively use Torii or Microsoft Graph for automated reports.

Sign up for Torii, connect your Microsoft 365 tenant, then search the Microsoft 365 app in the Torii dashboard to see license counts, spend, and renewal dates. Use Eko, Torii’s AI copilot, to query license details via natural language.

Use GET /subscribedSkus to get purchased and consumed counts, GET /users?select=assignedLicenses to list holders, and Reports endpoints like getOffice365ActiveUserCounts or getMicrosoft365AppsUsageUserCounts for activity CSVs. Combine these to map inventory to usage.

Register an app in Azure AD, grant application permissions Directory.Read.All and Reports.Read.All, then request a client_credentials token from https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token using client_id and client_secret. Save the returned access_token for API calls.

Compare prepaidUnits.enabled to consumedUnits from /subscribedSkus, then cross-check assigned users from /users and activity CSVs to find accounts assigned but inactive. Export and review regularly, reclaim or reassign stale seats to reduce waste.

Automate daily polling of /subscribedSkus and filtered /users per skuId, fetch one or two Reports endpoints for activity, and trigger alerts when consumedUnits approaches prepaidUnits.enabled. Respect Graph rate limits and use paging to retrieve all users.