← All articles
·7 min read·Cost optimisationHow-to

How to Find Unused Microsoft 365 Licenses: The Complete Guide

In most Microsoft 365 tenants we've analysed, 10–20% of paid licenses are effectively unused. For a 500-user organisation on E3 ($36/user/month), that's $21,000–$43,000 per year quietly leaving the building. Here's how to find it — manually or automatically.

What "unused" actually means

A license isn't just unused when it's unassigned. The expensive waste hides in assigned licenses:

  • Inactive users — assigned a license, but no sign-in or app activity for 30/60/90+ days
  • Disabled accounts — the account is blocked from sign-in but still holds a paid seat
  • Departed employees — offboarding removed access but nobody reclaimed the license
  • Over-provisioned users — on E5 or Business Premium, using nothing beyond email
  • Shared mailboxes with licenses — shared mailboxes under 50 GB don't need one at all

Method 1: The Microsoft 365 admin center

Go to Billing → Licenses to see assigned vs. purchased counts. This catches unassigned seats you're still paying for — the easy 2%.

For activity, go to Reports → Usage. The "Active users" report shows per-service activity over 7/30/90/180 days. Cross-referencing this against license assignments is where the real waste appears — but the admin center won't do that join for you. You'll be exporting CSVs.

One catch: if your organisation has privacy concealment enabled, usage reports show anonymised user IDs. An admin must disable concealment (Settings → Org settings → Reports) before names appear.

Method 2: PowerShell

With Microsoft Graph PowerShell you can pull license assignments and sign-in activity, then join them:

  • Get-MgUser -All -Property AssignedLicenses,SignInActivity,AccountEnabled
  • Filter for AccountEnabled -eq $false with non-empty AssignedLicenses — disabled accounts holding seats
  • Filter LastSignInDateTime older than 90 days — inactive licensed users

This works and it's free. The downsides: sign-in activity needs Entra ID P1, SKU GUIDs need mapping to human names, per-app usage (Teams vs Exchange vs Office) needs separate report endpoints, and you have to remember to run it. Most admins run this audit once, save the money, and never run it again — while the waste re-accumulates.

Method 3: Automated tooling

This is the job SeatPrune was built for. It connects to your tenant via Microsoft Graph, syncs license assignments, costs, and per-service usage, then continuously flags:

  • Licensed users with no activity in 30/60/90 days, and the exact monthly cost
  • Disabled accounts still holding licenses
  • Downgrade candidates (paying for E5, using E3 features)
  • Shared mailbox and duplicate-license waste

The difference from the PowerShell approach isn't the data — it's that the audit runs every day, and every finding has a dollar figure attached. See also our audit checklist for the full list of what to check.

What to do with what you find

  1. Reclaim before you cancel. Unassign licenses from inactive/disabled users first; let them pool.
  2. Right-size at renewal. Reduce your committed count at the annual renewal date — mid-term reductions are restricted under Microsoft's NCE terms.
  3. Fix the process. Add license reclamation to your offboarding checklist so the waste stops re-growing.
A 500-user tenant that finds even 8% waste recovers roughly $1,400/month. The audit takes an afternoon by hand — or five minutes with a tool. Either way, do the audit.

Find out what your tenant is wasting

SeatPrune audits your Microsoft 365 licenses and prices every finding in $/month. Free up to 200 users.

Start Free