मल्टी-कॉन्ट्रैक्ट वेबसाइट लीड इनटेक
यह दस्तावेज़ एक ही API कॉन्ट्रैक्ट का वर्णन करता है जिसके माध्यम से साइट backend एक ही रिक्वेस्ट में लीड डेटा, विज़िटर के संपर्क विवरण और मार्केटिंग UTM मेट्रिक्स ReactiveCRM को भेजता है।
1. उद्देश्य
साइट इंटीग्रेटर को संपर्क, फ़ोन, ईमेल, लीड और मार्केटिंग इवेंट अलग-अलग बनाने की ज़रूरत नहीं है। एक रिक्वेस्ट को एटॉमिक रूप से यह सब बनाना चाहिए:
- संपर्क;
- संपर्क का प्राथमिक फ़ोन;
- संपर्क का प्राथमिक ईमेल, यदि दिया गया हो;
- लीड;
- संपर्क और लीड के बीच लिंक;
- मार्केटिंग इवेंट और UTM एट्रिब्यूशन।
यदि कोई भी चरण विफल होता है, तो पूरी रिक्वेस्ट रोलबैक हो जाती है और आंशिक रूप से बनाया गया डेटा सहेजा नहीं जाता।
2. Endpoint
POST /api/site/leads
Authorization: Bearer <CRM_ACCESS_TOKEN>
Content-Type: application/json
टोकन केवल साइट backend या serverless function से ही पास किया जाना चाहिए। CRM टोकन को ब्राउज़र JavaScript में कभी न रखें।
टेनेंट ऑथराइज़ेशन टोकन से निर्धारित होता है। दिए गए सभी UUID इसी टेनेंट के भीतर मान्य किए जाते हैं।
3. पूर्ण JSON कॉन्ट्रैक्ट
{
"externalId": "site-form-01J7K9A2M4Y5T6",
"lead": {
"leadSourceId": "7b33b18f-55bd-48a5-a8f0-e450a56dde47",
"quality": "WARM",
"message": "I'd like a consultation on CRM implementation"
},
"contact": {
"firstName": "Ivan",
"lastName": "Ivanov",
"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 | string | अनुशंसित | Idempotency के लिए फ़ॉर्म सबमिशन की स्थिर अद्वितीय ID |
lead | object | हाँ | बनाए जा रहे लीड का डेटा |
contact | object | हाँ | संपर्क व्यक्ति का डेटा |
marketing | object | नहीं | मार्केटिंग विज़िट के UTM मेट्रिक्स और तकनीकी डेटा |
externalId पहले भेजने के प्रयास से पहले बनाया जाता है। टाइमआउट या नेटवर्क त्रुटि के बाद रिक्वेस्ट दोहराते समय, वही मान उपयोग करें।
4.2. lead ऑब्जेक्ट
| फ़ील्ड | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
leadSourceId | uuid | हाँ | वर्तमान टेनेंट में लीड स्रोत की ID |
quality | string | नहीं | प्रारंभिक रेटिंग: HOT, WARM, COOL या COLD |
message | string | नहीं | विज़िटर का संदेश या सबमिशन पर टिप्पणी |
यदि साइट प्री-क्वालिफ़िकेशन नहीं करती, तो quality फ़ील्ड न भेजना बेहतर है।
4.3. contact ऑब्जेक्ट
| फ़ील्ड | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
firstName | string | हाँ | संपर्क व्यक्ति का पहला नाम |
lastName | string | नहीं | संपर्क व्यक्ति का अंतिम नाम |
phone | string | हाँ | प्राथमिक फ़ोन; E.164 प्रारूप अनुशंसित |
email | string(email) | नहीं | संपर्क व्यक्ति का प्राथमिक ईमेल |
सबमिशन संसाधित करने के लिए न्यूनतम आवश्यक डेटा firstName और phone है।
4.4. marketing ऑब्जेक्ट
| फ़ील्ड | प्रकार | आवश्यक | विवरण |
|---|---|---|---|
occurredAt | date-time | नहीं | फ़ॉर्म सबमिशन का समय; अनुपस्थित होने पर CRM समय उपयोग होता है |
visitorId | string | नहीं | अनाम विज़िटर ID |
sessionId | string | नहीं | साइट सेशन ID |
source | string | नहीं | इवेंट स्रोत, डिफ़ॉल्ट website |
channel | string | नहीं | चैनल: जैसे paid, organic, social, email, direct |
utmSource | string | नहीं | utm_source मान |
utmMedium | string | नहीं | utm_medium मान |
utmCampaign | string | नहीं | utm_campaign मान |
utmContent | string | नहीं | utm_content मान |
utmTerm | string | नहीं | utm_term मान |
gclid | string | नहीं | Google Click ID |
fbclid | string | नहीं | Meta/Facebook Click ID |
landingUrl | string | नहीं | लैंडिंग पेज URL |
referrer | string | नहीं | पिछले पेज का URL |
मार्केटिंग ऑब्जेक्ट में व्यक्तिगत डेटा दोहराया नहीं जाना चाहिए। नाम, फ़ोन, ईमेल और संदेश टेक्स्ट केवल contact और lead में पास किए जाते हैं।
5. न्यूनतम रिक्वेस्ट
{
"externalId": "site-form-550e8400-e29b-41d4-a716-446655440000",
"lead": {
"leadSourceId": "7b33b18f-55bd-48a5-a8f0-e450a56dde47"
},
"contact": {
"firstName": "Ivan",
"phone": "+79991234567"
}
}
6. सफल रिस्पॉन्स
पहली रिक्वेस्ट — 201 Created
{
"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
{
"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"
}
दोहराई गई रिक्वेस्ट से दूसरा लीड या संपर्क नहीं बनना चाहिए।
7. cURL उदाहरण
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": "Call me back"
},
"contact": {
"firstName": "Ivan",
"lastName": "Ivanov",
"phone": "+79991234567",
"email": "ivan@example.com"
},
"marketing": {
"utmSource": "google",
"utmMedium": "cpc",
"utmCampaign": "crm-demo",
"landingUrl": "https://example.com/demo"
}
}'
8. TypeScript इंटरफ़ेस
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. सर्वर-साइड उदाहरण
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 अपडेट करें |
409 | externalId पहले से एक असंगत रिक्वेस्ट से जुड़ा है | ID जनरेशन और इंटीग्रेशन लॉग जाँचें |
5xx | अस्थायी CRM त्रुटि | समान externalId के साथ वही रिक्वेस्ट रीट्राई करें |
उदाहरण मान्यता त्रुटि:
{
"status": 400,
"error": "Bad Request",
"message": "contact.phone must not be blank",
"path": "/api/site/leads"
}
11. Idempotency
externalIdटेनेंट औरwebsiteस्रोत के भीतर अद्वितीय होना चाहिए।- पहली रिक्वेस्ट से पहले
externalIdबनाएँ और इसे साइट सबमिशन में संग्रहीत करें। - टाइमआउट पर, समान बॉडी और समान
externalIdके साथ रिक्वेस्ट रीट्राई करें। - एक ही सबमिशन को रीट्राई करते समय नया
externalIdन बनाएँ। - यदि
duplicate: trueहै, तो सबमिशन पहले ही संसाधित हो चुका है और सफलतापूर्वक डिलीवर माना जाता है।
12. साइट डेवलपर के लिए मिनी-गाइड
- पहली विज़िट पर, UTM टैग,
gclid,fbclid, लैंडिंग URL और referrer संग्रहीत करें। - फ़ॉर्म सबमिट होने पर, एक स्थिर
externalIdबनाएँ। - फ़ॉर्म को साइट backend पर भेजें।
- Backend CRM टोकन जोड़ता है और
POST /api/site/leadsकॉल करता है। 201याduplicate: trueके साथ200पर, सबमिशन को डिलीवर मानें।- टाइमआउट या
5xxपर, समानexternalIdके साथ रिक्वेस्ट रीट्राई करें। - CRM टोकन सीधे ब्राउज़र से कभी न भेजें।
13. CRM मैनेजर को क्या मिलता है
सफल रिक्वेस्ट के बाद, CRM में एक लीड होती है जो:
leadSourceIdस्रोत सेट किए हुए है;- विज़िटर का संदेश रखती है;
- प्रारंभिक क्वालिटी रेटिंग रखती है, यदि साइट ने प्रदान की हो;
- नाम और प्राथमिक फ़ोन वाले संपर्क से जुड़ी है;
- प्राथमिक ईमेल से जुड़ी है, यदि प्रदान किया गया हो;
- एनालिटिक्स के लिए UTM मेट्रिक्स और विज्ञापन पहचानकर्ता रखती है।
यह सेट मैनेजर के लिए सबमिशन देखने, संपर्क को कॉल करने और लीड को क्वालिफ़ाई करने के लिए पर्याप्त है।
Reactive CRM