Airtable コネクタ
Airtable のベースを Brevo に接続して、CRM 同期、製品カタログ管理、Tajo による構造化データを活用したマーケティング自動化ワークフローを実現します。
概要
| プロパティ | 値 |
|---|---|
| プラットフォーム | Airtable |
| カテゴリ | カスタム |
| セットアップの複雑さ | 簡単 |
| 公式統合 | いいえ |
| 同期データ | レコード、テーブル、ユーザー |
| API タイプ | REST API |
| 認証 | Personal Access Token / OAuth 2.0 |
| ベース URL | https://api.airtable.com/v0/ |
機能
- テーブルからリストへの同期 - Airtable テーブルのレコードを Brevo の連絡先リストに直接同期
- 製品カタログブリッジ - Airtable テーブルをメールレコメンデーション用の製品カタログとして使用
- CRM 同期 - Airtable CRM と Brevo 連絡先の双方向同期
- フォーム送信イベント - Airtable のフォーム送信を Brevo イベントとして転送
- ビューベースのフィルタリング - 特定の Airtable ビューをターゲットの Brevo リストに同期
- Webhook 自動化 - Airtable のレコードが変更されたときに Brevo キャンペーンをトリガー
前提条件
開始する前に、以下を準備してください。
- Airtable アカウント(無料プラン以上)
- 設定済みの Personal Access Token または OAuth アプリ
- 同期するベースおよびテーブルへのアクセス権
- API アクセス可能な Brevo アカウント
- 有効なサブスクリプションを持つ Tajo アカウント
認証
Airtable は Personal Access Tokens と OAuth 2.0 をサポートしています。
オプション 1: Personal Access Token(推奨)
- airtable.com/create/tokens にアクセス
- Create new token をクリック
- 「Tajo Integration」と名前を付ける
- スコープを追加:
data.records:readdata.records:writedata.recordComments:readschema.bases:readwebhook:manage- 特定のベースまたは全ベースへのアクセスを追加
- Create token をクリック
オプション 2: OAuth 2.0
マルチユーザー統合には OAuth 2.0 フローを使用します。
- airtable.com/create/oauth で統合を登録
- リダイレクト URI を設定:
https://app.tajo.io/callbacks/airtable - 上記と同じスコープをリクエスト
トークンスコープ
Personal Access Tokens は特定のベースにスコープできます。セキュリティのため、「All current and future bases」を選択するのではなく、統合に必要なベースにのみアクセスを付与してください。
Tajo への接続
tajo connectors install airtable \ --token $AIRTABLE_TOKEN設定
基本セットアップ
connectors: airtable: enabled: true
sync: records: true comments: false
tables: - base_id: "appXXXXXXXXXXXXXX" table_name: "Customers" view: "Active Customers" sync_to_list: 28 - base_id: "appXXXXXXXXXXXXXX" table_name: "Products" sync_as: "catalog"フィールドマッピング
Airtable のフィールドを Brevo の連絡先属性にマッピングします。
field_mapping: # Airtable フィールド -> Brevo 属性 Name: FIRSTNAME Email: email Phone: SMS Company: COMPANY Status: LEAD_STATUS Revenue: TOTAL_REVENUE "Last Contact": LAST_CONTACT_DATE Tags: TAGS Notes: NOTES "Created Time": SIGNUP_DATEビューベースの同期
views: - base_id: "appXXXXXXXXXXXXXX" table_name: "Customers" view: "High Value" sync_to_list: 29 filter_by_view: true
- base_id: "appXXXXXXXXXXXXXX" table_name: "Customers" view: "Churned" sync_to_list: 30 filter_by_view: trueAPI エンドポイント
Tajo は以下の Airtable Web API エンドポイントと統合します。
| エンドポイント | メソッド | 目的 |
|---|---|---|
/v0/{baseId}/{tableIdOrName} | GET | テーブル内のレコードを一覧取得 |
/v0/{baseId}/{tableIdOrName} | POST | レコードを作成 |
/v0/{baseId}/{tableIdOrName} | PATCH | レコードを更新 |
/v0/{baseId}/{tableIdOrName} | DELETE | レコードを削除 |
/v0/{baseId}/{tableIdOrName}/{recordId} | GET | 単一レコードを取得 |
/v0/meta/bases | GET | アクセス可能なベースを一覧取得 |
/v0/meta/bases/{baseId}/tables | GET | ベース内のテーブルを一覧取得 |
/v0/{baseId}/{tableIdOrName}/listRecordComments | GET | レコードコメントを一覧取得 |
/v0/bases/{baseId}/webhooks | POST | Webhook を作成 |
/v0/bases/{baseId}/webhooks | GET | Webhook を一覧取得 |
コード例
コネクタの初期化
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('airtable', { token: process.env.AIRTABLE_TOKEN});テーブルを Brevo に同期
// Airtable テーブルを Brevo リストに同期await tajo.connectors.sync('airtable', { type: 'full', resources: ['records'], baseId: 'appXXXXXXXXXXXXXX', tableName: 'Customers', view: 'Active Customers', targetList: 28});
const status = await tajo.connectors.status('airtable');console.log(status);// {// connected: true,// lastSync: '2024-03-15T15:00:00Z',// recordsSynced: 2340,// tablesMonitored: 2,// basesConnected: 1// }Webhook の処理
// Airtable Webhook は変更を通知します。カーソルで詳細を取得しますapp.post('/webhooks/airtable', async (req, res) => { const { base, webhook, timestamp } = req.body;
// Webhook カーソルを使用して変更されたレコードを取得 const changes = await tajo.connectors.getWebhookPayloads('airtable', { baseId: base.id, webhookId: webhook.id, cursor: timestamp });
for (const change of changes) { await tajo.connectors.handleEvent('airtable', { type: change.actionType, payload: change }); }
res.status(200).send('OK');});Brevo からレコードを作成
// Brevo 連絡先がコンバートしたときに Airtable レコードを作成tajo.events.on('contact.attribute_updated', async (event) => { if (event.attribute === 'LIFECYCLE_STAGE' && event.value === 'customer') { await tajo.connectors.create('airtable', { baseId: 'appXXXXXXXXXXXXXX', tableName: 'Customers', fields: { Name: event.contact.name, Email: event.contact.email, Status: 'Customer', 'Converted Date': new Date().toISOString().split('T')[0] } }); }});レート制限
Airtable はベースごとにレート制限を適用します。
| 制限タイプ | 値 |
|---|---|
| API レート制限 | ベースごとに 5 リクエスト/秒 |
| リクエストあたりのレコード数 | 最大 100 レコード(一覧)、最大 10 レコード(作成/更新) |
| Webhook ペイロード | listWebhookPayloads 呼び出しあたり 50 ペイロード |
| リクエストサイズ | ペイロード最大約 2MB |
バッチ操作
Airtable ではリクエストあたり最大 10 レコードの作成または更新が可能です。Tajo はより大きな操作を複数のリクエストに自動的にバッチ処理し、レート制限を遵守します。
トラブルシューティング
一般的な問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| 401 Unauthorized | トークンが無効または期限切れ | Personal Access Token を再生成 |
| 403 Forbidden | トークンにベースアクセス権がない | トークンのスコープにベースを追加 |
| 404 Not Found | 無効なベースまたはテーブル ID | ベース ID とテーブル名を確認 |
| 422 Invalid Request | フィールドタイプの不一致 | Airtable のフィールドタイプがデータと一致するか確認 |
| レート制限超過 | ベースあたり 5 req/s を超過 | 同期頻度を下げるか、ベース同期を分散 |
デバッグモード
connectors: airtable: debug: true log_level: verbose log_api_calls: true接続テスト
tajo connectors test airtable# ✓ API 認証に成功# ✓ ベースアクセスを確認# ✓ テーブルスキーマ読み取り可能# ✓ レコード一覧操作可能# ✓ Webhook 登録が利用可能ベストプラクティス
- トークンを特定のベースにスコープする - 必要な場合を除き、すべてのベースへのアクセスを付与しない
- フィルタ同期にはビューを使用する - データ量を減らすため、完全なテーブルではなく特定のビューを同期
- レコード操作をバッチ処理する - 作成と更新を 10 件単位でグループ化
- ページネーションを処理する - Airtable はページあたり 100 レコードを返します。
offsetで反復処理 - リアルタイムには Webhook を使用する - ポーリングの代わりに Webhook を登録して変更を検知
- フィールドタイプを正確にマッピングする - Airtable のフィールドタイプ(select、number、date)を Brevo 属性タイプに一致させる
セキュリティ
- Personal Access Tokens - 特定のベースと操作にスコープ
- OAuth 2.0 - リフレッシュトークンを使用した安全な認可フロー
- HTTPS のみ - すべての API 通信は TLS 1.2 以上で暗号化
- ベースレベルのアクセス制御 - トークンは個別のベースにスコープ
- 暗号化されたストレージ - トークンは Tajo で保存時に暗号化
- Webhook HMAC 検証 - Webhook 通知の真正性を検証