Compare
LicenseMeter vs a manual PowerShell audit
If you can write Get-MgUser and Get-MgSubscribedSku one-liners, you can audit licenses for free, and for a one-off check that is a perfectly good answer. This page is about what changes when the audit has to be joined across signals, priced in euros and repeated every month.
Side by side, dimension by dimension
| Dimension | Manual PowerShell | LicenseMeter |
|---|---|---|
| Cost | Free, apart from the hours it takes to write, run and interpret the output. | Flat monthly price per tenant, sized by seat count. The first scan is free. |
| Data gathering | Separate calls: Get-MgUser for accounts, Get-MgSubscribedSku for seat counts, audit logs for sign-ins, usage reports per workload. You join the results yourself. | One nightly sync joins directory data, license assignments, sign-in activity and per-workload usage reports into a single per-user picture. |
| Sign-in activity | signInActivity needs Entra ID P1. Without it, your script has to fall back to workload reports, and you have to build that fallback. | Same Graph constraint, handled for you: without P1, inactivity detection automatically falls back to per-workload usage reports. |
| Euro figures | SKU GUIDs and part numbers. Mapping them to what a seat actually costs is a manual lookup you repeat every run. | Every finding carries a monthly euro figure from an editable per-tenant price book, prefilled with list-price estimates. |
| Cadence | Runs when someone remembers to run it. Between runs, new leavers and new idle seats bill unnoticed. | Nightly sync plus manual sync, with full sync history. Waste is monitored month after month, not sampled once. |
| Findings workflow | Console output or a CSV you triage in a spreadsheet. Re-running the script forgets what you already decided. | Findings persist with an acknowledge and reopen workflow, so the seats you have already handled stay handled across syncs. |
| Finance handoff | You format the export yourself and explain the columns in the email. | One-click CSV export of all findings with their monthly cost, written for the finance side of the renewal conversation. |
| Remediation | You write the cleanup script, and you own every line of it. | Generates the PowerShell remediation script for you. Your IT reviews and runs it; LicenseMeter itself never writes to the tenant. |
| Beyond Microsoft 365 | Graph cmdlets stop at the tenant boundary. Adobe, Zoom or Salesforce seats need separate scripts against separate admin APIs. | Connectors cross-check Adobe, Zoom, Atlassian, Salesforce, OpenAI, Anthropic, ChatGPT and Claude seats against Entra ID in the same pass. |
When a script is enough
Honestly: often. A tenant small enough to eyeball, a single question like “which disabled accounts still hold licenses?”, a one-time cleanup before a renewal, or a team that already maintains Graph scripts and enjoys it - in all of those cases, PowerShell is free, transparent and entirely under your control. LicenseMeter exports its remediation as PowerShell precisely because we expect your IT to keep working that way: it complements the shell, it does not replace it.
What a script cannot easily give you
The join, maintained
The hard part is not any single cmdlet, it is joining accounts, license assignments, sign-in activity and Exchange, OneDrive, SharePoint and Teams usage per user, and keeping that join working when the tenant lacks Entra ID P1 or conceals report names, Microsoft’s default since 2021. LicenseMeter detects both cases and degrades rule by rule instead of failing the run.
Memory between runs
A script produces a snapshot. Monitoring needs state: which findings are new since last month, which you acknowledged, which came back. LicenseMeter keeps findings across nightly syncs with acknowledge and reopen actions, so the audit becomes a process rather than a yearly archaeology project.
Numbers finance accepts
A list of stale SKU assignments starts a debate; a monthly euro figure starts a decision. The per-tenant price book prices every finding, prefilled with list-price estimates and editable to your negotiated rates, and the CSV export hands finance the list in their own format.
A safer permission story
Ad-hoc scripts run with whatever rights your admin account has. LicenseMeter uses exactly 5 read-only application permissions (User.Read.All, AuditLog.Read.All, Reports.Read.All, LicenseAssignment.Read.All, ReportSettings.Read.All), granted once via admin consent and listed in full on the security overview. No write scope exists.
Keep your scripts. Skip the joining.
Connect read-only, get the joined, priced findings in minutes, and take away a generated PowerShell script your team reviews and runs.
After the free scan, 14 days of full monitoring, free. No credit card, read-only access.