How to inspect SharePoint site storage and quota
How full is this site, and how much may it grow?
30-second answer
Get-PnPTenantSite -Identity https://contoso.sharepoint.com/sites/finance |
Select-Object Url, StorageUsageCurrent, StorageQuota
Both values are in megabytes. StorageUsageCurrent is what the site holds;
StorageQuota is what it may hold.
What this proves
The current consumption and the ceiling, as the admin centre records them, for one site. Divide the two and you have the utilisation percentage.
What it does not prove
- That a site with room is healthy. A quota of zero, or a tenant using pooled storage, produces numbers that are not a ceiling in any practical sense. A site with no quota is not a site with room; it is a site whose limit is somewhere else.
- What is consuming the space. Version history, recycle bins and preservation holds all count, and none of them is visible here.
PowerShell
Get-PnPTenantSite | ForEach-Object {
if ($_.StorageQuota -gt 0) {
[pscustomobject]@{
Url = $_.Url
Used = $_.StorageUsageCurrent
Pct = [math]::Round(100 * $_.StorageUsageCurrent / $_.StorageQuota, 1)
}
}
} | Sort-Object Pct -Descending | Select-Object -First 10
The StorageQuota -gt 0 guard is not decoration: dividing by an absent
quota is how a storage report crashes on the one site that most needs
explaining.
Example output
Url Used Pct
--- ---- ---
https://contoso.sharepoint.com/sites/archive 23941 93.5
https://contoso.sharepoint.com/sites/finance 8102 31.6
Explanation
A site above 90 per cent of quota is close to stopping: writes fail when the quota is reached, and the people who hit that wall are users mid-upload, not administrators mid-review. The percentage is a planning number, and it only means something when the quota is a real ceiling rather than a default nobody set.
Production considerations
- Requires the admin-centre connection and a SharePoint administrator role.
- When the tenant uses automatic (pooled) storage management, per-site quotas are informational; the pool is the real limit.
- The values update on the service's schedule, not in real time. Treat them as accurate to the day, not to the minute.
References
- Manage site storage limits (Microsoft Learn)
- Get-PnPTenantSite (PnP PowerShell)
