商談や面談を Calendly で受けていると、予約の連絡が担当者のメールに届くだけで、チームからは見えないことがあります。担当者が不在の日のキャンセルに誰も気づかない、ということも起きます。
この記事では、予約とキャンセルをチームの Slack チャンネルへ送る手順を説明します。
結論
Samurai App のワークフローに「サービス連携」で Calendly をつなぎ、次の 2 つの出来事で起動します。Calendly 側から届く方式です。
- 予約: 「Meeting Scheduled」(
CALENDLY_MEETING_SCHEDULED) - キャンセル: 「Meeting Canceled」(
CALENDLY_MEETING_CANCELED)
日程変更では両方が 1 回ずつ届きます。 そのままだと、同じ変更で「キャンセル」と「予約」の 2 通が Slack に出ます。この記事では、キャンセル側で日程変更を除きます。
Calendly には Slack 用の公式アプリもあり、予約や更新の通知を受け取れます。本文の項目を自分で決めたいときや、通知の前に処理を足したいときは、この記事の方法を使います。
できること・できないこと
- Calendly の有料プランが必要です。 Calendly のヘルプでは、Webhook の対象は Professional、Standard、Standard Plus、Teams、Teams Plus、Enterprise です。無料プランでは登録できません
- 受ける範囲を
scopeで指定します。userは接続した本人の予約だけです。organizationは組織全体、groupは 1 つのグループです。後の 2 つは、接続した人が Calendly のオーナーか管理者でないと断られます - 参加者 1 人につき 1 件届きます。 グループ予約で 3 人が申し込むと 3 件になります。通知も費用も 3 件分です
- 時刻は UTC で届きます。
scheduled_event.start_timeは UTC なので、そのまま本文に入れると日本時間より 9 時間前の時刻が表示されます - 費用は 1 件受けるごとに約 0.5 円かかります。 有効にできるサービス連携は 20 個までです
- 参加者の名前とメールアドレスが届きます。 本文に入れるとチャンネルの全員に見えるので、載せる項目を先に決めます
用意するもの
- Calendly の有料プランのアカウント(組織全体を受けるならオーナーか管理者)
- 投稿先チャンネルの Slack の Incoming Webhook の URL
- Samurai App のマネージャー以上の権限(ワークフローにサービス連携を付けるために必要です)
手順
完成すると、次のようなワークフローになります。

ワークフローは、予約用とキャンセル用の 2 本に分けます。届く項目と通知の条件が違うためです。
1. 通知先を登録する

Slack のアプリ設定で「Incoming Webhooks」を有効にし、「Add New Webhook to Workspace」からチャンネルを選んで URL を作ります。Samurai App の「設定」→「通知」の「通知先」に名前と URL を登録し、「テスト送信」で確認します。
2. Calendly を接続する
「コネクタ」画面の「コネクタ」タブで Calendly の「追加」を押し、「標準連携アプリで追加」を選んでサインインします。
3. 予約用のワークフローを作る
「ワークフロー」の「作成」から「新規作成」を選びます。ステップを選んでいない状態の「設定」にある「ワークフローの入力」で「入力の項目を追加」を押し、名前を event、種類を「項目の組」にします。
最初に「コード」のステップを置いて、時刻を日本時間にします。「渡す値」に start として input.event.scheduled_event.start_time を渡し、次を書きます。
return new Date(inputs.start).toLocaleString("ja-JP", { timeZone: "Asia/Tokyo" });
次に「通知先へ送る」のステップを置いて通知先を選び、「本文」を書きます。日時の行は「/」からコードのステップの値を入れます。
予約が入りました: {{input.event.scheduled_event.name}}
参加者: {{input.event.name}}
日時: (コードのステップの値)
「保存」のあと、「バージョン」タブで「バージョン N を公開」を押します。
4. 予約の出来事を付ける
「トリガー」タブの「サービス連携を追加」を押します。「どのサービスを監視するか」で Calendly の接続を選び、「どうなったら動かすか」で「Meeting Scheduled」を選びます。「絞り込み」の scope で user か organization を選んで登録します。group を選ぶときは group_uri も入れます。
5. キャンセル用のワークフローを作る
手順 3 と同じように event の入力と「コード」のステップを置きます。その次に「条件分岐」を置き、条件を input.event.rescheduled が false のときにします。日程変更によるキャンセルでは rescheduled が true になるので、この条件で除けます。条件に合う側に「通知先へ送る」を置きます。
キャンセルがありました: {{input.event.scheduled_event.name}}
参加者: {{input.event.name}}
日時: (コードのステップの値)
公開したら、手順 4 と同じ手順で「Meeting Canceled」を付けます。
6. 予約して確認する
テスト用の予約を 1 件入れ、Slack に届くことを確認します。そのあと日程を変更して、「予約」の通知だけが届くこと、キャンセルして「キャンセル」の通知が届くことを確認します。「実行」タブの「最近の実行」に「出来事で起動」の行が増え、開くと届いた入力を確認できます。
動かないとき
登録するときに権限やプランで断られる
Calendly は、対応していないプランでは Webhook の作成を断ります。公式の API 資料には「Please upgrade your Calendly account to Standard」という断りの文があります。scope が organization か group なら、接続した人がオーナーか管理者かも確認します。
実行が失敗し、「$ref '…' の値がありません」と出る
本文の項目が、届いた内容にありません。任意の項目に注意してください。たとえば cancellation.reason は、キャンセルの理由の項目です。本文に足す前に、「最近の実行」の入力で実際に届いていることを確認します。値が null の項目は空欄で送られ、項目そのものが無いときはステップが失敗します。
同じ予約の通知が 2 通届く
グループ予約なら、参加者ごとに届く仕様です。日程変更なら、手順 5 の「条件分岐」が公開したバージョンに入っているかを確認します。
時刻がずれている
「コード」を通さず start_time を本文に入れていると、UTC のまま表示されます。手順 3 の「コード」の値を使います。
よくある質問
予約フォームの回答も載せられますか
載せられます。{{input.event.questions_and_answers}} と書くと、質問と回答の一覧が JSON の形で入ります。読みやすくするときは「コード」のステップで question と answer を組み合わせます。
日程変更と新規予約を文面で分けられますか
分けられます。新規予約では old_invitee が空です。予約用のワークフローに「条件分岐」を足し、「最近の実行」で届いた値を確認してから条件にします。
関連する使い方
出典
- Calendly: Webhooks overview(対象のプラン)
- Calendly: Webhook payloads for rescheduled events
- Calendly: Receive data from scheduled events in real time with webhook subscriptions
- Calendly: Create webhook subscription
- Calendly: OpenAPI(
start_timeは UTC) - Calendly: Slack との連携
- Slack: Sending messages using incoming webhooks