Airtable コネクタ

Airtable のベースを Brevo に接続して、CRM 同期、製品カタログ管理、Tajo による構造化データを活用したマーケティング自動化ワークフローを実現します。

概要

プロパティ
プラットフォームAirtable
カテゴリカスタム
セットアップの複雑さ簡単
公式統合いいえ
同期データレコード、テーブル、ユーザー
API タイプREST API
認証Personal Access Token / OAuth 2.0
ベース URLhttps://api.airtable.com/v0/

機能

  • テーブルからリストへの同期 - Airtable テーブルのレコードを Brevo の連絡先リストに直接同期
  • 製品カタログブリッジ - Airtable テーブルをメールレコメンデーション用の製品カタログとして使用
  • CRM 同期 - Airtable CRM と Brevo 連絡先の双方向同期
  • フォーム送信イベント - Airtable のフォーム送信を Brevo イベントとして転送
  • ビューベースのフィルタリング - 特定の Airtable ビューをターゲットの Brevo リストに同期
  • Webhook 自動化 - Airtable のレコードが変更されたときに Brevo キャンペーンをトリガー

前提条件

開始する前に、以下を準備してください。

  1. Airtable アカウント(無料プラン以上)
  2. 設定済みの Personal Access Token または OAuth アプリ
  3. 同期するベースおよびテーブルへのアクセス権
  4. API アクセス可能な Brevo アカウント
  5. 有効なサブスクリプションを持つ Tajo アカウント

認証

Airtable は Personal Access Tokens と OAuth 2.0 をサポートしています。

オプション 1: Personal Access Token(推奨)

  1. airtable.com/create/tokens にアクセス
  2. Create new token をクリック
  3. 「Tajo Integration」と名前を付ける
  4. スコープを追加:
data.records:read
data.records:write
data.recordComments:read
schema.bases:read
webhook:manage
  1. 特定のベースまたは全ベースへのアクセスを追加
  2. Create token をクリック

オプション 2: OAuth 2.0

マルチユーザー統合には OAuth 2.0 フローを使用します。

  1. airtable.com/create/oauth で統合を登録
  2. リダイレクト URI を設定: https://app.tajo.io/callbacks/airtable
  3. 上記と同じスコープをリクエスト

トークンスコープ

Personal Access Tokens は特定のベースにスコープできます。セキュリティのため、「All current and future bases」を選択するのではなく、統合に必要なベースにのみアクセスを付与してください。

Tajo への接続

Terminal window
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: true

API エンドポイント

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/basesGETアクセス可能なベースを一覧取得
/v0/meta/bases/{baseId}/tablesGETベース内のテーブルを一覧取得
/v0/{baseId}/{tableIdOrName}/listRecordCommentsGETレコードコメントを一覧取得
/v0/bases/{baseId}/webhooksPOSTWebhook を作成
/v0/bases/{baseId}/webhooksGETWebhook を一覧取得

コード例

コネクタの初期化

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

接続テスト

Terminal window
tajo connectors test airtable
# ✓ API 認証に成功
# ✓ ベースアクセスを確認
# ✓ テーブルスキーマ読み取り可能
# ✓ レコード一覧操作可能
# ✓ Webhook 登録が利用可能

ベストプラクティス

  1. トークンを特定のベースにスコープする - 必要な場合を除き、すべてのベースへのアクセスを付与しない
  2. フィルタ同期にはビューを使用する - データ量を減らすため、完全なテーブルではなく特定のビューを同期
  3. レコード操作をバッチ処理する - 作成と更新を 10 件単位でグループ化
  4. ページネーションを処理する - Airtable はページあたり 100 レコードを返します。offset で反復処理
  5. リアルタイムには Webhook を使用する - ポーリングの代わりに Webhook を登録して変更を検知
  6. フィールドタイプを正確にマッピングする - Airtable のフィールドタイプ(select、number、date)を Brevo 属性タイプに一致させる

セキュリティ

  • Personal Access Tokens - 特定のベースと操作にスコープ
  • OAuth 2.0 - リフレッシュトークンを使用した安全な認可フロー
  • HTTPS のみ - すべての API 通信は TLS 1.2 以上で暗号化
  • ベースレベルのアクセス制御 - トークンは個別のベースにスコープ
  • 暗号化されたストレージ - トークンは Tajo で保存時に暗号化
  • Webhook HMAC 検証 - Webhook 通知の真正性を検証

関連リソース

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AIアシスタント

こんにちは!ドキュメントについて何でもお聞きください。