テーマ
外部カレンダー連携
対応プロバイダ(MVP)
- Google Calendar
Outlook(Microsoft 365)対応は後続検討。
連携の単位
- ユーザー単位で接続(テナント単位ではない)
- 1 ユーザーあたり 1 つの Google アカウントを接続
- 同期対象カレンダーは複数選択可(既定はプライマリ1つ)
接続フロー(OAuth)
- スコープ:
calendar.events(読み書き) - リフレッシュトークンは暗号化保存(認証 / 認可 参照)
- ユーザーが連携を解除した時点でトークンを無効化
同期方針
| 方向 | トリガー | 仕組み |
|---|---|---|
| CRM → Google | スケジュール作成 / 更新 / 削除 | API 呼び出し(即時) |
| Google → CRM | カレンダー側の追加 / 更新 / 削除 | Push 通知(推奨)+ 定期 incremental sync |
マッピング
CRM schedule | Google event |
|---|---|
title | summary |
memo | description |
scheduled_at | start.dateTime |
| 終了時刻 | end.dateTime |
external_event_id | id |
attendees(任意) | attendees[] |
- 「終日」イベント / タイムゾーンは保持して同期
- カレンダー側にしかないカスタムフィールドは保持しない
競合解決
- CRM / Google で同じイベントが両方更新された場合は
updatedが新しい方を採用 - 削除はどちらか一方の操作で他方も削除(「ゴーストイベント」を避ける)
- 競合が発生したことは監査ログとアクティビティで通知
どのスケジュールを同期するか
- 既定: ユーザーが担当する
visit/call/taskを同期 renewal/birthday(自動生成系)は同期 or 非同期をユーザー設定で選択- 完了 / キャンセルしたスケジュールは Google 側からも削除 or イベント名の prefix で識別
連携の解除
- ユーザー操作で解除可能
- 解除時の動作(テナント設定 or ユーザー設定):
- Google 側に既に作ったイベントを 残す(既定)
- 削除
設計上の注意
- Push 通知の有効期限: Google Calendar の Push (Channels) は最大 ~30 日。期限前に renew するジョブを用意
- API クォータ: Google Calendar API のクォータを尊重。一斉初期同期はバックオフ
- ユーザーロケール: 表示はテナント / ユーザーのタイムゾーン基準。Google 側の TZ と一致を確認
権限
| 操作 | OWNER | MEMBER | ADMIN |
|---|---|---|---|
| 自分のカレンダー連携 | ✅ | ✅ | ❌ |
| 他人の連携状況の参照 | ✅ | ❌ | ✅ |
| 一括連携解除 | ✅ | ❌ | ✅ |