Microsoft has confirmed that Exchange Online does not, and likely will not in the immediate future, offer a native utilization report for room or resource mailboxes. The confirmation came directly from the Exchange Team on May 21, 2026, in response to long-standing administrator feedback. It leaves organizations with no out-of-the-box way to gauge how frequently meeting rooms are actually booked, forcing them to rely on manual extraction of calendar data using PowerShell or Microsoft Graph.
The absence of a built-in report has been a pain point for years. Resource mailboxes—the objects that represent conference rooms, projectors, or other bookable assets—generate a wealth of scheduling data. Yet the Exchange admin center provides no dashboard or report to surface that data into actionable insights. Without it, facilities managers and IT teams struggle to answer basic questions: Which rooms sit empty 90% of the time? Are any rooms consistently overbooked, leading to double-booking conflicts? Is it time to repurpose an underused space or invest in more capacity?
The Confirmation from Microsoft
In a statement posted to the Microsoft 365 message center and echoed by support engineers, the Exchange Team said: “Currently, there is no native report in Exchange Online that shows resource mailbox utilization. To obtain this information, you need to extract calendar events and interpret the data manually.” The team recommended using the Exchange Online PowerShell V2 module or the Microsoft Graph Places and Calendar APIs as the primary paths to gather the raw scheduling information.
The announcement, while not surprising to seasoned Exchange admins, formalizes what many had suspected after years of silence on the feature request. UserVoice items and community posts dating back over half a decade have asked for exactly this capability, often pointing to third-party tools like RoomFinder, Robin, or Teem that charge per-room fees simply to fill the visibility gap.
Why Room Mailbox Utilization Data Matters
Room utilization reporting is not a luxury; it’s a critical component of workplace management, especially as hybrid work reshapes office footprints. Real estate is often the second-largest expense for enterprises after payroll. A 2025 Gartner survey found that 48% of midsize to large companies had reduced their physical office space since 2023, yet meeting room contention remained high on peak days. Without hard data, facility decisions are made on anecdotal evidence.
Moreover, from a purely technical standpoint, unused or orphaned room mailboxes become clutter. They consume a license (though resource mailboxes are free, they still require management), show up in address lists, and can cause confusion during scheduling. A well-maintained directory means cleaning up rooms that haven’t been booked in 12 months—something impossible to audit without a report.
The Workarounds: PowerShell and Graph
Microsoft’s guidance points to two programmatic avenues: Exchange Online PowerShell and Microsoft Graph. Both require a moderate understanding of scripting and the ability to process and present the resulting data.
Exchange Online PowerShell
The Exchange Online PowerShell V2 module, specifically the Get-CalendarProcessing and Get-MailboxFolderStatistics cmdlets combined with Search-Mailbox or direct access to calendar items via EWS (Exchange Web Services), can be used to fetch booking data. However, this approach is cumbersome. The cmdlets provide configuration details—like booking window limits or auto-accept settings—but not a simple count of meetings. To compile utilization, an administrator must:
- Connect to Exchange Online PowerShell (EXO V2).
- Retrieve a list of all room mailboxes with
Get-Mailbox -RecipientTypeDetails RoomMailbox. - For each mailbox, access the calendar folder and enumerate appointments over a date range. This traditionally required EWS or the newer REST-based cmdlet
Get-ExoCalendarItem, which is part of the ExchangeOnlineManagement module (version 3.0 and later). - Calculate metrics like total booked minutes, percentage of working hours utilized, or average attendance (attendee count can be pulled from appointment properties).
A basic script snippet to get all room mailboxes and their calendar items for the past 30 days might look like this:
Connect-ExchangeOnline
$rooms = Get-Mailbox -RecipientTypeDetails RoomMailbox
$startDate = (Get-Date).AddDays(-30).Date
$endDate = (Get-Date).Date
foreach ($room in $rooms) {
$events = Get-ExoCalendarItem -Identity $room.UserPrincipalName -StartDate $startDate -EndDate $endDate
$totalMinutes = ($events | Measure-Object -Property Duration -Sum).Sum.TotalMinutes
Write-Output "$($room.DisplayName): $($events.Count) meetings, $totalMinutes minutes booked"
}
But this raw output is only the first step. To make it useful, admins often export to CSV and build Excel dashboards, or feed the data into Power BI. The absence of built-in views means each organization recreates the wheel.
Microsoft Graph API
The Graph API provides a more modern and scalable way to access the same data, albeit with its own learning curve. The relevant endpoints are:
- Places API:
GET /places/microsoft.graph.roomreturns a list of room resources, including display name, email address, and capacity. This handles the discovery of rooms without PowerShell. - Calendar events:
GET /users/{roomUpn}/calendar/calendarView?startDateTime={start}&endDateTime={end}returns the scheduled appointments for a given room across a specified window.
With Graph, an administrator can write a script in PowerShell (using Microsoft.Graph module) or any language (Python, C#) to authenticate, pull the data, and compute utilization. The advantage is that Graph works well with Azure Automation and can be used to generate scheduled reports and even send the results to Teams or SharePoint without a full Exchange connection.
A simple Graph call via PowerShell might look like:
Connect-MgGraph -Scopes "Place.Read.All", "Calendars.Read"
$rooms = Get-MgPlace -PlaceType Room
$utilization = @()
foreach ($room in $rooms) {
$uri = "https://graph.microsoft.com/v1.0/users/$($room.EmailAddress)/calendar/calendarView?startDateTime=$((Get-Date).AddDays(-30).ToString('yyyy-MM-ddTHH:mm:ssZ'))&endDateTime=$((Get-Date).ToString('yyyy-MM-ddTHH:mm:ssZ'))"
$events = Invoke-MgGraphRequest -Uri $uri
$meetingCount = $events.value.Count
$totalMinutes = 0
foreach ($event in $events.value) {
$start = [datetime]$event.start.dateTime
$end = [datetime]$event.end.dateTime
$totalMinutes += ($end - $start).TotalMinutes
}
$utilization += [PSCustomObject]@{
RoomName = $room.DisplayName
Meetings = $meetingCount
BookedMinutes = $totalMinutes
}
}
$utilization | Export-Csv "RoomUtilization.csv" -NoTypeInformation
Both methods are functional but fail the “easy button” test that even moderately experienced IT generalists need. They also require troubleshooting permissions, throttling limits, and sometimes authentication quirks.
Community Response and Workarounds
Since the Microsoft confirmation, online forums have lit up with a mix of frustration and ingenuity. On the M365 Community forums, one administrator wrote: “We’ve been paying for a third-party room booking tool just for its utilization dashboard. It’s disappointing that a platform used by millions can’t give us a simple pie chart.” Another user shared a complete PowerShell module they built in-house that generates a weekly Power BI report, complete with heatmaps. The thread quickly amassed dozens of replies, with engineers from other organizations sharing their own scripts and power queries.
Several common themes emerged:
- Permissions are a hurdle: Accessing room calendars requires ApplicationImpersonation or full_access_as_app permissions, granting broad read access to all mailboxes. Many security teams balk at that scope.
- Throttling on large environments: For organizations with over 500 rooms, Graph queries can hit throttling limits, forcing developers to implement retry logic and incremental syncing.
- Metrics definitions vary: Is a room “utilized” if one person blocks it for four hours but never shows up? Some organizations consider any booking as usage; others filter based on actual attendee responses or check-in data from room panels. There is no single industry standard, which may partly explain Microsoft’s hesitation to build a one-size-fits-all report.
A few community members noted that the Exchange Team’s acknowledgment might actually spur faster unofficial solutions. Within a week of the announcement, a GitHub repository named “ExoRoomReporter” appeared, packaging a Graph-based PowerShell script with an Azure Function to generate a weekly HTML report. It has since been forked over 200 times.
What’s Next for Exchange Online Reporting?
Microsoft’s message center historically serves as a roadmap telegraph. The fact that they publicly stated “no native report” rather than “under development” suggests that room utilization reporting is not on the near-term roadmap. However, the growing integration of Microsoft Places—a workplace analytics tool announced in 2025—hints at a possible future. Places aims to provide insights about how spaces are used across an organization, and it could eventually ingest room booking data to offer utilization trends. But today, Places remains in preview for select customers, and its reporting layer is still focused on in-office coordination rather than historical space analytics.
In the meantime, administrators have a clear path forward, though it’s paved with DIY effort. The recommended approach combines Graph for data extraction and a business intelligence tool for visualization. Microsoft’s own documentation on working with room mailboxes (updated in early 2026) points to the Places Graph endpoints as the “modern” way forward, subtly encouraging a shift away from Exchange Online PowerShell for reporting scenarios.
For organizations just starting the journey, the following steps provide a starting framework:
- Audit existing rooms: Use PowerShell to export all room mailboxes, their capacities, locations, and booking delegates.
- Define utilization metrics: Decide whether to count booked time as a percentage of a 40-hour work week, or only during core hours. Decide if declined meetings or cancellations are excluded.
- Prototype a Graph script: Use the Microsoft Graph PowerShell SDK to pull calendar data for a small subset of rooms to validate the approach and check permissions.
- Build a dashboard: Use Power BI (with a DirectQuery or imported dataset) to visualize trends over time. Publish to a shared workspace for facilities and leadership.
- Automate: Use an Azure Automation runbook or an Azure Function to run the script on a schedule (e.g., every Monday morning) and export the report.
Conclusion
The lack of a native room mailbox utilization report in Exchange Online is a clear gap that forces administrators into custom development. Microsoft’s confirmation, while disappointing, at least provides clarity and encourages the community to share solutions. Until the company integrates such reporting into the Microsoft 365 admin center—possibly via Microsoft Places or a future Graph-based dashboard—PowerShell and Microsoft Graph remain the only official paths to visibility. The bright side? The tools are powerful and the community is generous; with a little scripting, you can turn raw calendar data into a strategic asset that saves real estate costs and improves the meeting experience for everyone.