Reactive CRM मल्टी-कॉन्ट्रैक्ट वेबसाइट लीड इनटेक ← इंटीग्रेशन गाइड

मल्टी-कॉन्ट्रैक्ट वेबसाइट लीड इनटेक

यह दस्तावेज़ एक ही API कॉन्ट्रैक्ट का वर्णन करता है जिसके माध्यम से साइट backend एक ही रिक्वेस्ट में लीड डेटा, विज़िटर के संपर्क विवरण और मार्केटिंग UTM मेट्रिक्स ReactiveCRM को भेजता है।

1. उद्देश्य

साइट इंटीग्रेटर को संपर्क, फ़ोन, ईमेल, लीड और मार्केटिंग इवेंट अलग-अलग बनाने की ज़रूरत नहीं है। एक रिक्वेस्ट को एटॉमिक रूप से यह सब बनाना चाहिए:

  1. संपर्क;
  2. संपर्क का प्राथमिक फ़ोन;
  3. संपर्क का प्राथमिक ईमेल, यदि दिया गया हो;
  4. लीड;
  5. संपर्क और लीड के बीच लिंक;
  6. मार्केटिंग इवेंट और UTM एट्रिब्यूशन।

यदि कोई भी चरण विफल होता है, तो पूरी रिक्वेस्ट रोलबैक हो जाती है और आंशिक रूप से बनाया गया डेटा सहेजा नहीं जाता।

2. Endpoint

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

टोकन केवल साइट backend या serverless function से ही पास किया जाना चाहिए। CRM टोकन को ब्राउज़र JavaScript में कभी न रखें।

टेनेंट ऑथराइज़ेशन टोकन से निर्धारित होता है। दिए गए सभी UUID इसी टेनेंट के भीतर मान्य किए जाते हैं।

3. पूर्ण JSON कॉन्ट्रैक्ट

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. रूट फ़ील्ड

फ़ील्डप्रकारआवश्यकविवरण
externalIdstringअनुशंसितIdempotency के लिए फ़ॉर्म सबमिशन की स्थिर अद्वितीय ID
leadobjectहाँबनाए जा रहे लीड का डेटा
contactobjectहाँसंपर्क व्यक्ति का डेटा
marketingobjectनहींमार्केटिंग विज़िट के UTM मेट्रिक्स और तकनीकी डेटा

externalId पहले भेजने के प्रयास से पहले बनाया जाता है। टाइमआउट या नेटवर्क त्रुटि के बाद रिक्वेस्ट दोहराते समय, वही मान उपयोग करें।

4.2. lead ऑब्जेक्ट

फ़ील्डप्रकारआवश्यकविवरण
leadSourceIduuidहाँवर्तमान टेनेंट में लीड स्रोत की ID
qualitystringनहींप्रारंभिक रेटिंग: HOT, WARM, COOL या COLD
messagestringनहींविज़िटर का संदेश या सबमिशन पर टिप्पणी

यदि साइट प्री-क्वालिफ़िकेशन नहीं करती, तो quality फ़ील्ड न भेजना बेहतर है।

4.3. contact ऑब्जेक्ट

फ़ील्डप्रकारआवश्यकविवरण
firstNamestringहाँसंपर्क व्यक्ति का पहला नाम
lastNamestringनहींसंपर्क व्यक्ति का अंतिम नाम
phonestringहाँप्राथमिक फ़ोन; E.164 प्रारूप अनुशंसित
emailstring(email)नहींसंपर्क व्यक्ति का प्राथमिक ईमेल

सबमिशन संसाधित करने के लिए न्यूनतम आवश्यक डेटा firstName और phone है।

4.4. marketing ऑब्जेक्ट

फ़ील्डप्रकारआवश्यकविवरण
occurredAtdate-timeनहींफ़ॉर्म सबमिशन का समय; अनुपस्थित होने पर CRM समय उपयोग होता है
visitorIdstringनहींअनाम विज़िटर ID
sessionIdstringनहींसाइट सेशन ID
sourcestringनहींइवेंट स्रोत, डिफ़ॉल्ट website
channelstringनहींचैनल: जैसे paid, organic, social, email, direct
utmSourcestringनहींutm_source मान
utmMediumstringनहींutm_medium मान
utmCampaignstringनहींutm_campaign मान
utmContentstringनहींutm_content मान
utmTermstringनहींutm_term मान
gclidstringनहींGoogle Click ID
fbclidstringनहींMeta/Facebook Click ID
landingUrlstringनहींलैंडिंग पेज URL
referrerstringनहींपिछले पेज का URL

मार्केटिंग ऑब्जेक्ट में व्यक्तिगत डेटा दोहराया नहीं जाना चाहिए। नाम, फ़ोन, ईमेल और संदेश टेक्स्ट केवल contact और lead में पास किए जाते हैं।

5. न्यूनतम रिक्वेस्ट

json
{
  "externalId": "site-form-550e8400-e29b-41d4-a716-446655440000",
  "lead": {
    "leadSourceId": "7b33b18f-55bd-48a5-a8f0-e450a56dde47"
  },
  "contact": {
    "firstName": "Ivan",
    "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"
}

दोहराई गई रिक्वेस्ट से दूसरा लीड या संपर्क नहीं बनना चाहिए।

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": "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 इंटरफ़ेस

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टेनेंट या ऑपरेशन तक पहुँच नहींइंटीग्रेशन यूज़र और भूमिका जाँचें
404leadSourceId वर्तमान टेनेंट में नहीं मिलासाइट सेटिंग्स में स्रोत ID अपडेट करें
409externalId पहले से एक असंगत रिक्वेस्ट से जुड़ा हैID जनरेशन और इंटीग्रेशन लॉग जाँचें
5xxअस्थायी CRM त्रुटिसमान externalId के साथ वही रिक्वेस्ट रीट्राई करें

उदाहरण मान्यता त्रुटि:

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

11. Idempotency

12. साइट डेवलपर के लिए मिनी-गाइड

  1. पहली विज़िट पर, UTM टैग, gclid, fbclid, लैंडिंग URL और referrer संग्रहीत करें।
  2. फ़ॉर्म सबमिट होने पर, एक स्थिर externalId बनाएँ।
  3. फ़ॉर्म को साइट backend पर भेजें।
  4. Backend CRM टोकन जोड़ता है और POST /api/site/leads कॉल करता है।
  5. 201 या duplicate: true के साथ 200 पर, सबमिशन को डिलीवर मानें।
  6. टाइमआउट या 5xx पर, समान externalId के साथ रिक्वेस्ट रीट्राई करें।
  7. CRM टोकन सीधे ब्राउज़र से कभी न भेजें।

13. CRM मैनेजर को क्या मिलता है

सफल रिक्वेस्ट के बाद, CRM में एक लीड होती है जो:

यह सेट मैनेजर के लिए सबमिशन देखने, संपर्क को कॉल करने और लीड को क्वालिफ़ाई करने के लिए पर्याप्त है।