Reactive CRM マルチ契約ウェブサイトリード受付 ← 統合ガイド

マルチ契約ウェブサイトリード受付

このドキュメントは、サイトバックエンドがリードデータ、訪問者の連絡先詳細、マーケティングUTMメトリクスを1つのリクエストでReactiveCRMに送信する単一のAPI契約を説明します。

1. 目的

サイト統合者は、連絡先、電話、メール、リード、マーケティングイベントを個別に作成する必要はありません。1つのリクエストでアトミックに以下を作成する必要があります:

  1. 連絡先;
  2. 連絡先の主電話番号;
  3. 提供された場合の連絡先の主メールアドレス;
  4. リード;
  5. 連絡先とリード間のリンク;
  6. マーケティングイベントとUTMアトリビューション。

いずれかのステップが失敗した場合、リクエスト全体がロールバックされ、部分的に作成されたデータは保存されません。

2. エンドポイント

http
POST /api/site/leads
Authorization: Bearer <CRM_ACCESS_TOKEN>
Content-Type: application/json

トークンはサイトバックエンドまたはサーバーレス関数からのみ渡す必要があります。CRMトークンをブラウザのJavaScriptに配置しないでください。

テナントは認証トークンから決定されます。提供されたすべてのUUIDはこのテナント内で検証されます。

3. 完全なJSON契約

json
{
  "externalId": "site-form-01J7K9A2M4Y5T6",
  "lead": {
    "leadSourceId": "7b33b18f-55bd-48a5-a8f0-e450a56dde47",
    "quality": "WARM",
    "message": "CRM導入についての相談を希望します"
  },
  "contact": {
    "firstName": "イヴァン",
    "lastName": "イヴァノフ",
    "phone": "+79991234567",
    "email": "ivan@example.com"
  },
  "marketing": {
    "occurredAt": "2026-09-06T18:00:00Z",
    "visitorId": "visitor-8b7f",
    "sessionId": "session-31ac",
    "source": "website",
    "channel": "paid",
    "utmSource": "google",
    "utmMedium": "cpc",
    "utmCampaign": "summer-consulting",
    "utmContent": "banner-a",
    "utmTerm": "crm consultation",
    "gclid": "EAIaIQobChMI-example",
    "fbclid": null,
    "landingUrl": "https://example.com/consultation",
    "referrer": "https://www.google.com/"
  }
}

4. リクエストフィールド

4.1. ルートフィールド

フィールドタイプ必須説明
externalId文字列推奨冪等性のためのフォーム送信の安定した一意のID
leadオブジェクトはい作成されるリードのデータ
contactオブジェクトはい連絡先担当者のデータ
marketingオブジェクトいいえマーケティング訪問のUTMメトリクスと技術データ

externalIdは最初の送信試行前に生成されます。タイムアウトまたはネットワークエラー後にリクエストを繰り返す場合は、同じ値を使用してください。

4.2. lead オブジェクト

フィールドタイプ必須説明
leadSourceIduuidはい現在のテナント内のリードソースのID
quality文字列いいえ初期評価:HOT、WARM、COOLまたはCOLD
message文字列いいえ訪問者のメッセージまたは送信に関するコメント

サイトが事前評価を実行しない場合、qualityフィールドは送信しない方が良いでしょう。

4.3. contact オブジェクト

フィールドタイプ必須説明
firstName文字列はい連絡先担当者の名
lastName文字列いいえ連絡先担当者の姓
phone文字列はい主電話番号;E.164形式推奨
email文字列(メール)いいえ連絡先担当者の主メールアドレス

送信を処理するために必要な最小データはfirstNameとphoneです。

4.4. marketing オブジェクト

フィールドタイプ必須説明
occurredAt日時いいえフォーム送信時間;省略時はCRM時間を使用
visitorId文字列いいえ匿名訪問者ID
sessionId文字列いいえサイトセッションID
source文字列いいえイベントソース、デフォルトはwebsite
channel文字列いいえチャネル:例 paid、organic、social、email、direct
utmSource文字列いいえutm_sourceの値
utmMedium文字列いいえutm_mediumの値
utmCampaign文字列いいえutm_campaignの値
utmContent文字列いいえutm_contentの値
utmTerm文字列いいえutm_termの値
gclid文字列いいえGoogleクリックID
fbclid文字列いいえMeta/FacebookクリックID
landingUrl文字列いいえランディングページURL
referrer文字列いいえ前のページURL

個人データはマーケティングオブジェクト内で重複させてはいけません。名前、電話、メール、メッセージ本文はcontactとleadのみで渡されます。

5. 最小リクエスト

json
{
  "externalId": "site-form-550e8400-e29b-41d4-a716-446655440000",
  "lead": {
    "leadSourceId": "7b33b18f-55bd-48a5-a8f0-e450a56dde47"
  },
  "contact": {
    "firstName": "イヴァン",
    "phone": "+79991234567"
  }
}

6. 成功レスポンス

最初のリクエスト — 201 Created

json
{
  "leadId": "22222222-2222-2222-2222-222222222222",
  "contactId": "33333333-3333-3333-3333-333333333333",
  "phoneId": "44444444-4444-4444-4444-444444444444",
  "emailId": "55555555-5555-5555-5555-555555555555",
  "marketingEventId": "66666666-6666-6666-6666-666666666666",
  "duplicate": false,
  "createdAt": "2026-09-06T18:00:01Z"
}

メールまたはマーケティングデータが提供されない場合、対応するIDはnullとして返されます。

同じexternalIdでの繰り返し — 200 OK

json
{
  "leadId": "22222222-2222-2222-2222-222222222222",
  "contactId": "33333333-3333-3333-3333-333333333333",
  "phoneId": "44444444-4444-4444-4444-444444444444",
  "emailId": "55555555-5555-5555-5555-555555555555",
  "marketingEventId": "66666666-6666-6666-6666-666666666666",
  "duplicate": true,
  "createdAt": "2026-09-06T18:00:01Z"
}

繰り返しリクエストは2番目のリードまたは連絡先を作成してはいけません。

7. cURL例

bash
curl -X POST "$CRM_BASE_URL/api/site/leads" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "externalId": "site-form-01J7K9A2M4Y5T6",
    "lead": {
      "leadSourceId": "7b33b18f-55bd-48a5-a8f0-e450a56dde47",
      "quality": "WARM",
      "message": "折り返し電話してください"
    },
    "contact": {
      "firstName": "イヴァン",
      "lastName": "イヴァノフ",
      "phone": "+79991234567",
      "email": "ivan@example.com"
    },
    "marketing": {
      "utmSource": "google",
      "utmMedium": "cpc",
      "utmCampaign": "crm-demo",
      "landingUrl": "https://example.com/demo"
    }
  }'

8. TypeScriptインターフェース

ts
type LeadQuality = 'HOT' | 'WARM' | 'COOL' | 'COLD';

interface SiteLeadRequest {
  externalId?: string;
  lead: {
    leadSourceId: string;
    quality?: LeadQuality;
    message?: string;
  };
  contact: {
    firstName: string;
    lastName?: string;
    phone: string;
    email?: string;
  };
  marketing?: {
    occurredAt?: string;
    visitorId?: string;
    sessionId?: string;
    source?: string;
    channel?: string;
    utmSource?: string;
    utmMedium?: string;
    utmCampaign?: string;
    utmContent?: string;
    utmTerm?: string;
    gclid?: string;
    fbclid?: string;
    landingUrl?: string;
    referrer?: string;
  };
}

interface SiteLeadResponse {
  leadId: string;
  contactId: string;
  phoneId: string;
  emailId: string | null;
  marketingEventId: string | null;
  duplicate: boolean;
  createdAt: string;
}

9. サーバーサイドの例

ts
export async function sendLeadToCrm(payload: SiteLeadRequest): Promise<SiteLeadResponse> {
  const response = await fetch(`${process.env.CRM_BASE_URL}/api/site/leads`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.CRM_ACCESS_TOKEN}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(payload),
  });

  if (!response.ok) {
    const body = await response.text();
    throw new Error(`ReactiveCRM returned ${response.status}: ${body}`);
  }

  return response.json() as Promise<SiteLeadResponse>;
}

10. エラー

HTTP原因統合者の対応
400形式エラー、必須フィールド欠落、無効なメール/電話/qualityデータを修正;変更なしで自動再試行しない
401トークン欠落または無効統合トークンを更新
403テナントまたは操作へのアクセス権なし統合ユーザーとロールを確認
404現在のテナントにleadSourceIdが見つからないサイト設定でソースIDを更新
409externalIdが互換性のないリクエストに既にリンクされているID生成と統合ログを確認
5xx一時的なCRMエラー同じexternalIdで同じリクエストを再試行

検証エラーの例:

json
{
  "status": 400,
  "error": "Bad Request",
  "message": "contact.phone must not be blank",
  "path": "/api/site/leads"
}

11. 冪等性

12. サイト開発者向けミニガイド

  1. 最初の訪問時に、UTMタグ、gclid、fbclid、ランディングURL、リファラーを保存します。
  2. フォームが送信されたら、安定したexternalIdを生成します。
  3. フォームをサイトバックエンドに送信します。
  4. バックエンドがCRMトークンを追加し、POST /api/site/leadsを呼び出します。
  5. 201または200でduplicate: trueの場合、送信は配信されたと見なします。
  6. タイムアウトまたは5xxの場合、同じexternalIdでリクエストを再試行します。
  7. CRMトークンをブラウザから直接送信しないでください。

13. CRMマネージャーが得るもの

成功したリクエスト後、CRMには次のリードが含まれます:

このセットは、マネージャーが送信を確認し、連絡先に電話し、リードを評価するのに十分です。