Admin

PowerShell for Microsoft Bookings admins

The documented PowerShell for Microsoft Bookings: every Bookings parameter on Set-OrganizationConfig and Set-OwaMailboxPolicy, plus mailbox cmdlets for pages.

Last updated 17 sources

Every PowerShell task for Microsoft Bookings runs in Exchange Online PowerShell. Tenant-wide switches are Bookings* parameters on Set-OrganizationConfig; who can create shared pages, the domain those pages get, and Bookings with me are parameters on Set-OwaMailboxPolicy; and each shared booking page is a mailbox of type SchedulingMailbox that you find, open and delete with the ordinary mailbox cmdlets. As of October 2026, 8 of the 18 Bookings parameters on Set-OrganizationConfig, and 2 of the 3 on Set-OwaMailboxPolicy, have no description in the reference. This page lists only what Microsoft documents, and says where the documentation is empty or wrong.

What each control means for users is in Microsoft Bookings admin controls.

Before you run anything#

You need the ExchangeOnlineManagement module (the Exchange Online PowerShell V3 module). It works in Windows PowerShell 5.1 and in PowerShell 7; module 3.10.0 and later need PowerShell 7.6.0 or later.

powershell
Install-Module -Name ExchangeOnlineManagement
Connect-ExchangeOnline -UserPrincipalName admin@contoso.com

The Bookings articles on Microsoft Learn use a global admin. The cmdlet reference pages name no role and say only that "you need to be assigned permissions". To see which role groups in your tenant can run a cmdlet, and a specific parameter, ask Exchange:

powershell
$Perms = Get-ManagementRole -Cmdlet Set-OrganizationConfig -CmdletParameters BookingsAuthEnabled
$Perms | foreach {Get-ManagementRoleAssignment -Role $_.Name -Delegating $false | Format-Table -Auto Role,RoleAssigneeType,RoleAssigneeName}

One trap: the add-staff article on Microsoft Learn links to an old "Connect to Microsoft 365 with PowerShell" page before its Add-MailboxPermission steps. Those are Exchange Online cmdlets, so connect with Connect-ExchangeOnline.

Save the current state before you change anything:

powershell
Get-OrganizationConfig | Format-List Bookings*
Get-OwaMailboxPolicy | Format-List Name, BookingsMailboxCreationEnabled, BookingsMailboxDomain, PersonalBookingsDisabled
Get-CASMailbox -Identity user@contoso.com | Format-List OwaMailboxPolicy

Set-OrganizationConfig: the tenant switches#

All 18 Bookings parameters are Exchange Online only. They're Boolean except the two naming-policy strings. "Admin center" is the matching label under Settings → Org settings → Bookings.

ParameterAdmin centerWhat $true does, per the referenceDocumented default
BookingsEnabledAllow your organization to use BookingsEnables Bookings in the organization$false (see below)
BookingsAuthEnabledBlock shared bookings from outside your organization"All new and existing Bookings pages are forced to authenticate users before they can book"None
BookingsSocialSharingRestrictedBlock social sharing optionsRestricts the social sharing options inside Bookings$false
BookingsExposureOfStaffDetailsRestrictedBlock sharing staff details with customersInternal staff attributes, such as email addresses, aren't visible to external customersNone
BookingsMembershipApprovalRequiredRequire staff approvals before sharing free/busy informationNew staff must accept membership before they're bookableNone
BookingsSmsMicrosoftEnabledAllow Microsoft to send SMS messagesNo descriptionNone in the reference; the Teams admin article says on
BookingsSearchEngineIndexDisabledDisable direct search engine indexingNo descriptionNone
BookingsPhoneNumberEntryRestrictedRestrict collection of customer dataPhone numbers can't be collectedNone
BookingsAddressEntryRestrictedRestrict collection of customer dataAddresses can't be collectedNone
BookingsNotesEntryRestrictedRestrict collection of customer dataAppointment notes can't be collectedNone
BookingsCreationOfCustomQuestionsRestrictedRestrict collection of customer dataBookings admins can't add custom questionsNone
BookingsNamingPolicyEnabledEnforce naming policy for shared booking pages aliasNo descriptionNone
BookingsNamingPolicyPrefixSameNo description (string)None
BookingsNamingPolicyPrefixEnabledSameNo descriptionNone
BookingsNamingPolicySuffixSameNo description (string)None
BookingsNamingPolicySuffixEnabledSameNo descriptionNone
BookingsPaymentsEnabledNoneEnables "the online payment node inside Bookings"$false
BookingsBlockedWordsEnabledNoneNo descriptionNone

Where the reference is wrong or empty, as of October 2026:

  • BookingsEnabled default. The reference says $false "is the default", which doesn't match tenants where Bookings is already on. Check your value; don't assume.
  • BookingsPhoneNumberEntryRestricted. Its $true and $false lines talk about "appointment notes", an apparent copy of the notes parameter. The opening sentence and the admin center label both say it's about phone numbers.
  • BookingsPaymentsEnabled. Still listed, but the Bookings FAQ says "there's no payment support in Bookings". Setting it doesn't bring payments back; see payments.
  • BookingsBlockedWordsEnabled. No description and no matching control in the granular-controls article. We don't know what it does, so leave it alone.
  • The naming policy. The five parameter names suggest an on/off switch plus a prefix and a suffix, each with its own toggle, but Microsoft hasn't described them. Set the policy in the admin center, then read the values back with Get-OrganizationConfig.

Typical changes:

powershell
# Force sign-in on every shared page (new and existing)
Set-OrganizationConfig -BookingsAuthEnabled $true

# Stop collecting phone numbers and addresses on every booking form
Set-OrganizationConfig -BookingsPhoneNumberEntryRestricted $true -BookingsAddressEntryRestricted $true

# Make new staff opt in before they can be booked
Set-OrganizationConfig -BookingsMembershipApprovalRequired $true

Microsoft says tenant setting changes can take up to four hours to apply.

What we saw when testing (September 2026)#

In our captures of the public booking page, every shared page fetched a tenant settings object on load containing BookingsEnabled, BookingsAuthEnabled, BookingsPhoneNumberEntryRestricted, BookingsAddressEntryRestricted, BookingsNotesEntryRestricted, BookingsCreationOfCustomQuestionsRestricted and BookingsSmsMicrosoftEnabled. When the restriction flags were set, the page hid phone, address and notes and dropped custom questions, whatever the service said. So these flags act on existing pages, not just new ones, once the change has propagated.

Set-OwaMailboxPolicy: creation, domain and Bookings with me#

OWA mailbox policies are per user: each mailbox has one, assigned with Set-CASMailbox. The Bookings steps on Microsoft Learn assume you have only OwaMailboxPolicy-Default. If you have more, a setting changed on one policy doesn't reach users on the others. The cmdlet reference says policy changes "might take up to 60 minutes to take effect".

ParameterTypeWhat it doesNotes
BookingsMailboxCreationEnabledBoolean$false stops users on the policy creating shared booking pagesThe reference says it "allows you disable Microsoft Bookings", but the turn-on article uses it only for page creation. Users without it can still be staff, including Administrator. New policies allow creation by default
BookingsMailboxDomainStringThe domain new booking mailboxes get, instead of onmicrosoft.comNo description in the reference. The custom domain article: new pages only
PersonalBookingsDisabledBoolean$true turns off Bookings with me (Personal Bookings) for users on the policyNo description in the reference. Now the only control: EWS organization and CAS settings no longer apply

Only named people may create shared pages:

powershell
New-OwaMailboxPolicy -Name "BookingsCreators"
Set-CASMailbox -Identity creator@contoso.com -OwaMailboxPolicy "BookingsCreators"
Set-OwaMailboxPolicy "OwaMailboxPolicy-Default" -BookingsMailboxCreationEnabled:$false

New pages use your own domain:

powershell
Get-OwaMailboxPolicy -Identity OwaMailboxPolicy-Default | Format-List BookingsMailboxDomain
Set-OwaMailboxPolicy -Identity OwaMailboxPolicy-Default -BookingsMailboxDomain "contoso.com"

The per-user version in the custom domain article is missing a space before -OwaMailboxPolicy in its Set-CASMailbox line; copy it carefully.

Bookings with me off for everyone, or for some people:

powershell
# Everyone on the default policy
Set-OwaMailboxPolicy -Identity "OwaMailboxPolicy-Default" -PersonalBookingsDisabled $true

# Only some people: a separate policy, then assign it
New-OwaMailboxPolicy -Name "BwmDisablePolicy"
Set-OwaMailboxPolicy -Identity "BwmDisablePolicy" -PersonalBookingsDisabled $true
Set-CASMailbox -Identity user@contoso.com -OwaMailboxPolicy "BwmDisablePolicy"

Assigning a new policy replaces the user's old one, so carry over any other OWA settings that policy had. The trade-offs of each switch are in turning Bookings off for users.

Finding booking mailboxes#

Shared pages are SchedulingMailbox recipients. Both Get-EXOMailbox and Get-Mailbox return 1,000 results by default, and the delete article's list command doesn't add -ResultSize, so large tenants should:

powershell
# Every booking page, with its creation date
Get-EXOMailbox -RecipientTypeDetails SchedulingMailbox -ResultSize Unlimited -Properties WhenCreated |
  Select-Object DisplayName, PrimarySmtpAddress, WhenCreated

# Find one by part of its name
Get-EXOMailbox -Anr "dental" -RecipientTypeDetails SchedulingMailbox

# The FAQ command: every booking mailbox and who has access to it
Get-Mailbox -RecipientTypeDetails SchedulingMailbox -ResultSize Unlimited |
  Get-MailboxPermission |
  Select-Object Identity, User, AccessRights |
  Where-Object { $_.User -like '*@*' }

WhenCreated isn't in the default property set of Get-EXOMailbox, hence -Properties. Rows from the last command whose only users have left are orphaned pages. Counting pages over time is covered in usage and adoption.

Giving an admin access to a page#

Full Access plus Send As on the booking mailbox lets someone open the page in Bookings without being bookable. Microsoft notes it only works if they don't already have the Viewer role on that page.

powershell
Add-MailboxPermission -Identity "page@contoso.com" -User "admin@contoso.com" -AccessRights FullAccess -Deny:$false -AutoMapping:$false
Add-RecipientPermission -Identity "page@contoso.com" -Trustee "admin@contoso.com" -AccessRights SendAs -Confirm:$false

-AutoMapping defaults to $true, which adds the mailbox to the admin's Outlook. To turn auto-mapping off after the fact, the reference says you must remove the permission with Remove-MailboxPermission and grant it again. Full Access in Exchange Online also opens private calendar items. When and why to do this is in admin access to every calendar.

Changing a page's address#

The Teams admin article gives Set-Mailbox for moving an existing page off onmicrosoft.com:

powershell
Set-Mailbox -Identity business@contoso.onmicrosoft.com -WindowsEmailAddress business@contoso.com -EmailAddresses business@contoso.com

That changes the sender and the page link, and old links can break. Read changing the sender email and changing the page URL before running it.

Deleting a page#

powershell
Remove-Mailbox -Identity <BookingCalendarToDelete>
Get-EXOMailbox -RecipientTypeDetails SchedulingMailbox -ResultSize Unlimited

Use the exact alias; several pages can have similar names. Two Microsoft documents disagree about what happens next. The delete article says the page's data "can't be recovered". The Remove-Mailbox reference says that -Identity on its own removes the user account but retains the mailbox until the deleted-mailbox retention period ends, and that -PermanentlyDelete purges a soft-deleted one:

powershell
Get-Mailbox -Identity <alias> -SoftDeletedMailbox | Remove-Mailbox -PermanentlyDelete

Microsoft doesn't document restoring a booking page from a soft-deleted mailbox, and we haven't tested it. Export the bookings first and treat deletion as final. See deleting a page.

What PowerShell can't do for Bookings#

  • Staff, services, customers and appointments. No Exchange cmdlet manages them. Use the Bookings web app or the Microsoft Graph Bookings API. That includes time off: see holidays and time off.
  • Bookings with me settings. Beyond on or off, nothing is exposed.
  • Page settings such as the one-time password, the booking page access setting or the language. These are set per page in Bookings.

BookingsXP is independent and not affiliated with or endorsed by Microsoft.

More on this topic

Questions people also ask

Sources

  1. Microsoft Learn: Set organizationconfig (opens in a new tab) · learn.microsoft.com
  2. Microsoft Learn: Set owamailboxpolicy (opens in a new tab) · learn.microsoft.com
  3. Microsoft Learn: Get exomailbox (opens in a new tab) · learn.microsoft.com
  4. Microsoft Learn: Get mailbox (opens in a new tab) · learn.microsoft.com
  5. Microsoft Learn: Add mailboxpermission (opens in a new tab) · learn.microsoft.com
  6. Microsoft Learn: Remove mailbox (opens in a new tab) · learn.microsoft.com
  7. Microsoft Learn: Connect to exchange online powershell (opens in a new tab) · learn.microsoft.com
  8. Microsoft Learn: Exchange online powershell v2 (opens in a new tab) · learn.microsoft.com
  9. Microsoft Learn: Find exchange cmdlet permissions (opens in a new tab) · learn.microsoft.com
  10. Microsoft Learn: Turn bookings on or off (opens in a new tab) · learn.microsoft.com
  11. Microsoft Learn: Granular controls shared bookings (opens in a new tab) · learn.microsoft.com
  12. Microsoft Learn: Bookings in outlook (opens in a new tab) · learn.microsoft.com
  13. Microsoft Learn: Custom domain support (opens in a new tab) · learn.microsoft.com
  14. Microsoft Learn: Add staff (opens in a new tab) · learn.microsoft.com
  15. Microsoft Learn: Delete calendar (opens in a new tab) · learn.microsoft.com
  16. Microsoft Learn: Bookings faq (opens in a new tab) · learn.microsoft.com
  17. Microsoft Learn: Bookings app admin (opens in a new tab) · learn.microsoft.com

Edit or question? hello@bookingsxp.com