A zombie report is a report that nobody has opened in months but that still lives in a workspace — refreshing its dataset on schedule, consuming capacity and storage, showing up in search results, and widening your security and audit surface. Every Power BI tenant older than a year has them; large tenants have thousands.
Why unused content is worth hunting
- Cost: scheduled refreshes of unwatched datasets burn capacity units and, on Premium/Fabric SKUs, contribute to throttling and oversized capacity purchases.
- Risk: every forgotten report is still shareable and still governed by whatever permissions it had years ago.
- Trust: when five versions of "Sales Overview" coexist, nobody is sure which one is the real number.
Method 1 — Usage metrics in the service
Every report has a built-in usage metrics report (report menu → Usage metrics) showing views and viewers. It is the quickest check for a single report, but it only covers a rolling ~30-day window, works report-by-report, and cannot give you a tenant-wide list of what is idle.
Method 2 — The unused-artifacts admin API
The admin REST API has a purpose-built (preview) call that returns datasets, reports and dashboards not used within the last 30 days — one workspace at a time:
Login-PowerBI # Power BI PowerShell module, admin account
$workspaces = Get-PowerBIWorkspace -Scope Organization -All
foreach ($w in $workspaces) {
Invoke-PowerBIRestMethod -Method Get `
-Url "admin/groups/$($w.Id)/unused"
}Method 3 — Build your own usage store from the activity log
The tenant activity log records every report view. Admins can export it via the Get Activity Events API (or Get-PowerBIActivityEvent), one day per call, with roughly a month of lookback. Persist those events into a database every day and you can answer "no views in N months" for any N — this is the correct foundation, but now you own a scheduled pipeline, a database, API limits and schema drift.
What a continuous approach looks like
The DIY methods share one weakness: they are snapshots. Usage governance only works when view events are collected every day, kept for months, joined with a live inventory of workspaces, reports and datasets, and evaluated against an "unused" rule your organization actually agrees with. That is precisely what PGR Sonar does — it syncs your tenant on schedule, accumulates usage history, and keeps a standing list of unused reports and models across every workspace, with the threshold under your control.