> ## Documentation Index
> Fetch the complete documentation index at: https://www.integrate.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ETL: Outlook Calendar Destination

> Create or update Microsoft Outlook calendar events from Integrate.io ETL pipeline records, with field mapping for times, attendees, and reminders.

Use the Outlook Calendar destination to write records from your ETL pipeline to a Microsoft Outlook calendar. The component creates one event per input record. When a record includes an event `id`, the component updates that event instead.

<Warning>
  Mapping `attendees` sends real meeting invitations to every address on every record that succeeds. Test on a small sample and a test calendar before running against a full dataset.
</Warning>

## When to use it

* Put campaign, project, or booking dates from a CRM or database on a shared calendar.
* Keep calendar events in sync with a source system by updating events you created earlier.
* Copy events from one calendar to another together with the [Outlook source](/docs/etl/using-components-outlook-source).

## Connection

Select an Outlook connection. The connection uses delegated OAuth, so the destination writes events as the Microsoft user who signed in. The mailbox is part of the connection: the signed-in user's own, or a shared mailbox whose address is set on the connection.

A token that expires during a job is refreshed automatically. See the [Outlook source](/docs/etl/using-components-outlook-source#connection) for more about the connection.

## Destination properties

* **Calendar.** Select the calendar by name. Only calendars the signed-in user can edit are listed. If the user can't edit the mailbox's default calendar, it is shown as **(default calendar, read-only)** and can't be selected. If the selected calendar is removed from the mailbox, or the user loses access to it, the editor won't save until you pick another calendar.
* **Time zone.** Required. All-day events, and start and end values without a UTC offset such as `2026-10-01 09:00`, are placed in this zone. Values with an offset keep it. A mapped `timeZone` field overrides it for that record.
* **Requests per second.** Each record is one request to Microsoft Graph. Greater than 0 and at most 15. Defaults to `4`.

## Field mapping

Map each input field to an Outlook event field. **Auto-fill** maps input fields whose names match event fields, and also maps the Outlook source's `start_time`, `end_time`, `is_all_day`, and `show_as` to `start`, `end`, `isAllDay`, and `showAs`. Auto-fill never maps `id` or `attendees`, so you have to map those yourself.

A blank or null value is left out of the request, so an update never clears a field you didn't supply.

### Create or update

* A record without `id` creates a new event.
* A record with `id` updates that event. Only `id` is required for an update. Any other mapped fields are changed.

The editor won't save the component until `subject` and `start` are mapped. If `id` is mapped, no other field is required.

To update events later, read their `id` with the Outlook source. Both components use immutable IDs, so the IDs match.

### Fields

| Field | Required on create | Description |
| :- | :- | :- |
| `id` | No | Outlook event ID. When present, the record updates this event. |
| `subject` | Yes | Event title. |
| `start` | Yes | Start date or date-time. |
| `end` | Yes, unless all-day | End date or date-time. An all-day event without an end lasts one day. |
| `timeZone` | No | Time zone for this record, such as `America/Los_Angeles`. Overrides the component's time zone. |
| `isAllDay` | No | `true` or `false`. |
| `body` | No | Event body. |
| `bodyContentType` | No | `text` (default) or `html`. |
| `location` | No | Location display name. |
| `categories` | No | Comma-separated category names. |
| `attendees` | No | Attendee addresses. Each attendee is invited as a required attendee. |
| `showAs` | No | `free`, `tentative`, `busy`, `oof`, `workingElsewhere`, or `unknown`. |
| `sensitivity` | No | `normal`, `personal`, `private`, or `confidential`. |
| `importance` | No | `low`, `normal`, or `high`. |
| `isReminderOn` | No | `true` or `false`. |
| `reminderMinutesBeforeStart` | No | Whole number of minutes. |
| `referenceId` | No | Your own identifier for the record, such as a Salesforce Campaign ID. Not sent to Outlook. |

Enum values are case-insensitive. A value that isn't valid fails the record instead of being written with missing fields.

### Dates and all-day events

* A date-time with an offset, such as `2026-10-01T15:00:00Z`, or a datetime field is written as that exact instant.
* A date-time without an offset, such as `2026-10-01 15:00`, is read in the record's `timeZone` or the component's time zone.
* A text date without a time, such as `2026-10-01`, creates an all-day event unless `isAllDay` is mapped to `false`.
* A datetime field at midnight UTC, such as a Salesforce date field, creates an all-day event on that day only when `isAllDay` is mapped to `true`. Otherwise it creates a timed event at 00:00 UTC.
* The `end` of an all-day event is inclusive. A start of `2026-10-01` and an end of `2026-10-02` creates an event that covers both days.
* On an update, the event switches between all-day and timed only when `isAllDay` is mapped.

### Attendees

`attendees` accepts any of these:

* Addresses separated by commas or semicolons, such as `ana@example.com; ben@example.com`.
* The JSON array that the Outlook source returns in its `attendees` field.
* A bag or tuple of addresses.

## Errors and retries

* Requests throttled by Microsoft Graph (HTTP 429), and HTTP 503 and 504 responses, are retried after the wait time Graph returns. Other 5xx responses are retried with a growing delay. A request is retried up to 5 times.
* If a create gets no confirmation after its retries, the record fails with a message that the event may exist. Check the calendar before you rerun so you don't create it twice.
* If the signed-in user can't write to the calendar (HTTP 403), a create stops the job. On an update, that record fails.
* An update for an event that no longer exists (HTTP 404) fails that record.

<Note>
  A failed record fails the job. Events written before the failure stay in the calendar, so check which records were written before you rerun.
</Note>

## Example: Salesforce campaigns to a shared calendar

Read Salesforce `Campaign` records. Add a Select component that passes the fields through and adds a field `isAllDay` with the value `true`. Then map:

| Input field | Event field |
| :- | :- |
| `Name` | `subject` |
| `StartDate` | `start` |
| `EndDate` | `end` |
| `isAllDay` | `isAllDay` |
| `Description` | `body` |
| `Type` | `categories` |

Salesforce date fields arrive as datetimes at midnight UTC. Because `isAllDay` is `true`, each campaign becomes an all-day event covering its first through last day.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.