sysop@hub:~/tools/license-optimizer$
license-optimizer
Drop an export of your users and their Microsoft 365 licences. You see how much of the monthly bill pays for nothing: licences on blocked accounts, licences already covered by a bigger one, accounts nobody uses and seats assigned to no one. The file is read by your browser and never uploaded.
getting the export
| Source | What you get |
|---|---|
| Export script (recommended) | Everything: last sign-in per user, seats bought and assigned, group-based assignment, and shared mailboxes if you are also connected to Exchange Online. Read-only. |
| Microsoft 365 admin center | Users, Active users, Export users. Enough for blocked accounts, covered licences and guests. It has no sign-in dates and no seat totals, so those checks are skipped. |
The export script. Run it in PowerShell 7, then drop the resulting licences.json above.
what it checks
| Check | Triggers when | Counted as |
|---|---|---|
| Blocked accounts | Sign-in is blocked and the account holds paid licences. | can go now |
| Covered licences | Everything a licence contains is part of another licence the same user has, for example Entra ID P1 next to Microsoft 365 E3, or Business Basic next to Business Premium. | can go now |
| Shared mailboxes | A shared mailbox holds a paid licence. | check first |
| Guests | A guest account holds a paid licence. | check first |
| Never signed in | Older than 30 days, licensed, and no sign-in on record. | check first |
| Inactive | No interactive or background sign-in for more than 90 days. | check first |
| Unassigned seats | A subscription has more seats than assigned users. | at renewal |
| Assignment errors | A group could not assign a licence to a user. | no cost |
| Direct assignments | A user gets licences from a group and others by hand. | no cost |
Each licence of a user is counted once, in the order of the table. The money figures use the prices in the table on the result, which start as rough list prices and are yours to correct. A licence you remove from a user becomes an unassigned seat first. The bill only shrinks when you reduce the seat count, which on an annual term is possible at renewal. The page knows what the common suites and add-ons contain. It does not know how much a person actually uses a product, so it cannot tell you who could move from E5 to E3. Products it does not recognise are listed with a price of zero until you enter one.
Related: license comparison offboarding checklist find inactive guests Intune fleet analyzer cockpit