outlook-book-meeting implementation guide

---
availability: INSTALLABLE
installation_asset_uuid: ee10e5b2-5baa-4fc4-ac24-6bd0f15e3fe8
name: Book a Meeting
purple_chat_link: https://marketplace.moveworks.com/purple-chat?conversation=%7B%22messages%22%3A%5B%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Book+a+meeting+on+Outlook+with+Sarah+about+the+Q4+Roadmap+for+30+minutes+tomorrow+at+10+AM.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ESearching+for+employees+named+%3Cstrong%3ESarah%3C%2Fstrong%3E%3C%2Fp%3E%22%2C%22content%22%3A%5B%5D%2C%22connectorName%22%3A%22%22%2C%22overrideImageUrl%22%3A%22%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI+found+two+people+named+%3Cb%3ESarah%3C%2Fb%3E.+Which+one+should+I+invite%3F%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESarah+Jenkins%3C%2Fb%3E+%28Finance+Manager%29%3C%2Fli%3E%3Cli%3E%3Cb%3ESarah+Miller%3C%2Fb%3E+%28Product+Lead%29%3C%2Fli%3E%3C%2Ful%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Sarah+Miller%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22%3Cp%3EOkay%2C+I%27ve+prepared+the+calendar+invitation%3A%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESubject%3A%3C%2Fb%3E+Q4+Roadmap%3C%2Fli%3E%3Cli%3E%3Cb%3EAttendees%3A%3C%2Fb%3E+Sarah+Miller%3C%2Fli%3E%3Cli%3E%3Cb%3EDate%3A%3C%2Fb%3E+Tomorrow%2C+October+24%3C%2Fli%3E%3Cli%3E%3Cb%3ETime%3A%3C%2Fb%3E+10%3A00+AM+-+10%3A30+AM%3C%2Fli%3E%3Cli%3E%3Cb%3EPlatform%3A%3C%2Fb%3E+Microsoft+Teams%3C%2Fli%3E%3C%2Ful%3E%3Cp%3EReady+to+send+this+out%3F%3C%2Fp%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22%3Cp%3EYes%3C%2Fp%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ECreating+the+calendar+event+in+%3Cb%3EOutlook%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22outlook%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EDone%21+I%27ve+scheduled+the+meeting+and+sent+the+invitation+to+%3Cb%3ESarah+Miller%3C%2Fb%3E.%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22outlook%22%2C%22citationTitle%22%3A%22Q4+Roadmap+Meeting%22%7D%5D%7D%5D%7D%5D%7D
solution_tags:
- HR - Other
- IT
- Productivity
- Sales
systems:
- outlook
description: Create a meeting, invite attendees, and add a video link in one go.
---

## Description

Enables employees to schedule meetings directly through the Moveworks AI Assistant. Specify the attendees, time, duration, and preferences — and the assistant handles the rest, from sending invites to optionally adding a Teams or Zoom link if requested.

## User Experience Preview

Please refer to the following [**Purple Chat**](https://marketplace.moveworks.com/purple-chat?conversation=%7B%22messages%22%3A%5B%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Book+a+meeting+on+Outlook+with+Sarah+about+the+Q4+Roadmap+for+30+minutes+tomorrow+at+10+AM.%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ESearching+for+employees+named+%3Cstrong%3ESarah%3C%2Fstrong%3E%3C%2Fp%3E%22%2C%22content%22%3A%5B%5D%2C%22connectorName%22%3A%22%22%2C%22overrideImageUrl%22%3A%22%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EI+found+two+people+named+%3Cb%3ESarah%3C%2Fb%3E.+Which+one+should+I+invite%3F%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESarah+Jenkins%3C%2Fb%3E+%28Finance+Manager%29%3C%2Fli%3E%3Cli%3E%3Cb%3ESarah+Miller%3C%2Fb%3E+%28Product+Lead%29%3C%2Fli%3E%3C%2Ful%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22Sarah+Miller%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22%3Cp%3EOkay%2C+I%27ve+prepared+the+calendar+invitation%3A%3C%2Fp%3E%3Cul%3E%3Cli%3E%3Cb%3ESubject%3A%3C%2Fb%3E+Q4+Roadmap%3C%2Fli%3E%3Cli%3E%3Cb%3EAttendees%3A%3C%2Fb%3E+Sarah+Miller%3C%2Fli%3E%3Cli%3E%3Cb%3EDate%3A%3C%2Fb%3E+Tomorrow%2C+October+24%3C%2Fli%3E%3Cli%3E%3Cb%3ETime%3A%3C%2Fb%3E+10%3A00+AM+-+10%3A30+AM%3C%2Fli%3E%3Cli%3E%3Cb%3EPlatform%3A%3C%2Fb%3E+Microsoft+Teams%3C%2Fli%3E%3C%2Ful%3E%3Cp%3EReady+to+send+this+out%3F%3C%2Fp%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22user%22%2C%22parts%22%3A%5B%7B%22richText%22%3A%22%3Cp%3EYes%3C%2Fp%3E%22%7D%5D%7D%2C%7B%22role%22%3A%22assistant%22%2C%22parts%22%3A%5B%7B%22reasoningSteps%22%3A%5B%7B%22status%22%3A%22success%22%2C%22richText%22%3A%22%3Cp%3ECreating+the+calendar+event+in+%3Cb%3EOutlook%3C%2Fb%3E...%3C%2Fp%3E%22%2C%22connectorName%22%3A%22outlook%22%7D%5D%7D%2C%7B%22richText%22%3A%22%3Cp%3EDone%21+I%27ve+scheduled+the+meeting+and+sent+the+invitation+to+%3Cb%3ESarah+Miller%3C%2Fb%3E.%3C%2Fp%3E%22%7D%2C%7B%22citations%22%3A%5B%7B%22connectorName%22%3A%22outlook%22%2C%22citationTitle%22%3A%22Q4+Roadmap+Meeting%22%7D%5D%7D%5D%7D%5D%7D) for a sample conversational experience between a user and the AI Assistant for this plugin.

## Prerequisites

Before installing and using the **Book a Meeting** plugin, ensure the following requirements are met.

### 1. Microsoft Graph Connector

This plugin requires an active **Microsoft Graph connector** configured with the OAuth 2.0 Authorization Code (User Consent Auth) flow.

- If you have not already set up the connector, follow the [**Microsoft Graph Connector Guide**](https://marketplace.moveworks.com/connectors/microsoft-graph#how-to-implement) before proceeding. Please follow the 'OAuth 2.0 with Authorization Code (User Consent Auth) Setup' section.
- The connector must be fully configured and tested before installing this plugin.

### 2. Zoom Connector (Optional)

If your organization uses Zoom and you want the plugin to generate Zoom meeting links, an active **Zoom connector** is also required.

- Follow the [**Zoom Connector Guide**](https://marketplace.moveworks.com/connectors/zoom#how-to-implement) to configure the Zoom connector before enabling this option.
- If Zoom is not configured, the plugin will offer Microsoft Teams or no online meeting as options.

### 3. Plugin Installation

Once the connector is ready, follow the [**plugin installation documentation**](https://help.moveworks.com/docs/ai-agent-marketplace-installation) for steps on how to install and activate the plugin in Agent Studio.

### 4. Microsoft 365 System Requirements

### a. End User Permissions

To book meetings through this plugin, users must already have permission to create calendar events in Microsoft 365 — the same access required to create meetings in Outlook.

At a minimum, end users must have:

- A licensed Microsoft 365 account with an active Exchange Online mailbox
- Permission to create events on their own calendar
- If adding a Teams meeting link — the user must have a Microsoft Teams license enabled in their Microsoft 365 account
- If adding a Zoom meeting link — the user must have an active Zoom account and the Zoom connector must be configured (see section 2 above)

### b. Timezone and Working Hours Configuration for End User

For meetings to be created at the correct local time, each user must have their timezone and working hours configured in Outlook. If this is not set, event times may not reflect the user's local time correctly.

To configure timezone and working hours in Outlook:

1. Open **Outlook** and go to **Settings → View all Outlook settings → Calendar → View**.
2. Under **Time zone**, select your local timezone from the dropdown.
3. Under **Working hours**, set your working days and start/end times.

![image.png](Book%20a%20Meeting/image.png)

### c. API Permissions

The Microsoft Graph connector uses **delegated permissions** to create calendar events on behalf of the authenticated user. The following permissions are required for this plugin:

| Permission | Purpose |
| --- | --- |
| `Calendars.ReadWrite` | Create and manage calendar events on behalf of the user |
| `Place.Read.All` | Read room and location data for meeting suggestions |
| `User.Read` | Read user profiles for resolving attendees |
| `offline_access` | Maintain access via refresh tokens |

**Note:** This plugin does not grant new permissions. It operates within the calendar access already granted to the authenticated user in Microsoft 365.

## Implementation Details

This plugin works by making a sequence of API calls behind the scenes to retrieve the information you need. The diagram below gives you a high-level picture of that flow, followed by a breakdown of each API call — what it does, what it sends, and what it returns. Understanding this will help you configure the plugin correctly and troubleshoot if something doesn't look right.

### Visual Representation of How the Plugin Works

![image.png](Book%20a%20Meeting/image%201.png)

### API Details

This plugin executes up to four API calls depending on the video conferencing option selected. The **Microsoft Teams** and **No Online Meeting** paths use two API calls. The **Zoom** path uses four.

### API #1: Get User Timezone

Retrieves the authenticated user's timezone as configured in their Outlook mailbox settings. This ensures the meeting is created at the correct local time.

```bash
curl --request GET \
  --url 'https://graph.microsoft.com/v1.0/me/mailboxSettings' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json'
```

**Key fields returned:**

- `timeZone` *(string)* — The user's configured timezone (e.g., `Pacific Standard Time`). This value is passed as an input to API #2.

### API #2: Create Calendar Event

Creates a new calendar event in the authenticated user's Outlook calendar. If Microsoft Teams is selected, the Teams meeting link is generated at this step. If Zoom is selected, the event is created first without an online meeting link — the Zoom link is added in API #4.

```bash
curl --request POST \
  --url 'https://graph.microsoft.com/v1.0/me/events' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "subject": "{{event_title}}",
    "body": { "contentType": "HTML", "content": "{{event_description}}" },
    "start": { "dateTime": "{{start_date_time}}", "timeZone": "{{user_time_zone}}" },
    "end": { "dateTime": "{{end_date_time}}", "timeZone": "{{user_time_zone}}" },
    "attendees": [
      { "type": "required", "emailAddress": { "address": "{{attendee_email}}" } }
    ],
    "isOnlineMeeting": true,
    "onlineMeetingProvider": "teamsForBusiness",
    "recurrence": "{{recurrence}}",
    "showAs": "{{show_as}}",
    "sensitivity": "{{sensitivity}}",
    "isAllDay": false
  }'
```

**Request Body Parameters:**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `subject` | string | Yes | The title of the meeting. |
| `body` | object | No | The description or agenda of the meeting. Set `contentType` to `HTML`. |
| `start` | object | Yes | Start time with `dateTime` (ISO 8601, no timezone) and `timeZone` (e.g. `Pacific Standard Time`). |
| `end` | object | Yes | End time with `dateTime` (ISO 8601, no timezone) and `timeZone`. |
| `attendees` | array | Yes | List of attendee objects each with `emailAddress.address` and `type` (`required` or `optional`). |
| `isOnlineMeeting` | boolean | No | Set to `true` to attach a Teams meeting link. |
| `onlineMeetingProvider` | string | No | The online meeting provider. Set to `teamsForBusiness` when `isOnlineMeeting` is `true`. Possible values: `teamsForBusiness`, `skypeForBusiness`, `skypeForConsumer`. |
| `showAs` | string | Yes | The availability status shown on the user's calendar during the meeting. Possible values: `free`, `tentative`, `busy`, `oof`, `workingElsewhere`, `unknown`. Defaults to `busy`. |
| `sensitivity` | string | Yes | The visibility of the event to other users. Possible values: `normal`, `personal`, `private`, `confidential`. Defaults to `normal`. |
| `isAllDay` | boolean | Yes | Whether the event is an all-day event. Defaults to `false`. |
| `recurrence` | object | No | Recurrence configuration following Microsoft Graph's `patternedRecurrence` schema. If omitted, the event is created as a one-time meeting. See [Microsoft Graph recurrence documentation](https://learn.microsoft.com/en-us/graph/api/resources/patternedrecurrence). |

**Key nuances:**

- The `start_date_time` and `end_date_time` are provided without a timezone component — the timezone is passed separately via the `user_time_zone` field fetched from API #1.
- Microsoft Graph's `patternedRecurrence` supports patterns like daily, weekly, absolute monthly, relative monthly, absolute yearly, and relative yearly recurrences.

### API #3: Create Zoom Meeting *(Zoom path only)*

Creates a Zoom meeting via the Zoom API. This step is only executed when the user selects Zoom as the video conferencing provider.

```bash
curl --request POST \
  --url 'https://api.zoom.us/v2/users/me/meetings' \
  --header 'Authorization: Bearer {{zoom_access_token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "topic": "{{event_title}}",
    "type": 1
  }'
```

**Request Body Parameters:**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `meeting_title` | string | Yes | The title of the Zoom meeting, matched to the Outlook event title. |
| `meeting_type_id` | integer | Yes | The Zoom meeting type. Set to `1` (instant meeting). See [Zoom meeting type documentation](https://developers.zoom.us/docs/api/meetings/#tag/meetings/post/users/%7BuserId%7D/meetings.body.type) for details. |

**Key fields returned:**

- `join_url` — The Zoom join link injected into the Outlook event description and location in API #4.
- `id` — The Zoom meeting ID displayed in the event description.
- `password` — The Zoom meeting passcode displayed in the event description.

### API #4: Update Outlook Event with Zoom Link *(Zoom path only)*

Updates the previously created Outlook event to inject the Zoom meeting details into the event description and location. This step is only executed when the user selects Zoom as the video conferencing provider.

```bash
curl --request PATCH \
  --url 'https://graph.microsoft.com/v1.0/me/events/{{event_id}}' \
  --header 'Authorization: Bearer {{access_token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "body": {
      "contentType": "HTML",
      "content": "<p><strong>Zoom</strong></p><p><a href=\"{{join_url}}\">Join Zoom Meeting</a><br/>{{join_url}}<br/><br/>Meeting ID: {{zoom_meeting_id}}<br/>Passcode: {{password}}</p>"
    },
    "location": { "displayName": "{{join_url}}" }
  }'
```

**Request Body Parameters:**

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | string | Yes | The ID of the Outlook event created in API #2. |
| `event_description` | string | Yes | The updated event body containing the formatted Zoom join link, meeting ID, and passcode. |
| `location_display_name` | string | Yes | Set to the Zoom join URL so it appears as the event location in Outlook. |

Now that you understand how the plugin works under the hood, let's walk through what it can and can't do. We recommend reading both sections before going live to ensure the best experience for your users.

## What Is In Scope for This Plugin?

This plugin supports the following capabilities:

- Create a **one-time meeting** with one or more attendees on the authenticated user's calendar
- Create a **recurring meeting** using natural language (e.g. "every Monday", "daily for 2 weeks") — the assistant interprets and converts this to the correct recurrence configuration
- Optionally include a **Microsoft Teams or Zoom meeting link** if requested by the user
- Set a custom **meeting title**, **description**, **start time**, and **end time**
- Configure **availability status** (`show_as`) and **event visibility** (`sensitivity`)
- Add both **internal attendees** (resolved by name) and **external attendees** (specified by exact email address)
- Support for **all-day events**

## What Is Out of Scope for This Plugin?

This plugin does **not** support the following:

- Updating or cancelling existing meetings — handled by separate plugins
- Booking meetings on behalf of another user — the meeting is always created on the authenticated user's calendar
- Adding meeting room resources or physical locations to the event
- Sending custom email notifications to attendees beyond the standard Outlook meeting invite