Exchange Online Room Finder & Hierarchical Room Lists: Step-by-Step Set-Place & PowerShell Guide

In enterprise organizations with hundreds of meeting spaces spread across global headquarters, regional campuses, and multi-floor facilities, finding an available meeting room should take seconds. Yet in many Microsoft 365 tenants, users open Outlook or Microsoft Teams, click Room Finder, and encounter a broken experience: an empty room list, an unmanageable flat list of 300 mailboxes, or rooms missing critical metadata like seating capacity, display hardware, and wheelchair accessibility.

The root cause is a dual-architecture gap. Classic Outlook desktop clients rely on legacy Exchange Room List Distribution Groups (New-DistributionGroup -RoomList), while modern Outlook on the Web, the New Outlook for Windows, Microsoft Teams, and Microsoft Places rely on the Places Graph API via Set-Place. To deliver a seamless Room Finder experience, administrators must configure both layers in lockstep.

This deployment runbook walks through the end-to-end engineering process to build a hierarchical room directory in Exchange Online: provisioning room mailboxes, structuring multi-tier Room Lists, enriching hardware metadata with Set-Place, deploying a bulk CSV automation script, and troubleshooting common cache replication gotchas.

Architecture Standard:

Always establish your hierarchical taxonomy before executing PowerShell: Country ➔ City ➔ Building/Campus ➔ Floor ➔ Room Mailbox. Missing any tier will result in fragmented filtering inside Outlook Room Finder.

Table of Contents

1. Dual-Architecture: Places Graph API vs. Room List Groups

To understand why rooms fail to appear in Room Finder, administrators must distinguish how Microsoft Outlook discovers conference rooms:

Feature / Component Classic Room List DGs Modern Places API (Set-Place)
Core Cmdlet New-DistributionGroup -RoomList Set-Place -Identity <Mailbox>
Target Clients Classic Outlook for Windows (MAPI/RPC) New Outlook, Outlook Web (OWA), Teams, Places
Hierarchical Filtering Provides the “Building” dropdown picker Filters by Floor, Capacity, Wheelchair, Audio/Video
Replication Time 4 to 24 hours (OAB generation cycle) 24 to 48 hours (Microsoft Graph Substrate sync)

If you execute Set-Place without creating Room List distribution groups, users on classic Outlook will see an empty building list. Conversely, if you only build Room Lists without configuring Set-Place, modern Outlook and Teams cannot filter rooms by floor, capacity, or AV peripherals.

2. Prerequisites & Exchange Online PowerShell Module

All room configuration cmdlets require the ExchangeOnlineManagement PowerShell module (v3.2.0 or later). Connect with an account holding either the Exchange Administrator or Global Administrator role:

# Install the latest Exchange Online PowerShell v3 module
Install-Module -Name ExchangeOnlineManagement -Scope CurrentUser -Force

# Connect with Modern Authentication (MFA enabled)
Connect-ExchangeOnline -UserPrincipalName admin@yourdomain.com -ShowBanner:$false

3. Step 1: Provisioning & Sizing Room Mailboxes

Before grouping or tagging spaces, create the room resource mailbox. Ensure you define the resource capacity during initial provisioning:

# Create a new Room Resource Mailbox
New-Mailbox -Room -Name "NYC-HQ-Fl04-Boardroom" `
  -DisplayName "NYC HQ - Fl 04 - Boardroom (Cap 16)" `
  -PrimarySmtpAddress "nyc-hq-fl04-boardroom@yourdomain.com"

# Set the maximum room capacity (visible in scheduling assistant)
Set-Mailbox -Identity "nyc-hq-fl04-boardroom@yourdomain.com" -ResourceCapacity 16

# Configure calendar processing to auto-accept invites and preserve meeting subjects
Set-CalendarProcessing -Identity "nyc-hq-fl04-boardroom@yourdomain.com" `
  -AutomateProcessing AutoAccept `
  -AddOrganizerToSubject $false `
  -DeleteComments $false `
  -DeleteSubject $false `
  -ProcessExternalMeetingMessages $true

Production Gotcha:

Always set -DeleteComments $false and -DeleteSubject $false on boardrooms equipped with Microsoft Teams Rooms (MTR) or Cisco Webex Room Kits. If deleted, the meeting join link is stripped, breaking One Button to Push (OBTP).

4. Step 2: Creating Hierarchical Room List Distribution Groups

Room Lists are special distribution groups created with the -RoomList switch. Outlook Room Finder treats each Room List as a Building or Location:

# 1. Create a Room List for New York Headquarters (Building 1)
New-DistributionGroup -Name "RoomList-NYC-HQ" `
  -DisplayName "New York HQ - 350 5th Avenue" `
  -PrimarySmtpAddress "roomlist-nyc-hq@yourdomain.com" `
  -RoomList

# 2. Create a Room List for London Regional Office
New-DistributionGroup -Name "RoomList-LON-Canary" `
  -DisplayName "London Canary Wharf - 25 Bank St" `
  -PrimarySmtpAddress "roomlist-lon-canary@yourdomain.com" `
  -RoomList

# 3. Add Room Mailboxes as members of their respective Building Room List
Add-DistributionGroupMember -Identity "roomlist-nyc-hq@yourdomain.com" `
  -Member "nyc-hq-fl04-boardroom@yourdomain.com"

Add-DistributionGroupMember -Identity "roomlist-nyc-hq@yourdomain.com" `
  -Member "nyc-hq-fl04-conf-a@yourdomain.com"

To verify all active Room Lists in your tenant, run:

# List all designated Room Lists
Get-DistributionGroup | Where-Object { $_.RecipientTypeDetails -eq "RoomList" } | Select-Object DisplayName, PrimarySmtpAddress

5. Step 3: Enriching Metadata with Set-Place (Capacity, Devices, Map)

The Set-Place cmdlet decorates the Exchange mailbox with rich metadata consumed by Microsoft Graph, the New Outlook Room Finder, and Microsoft Teams Rooms:

Set-Place -Identity "nyc-hq-fl04-boardroom@yourdomain.com" `
  -Building "New York HQ" `
  -Floor 4 `
  -FloorLabel "Executive Level 4" `
  -Capacity 16 `
  -AudioDeviceName "Shure MXA920 Ceiling Array" `
  -VideoDeviceName "Cisco Quad Camera / Neat Bar Pro" `
  -DisplayDeviceName "Samsung 85-inch Dual 4K Displays" `
  -IsWheelChairAccessible $true `
  -Street "350 5th Avenue" `
  -City "New York" `
  -State "NY" `
  -PostalCode "10118" `
  -CountryOrRegion "United States" `
  -GeoCoordinates "40.7484; -73.9857" `
  -Tags "MTR-Windows", "Dual-Screen", "Whiteboard", "Executive"

Key Set-Place Attribute Specifications:

  • -Floor (Integer): Must be a numerical integer (e.g., 4, not "4th Floor"). Use -FloorLabel for alphanumeric strings (e.g., "Mezzanine", "Level 4B").
  • -GeoCoordinates: Latitude and Longitude separated by a semicolon and space (e.g., "40.7484; -73.9857"). Used by mobile apps to locate the nearest room based on device GPS.
  • -Tags: Custom comma-separated strings that users can search for inside modern Room Finder (e.g., searching for “Dual-Screen” or “Whiteboard”).
  • -IsWheelChairAccessible: Boolean ($true or $false). Powers the accessibility toggle in Outlook Room Finder.

6. Step 4: Enterprise Bulk Provisioning Automation (CSV Script)

In production deployments with dozens or hundreds of rooms, manual command entry leads to inconsistencies. Use this complete production automation script to import room mailboxes, bind them to Room Lists, and populate Set-Place properties from a structured CSV.

Step A: Prepare the CSV File (rooms_inventory.csv)

Email,Building,Floor,FloorLabel,Capacity,AudioDevice,VideoDevice,DisplayDevice,Wheelchair,City,State,PostalCode,RoomListEmail
nyc-fl04-board@domain.com,New York HQ,4,Level 4,16,Shure MXA920,Cisco Quad,Dual 85in,TRUE,New York,NY,10118,roomlist-nyc-hq@domain.com
nyc-fl04-conf-a@domain.com,New York HQ,4,Level 4,8,Poly Studio,Poly E70,Single 65in,TRUE,New York,NY,10118,roomlist-nyc-hq@domain.com
lon-fl02-board@domain.com,Canary Wharf,2,Executive 2,20,Logitech Rally,Rally Cam,Dual 75in,TRUE,London,ENG,E14 5AB,roomlist-lon-canary@domain.com

Step B: Production Import Script (Deploy-RoomFinder.ps1)

<#
.SYNOPSIS
  Bulk provisions Set-Place metadata and Room List group memberships for Exchange Online Room Finder.
#>
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [string]$CsvPath
)

if (-not (Test-Path -Path $CsvPath)) {
    Write-Error "CSV file not found at: $CsvPath"
    return
}

$rooms = Import-Csv -Path $CsvPath
Write-Host "Found $($rooms.Count) rooms to process in $CsvPath..." -ForegroundColor Cyan

foreach ($room in $rooms) {
    Write-Host "Processing: $($room.Email)..." -ForegroundColor Yellow
    
    # 1. Verify Mailbox exists
    $mbx = Get-Mailbox -Identity $room.Email -ErrorAction SilentlyContinue
    if (-not $mbx) {
        Write-Warning "Mailbox $($room.Email) does not exist. Skipping."
        continue
    }

    # 2. Update Set-Mailbox Capacity
    Set-Mailbox -Identity $room.Email -ResourceCapacity ([int]$room.Capacity)
    
    # 3. Apply Set-Place Metadata
    $isWheelchair = ($room.Wheelchair -eq 'TRUE' -or $room.Wheelchair -eq 'true' -or $room.Wheelchair -eq '1')
    Set-Place -Identity $room.Email `
        -Building $room.Building `
        -Floor ([int]$room.Floor) `
        -FloorLabel $room.FloorLabel `
        -Capacity ([int]$room.Capacity) `
        -AudioDeviceName $room.AudioDevice `
        -VideoDeviceName $room.VideoDevice `
        -DisplayDeviceName $room.DisplayDevice `
        -IsWheelChairAccessible $isWheelchair `
        -City $room.City `
        -State $room.State `
        -PostalCode $room.PostalCode

    # 4. Add to Room List Distribution Group
    if (-not [string]::IsNullOrEmpty($room.RoomListEmail)) {
        # Ensure Room List exists
        $rl = Get-DistributionGroup -Identity $room.RoomListEmail -ErrorAction SilentlyContinue
        if ($rl) {
            # Check existing membership
            $members = Get-DistributionGroupMember -Identity $room.RoomListEmail | Select-Object -ExpandProperty PrimarySmtpAddress
            if ($members -notcontains $room.Email) {
                Add-DistributionGroupMember -Identity $room.RoomListEmail -Member $room.Email
                Write-Host "  [+] Added $($room.Email) to Room List $($room.RoomListEmail)" -ForegroundColor Green
            } else {
                Write-Host "  [-] Already member of $($room.RoomListEmail)" -ForegroundColor DarkGray
            }
        } else {
            Write-Warning "Room List $($room.RoomListEmail) not found! Create it with New-DistributionGroup -RoomList."
        }
    }
}

Write-Host "Bulk Room Finder deployment completed successfully!" -ForegroundColor Green

7. Step 5: Auditing & Verifying Room Directory Replication

To inspect the applied metadata on any mailbox, use Get-Place:

# View all Set-Place properties for a room
Get-Place -Identity "nyc-hq-fl04-boardroom@yourdomain.com" | Format-List DisplayName, Building, Floor, FloorLabel, Capacity, AudioDeviceName, VideoDeviceName, IsWheelChairAccessible, City

Understanding Replication Latency:

  • PowerShell Verification: Get-Place reflects changes immediately (within 60 seconds).
  • Outlook on the Web (OWA): Pulls modern Graph Places data within 2 to 12 hours.
  • Classic Outlook for Windows: Relies on the Offline Address Book (OAB). Exchange Online generates the OAB once every 24 to 48 hours, after which Outlook downloads the differential. To speed up testing, test inside OWA before troubleshooting desktop Outlook.

8. Troubleshooting Common Room Finder Failures

Issue 1: Room Finder Displays “No Available Rooms” in Outlook

Cause: The room mailbox is not an active member of a distribution group tagged with -RoomList, or the user has filtered by capacity exceeding the room’s ResourceCapacity.

Fix: Confirm membership using Get-DistributionGroupMember -Identity "your-roomlist@domain.com". Verify that Get-DistributionGroup "your-roomlist@domain.com" | Select RecipientTypeDetails returns RoomList.

Issue 2: Floor or Building Appears Blank in New Outlook / Teams

Cause: -Floor was populated with an alphanumeric string (e.g., “4th Floor”) instead of an integer. The Places Graph API silently discards invalid data types.

Fix: Re-run Set-Place -Identity <Room> -Floor 4 -FloorLabel "4th Floor".

Issue 3: Room Automatically Declines Meetings During Business Hours

Cause: Conflict in Set-CalendarProcessing rules (e.g., EnforceSchedulingHorizon is set to $true with BookingWindowInDays set too low, or AllowConflicts is $false).

Fix: Audit calendar processing flags:

Get-CalendarProcessing -Identity "nyc-hq-fl04-boardroom@yourdomain.com" | Select-Object AutomateProcessing, AllowConflicts, BookingWindowInDays, MaximumDurationInMinutes

Need Enterprise Meeting Room Architecture or MTR Advisory?

Our team provides enterprise Microsoft 365, Teams Rooms (MTR), and Cisco Webex hybrid meeting space architecture, custom PowerShell automation, and Intune compliance advisory. If your organization is modernizing global conference rooms, connect with our senior UC engineering team for a consultation.

9. Frequently Asked Questions (FAQ)

Related Meeting Room & Infrastructure Guides

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *