To check archive mailbox sizes in Exchange Online, list the mailboxes that have an archive with Get-EXOMailbox -Archive, then read each archive's size with Get-EXOMailboxStatistics -Archive and compare it with the archive quota. Microsoft's usage reports leave archives out of their storage figures, and an archive with auto-expanding archiving on grows past its quota.
| Method | Best fit |
|---|---|
| PowerShell | A CSV of every archive's size against its quota, largest first. |
| Admin centre | Seeing which mailboxes have an archive, without their sizes. |
| Altivane | Recommended for storage reviews, with archives near or at their quota rated and a workbook to keep. |
Before you start
Use an account in a role group that can read mailbox settings: Microsoft lists Organization Management and Recipient Management, and says members of View-Only Management can view the configuration.
Know the limits. Microsoft gives a new archive up to 100 GB, with the warning quota at 90 GB. With auto-expanding archiving on, it adds space as the archive fills, up to 1.5 TB including the Recoverable Items folder, or 3 TB with some E5 licences. Auto-expanding archiving needs Exchange Online Plan 2, or Plan 1 with the Exchange Online Archiving add-on. The script reads sizes as they are when it runs. The examples read and export; they turn on no archive and change no quota.
Option 1
Check archive mailbox sizes with PowerShell
Install the module once, then connect and export each archive's size, reading 1 mailbox at a time.
# Install once, if the module is not already installed.
Install-Module ExchangeOnlineManagement -Scope CurrentUser$ErrorActionPreference = 'Stop'
Connect-ExchangeOnline -ShowBanner:$false
try {
$properties = 'ArchiveQuota', 'ArchiveWarningQuota', 'AutoExpandingArchiveEnabled'
$mailboxes = @(Get-EXOMailbox -Archive -ResultSize Unlimited -Properties $properties)
$report = @(foreach ($mailbox in $mailboxes) {
$identity = $mailbox.UserPrincipalName
if (-not $identity) { throw "No user principal name for $($mailbox.DisplayName)." }
$bytes = $null
try {
$size = "$((Get-EXOMailboxStatistics -Identity $identity -Archive).TotalItemSize)"
if ($size -match '\(([\d,]+) bytes\)') { $bytes = [int64]($Matches[1] -replace ',') }
} catch {
Write-Warning "The archive of $identity couldn't be read: $($_.Exception.Message)"
}
[pscustomobject]@{
Mailbox = $mailbox.DisplayName
Address = $mailbox.PrimarySmtpAddress.ToString()
Type = $mailbox.RecipientTypeDetails
ArchiveGB = if ($null -ne $bytes) { [math]::Round($bytes / 1GB, 2) } else { $null }
Quota = "$($mailbox.ArchiveQuota)"
WarningQuota = "$($mailbox.ArchiveWarningQuota)"
AutoExpanding = $mailbox.AutoExpandingArchiveEnabled
}
})
if ($report.Count -eq 0) {
Write-Output 'No mailbox has an archive.'
} else {
$report | Sort-Object ArchiveGB -Descending |
Export-Csv -Path './archive-mailbox-sizes.csv' -NoTypeInformation -Encoding utf8
Write-Output "$($report.Count) archive mailboxes exported."
}
} finally {
Disconnect-ExchangeOnline -Confirm:$false
}The CSV has 1 row for each archive, largest first, with its quota and warning quota as Exchange writes them. The script reads the byte count Exchange gives in brackets in TotalItemSize, so the result does not depend on how the size is rounded. An archive whose size can't be read is named in a warning and left blank. To narrow it to shared mailboxes, add -RecipientTypeDetails SharedMailbox to Get-EXOMailbox.
Check 1 archive
Reconnect with Connect-ExchangeOnline, then read 1 archive with its Recoverable Items.
# Run while connected to Exchange Online. Replace the example mailbox.
Get-EXOMailboxStatistics -Identity 'person@example.com' -Archive |
Select-Object DisplayName, TotalItemSize, TotalDeletedItemSize, ItemCountOption 2
See which mailboxes have an archive in the admin centre
- Sign in to the Microsoft 365 admin centre for the correct tenant and go to Reports > Usage. If Reports is missing, select Show all first.
- Under Reports, select Exchange. On the Email activity tab, select View More, then choose Exchange > Mailbox usage from the list.
- Select Choose columns and add Has Archive, which shows whether each mailbox has an online archive.
- In the Exchange admin centre, Recipients > Mailboxes shows Active in the Archive status column for a mailbox with an archive.
This suits finding the mailboxes that have an archive. It does not suit checking sizes: Microsoft's Storage chart leaves archive mailboxes out, and the table has no column for an archive's size.
Option 3 ยท Recommended for storage reviews
Run Altivane's Archive Mailboxes report
- Open Altivane and choose the tenant.
- Run the Archive Mailboxes report for Exchange Online.
- Open the Excel workbook and read the table of the same name, largest first: Archive Status, Auto-Expanding, Size (GB), Items, Recoverable Items (GB), Quota (GB) and Used (%).
- Run the Mailbox Sizes report next for the primary mailboxes.
Altivane marks an archive Warning over its warning quota and Critical when it is full, and leaves auto-expanding archives unrated against a quota they grow past. It counts auto-expanding archiving turned on for the whole organisation as well as for 1 mailbox, which the script does not. A shared mailbox with an archive and no licence is marked Warning, and a mailbox with no retention policy says so in its note.
Contact usCommon questions
Why is an archive over 100 GB not full?
Auto-expanding archiving is on for it. When the archive reaches its quota, Microsoft converts it and adds space, which can take up to 30 days to arrive. With a hold or retention policy, turning it on raises the quota to 110 GB first.
Why does the archive look smaller than its quota says?
TotalItemSize is the part the user sees, and Recoverable Items is counted apart, in TotalDeletedItemSize. Microsoft counts Recoverable Items towards the limit of an auto-expanding archive, so check both for an archive on hold.
How do I check the primary mailbox sizes too?
Primary mailboxes have their own quotas and appear in Microsoft's usage reports. See how to export Exchange Online mailbox sizes.
Microsoft references
Technical references checked on 7 November 2026. The example scripts have been reviewed and syntax checked; they have not been run against a live tenant.