Reactive CRM Leitfaden zur Lead-Integration von der Website ← Integrationsanleitung

Leads von Ihrer Website empfangen

Anleitung zur Integration des Formulars Ihrer Website mit ReactiveCRM: Erfassung von Formularübermittlungen als Leads, Senden von Marketing-Attributionsereignissen und Überprüfung der Ergebnisse.

1. Überblick

Das empfohlene Szenario besteht aus zwei Anfragen:

  1. Die Website sendet die Formulardaten an ihr eigenes Backend.
  2. Das Website-Backend erstellt einen Lead in der CRM über POST /api/leads/create.
  3. Nach erfolgreicher Erstellung sendet das Backend das Marketing-Ereignis lead_submitted über POST /api/dashboard/marketing/events und übergibt dabei die erhaltene leadId.
  4. Die CRM speichert UTM-Tags, Werbe-IDs und Referrer für die Marketing-Attribution.
text
Website-Formular
    |
    v
Website-Backend / serverseitiger Proxy
    |  POST /api/leads/create
    v
ReactiveCRM -> leadId
    |  POST /api/dashboard/marketing/events
    v
Marketing-Attribution und Dashboard

Senden Sie CRM-JWT und Geheimnisse nicht direkt aus dem Browser. Verwenden Sie das Website-Backend oder eine Serverless-Funktion, damit das CRM-Token und interne IDs niemals an den Besucher gelangen.

2. Authentifizierung und Basis-URL

Alle Anfragen werden im Kontext des entsprechenden Mandanten ausgeführt und erfordern eine CRM-Autorisierung:

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

In den Beispielen wird verwendet:

text
CRM_BASE_URL=https://crm.example.com

Ersetzen Sie dies durch die URL Ihrer Umgebung.

3. Auf der Website zu sammelnde Daten

Lead-Daten

Für die Lead-Erstellung unterstützt die API:

FeldErforderlichBeschreibung
messageneinNachricht oder Anfragetext aus dem Formular
ownerIdjaUUID des für den Lead verantwortlichen CRM-Benutzers
authorIdjaUUID des CRM-Benutzers, der den Lead erstellt hat
clientIdneinUUID eines vorhandenen Kunden
contactIdneinUUID eines vorhandenen Kontakts
leadSourceIdneinUUID eines Knotens im Lead-Quellen-Baum
statusIdneinUUID des Anfangsstatus
qualityneinHOT, WARM, COOL oder COLD

ownerId und authorId sind UUIDs von CRM-Benutzern. Erlauben Sie dem Besucher bei einem öffentlichen Formular auf der Website nicht, diese Werte selbst zu setzen: Das Backend sollte sie aus der Integrationskonfiguration übernehmen.

Daten des Marketing-Besuchs

Speichern Sie vor dem Absenden des Formulars Folgendes in Cookies, Session Storage oder im Backend:

Speichern Sie die Werte beim ersten Besuch und überschreiben Sie sie nicht mit leeren Parametern bei der Navigation auf der Website.

4. Lead erstellen

Endpunkt

http
POST /api/leads/create

Beispielanfrage

bash
curl -X POST "$CRM_BASE_URL/api/leads/create" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Website-Anfrage: Beratungsanfrage",
    "ownerId": "11111111-1111-1111-1111-111111111111",
    "authorId": "11111111-1111-1111-1111-111111111111",
    "quality": "WARM"
  }'

Beispielantwort 201 Created

json
{
  "id": "22222222-2222-2222-2222-222222222222",
  "message": "Website-Anfrage: Beratungsanfrage",
  "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": "Bot"
  },
  "owner": {
    "id": "11111111-1111-1111-1111-111111111111",
    "firstName": "CRM",
    "lastName": "Bot"
  }
}

Speichern Sie die id aus der Antwort: Dieser Wert wird im Feld leadId des Marketing-Ereignisses übergeben.

5. Ereignis „Lead gesendet“ senden

Endpunkt

http
POST /api/dashboard/marketing/events

Beispielanfrage

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"
    }
  }'

Beispielantwort

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

Wenn dieselbe externalId bereits für dieses Paar aus source und Mandant verarbeitet wurde, gibt die API eine erfolgreiche Antwort mit duplicate: true zurück. Betrachten Sie dies als Erfolg, nicht als Fehler, und erstellen Sie keinen zweiten Lead.

6. Beispiel für einen Server-Handler

Nachfolgend ein vereinfachtes Beispiel in Node.js. Die Formulardaten sollten an das Website-Backend gesendet werden, nicht direkt vom Browser an die 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 || `Website-Anfrage: ${form.subject || 'kein Betreff'}`,
        ownerId: process.env.CRM_LEAD_OWNER_ID,
        authorId: process.env.CRM_LEAD_AUTHOR_ID,
        quality: 'WARM',
      }),
    },
  );

  if (!leadResponse.ok) {
    throw new Error(`CRM-Lead-Erstellung fehlgeschlagen: ${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) {
    // Lead wurde bereits erstellt. Stellen Sie das Ereignis in eine Warteschlange und wiederholen Sie es
    // mit derselben externalId, anstatt einen zweiten Lead zu erstellen.
    throw new Error(`CRM-Marketing-Ereignis fehlgeschlagen: ${eventResponse.status}`);
  }

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

7. Idempotenz und Wiederholungen

8. Personenbezogene Daten und metadata

Es ist verboten, personenbezogene Daten und Formularinhalte in metadata zu übermitteln:

Personenbezogene Daten dürfen nur in den dafür vorgesehenen CRM-Entitäten übermittelt werden — z. B. in zuvor erstellten contactId/clientId. Belassen Sie in metadata nur technische Attribute: Formularname, Seitentyp, Bannervariante usw.

9. Typische Antworten und Fehler

HTTPSituationMaßnahme
201Lead erstelltSpeichern Sie id und senden Sie lead_submitted
200 + duplicate: falseEreignis angenommenSpeichern Sie eventId im Integrationsprotokoll
200 + duplicate: trueEreignis bereits angenommenAls verarbeitet betrachten; nicht erneut senden
400Ungültige Daten oder personenbezogene Daten in metadataDaten korrigieren; Wiederholung ohne Änderungen hilft nicht
401Ungültiges oder fehlendes TokenCRM-Token im Backend aktualisieren
403Token hat keine Berechtigung für die OperationRolle und Mandant prüfen
5xx / TimeoutVorübergehender CRM- oder NetzwerkfehlerMit derselben externalId wiederholen; für Leads eine Warteschlange verwenden

10. Ergebnisse im CRM überprüfen

Nach der Integration prüfen Sie:

  1. Der Lead wird über GET /api/leads/{id} oder in der Liste GET /api/leads/paged angezeigt.
  2. Besitzer, Autor und Erstellungszeitpunkt des Leads sind korrekt.
  3. Die Antwort des Marketing-Ereignisses bei der ersten Sendung enthält duplicate gleich false.
  4. Das erneute Senden derselben Anfrage gibt duplicate: true zurück.
  5. Im Marketing-Dashboard erscheinen die Daten im richtigen Zeitraum, Kanal und Kampagne.

Erstellten Lead abrufen

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

Leads für Listen oder Abgleiche abrufen

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"

Der Parameter page beginnt bei 0; der Standardwert für size ist 20. Um Leads von der Website zu erhalten, verwenden Sie zusätzlich die Filter message, createdAtFrom/createdAtTo, contactEmail oder search, falls die entsprechenden Daten bereits in der CRM gespeichert sind.