Meeting rooms generate a surprising share of help desk tickets: the room "didn't accept", a recurring series was declined, visitors can't book, or the room never shows up in Room Finder. Almost all of it comes down to a handful of calendar processing settings and some metadata on the mailbox. In this post I'll create room and equipment mailboxes, walk through the booking policy parameters that matter and what their defaults are, set up room lists and Room Finder properties, and go through the booking problems you'll actually be asked about.
Prerequisites#
- Exchange Online PowerShell V3 (
Connect-ExchangeOnline); Microsoft specifically recommends the V3 module forSet-Place, and room lists can only be created in PowerShell. - A role with the Recipients permissions (Organization Management or Recipient Management).
- No licence for the resource mailboxes themselves; they get 50 GB without one. In hybrid, create rooms for cloud users in Exchange Online and rooms for on-premises users on-premises.
- A naming convention: Microsoft suggests putting the important details (building, floor, capacity) in the display name because that's what users see in the address book.
Step 1: Create the mailboxes#
In the Exchange admin center go to Recipients › Resources and choose Add a room resource or Add an equipment resource; the wizard also asks for capacity, location and the first booking options. In PowerShell:
Connect-ExchangeOnline
New-Mailbox -Name CAI-01-Boardroom -Room -DisplayName "Cairo 1F Boardroom (12)" -PrimarySmtpAddress boardroom.cai1@contoso.com
New-Mailbox -Name Projector-02 -Equipment -DisplayName "Portable projector 2"
Get-Mailbox -RecipientTypeDetails RoomMailbox,EquipmentMailbox -ResultSize Unlimited | Format-Table Name, DisplayName, PrimarySmtpAddressRoom mailboxes created in the admin center or in PowerShell get AutomateProcessing set to AutoAccept; Microsoft notes that resource mailboxes created in PowerShell before 15 November 2018 defaulted to AutoUpdate, and a mailbox that started life as a user mailbox and was converted with Set-Mailbox -Type Room deserves a check too.
Step 2: Set the booking policy#
Everything about how a room answers lives in Set-CalendarProcessing. The three building blocks Microsoft documents are:
- Default booking:
AutomateProcessing AutoAcceptandAllBookInPolicy $true. Anyone books; free is accepted, busy is declined. - Delegate approval:
AutoAccept,AllBookInPolicy $false,AllRequestInPolicy $true,ForwardRequestsToDelegates $trueand aResourceDelegateslist. Requests sit tentative until a delegate acts. - Scoped auto-approval:
AutoAccept,AllBookInPolicy $false,AllRequestInPolicy $false,ForwardRequestsToDelegates $falseand aBookInPolicylist of users or (non-nested, non-dynamic) groups. Everyone else is declined.
| Parameter | Default | What it controls |
|---|---|---|
AllowConflicts | $false | Whether double bookings are accepted; with $false a series is judged by the two conflict settings below |
ConflictPercentageAllowed / MaximumConflictInstances | 0 / 0 | How many occurrences of a recurring request may clash before the whole series is declined; at 0, a single clash declines it |
AllowRecurringMeetings | $true | Whether recurring requests are accepted at all |
BookingWindowInDays | 180 (0-1080) | How far ahead the room can be booked |
EnforceSchedulingHorizon | $true | Declines a series that runs past the booking window; $false accepts it and trims the later occurrences |
MaximumDurationInMinutes | 1440 | Longest single meeting (per occurrence for a series); 0 means unlimited |
ScheduleOnlyDuringWorkHours | $false | Rejects requests outside the mailbox's working hours, which come from Set-MailboxCalendarConfiguration (WorkDays, WorkingHoursStartTime, WorkingHoursEndTime, WorkingHoursTimeZone) |
ProcessExternalMeetingMessages | $false | Whether requests from outside the organisation are processed |
DeleteSubject / AddOrganizerToSubject / DeleteComments | $true | Replace the subject with the organiser's name and strip the body |
RemovePrivateProperty | $true | Clears the private flag on bookings |
AddAdditionalResponse / AdditionalResponse | $false | Custom text appended to the room's reply |
TentativePendingApproval | $true | Pending delegate requests show as tentative instead of free |
Set-CalendarProcessing -Identity boardroom.cai1@contoso.com -AutomateProcessing AutoAccept -AllBookInPolicy $true `
-BookingWindowInDays 365 -MaximumDurationInMinutes 480 -ConflictPercentageAllowed 10 -MaximumConflictInstances 3 `
-DeleteSubject $false -AddOrganizerToSubject $false -AddAdditionalResponse $true `
-AdditionalResponse "Please release the room if your meeting is cancelled."
# Let people see what the room is booked for (Default is AvailabilityOnly)
Set-MailboxFolderPermission -Identity "boardroom.cai1@contoso.com:\Calendar" -User Default -AccessRights LimitedDetailsTo add someone to BookInPolicy without wiping the existing list, read the current value, append, and write it back; the parameter replaces the list every time.
Step 3: Room lists and Room Finder metadata#
Room Finder in Outlook groups rooms by room list (typically one per building) and lets users filter by city, floor, capacity and features. A room list is a special distribution group:
New-DistributionGroup -Name "Cairo HQ rooms" -RoomList
Add-DistributionGroupMember -Identity "Cairo HQ rooms" -Member boardroom.cai1@contoso.com
Set-DistributionGroup -Identity "Old rooms DL" -RoomList # convert an existing group
Set-Place -Identity boardroom.cai1@contoso.com -City "Cairo" -CountryOrRegion EG -Building "HQ" -Floor 1 -FloorLabel "First floor" `
-Capacity 12 -AudioDeviceName "Poly Studio" -VideoDeviceName "Poly Studio" -DisplayDeviceName "85-inch display" `
-IsWheelChairAccessible $true -Tags "Whiteboard","Natural light"
Get-Place -Identity boardroom.cai1@contoso.com | Format-List City, Building, Floor, Capacity, *DeviceName, TagsMicrosoft recommends room lists once you have (or expect) more than 100 rooms or several buildings. In hybrid, Set-Place can't write City, CountryOrRegion, GeoCoordinates, Phone, PostalCode, State or Street on synchronised rooms; set those on-premises with Set-User or Set-Mailbox and let them sync. Metadata changes are not instant in Room Finder, so give them time before you declare them broken. If your tenant is adopting Microsoft Places, the same cmdlet carries the ParentId property that attaches a room to a building or floor in the Places hierarchy.
Verify#
Get-CalendarProcessing -Identity boardroom.cai1@contoso.com | Format-List AutomateProcessing, AllBookInPolicy, BookInPolicy, AllRequestInPolicy,
ResourceDelegates, ForwardRequestsToDelegates, AllowConflicts, ConflictPercentageAllowed, MaximumConflictInstances,
BookingWindowInDays, EnforceSchedulingHorizon, MaximumDurationInMinutes, ScheduleOnlyDuringWorkHours, ProcessExternalMeetingMessages
Get-MailboxCalendarConfiguration -Identity boardroom.cai1@contoso.com | Format-List WorkDays, WorkingHours*
Get-DistributionGroup -RecipientTypeDetails RoomList | ForEach-Object { $_.Name; Get-DistributionGroupMember -Identity $_.Identity | Format-Table Name, PrimarySmtpAddress }Then book three test meetings from a normal user: one in policy (expect an acceptance within a minute or two), one that breaks a rule such as duration (expect a decline that names the reason, because EnableResponseDetails is on by default), and one recurring series with a known clash. Finally open Room Finder in Outlook on the web, pick the room list and confirm the city and capacity filters find the room.
Tips & gotchas#
- "The room never accepts or declines." Check
AutomateProcessing: onAutoUpdatethe booking attendant is off and, on a room mailbox, delegates don't even receive the requests.Noneturns processing off entirely. - "Requests just sit as tentative."
AllBookInPolicyis$falsewithout working delegates, orForwardRequestsToDelegatesis off; either addResourceDelegates(and give them Calendar permission) or turnAllBookInPolicyback on. - "My weekly meeting was declined." The three usual reasons are a series running past
BookingWindowInDayswithEnforceSchedulingHorizonon, a single clash with the conflict limits at 0, orAllowRecurringMeetings $false. A series with no end date is treated against the booking window like any other long series. - "Our partner can't book the room." External requests are rejected by default; set
ProcessExternalMeetingMessages $trueon that room only. - "The calendar just says the organiser's name." That's
AddOrganizerToSubjectandDeleteSubject, and users also need at leastLimitedDetailson the Calendar folder to read subjects. - "Bookings outside office hours get declined."
ScheduleOnlyDuringWorkHoursis on and the mailbox's time zone or hours are wrong; fix them withSet-MailboxCalendarConfiguration. - Don't use nested groups or dynamic distribution groups in
BookInPolicy,RequestInPolicyorResourceDelegates; only flat groups work.