Salesforce コネクター
Salesforce コネクター
Salesforce CRM を Tajo 経由で Brevo に接続して、エンタープライズグレードのコンタクト同期、リード管理、商談追跡、CRM データを活用したマーケティングオートメーションを実現します。
概要
| 項目 | 値 |
|---|---|
| プラットフォーム | Salesforce |
| カテゴリー | CRM |
| セットアップ難易度 | 高度 |
| 公式統合 | あり |
| 同期データ | コンタクト、リード、アカウント、商談、イベント |
| API ベース URL | https://yourInstance.salesforce.com/services/data/vXX.0 |
機能
- 双方向のコンタクト/リード同期 - Salesforce のコンタクトとリードを Brevo コンタクトリストと同期
- 商談追跡 - 売上ベースのセグメンテーションのために取引ステージと金額をマッピング
- アカウント階層 - Brevo の ABM 向けに企業アカウントを同期
- カスタムオブジェクトマッピング - Salesforce カスタムオブジェクトを Brevo 属性とイベントにマッピング
- キャンペーンメンバー同期 - Salesforce キャンペーンメンバーを Brevo リストと同期
- アクティビティ追跡 - エンゲージメントスコアリング向けに、タスク、イベント、メール活動を同期
- リアルタイムストリーミング - Salesforce Streaming API を使用した即時データ更新
- SOQL クエリ対応 - カスタム SOQL クエリで同期データをフィルタリング
前提条件
開始する前に、以下をご用意ください。
- API アクセス可能な Salesforce org (エディション不問)
- Salesforce Setup で設定した Connected App
- Salesforce ユーザープロファイルで API アクセスが有効
- API アクセス付きの Brevo アカウント
- Tajo アカウント
認証
OAuth 2.0 Web Server フロー (推奨)
ユーザー承認を伴う本番統合に最適です。
# Step 1: Authorizehttps://login.salesforce.com/services/oauth2/authorize? response_type=code& client_id={consumer_key}& redirect_uri={callback_url}
# Step 2: Exchange code for tokenscurl -X POST https://login.salesforce.com/services/oauth2/token \ -d "grant_type=authorization_code" \ -d "code={auth_code}" \ -d "client_id={consumer_key}" \ -d "client_secret={consumer_secret}" \ -d "redirect_uri={callback_url}"Username-Password フロー
ユーザー操作を伴わないサーバー間統合向けです。
curl -X POST https://login.salesforce.com/services/oauth2/token \ -d "grant_type=password" \ -d "client_id={consumer_key}" \ -d "client_secret={consumer_secret}" \ -d "username={username}" \ -d "password={password}{security_token}"セキュリティトークン
Salesforce の Username-Password フローでは、パスワードにセキュリティトークンを追加する必要があります。Setup > My Personal Information > Reset My Security Token からトークンをリセットしてください。
設定
基本セットアップ
connectors: salesforce: enabled: true instance_url: "https://yourorg.my.salesforce.com" api_version: "v59.0" auth: type: oauth2 consumer_key: "${SF_CONSUMER_KEY}" consumer_secret: "${SF_CONSUMER_SECRET}" refresh_token: "${SF_REFRESH_TOKEN}"
# Data sync options sync: contacts: true leads: true accounts: true opportunities: true campaigns: true
# Sync direction direction: salesforce_to_brevo
# Brevo list assignment lists: all_leads: 15 qualified_leads: 16 customers: 17フィールドマッピング
Salesforce のフィールドを Brevo コンタクト属性にマッピングします。
既定のマッピング
| Parameter | Type | Description |
|---|---|---|
Email required | string | コンタクト/リードのメール (Brevo における一意の識別子) |
FirstName optional | string | Brevo の FIRSTNAME 属性にマッピング |
LastName optional | string | Brevo の LASTNAME 属性にマッピング |
Phone optional | string | WhatsApp/SMS 送信用の SMS 属性にマッピング |
Account.Name optional | string | 紐づくアカウント/会社名 |
LeadSource optional | string | リードの取得ソース |
StageName optional | string | 取引追跡用の商談ステージ |
OwnerId optional | string | ルーティング用の担当営業 |
カスタムフィールドマッピング
field_mapping: # Standard fields Email: email FirstName: FIRSTNAME LastName: LASTNAME Phone: SMS
# CRM fields LeadSource: LEAD_SOURCE Lead_Score__c: LEAD_SCORE Account.Name: COMPANY_NAME Account.Industry: INDUSTRY
# Opportunity fields Amount: DEAL_VALUE StageName: DEAL_STAGE CloseDate: EXPECTED_CLOSE_DATE
# Custom fields Preferred_Channel__c: PREFERRED_CHANNEL Customer_Tier__c: VIP_TIERAPI エンドポイント
REST API リソース
| メソッド | エンドポイント | 説明 |
|---|---|---|
GET | /services/data/vXX.0/sobjects/Contact | コンタクトをクエリ |
POST | /services/data/vXX.0/sobjects/Contact | コンタクトを作成 |
PATCH | /services/data/vXX.0/sobjects/Contact/{id} | コンタクトを更新 |
GET | /services/data/vXX.0/sobjects/Lead | リードをクエリ |
GET | /services/data/vXX.0/sobjects/Account | アカウントをクエリ |
GET | /services/data/vXX.0/sobjects/Opportunity | 商談をクエリ |
GET | /services/data/vXX.0/query?q={SOQL} | SOQL クエリを実行 |
POST | /services/data/vXX.0/composite/sobjects | バッチ作成/更新 |
Bulk API
| メソッド | エンドポイント | 説明 |
|---|---|---|
POST | /services/data/vXX.0/jobs/ingest | バルク取込ジョブを作成 |
PUT | /services/data/vXX.0/jobs/ingest/{jobId}/batches | バッチデータをアップロード |
GET | /services/data/vXX.0/jobs/ingest/{jobId} | ジョブステータスを確認 |
Streaming API
| エンドポイント | 説明 |
|---|---|
/cometd/XX.0 | リアルタイムイベント用 CometD ロングポーリング |
| PushTopic | SOQL ベースのトピックでレコード変更を購読 |
| Change Data Capture | フィールドレベルの変更をきめ細かくストリーム |
| Platform Events | カスタムイベント駆動アーキテクチャ |
イベント
レコードイベント (Change Data Capture)
| イベント | トリガー | 用途 |
|---|---|---|
ContactChangeEvent | コンタクトの作成/更新/削除 | リアルタイムコンタクト同期 |
LeadChangeEvent | リードの作成/更新/変換 | リードライフサイクル追跡 |
OpportunityChangeEvent | 商談ステージの変更 | 取引パイプラインの自動化 |
AccountChangeEvent | アカウントレコードの変更 | 企業データ同期 |
Platform Events
| イベント | トリガー | 用途 |
|---|---|---|
Lead_Converted__e | リードがコンタクトに変換 | 変換後のナーチャリング |
Deal_Won__e | 商談成立 | 顧客オンボーディングフロー |
Deal_Lost__e | 商談失注 | ウィンバックキャンペーン |
コード例
コネクターの初期化
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
// Connect Salesforceawait tajo.connectors.connect('salesforce', { instanceUrl: 'https://yourorg.my.salesforce.com', consumerKey: process.env.SF_CONSUMER_KEY, consumerSecret: process.env.SF_CONSUMER_SECRET, refreshToken: process.env.SF_REFRESH_TOKEN});SOQL フィルタでコンタクトを同期
// Sync only qualified leads from Salesforceawait tajo.connectors.sync('salesforce', { type: 'filtered', resources: ['leads'], filter: "SELECT Id, Email, FirstName, LastName, LeadScore__c FROM Lead WHERE Status = 'Qualified' AND Email != null", brevoListId: 16});
// Check sync statusconst status = await tajo.connectors.status('salesforce');console.log(status);// {// connected: true,// lastSync: '2024-01-15T10:30:00Z',// contactsSynced: 18400,// leadsSynced: 7200,// opportunitiesSynced: 3100// }リアルタイムストリーミング
// Subscribe to Salesforce Change Data Captureawait tajo.connectors.stream('salesforce', { channels: [ '/data/ContactChangeEvent', '/data/LeadChangeEvent', '/data/OpportunityChangeEvent' ], handler: async (event) => { console.log(`Change detected: ${event.entity} ${event.changeType}`); // Automatically synced to Brevo by Tajo }});レート制限
Salesforce REST API の制限はエディションとライセンス数によって異なります。
| エディション | 24 時間あたりの API リクエスト数 |
|---|---|
| Developer | 15,000 |
| Enterprise | ユーザーライセンス 1 件あたり 1,000 (最小 15,000) |
| Unlimited | ユーザーライセンス 1 件あたり 5,000 (最小 15,000) |
| Performance | ユーザーライセンス 1 件あたり 5,000 (最小 15,000) |
追加制限:
- 同時 API 制限: 長時間実行リクエスト 25 件
- Bulk API: 24 時間あたり 15,000 バッチ
- Streaming API: 1 日あたり 2,000 イベント (引き上げ可能)
- Composite API: 1 リクエストあたり 25 サブリクエスト
API 使用状況のモニタリング
Salesforce Setup > System Overview で API 使用状況を確認できます。Tajo は大規模同期で Bulk API を使用して API 制限を節約します。
トラブルシューティング
よくある問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| INVALID_SESSION_ID | トークン期限切れ | OAuth トークンを自動更新 |
| REQUEST_LIMIT_EXCEEDED | 1 日の API 制限到達 | Bulk API を使用または同期頻度を削減 |
| FIELD_INTEGRITY_EXCEPTION | 必須フィールド欠落 | 設定で全必須フィールドをマッピング |
| DUPLICATES_DETECTED | 重複ルールが有効 | 重複処理の設定を調整 |
| INSUFFICIENT_ACCESS | オブジェクト権限不足 | Salesforce プロファイルで API アクセスを付与 |
デバッグモード
詳細ログを有効化します。
connectors: salesforce: debug: true log_level: verbose log_api_calls: true接続テスト
tajo connectors test salesforce# ✓ OAuth token valid# ✓ Contacts accessible# ✓ Leads accessible# ✓ Accounts accessible# ✓ Opportunities accessible# ✓ Bulk API enabledベストプラクティス
- 大規模同期には Bulk API を使用 - 2,000 件超のデータセットには Bulk API 2.0 を採用
- Change Data Capture を実装 - ポーリングの代わりに CDC でリアルタイム同期
- 必要なフィールドのみマッピング - 必要なフィールドのみ同期して API 使用量を削減
- トークンリフレッシュを処理 - OAuth トークンの自動更新ロジックを実装
- Composite リクエストを活用 - 関連する API コールを束ねてリクエスト数を削減
- まず Sandbox でテスト - 本番展開前に Salesforce Sandbox org で検証
セキュリティ
- OAuth 2.0 - 複数のグラント種別をサポートする業界標準の認可
- IP 制限 - Salesforce はログイン IP 範囲と信頼 IP 設定をサポート
- TLS 1.2+ - すべての API 通信は TLS 1.2 以上で暗号化
- フィールドレベルセキュリティ - プロファイルごとのきめ細かいフィールドアクセス制御
- セッション管理 - セッションタイムアウトと同時セッション数を設定可能