How to Report and Reduce Microsoft 365 License Cost for Unused Licenses

How to report & reduce unused microsoft 365 license cost

One of the first questions I help new clients answer is, ‘What is the total Microsoft 365 license cost of unused licenses today?’

Unused licenses are typically those assigned to users who are blocked from signing in, haven’t logged in for a long time, or have an outdated activity date in Microsoft 365.

Microsoft 365 offers several reports and views that attempt to answer these questions, but most come with their own limitations.

So, let’s take a look at how to obtain this information using Microsoft’s native tools and compare it with a faster, simpler alternative, sapio365.

Solution 1: Build a report with Microsoft native tools

When it comes to understanding Microsoft 365 license costs, most admins start with Microsoft 365 admin centers or turn to PowerShell. These native tools can shed light on your Microsoft 365 license cost, but the process isn’t as straightforward as you might expect.

Microsoft 365 Entra admin center

Although information about your purchased licenses can be found in the billing section of the general Microsoft 365 admin center, additional user properties and filters are available in the Entra admin center. But you’ll quickly notice a few frustrating limitations.

1 – For starters, you can only filter blocked users for one license type at a time, so prepare for some manual list-building.

The Microsoft Entra admin center allows you to combine filters on the Users view, but only for one license at a time.

2 – Second, to get a list of users who haven’t signed in for a while, you can filter on the last sign-in date, but you can’t add any other filters like enabled, member and licenses.

The Entra admin center does not allow the addition of other filters when users are filtered by their last sign-in date.

3 – Finally, to get a list of inactive users with licenses, you’ll need to look up the usage report in Entra. Unfortunately, this report is too broad to determine who’s not using services included in their license. Unfortunately, there’s no way to filter out blocked users or those who haven’t logged in recently.

The Active Users report in Entra does not include properties such as account enabled and last sign-in.

The only way to obtain a comprehensive picture of these states is to collate the data from all the different views manually. All of this means that your Microsoft 365 license cost analysis can quickly become a manual, time-consuming task if you rely solely on the native tools.

If you’ve got the time and some PowerShell skills, scripting (or using Microsoft Graph Explorer) is always an option.

Microsoft Graph Explorer and PowerShell

If you opt to use Microsoft Graph PowerShell, you’ll need to integrate specific cmdlets into your script.

1 – For example, to get the licenses assigned to blocked users, you’ll need to:

  • Connect to Microsoft Graph: Connect-MgGraph -Scopes “User.Read.All”.
  • Get the list of blocked users: Get-MgUser -Filter “accountEnabled eq false” -Select DisplayName, UserPrincipalName, AccountEnabled
  • To grab license details for each user, run: Get-MgUserLicenseDetail -UserId “username@domain.com”

2 – To get users who haven’t signed in a long time:

  • Use Microsoft Graph PowerShell, and connect with the proper scopes: Connect-MgGraph -Scopes “AuditLog.Read.All”, “User.Read.All”
  • Filter users by their last sign-in date:

Get-MgUser -All -Property DisplayName,UserPrincipalName,SignInActivity | Where-Object {!$_.SignInActivity.LastSignInDateTime -or [datetime]$_.SignInActivity.LastSignInDateTime -lt (Get-Date).AddDays(-90)} | Format-Table DisplayName, UserPrincipalName, @{Name=’LastSignInDateTime’; Expression={ $_.SignInActivity.LastSignInDateTime }}

Get-MgUser cmdlet example to get a list of users who haven’t signed in the last 90 days.
  • Or, use Microsoft Graph Explorer with a filter on the last sign-in date: v1.0/users?$select=userPrincipalName,assignedLicenses,userType,signInActivity&$filter=signInActivity/lastSignInDateTime%20lt%202025-05-18T00:00:00Z&$count=true
Using Microsoft Graph Explorer to filter for users on the last sign-in date.

3 – To get users with an old Microsoft 365 activity date:

  • Connect to Graph with the right scope if you haven’t already: Connect-MgGraph -Scopes “Reports.Read.All”
  • Export the Microsoft 365 Active User report: Get-MgReportOffice365ActiveUserDetail -Period “D30” -OutFile “C:\Users\SoniaBounardjian\Desktop\Exports\M365UserActivity.csv”
Export the Microsoft 365 Active User report with Graph PowerShell.

As you can see, to accurately report the cost of users with unused licenses using Microsoft’s native tools, manual consolidation of outputs from different scripts or views is required, and you’ll need to add license costs in Excel.

In fact, combining the data for blocked users, those inactive for an extended period, and users with outdated activity can be tedious and complex, whether handled manually or with scripting. So let’s jump to a faster solution: sapio365.

Solution 2: Quickly create a license consumption report in sapio365

Looking for a no-code way to report and control your Microsoft 365 license cost? sapio365 makes it remarkably simple to manage unused licenses and overall spend.

The License Consumption Analysis report in sapio365 enables you to automate Microsoft 365 license cost tracking and highlights inactive, unused, and costly assignments across your tenants.

This report loads Usage Reports to analyze user license consumption and report on licensed users who have been inactive for a chosen time period. You can run it now, or you can schedule it and even run it for multiple tenants at once.

Click and run the license report

In the sapio365 Jobs section:

  1. Run the job “License Consumption report”
  2. Select the services that you want to relate to assigned licenses for a cost analysis.
  3. Select licenses relevant to each service.
  4. (optional) Update date ranges for the analyses and labels if necessary.
Click and run a license consumption report based on the usage of selected services.

Once it’s done, you’ll get a clear breakdown of license costs by user and service usage.

sapio365 will show you the total sum of license costs of:

  • Users who are blocked from signing in
  • Users who haven’t signed in for a long time
  • Users who were inactive for a long time

You can copy/paste this information or export from sapio365.

See the breakdown of license costs by user and by service usage in sapio365.

Remove unused licenses in 1 click in sapio365

Now that you have information about your unused licenses, you can easily remove them directly from this view.

sapio365 lets you:

  • Remove all assigned licenses in one click
  • Review applied changes before committing them.

You can get more details on how to manage directly assigned licenses and group-based licenses in one place in this article.

Remove all assigned licenses in one click in sapio365.

Schedule a monthly M365 licensing report

sapio365 even lets you automate regular Microsoft 365 license cost reports, meaning you’re always on top of cost-saving opportunities.

To schedule this automated license cost report, you have various options:

  1. Select when and how often you want to run the report.
  2. Create a report for more than one tenant.
  3. Save a grid Snapshot if you want to remove the licenses from there later.
  4. Email the report.
  5. Once you’re done, you’ll see the job in the list.
Schedule a comprehensive cost report for unused Microsoft 365 licenses.

To recap, here’s how Microsoft’s built-in tools compare to sapio365 when it comes to tracking, analyzing, and optimizing your Microsoft 365 license cost.

Feature Native Tools (Microsoft 365 License Cost) sapio365 (Microsoft 365 License Cost Automation)
Setup Manual, script-heavy, time-consuming No-code, automated, quick setup
Filters & Views Limited (one-at-a-time), manual export Multiple filters, all data in one dashboard
Inactive User & Cost Tracking Needs custom scripts, broad reports Automatic inactive reporting, cost breakdown
Cost Calculation Multi-step, export and combine Immediate per-user and service cost analysis
License Removal Manual or via separate PowerShell scripts One-click removal directly from the cost analysis report
Scheduling (Microsoft 365 License Cost) Not natively supported Automated, recurring cost reports
Multi-Tenant Management Separate processes per tenant Manage & report costs across multiple tenants
Ease of Use Technical skills needed, slow Point-and-click simplicity, effortless

In short, sapio365 provides fast answers to the Microsoft 365 license cost of unused licenses through simple automatic reports. No scripts, no spreadsheets—just the real numbers you need to manage expenses and keep your licenses under control. Everything’s faster and simpler. And with one-click license removal, keeping license costs under control is a breeze.

Give sapio365 a try and see for yourself just how easy managing unused licenses can be.


Sonia Bounardjian

Sonia is a sapio365 product specialist at Ytria. She was part of the initial development team that created sapio365. When she's not busy helping sapio365 users virtually or writing helpful articles in this blog, she's reorganizing her impressive collection of unused high heels.