Reactive CRM サイトリード統合ガイド ← 統合ガイド

ウェブサイトからのリード取得

ウェブサイトフォームをReactiveCRMと統合する手順:フォーム送信をリードとして取得、マーケティングアトリビューションイベントの送信、結果の検証。

1. 概要

推奨されるフローは2つのリクエストで構成されます:

  1. サイトはフォームデータを自身のバックエンドに送信します。
  2. サイトバックエンドはPOST /api/leads/createを介してCRMにリードを作成します。
  3. 作成成功後、バックエンドはPOST /api/dashboard/marketing/eventsを介してlead_submittedマーケティングイベントを送信し、受け取ったleadIdを渡します。
  4. CRMはマーケティングアトリビューションのためにUTMタグ、広告識別子、リファラーを保存します。
テキスト
ウェブサイトフォーム
    |
    v
サイトバックエンド / サーバーサイドプロキシ
    |  POST /api/leads/create
    v
ReactiveCRM -> leadId
    |  POST /api/dashboard/marketing/events
    v
マーケティングアトリビューションとダッシュボード

CRM JWTとシークレットをブラウザから直接送信しないでください。CRMトークンとサービス識別子が訪問者にさらされることがないよう、サイトバックエンドまたはサーバーレス関数を使用してください。

2. 認証とベースURL

すべてのリクエストは関連するテナントのコンテキストで実行され、CRM認証が必要です:

http
Authorization: Bearer <CRM_ACCESS_TOKEN>
Content-Type: application/json

例では次を使用します:

テキスト
CRM_BASE_URL=https://crm.example.com

ご自身の環境のURLに置き換えてください。

3. サイトで収集するデータ

リードデータ

リード作成のために、APIは以下をサポートします:

フィールド必須説明
messageいいえフォームからの問い合わせのメッセージまたはテキスト
ownerIdはいリードを担当するCRMユーザーのUUID
authorIdはいリードを作成したCRMユーザーのUUID
clientIdいいえ既存クライアントのUUID
contactIdいいえ既存連絡先のUUID
leadSourceIdいいえリードソースツリー内のノードのUUID
statusIdいいえ初期ステータスのUUID
qualityいいえHOT、WARM、COOLまたはCOLD

ownerIdとauthorIdはCRMユーザーのUUIDです。公開ウェブサイトフォームの場合、訪問者にこれらの値を自分で設定させないでください:バックエンドが統合設定から提供する必要があります。

マーケティング訪問データ

フォームが送信される前に、以下をクッキー、セッションストレージ、またはバックエンドに保存します:

最初の訪問時に値を保存し、サイト内を移動する際に空のパラメータで上書きしないでください。

4. リードの作成

エンドポイント

http
POST /api/leads/create

リクエスト例

bash
curl -X POST "$CRM_BASE_URL/api/leads/create" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "ウェブサイト問い合わせ:相談リクエスト",
    "ownerId": "11111111-1111-1111-1111-111111111111",
    "authorId": "11111111-1111-1111-1111-111111111111",
    "quality": "WARM"
  }'

201 Createdレスポンス例

json
{
  "id": "22222222-2222-2222-2222-222222222222",
  "message": "ウェブサイト問い合わせ:相談リクエスト",
  "quality": "WARM",
  "dealId": null,
  "createdAt": "2026-09-05T20:00:00Z",
  "updatedAt": "2026-09-05T20:00:00Z",
  "version": 0,
  "author": {
    "id": "11111111-1111-1111-1111-111111111111",
    "firstName": "CRM",
    "lastName": "ボット"
  },
  "owner": {
    "id": "11111111-1111-1111-1111-111111111111",
    "firstName": "CRM",
    "lastName": "ボット"
  }
}

レスポンスのidを保存します:この値はマーケティングイベントのleadIdフィールドに渡されます。

5. リード送信イベントの送信

エンドポイント

http
POST /api/dashboard/marketing/events

リクエスト例

bash
curl -X POST "$CRM_BASE_URL/api/dashboard/marketing/events" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "eventType": "lead_submitted",
    "occurredAt": "2026-09-05T20:00:00Z",
    "visitorId": "visitor-8b7f",
    "sessionId": "session-31ac",
    "leadId": "22222222-2222-2222-2222-222222222222",
    "externalId": "site-form-submit-20260905-000123",
    "source": "website",
    "channel": "paid",
    "utmSource": "google",
    "utmMedium": "cpc",
    "utmCampaign": "summer-consulting",
    "utmContent": "banner-a",
    "utmTerm": "crm consultation",
    "gclid": "EAIaIQobChMI-example",
    "landingUrl": "https://www.example.com/consultation",
    "referrer": "https://www.google.com/",
    "metadata": {
      "formName": "consultation",
      "pageType": "landing"
    }
  }'

レスポンス例

json
{
  "accepted": true,
  "duplicate": false,
  "eventId": "33333333-3333-3333-3333-333333333333"
}

同じexternalIdがこのsourceとテナントのペアですでに処理されている場合、APIはduplicate: trueを含む成功レスポンスを返します。これをエラーではなく成功として扱い、2番目のリードを作成しないでください。

6. サーバーサイドハンドラーの例

以下は簡略化されたNode.jsの例です。フォームデータはサイトバックエンドに送信される必要があり、ブラウザからCRMに直接送信されることはありません。

js
async function createWebsiteLead(form, attribution) {
  const headers = {
    Authorization: `Bearer ${process.env.CRM_ACCESS_TOKEN}`,
    'Content-Type': 'application/json',
  };

  const leadResponse = await fetch(
    `${process.env.CRM_BASE_URL}/api/leads/create`,
    {
      method: 'POST',
      headers,
      body: JSON.stringify({
        message: form.message || `ウェブサイト問い合わせ:${form.subject || '件名なし'}`,
        ownerId: process.env.CRM_LEAD_OWNER_ID,
        authorId: process.env.CRM_LEAD_AUTHOR_ID,
        quality: 'WARM',
      }),
    },
  );

  if (!leadResponse.ok) {
    throw new Error(`CRMリード作成に失敗しました:${leadResponse.status}`);
  }

  const lead = await leadResponse.json();
  const externalId = `website-${form.requestId}`;

  const eventResponse = await fetch(
    `${process.env.CRM_BASE_URL}/api/dashboard/marketing/events`,
    {
      method: 'POST',
      headers,
      body: JSON.stringify({
        eventType: 'lead_submitted',
        occurredAt: new Date().toISOString(),
        visitorId: attribution.visitorId,
        sessionId: attribution.sessionId,
        leadId: lead.id,
        externalId,
        source: 'website',
        channel: attribution.channel || 'direct',
        utmSource: attribution.utmSource,
        utmMedium: attribution.utmMedium,
        utmCampaign: attribution.utmCampaign,
        utmContent: attribution.utmContent,
        utmTerm: attribution.utmTerm,
        gclid: attribution.gclid,
        fbclid: attribution.fbclid,
        landingUrl: attribution.landingUrl,
        referrer: attribution.referrer,
        metadata: { formName: form.formName || 'website' },
      }),
    },
  );

  if (!eventResponse.ok) {
    // リードはすでに作成されています。イベントをキューに入れ、
    // 2番目のリードを作成する代わりに同じexternalIdで再試行します。
    throw new Error(`CRMマーケティングイベントに失敗しました:${eventResponse.status}`);
  }

  return { leadId: lead.id, marketingEvent: await eventResponse.json() };
}

7. 冪等性と再試行

8. 個人データとメタデータ

metadataに個人データやフォーム内容を渡すことは禁止されています:

個人データは、それ用に意図されたCRMエンティティでのみ渡される必要があります — 例えば、事前に作成されたcontactId/clientIdなど。metadataには技術的属性のみを保持してください:フォーム名、ページタイプ、バナーバリアントなど。

9. 典型的なレスポンスとエラー

HTTP状況対応
201リード作成idを保存しlead_submittedを送信
200 + duplicate: falseイベント受諾eventIdを統合ログに保存
200 + duplicate: trueイベントは既に受諾済み処理済みとして扱う;再送信しない
400無効なデータまたはmetadata内のPIIペイロードを修正;変更なしの再試行は無効
401トークン無効または欠落バックエンドでCRMトークンを更新
403トークンに操作権限がないロールとテナントを確認
5xx / タイムアウト一時的なCRMまたはネットワークエラー同じexternalIdで再試行;リードにはキューを使用

10. CRMでの結果の検証

統合後、以下を検証します:

  1. リードがGET /api/leads/{id}またはGET /api/leads/pagedリストに表示される。
  2. リードの所有者、作成者、作成時間が正しい。
  3. 最初の送信でマーケティングイベントレスポンスのduplicateがfalseである。
  4. 同じ送信を再送信するとduplicate: trueが返される。
  5. マーケティングダッシュボードで、データが正しい期間、チャネル、キャンペーンに表示される。

作成されたリードの取得

bash
curl "$CRM_BASE_URL/api/leads/$LEAD_ID" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

リストまたは照合用のリード取得

bash
curl "$CRM_BASE_URL/api/leads/paged?page=0&size=20&createdAtFrom=2026-09-05T00:00:00Z&createdAtTo=2026-09-05T23:59:59Z&sort=createdAt,desc" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

pageパラメータは0から始まり、デフォルトのsizeは20です。ウェブサイトリードを取得するには、関連データがCRMにすでに保存されている場合、message、createdAtFrom/createdAtTo、contactEmail、またはsearchフィルターを追加で使用します。