Notion コネクタ
Notion ワークスペースを Brevo に接続し、Tajo を介してコンテンツ駆動型マーケティングワークフロー、CRM データベース同期、自動通知を実現します。
概要
| プロパティ | 値 |
|---|---|
| プラットフォーム | Notion |
| カテゴリ | カスタム |
| セットアップの複雑さ | 簡単 |
| 公式統合 | いいえ |
| 同期データ | データベース、ページ、ユーザー |
| API タイプ | REST API |
| 認証 | Internal Integration Token / OAuth 2.0 |
| ベース URL | https://api.notion.com |
| API バージョン | 2022-06-28(Notion-Version ヘッダー経由) |
機能
- データベース同期 - Notion データベースのエントリを Brevo 連絡先およびリストに同期
- CRM ブリッジ - Notion データベースを軽量 CRM として使用し Brevo に同期
- コンテンツ通知 - Notion ページが公開されたときに Brevo キャンペーンをトリガー
- プロパティマッピング - Notion データベースのプロパティを Brevo 連絡先属性にマッピング
- ページ監視 - ページ更新をトラッキングして Brevo イベントとして転送
- ユーザーディレクトリ同期 - Notion ワークスペースのメンバーを Brevo 連絡先に同期
前提条件
開始する前に、以下を準備してください。
- 管理者アクセス権を持つ Notion ワークスペース
- Notion の内部統合または OAuth アプリ
- 統合と共有されているデータベースページ
- API アクセス可能な Brevo アカウント
- 有効なサブスクリプションを持つ Tajo アカウント
認証
Notion は 2 つの認証方法をサポートしています。
オプション 1: 内部統合(単一ワークスペース向け推奨)
- notion.so/my-integrations にアクセス
- New integration をクリック
- 「Tajo Integration」と名前を付ける
- ワークスペースを選択
- 機能を設定:
Content Capabilities: Read content: ✓ Update content: ✓ Insert content: ✓
User Capabilities: Read user information: ✓- Internal Integration Secret をコピー(
ntn_で始まる)
ページ共有が必要
内部統合は、明示的に共有されたページおよびデータベースのみにアクセスできます。各対象データベースを「…」メニュー > 「Connections」 > 統合を選択 から統合と共有してください。
オプション 2: OAuth 2.0(パブリック統合)
複数のワークスペースを対象とする統合の場合、OAuth 2.0 フローを使用します。
- 統合をパブリック統合として登録
- ユーザーを次にリダイレクト:
https://api.notion.com/v1/oauth/authorize?client_id=... - コードを
/v1/oauth/tokenでアクセストークンと交換
Tajo への接続
tajo connectors install notion \ --token $NOTION_TOKEN設定
基本セットアップ
connectors: notion: enabled: true api_version: "2022-06-28"
sync: databases: true pages: false users: true
databases: - id: "abc123def456" name: "Customers" sync_to_list: 25 - id: "ghi789jkl012" name: "Leads" sync_to_list: 26フィールドマッピング
Notion データベースのプロパティを Brevo 連絡先属性にマッピングします。
field_mapping: # Notion プロパティ -> Brevo 属性 Name: type: title target: FIRSTNAME Email: type: email target: email Phone: type: phone_number target: SMS Company: type: rich_text target: COMPANY Status: type: select target: LEAD_STATUS Deal Value: type: number target: DEAL_VALUE Last Contact: type: date target: LAST_CONTACT_DATE Tags: type: multi_select target: TAGSAPI エンドポイント
Tajo は以下の Notion API エンドポイントと統合します。
| エンドポイント | メソッド | 目的 |
|---|---|---|
/v1/databases/{id}/query | POST | データベースエントリをクエリ |
/v1/databases/{id} | GET | データベーススキーマを取得 |
/v1/pages | POST | 新しいページを作成 |
/v1/pages/{id} | GET | ページプロパティを取得 |
/v1/pages/{id} | PATCH | ページプロパティを更新 |
/v1/blocks/{id}/children | GET | ブロックの子要素を取得 |
/v1/users | GET | すべてのワークスペースユーザーを一覧取得 |
/v1/users/{id} | GET | ユーザーを取得 |
/v1/search | POST | ワークスペース全体を検索 |
コード例
コネクタの初期化
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('notion', { token: process.env.NOTION_TOKEN});データベースを Brevo に同期
// Notion データベースを Brevo リストに同期await tajo.connectors.sync('notion', { type: 'full', resources: ['databases'], databaseId: 'abc123def456', targetList: 25});
const status = await tajo.connectors.status('notion');console.log(status);// {// connected: true,// lastSync: '2024-03-15T14:30:00Z',// databasesSynced: 2,// pagesTracked: 1450,// usersCount: 32// }クエリとフィルタ
// フィルタ付きで Notion データベースをクエリconst results = await tajo.connectors.query('notion', { databaseId: 'abc123def456', filter: { property: 'Status', select: { equals: 'Active' } }, sorts: [ { property: 'Last Contact', direction: 'descending' } ]});Brevo イベントからページを作成
// Brevo 連絡先がマイルストーンに達したときに Notion ページを作成tajo.events.on('contact.attribute_updated', async (event) => { if (event.attribute === 'LIFECYCLE_STAGE' && event.value === 'customer') { await tajo.connectors.create('notion', { databaseId: 'ghi789jkl012', properties: { Name: { title: [{ text: { content: event.contact.name } }] }, Email: { email: event.contact.email }, 'Converted Date': { date: { start: new Date().toISOString() } } } }); }});レート制限
Notion は統合ごとにレート制限を適用します。
| 制限タイプ | 値 |
|---|---|
| レート制限 | 統合ごとに 3 リクエスト/秒 |
| バースト制限 | 短いバーストが許可され、その後スロットリング |
| ページサイズ | ページネーションリクエストごとに最大 100 アイテム |
カーソルベースのページネーション
Notion はカーソルベースのページネーションを使用します。Tajo はこれを自動的に処理し、has_more が false を返すまで next_cursor パラメータを使用してすべてのページを反復処理します。
レート制限を超えると、Notion は Retry-After ヘッダー付きで 429 Too Many Requests を返します。
トラブルシューティング
一般的な問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| 401 Unauthorized | トークンが無効または期限切れ | 統合トークンを再生成 |
| 403 Forbidden | ページが統合と共有されていない | Connections 経由でページ/データベースを統合と共有 |
| 404 Object not found | データベース ID が不正または共有されていない | データベース ID と共有設定を確認 |
| プロパティの欠落 | スキーマの不一致 | データベーススキーマを再同期してフィールドマッピングを更新 |
| レート制限超過 | 高速すぎるリクエスト | 同期頻度またはバッチサイズを削減 |
デバッグモード
connectors: notion: debug: true log_level: verbose log_api_calls: true接続テスト
tajo connectors test notion# ✓ API 認証に成功# ✓ データベースアクセスを確認# ✓ ユーザーリストにアクセス可能# ✓ 検索操作可能# ✓ ページ作成が利用可能ベストプラクティス
- データベースを明示的に共有する - 内部統合は共有されたコンテンツのみを参照できる
- 検索よりもデータベースクエリを使用する - 既知のデータベースに対してはクエリの方が高速で信頼性が高い
- プロパティタイプを慎重にマッピングする - Notion は多くのプロパティタイプを持つので、Brevo 属性タイプに一致させる
- ページネーションを処理する - 完全なデータのため常にすべてのカーソルページを反復処理
- 増分同期を行う - 変更されたエントリのみを同期するため
last_edited_timeフィルタを使用 - ポーリングスケジュールを設定する - Notion はネイティブで Webhook をサポートしないため、定期的にポーリング
セキュリティ
- ベアラートークン認証 - 統合シークレットと OAuth トークン
- HTTPS のみ - すべての API 通信は TLS 1.2 以上で暗号化
- スコープ付きアクセス - 統合は明示的に共有されたコンテンツのみにアクセス
- OAuth 2.0 - パブリック統合用の安全な認可フロー
- 暗号化されたストレージ - トークンは Tajo で保存時に暗号化
- ワークスペース分離 - 各統合は単一のワークスペースにスコープ