ウェブサイトからのリード取得
ウェブサイトフォームをReactiveCRMと統合する手順:フォーム送信をリードとして取得、マーケティングアトリビューションイベントの送信、結果の検証。
1. 概要
推奨されるフローは2つのリクエストで構成されます:
- サイトはフォームデータを自身のバックエンドに送信します。
- サイトバックエンドは
POST /api/leads/createを介してCRMにリードを作成します。 - 作成成功後、バックエンドは
POST /api/dashboard/marketing/eventsを介してlead_submittedマーケティングイベントを送信し、受け取ったleadIdを渡します。 - CRMはマーケティングアトリビューションのためにUTMタグ、広告識別子、リファラーを保存します。
ウェブサイトフォーム
|
v
サイトバックエンド / サーバーサイドプロキシ
| POST /api/leads/create
v
ReactiveCRM -> leadId
| POST /api/dashboard/marketing/events
v
マーケティングアトリビューションとダッシュボード
CRM JWTとシークレットをブラウザから直接送信しないでください。CRMトークンとサービス識別子が訪問者にさらされることがないよう、サイトバックエンドまたはサーバーレス関数を使用してください。
2. 認証とベースURL
すべてのリクエストは関連するテナントのコンテキストで実行され、CRM認証が必要です:
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です。公開ウェブサイトフォームの場合、訪問者にこれらの値を自分で設定させないでください:バックエンドが統合設定から提供する必要があります。
マーケティング訪問データ
フォームが送信される前に、以下をクッキー、セッションストレージ、またはバックエンドに保存します:
utm_source→utmSourceutm_medium→utmMediumutm_campaign→utmCampaignutm_content→utmContentutm_term→utmTermgclid— Google Ads識別子fbclid— Meta/Facebook識別子- ランディングページURL →
landingUrl - 前のページURL →
referrer - 独自の訪問者およびセッション識別子 →
visitorId、sessionId
最初の訪問時に値を保存し、サイト内を移動する際に空のパラメータで上書きしないでください。
4. リードの作成
エンドポイント
POST /api/leads/create
リクエスト例
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レスポンス例
{
"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. リード送信イベントの送信
エンドポイント
POST /api/dashboard/marketing/events
リクエスト例
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"
}
}'
レスポンス例
{
"accepted": true,
"duplicate": false,
"eventId": "33333333-3333-3333-3333-333333333333"
}
同じexternalIdがこのsourceとテナントのペアですでに処理されている場合、APIはduplicate: trueを含む成功レスポンスを返します。これをエラーではなく成功として扱い、2番目のリードを作成しないでください。
6. サーバーサイドハンドラーの例
以下は簡略化されたNode.jsの例です。フォームデータはサイトバックエンドに送信される必要があり、ブラウザからCRMに直接送信されることはありません。
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. 冪等性と再試行
- 各フォーム送信に対して安定した
externalIdを生成します。例えば、最初のリクエストの前に作成されたUUID、または一意のフォームrequestIdを使用します。 - ネットワークエラー時には、同じ
externalIdでマーケティングイベントリクエストを再試行します。 - 再試行時に新しい
externalIdを生成しないでください:重複イベントが作成されます。 - リード作成リクエストがタイムアウトにより不明な結果で終了した場合、盲目的に新しいリードを作成しないでください。最初に独自の
requestIdとサイトバックエンドの重複排除メカニズムを使用するか、CRMで作成されたリードを探してください。 - イベント送信エラーが、リード作成結果を確認せずにユーザーがフォームを再送信する原因になってはいけません。
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での結果の検証
統合後、以下を検証します:
- リードが
GET /api/leads/{id}またはGET /api/leads/pagedリストに表示される。 - リードの所有者、作成者、作成時間が正しい。
- 最初の送信でマーケティングイベントレスポンスの
duplicateがfalseである。 - 同じ送信を再送信すると
duplicate: trueが返される。 - マーケティングダッシュボードで、データが正しい期間、チャネル、キャンペーンに表示される。
作成されたリードの取得
curl "$CRM_BASE_URL/api/leads/$LEAD_ID" \
-H "Authorization: Bearer $CRM_ACCESS_TOKEN"
リストまたは照合用のリード取得
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フィルターを追加で使用します。
Reactive CRM