# Tell Scheduler attendees a meeting is recorded

Source: https://developer.nylas.com/docs/cookbook/workflows/recording-notice-scheduler/

If your Scheduler configuration turns on Notetaker, every meeting booked through it gets recorded and transcribed. Telling attendees that before the call is good manners, and in many places it's a legal requirement. A `booking.created` workflow does it automatically.

![A meeting confirmation email stating the meeting will be recorded and transcribed, with the meeting details and a reschedule button](/_images/workflows/recording-notice-scheduler.png)

## Why not trigger this from the Notetaker event?

Because the Notetaker payload can't reach the attendees. `notetaker.created` carries an `event` object containing only `ical_uid`, `event_id`, and `master_event_id`. There are no participants, no title, and no times, so a template fired from it has nobody to greet and nothing to describe.

`booking.created` has all of it: the full participant list, the title, the times, and `recipient` populated per person when `notify_individually` is set. Fire the notice from the booking and treat the Notetaker configuration as the reason you are sending it.

The decision to record is made on the configuration, not per booking. If `notetaker_settings.enabled` is `true` on a Scheduler configuration, every booking on that configuration is recorded, so every booking on it should carry the notice.

## How do I know the meeting will be recorded?

Read it from the Scheduler configuration. `scheduler.notetaker_settings.enabled` controls whether a Notetaker session is created for bookings on that configuration. Notetaker needs a meeting link to join, so the configuration also needs `event_booking.conferencing` set.

```bash
curl "https://api.us.nylas.com/v3/grants/$GRANT_ID/scheduling/configurations/$CONFIG_ID" \
  -H "Authorization: Bearer $NYLAS_API_KEY"
```

```json
"scheduler": {
  "notetaker_settings": { "enabled": true }
}
```

## How do I send the notice only for recorded configurations?

Branch on `configuration_id` inside the template. A workflow applies to every booking in your application and can't be limited to one configuration, so a `booking.created` workflow fires for recorded and unrecorded bookings alike. Every booking payload carries `configuration_id` at the top level, next to `booking_info`.

```handlebars
{{#if (eq configuration_id "<RECORDED_CONFIGURATION_ID>")}}
  <p>This meeting will be recorded and transcribed.</p>
{{else}}
  <p>Your meeting is booked.</p>
{{/if}}
```

Replace `<RECORDED_CONFIGURATION_ID>` with the ID of the configuration that has Notetaker enabled. The template in this recipe uses this pattern twice, for the heading and for the opening paragraph, so one template serves as the confirmation for every configuration. If you record on several configurations, nest another `{{#if (eq ...)}}` inside the `{{else}}` for each one.

## How do I create the workflow?

Point your `booking.created` workflow at the recording notice template instead of the plain confirmation. Because the template covers both cases, it replaces the confirmation for every configuration. Don't run it alongside a second `booking.created` workflow, or attendees receive 2 messages about one booking.

```bash
curl -X POST 'https://api.us.nylas.com/v3/workflows' \
  -H "Authorization: Bearer $NYLAS_API_KEY" -H 'Content-Type: application/json' \
  -d '{
    "name": "Booking confirmed, recording notice",
    "trigger_event": "booking.created",
    "template_id": "<TEMPLATE_ID>",
    "delay": 0,
    "is_enabled": true,
    "from": { "email": "bookings@yourdomain.com", "name": "Your Company" }
  }'
```

Send it immediately with `delay: 0`. A disclosure that arrives after the meeting has started hasn't done its job, and a booking made 10 minutes before the call leaves no room for a delay.

Enable `notify_individually` on the configuration so each attendee gets their own copy addressed to them. A single message to all participants leaves `recipient` undefined, and a disclosure that opens `Hi there,` to a room of people is weaker than one that names them.

## What should the email say?

State plainly that the meeting will be recorded and transcribed, name what gets captured, and tell people how to object. The template in this recipe says audio, video, and a written transcript, because a Notetaker captures all three and "recorded" alone understates it.

Give an out that doesn't require technical knowledge. Attendees can't disable Notetaker themselves, so point them at the organizer rather than at a setting they can't reach.

Keep the meeting details in the same email. A notice that arrives separately from the confirmation reads like a warning, while a confirmation that mentions recording reads like a normal part of booking. The template below is the standard confirmation, with the disclosure as its opening paragraph on recorded configurations.

## The complete template

This is the confirmation template with the recording disclosure added for one configuration, including the per-recipient timezone chain. [Customize Scheduler email for your app](/docs/cookbook/workflows/scheduler-booking-email/) walks through how the greeting guards and timezone resolution work.

```html [recordingNoticeScheduler-booking.created]

<html>

<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Your meeting is booked</title>
  <style>
    body {
      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
        Helvetica, Arial, sans-serif;
      line-height: 1.6;
      color: #333333;
      margin: 0;
      padding: 0;
      background-color: #f9fbfe;
      font-size: 16px;
    }

    .container {
      max-width: 600px;
      margin: 0 auto;
      padding: 20px;
    }

    .header {
      text-align: center;
      padding: 20px 0;
    }

    .content {
      background-color: #ffffff;
      padding: 30px;
      border-radius: 8px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .detail-label {
      color: #666666;
      font-size: 14px;
      padding: 6px 16px 6px 0;
      vertical-align: top;
      white-space: nowrap;
    }

    .detail-value {
      padding: 6px 0;
      vertical-align: top;
    }

    .footer {
      text-align: center;
      padding: 20px 0;
      color: #666666;
      font-size: 14px;
    }

    @media only screen and (max-width: 600px) {
      .container {
        width: 100% !important;
        padding: 10px !important;
      }

      .content {
        padding: 20px !important;
      }
    }
  </style>
</head>

<body>
  <div class="container">
    <div class="header">
      <img src="https://brand.nylas.com/assets/site_images/Nylas-Logo_Horizontal-Blue.png" alt="Nylas Logo"
        style="max-width: 150px;" />
    </div>

    <div class="content">
      {{!-- Replace <RECORDED_CONFIGURATION_ID> with the ID of the configuration that has Notetaker enabled. --}}
      {{#if (eq configuration_id "<RECORDED_CONFIGURATION_ID>")}}
      <h1 style="margin-top: 0; color: #1A1A1A;">This meeting will be recorded</h1>
      {{else}}
      <h1 style="margin-top: 0; color: #1A1A1A;">Your meeting is booked</h1>
      {{/if}}

      {{#if recipient}}{{#if recipient.first_name}}<p>Hi {{recipient.first_name}},</p>{{else}}<p>Hi there,</p>{{/if}}{{else}}<p>Hi there,</p>{{/if}}

      {{#if (eq configuration_id "<RECORDED_CONFIGURATION_ID>")}}
      <p>
        <strong>{{booking_info.title}}</strong> is booked, and it will be recorded and
        transcribed. A Notetaker joins the call and captures audio, video, and a written
        transcript.
      </p>

      <p>If you would rather it was not recorded, reply to the organizer before the meeting starts.</p>
      {{else}}
      <p><strong>{{booking_info.title}}</strong> is booked. The details are below.</p>
      {{/if}}

      <hr style="border: 0; border-top: 1px solid #eeeeee; margin: 20px 0;" />

      <h2 style="color: #4D4D4D; font-weight: 500;">Meeting details</h2>

      <table cellpadding="0" cellspacing="0" border="0" style="width: 100%;">
        <tr>
          <td class="detail-label">When</td>
          <td class="detail-value">
            {{#if recipient}}{{#if booking_info.additional_fields}}{{#if (lookup booking_info.additional_fields recipient.email)}}{{ formatDate booking_info.start_time (lookup booking_info.additional_fields recipient.email) "EEEE d LLLL yyyy, h:mm a ZZZZ" "en" }}{{else}}{{#if booking_info.guest_timezone}}{{ formatDate booking_info.start_time booking_info.guest_timezone "EEEE d LLLL yyyy, h:mm a ZZZZ" "en" }}{{else}}{{ formatDate booking_info.start_time booking_info.organizer_timezone "EEEE d LLLL yyyy, h:mm a ZZZZ" "en" }}{{/if}}{{/if}}{{else}}{{#if booking_info.guest_timezone}}{{ formatDate booking_info.start_time booking_info.guest_timezone "EEEE d LLLL yyyy, h:mm a ZZZZ" "en" }}{{else}}{{ formatDate booking_info.start_time booking_info.organizer_timezone "EEEE d LLLL yyyy, h:mm a ZZZZ" "en" }}{{/if}}{{/if}}{{else}}{{#if booking_info.guest_timezone}}{{ formatDate booking_info.start_time booking_info.guest_timezone "EEEE d LLLL yyyy, h:mm a ZZZZ" "en" }}{{else}}{{ formatDate booking_info.start_time booking_info.organizer_timezone "EEEE d LLLL yyyy, h:mm a ZZZZ" "en" }}{{/if}}{{/if}}
          </td>
        </tr>
        <tr>
          <td class="detail-label">Duration</td>
          <td class="detail-value">{{booking_info.duration}} minutes</td>
        </tr>
        {{#if booking_info.location}}
        <tr>
          <td class="detail-label">Where</td>
          <td class="detail-value"><a href="{{booking_info.location}}" style="color: #0D6EFD;">{{booking_info.location}}</a></td>
        </tr>
        {{/if}}
        <tr>
          <td class="detail-label">Who</td>
          <td class="detail-value">
            {{#each booking_info.participants}}{{name}} &lt;{{email}}&gt;{{#unless @last}}<br />{{/unless}}{{/each}}
          </td>
        </tr>
      </table>

      <div style="text-align: center; margin: 30px 0;">
        <a href="{{booking_info.participant_rescheduling_url}}"
          style="background-color: #0D6EFD; color: white; padding: 12px 24px; text-decoration: none; border-radius: 4px; display: inline-block;">Reschedule</a>
      </div>

      <p style="font-size: 14px; color: #666666; text-align: center;">
        Need to change the time?
        <a href="{{booking_info.participant_cancellation_url}}" style="color: #0D6EFD;">Cancel this meeting</a>.
      </p>
    </div>

    <div class="footer">
      <p>© 2026 <a href="https://www.nylas.com/" style="color: #0D6EFD;">Nylas</a></p>
      <p style="font-size: 12px; color: #999999; margin-top: 4px;">
        Booking reference: {{booking_info.event_id}}
      </p>
    </div>
  </div>
</body>

</html>


```

Render it with `POST /v3/templates/render` before enabling the workflow. A missing variable returns `400` and sends nothing, which on a compliance email is a failure worth catching in testing rather than in production.

## What's next

- [Tell Events API attendees the meeting is recorded](/docs/cookbook/workflows/recording-notice-events/) for meetings created outside Scheduler
- [Send the recording when Notetaker media is ready](/docs/cookbook/workflows/notetaker-media-ready/) delivers the output afterwards
- [Tell the host when Notetaker couldn't join](/docs/cookbook/workflows/notetaker-failed-to-join/) for the case where no recording happens
- [Notetaker](/docs/v3/notetaker/) for how Notetaker joins meetings and what it captures