Reactive CRM Integrationsanleitung ← Zurück zur Website

ReactiveCRM Integrationsanleitung

Technische Dokumentation für Unternehmen (Mandanten), die eine eigene Integration mit ReactiveCRM entwickeln möchten: Erfassen von Leads und Kunden, Anlegen von Deals, Senden von Marketing-Ereignissen und Exportieren von Daten.

Dieses Dokument behandelt nur die für externe Integrationen am häufigsten verwendeten APIs. Interne Referenzdaten und Admin-Service-Endpunkte werden bewusst ausgeschlossen.

1. Überblick über die Integration

Ein typischer Integrationsablauf sieht wie folgt aus:

text
Ihr System (Backend / serverseitiger Proxy)
    |
    | 1. POST /api/auth/login  (Access- und Refresh-Token anfordern)
    v
ReactiveCRM
    | 2. Referenzen: GET /api/users/paged, GET /api/statuses, GET /api/stages, GET /api/lead-sources
    |    (UUIDs für ownerId, authorId, statusId usw. abrufen)
    v
    | 3. Kernoperationen:
    |      POST /api/leads/create              — Lead anlegen
    |      POST /api/clients/create            — Kunden anlegen
    |      POST /api/contacts/create           — Kontakt anlegen
    |      POST /api/deals/create              — Deal anlegen
    |      POST /api/dashboard/marketing/events — Marketing-Ereignis senden
    |      POST /api/leads/import/batch         — Leads per Sammelimport anlegen
    v
    | 4. Lesen / Exportieren:
    |      GET /api/leads/paged                 — Seitenweises Lesen mit Filtern
    |      GET /api/export/leads                — NDJSON-Export aller Leads

Wichtige Sicherheitsregel: Rufen Sie die CRM-API niemals direkt aus dem Browser eines Endbenutzers auf. Bewahren Sie das CRM-Token und die internen Identifikatoren in Ihrem Backend (oder einer Serverless-Funktion) auf.

2. Authentifizierung

2.1. Token abrufen

Die Authentifizierungsendpunkte benötigen kein Token:

MethodeURLBeschreibung
POST/api/auth/loginAnmeldung mit Benutzername + Passwort, gibt Access- und Refresh-Token zurück
POST/api/auth/refreshRefresh-Token gegen ein neues Tokenpaar eintauschen
POST/api/auth/logoutRefresh-Token widerrufen
bash
curl -X POST "$CRM_BASE_URL/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"username": "integration", "password": "secret123"}'
json
{
  "token": "eyJhbGciOiJIUzI1NiJ9...",
  "refreshToken": "a8f3k2m9Qx7Tt1Vv...",
  "tokenType": "Bearer",
  "user": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "firstName": "Integration",
    "lastName": "Bot",
    "tenantId": "660e8400-e29b-41d4-a716-446655440001"
  },
  "tenant": {
    "id": "660e8400-e29b-41d4-a716-446655440001",
    "name": "Zunga Corp"
  }
}

2.2. Regeln für die Token-Verwaltung

2.3. Grundeinstellungen

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

In allen folgenden Beispielen werden diese Header vorausgesetzt:

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

3. Konventionen für Seiten-APIs

Alle Listen-Endpunkte der Form GET /api/*/paged teilen dieselben Konventionen:

ParameterTypStandardBeschreibung
pageinteger0Seitennummer, nullbasiert
sizeintegerpro EndpunktSeitengröße
sortstringcreatedAt,descSortierung im Format Feld,Richtung. Richtung: asc oder desc

Antwortstruktur für Seiten

json
{
  "content": [ { "..." } ],
  "page": 0,
  "size": 20,
  "totalElements": 137,
  "totalPages": 7
}

Datumsfilter

Verwenden Sie FeldVon / FeldBis für Bereiche (ISO 8601):

text
createdAtFrom=2026-01-01T00:00:00Z
createdAtTo=2026-01-31T23:59:59Z

Sortierung

Immer ?sort=Feld,Richtung:

text
?sort=createdAt,desc
?sort=name,asc

Einige Filterfelder haben eigene Bereichsparameter (z. B. dealAmountFrom/dealAmountTo).

Semantik der Filterung

4. Referenzen (UUIDs abrufen)

Bevor Sie Entitäten anlegen, rufen Sie die UUIDs der zugehörigen Referenzdaten ab. Die wichtigsten sind:

4.1. Benutzer (GET /api/users/paged)

Wird für ownerId, authorId, developingManagerIds verwendet.

bash
curl "$CRM_BASE_URL/api/users/paged?page=0&size=50&sort=createdAt,asc" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

Beispielantwort (content-Auszug):

json
[
  {
    "id": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "firstName": "Roman",
    "lastName": "Posledovskiy",
    "username": "roman",
    "email": "roman@example.com",
    "tenantId": "660e8400-e29b-41d4-a716-446655440001"
  }
]

4.2. Status (GET /api/statuses)

Wird für statusId von Leads, Deals und Deal-Party-Kunden verwendet. Gibt ein Array zurück:

bash
curl "$CRM_BASE_URL/api/statuses" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"
json
[
  {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "New",
    "entityType": "LEAD"
  },
  {
    "id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
    "name": "In progress",
    "entityType": "STAGE"
  }
]

4.3. Phasen (GET /api/stages)

Wird für die stageId eines Deals verwendet:

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

4.4. Lead-Quellen (GET /api/lead-sources)

Gibt einen Baum der Lead-Quellen zurück. Wird für die leadSourceId eines Leads verwendet:

bash
curl "$CRM_BASE_URL/api/lead-sources" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"
json
[
  {
    "id": "cccc0001-0000-0000-0000-000000000001",
    "name": "Website",
    "children": [
      {
        "id": "cccc0001-0000-0000-0000-000000000002",
        "name": "Feedback form",
        "children": []
      }
    ]
  }
]

5. Leads

5.1. Lead anlegen (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": "Website-Anfrage: Beratung",
    "ownerId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "authorId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "leadSourceId": "cccc0001-0000-0000-0000-000000000002",
    "statusId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "quality": "WARM"
  }'

Anfragefelder:

FeldTypErforderlichBeschreibung
messagestringneinNachricht / Anfrage-Text
ownerIduuidjaVerantwortlicher Benutzer
authorIduuidjaBenutzer, der den Lead erstellt hat
clientIduuidneinZugehöriger Kunde
contactIduuidneinZugehöriger Kontakt
leadSourceIduuidneinKnoten der Lead-Quelle
statusIduuidneinStatus
qualityenumneinHOT, WARM, COOL, COLD

Beispielantwort 201 Created:

json
{
  "id": "22222222-2222-2222-2222-222222222222",
  "message": "Website-Anfrage: Beratung",
  "status": {
    "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "New"
  },
  "quality": "WARM",
  "dealId": null,
  "createdAt": "2026-09-05T20:00:00Z",
  "updatedAt": "2026-09-05T20:00:00Z",
  "version": 0,
  "author": {
    "id": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "firstName": "Roman",
    "lastName": "Posledovskiy"
  },
  "owner": {
    "id": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "firstName": "Roman",
    "lastName": "Posledovskiy"
  }
}

Bewahren Sie die zurückgegebene id auf — sie wird für die leadId des Marketing-Ereignisses benötigt (siehe Abschnitt 8).

5.2. Seitenweises Lesen (GET /api/leads/paged)

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

Wichtige Filter:

ParameterTypModusBeschreibung
statusIduuidexaktNach Status filtern
leadSourceIduuidexaktNach Lead-Quelle filtern
qualityenumexaktHOT, WARM, COOL, COLD
messagestringILIKETeilstring in der Nachricht
searchstringILIKE (ODER)Suche über Nachricht, Kontakt, E-Mail, Telefon
contactEmailstringILIKENach E-Mail des Kontakts
contactPhonestringILIKENach Telefon des Kontakts
companystringILIKENach Firmenname
clientIduuidexaktNach Kunden-ID
createdAtFrom / createdAtTodate-timeBereichNach Erstellungsdatum
updatedAtFrom / updatedAtTodate-timeBereichNach Änderungsdatum
createdByuuidexaktNach Lead-Autor

Es gibt auch Filter für den zugehörigen Deal: dealStatusId, dealStageId, dealAmountFrom/dealAmountTo, dealProbabilityFrom/dealProbabilityTo.

Sortierung: createdAt, updatedAt, message, quality, Status/Quelle und andere (Feld,Richtung-Format).

5.3. Einzelnen Lead abrufen (GET /api/leads/{id})

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

5.4. Sammelimport von Leads (POST /api/leads/import/batch)

Für das Massenladen vieler Leads verwenden Sie den Batch-Endpunkt. Er akzeptiert ein Array von Leads, erstellt einen Importverlauf und ermöglicht das Zurücksetzen des gesamten Imports.

bash
curl -X POST "$CRM_BASE_URL/api/leads/import/batch" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "fileName": "leads-2026-09-05.csv",
    "leads": [
      {
        "message": "Anfrage #1",
        "ownerId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
        "authorId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
        "quality": "WARM"
      },
      {
        "message": "Anfrage #2",
        "ownerId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
        "authorId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
        "quality": "COOL"
      }
    ]
  }'

Beispielantwort:

json
{
  "importId": "44444444-4444-4444-4444-444444444444",
  "imported": 2,
  "total": 2,
  "skipped": []
}

Verlauf und Zurücksetzen:

bash
# Importverlauf
curl "$CRM_BASE_URL/api/leads/import/history" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

# Import zurücksetzen
curl -X POST "$CRM_BASE_URL/api/leads/import/rollback/$IMPORT_ID" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

5.5. Schneller Website-Lead (POST /api/site/leads)

Für Website-Formulare gibt es einen einzigen kombinierten Endpunkt, der atomar den Kontakt, dessen primäre Telefonnummer und E-Mail, den Lead, die Kontakt-Lead-Verknüpfung und das Marketing-Ereignis in einer Anfrage erstellt — mit Idempotenz über externalId.

Siehe die spezielle Anleitung: site-lead-multi-contract.md.

6. Kunden und Kontakte

6.1. Kunden anlegen (POST /api/clients/create)

bash
curl -X POST "$CRM_BASE_URL/api/clients/create" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "COMPANY",
    "name": "Romashka GmbH",
    "taxId": "7700000001",
    "regNumber": "1234567890",
    "country": "RU",
    "phone": "+7-495-000-00-01",
    "email": "info@romashka.ru",
    "website": "https://romashka.ru",
    "ownerId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "authorId": "7a786a66-3617-48c1-921d-97f4aaefcd35"
  }'

Wichtige Felder:

FeldTypGilt fürBeschreibung
typeenumalleINDIVIDUAL oder COMPANY (erforderlich)
namestringalleAnzeigename (erforderlich)
firstName / lastNamestringINDIVIDUALVor- und Nachname
taxIdstringCOMPANYSteuer-ID (INN)
regNumberstringCOMPANYRegistrierungsnummer
legalAddressstringCOMPANYRechtliche Anschrift
phone / email / websitestringalleKontaktdaten
countrystringalleISO-Ländercode
ownerIduuidalleVerantwortlicher Benutzer
authorIduuidalleAutor
developingManagerIdsuuid[]alleBetreuende Manager

6.2. Seitenweises Kundenlesen (GET /api/clients/paged)

bash
curl "$CRM_BASE_URL/api/clients/paged?page=0&size=20&type=COMPANY&search=Romashka&sort=name,asc" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

Wichtige Filter: name, type (INDIVIDUAL/COMPANY), country, taxId, email, phone, lastName (Einzelpersonen), search (nach Name/Steuer-ID/Telefon), createdAtFrom/createdAtTo, createdBy, developingManagerId.

6.3. Duplikatsprüfung (GET /api/clients/duplicates)

Prüfen Sie vor dem Anlegen eines Kunden, ob bereits ein ähnlicher existiert:

bash
# Nach Steuer-ID und Name
curl "$CRM_BASE_URL/api/clients/duplicates?type=COMPANY&taxId=7700000001&name=Romashka" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

6.4. Kontakt anlegen (POST /api/contacts/create)

bash
curl -X POST "$CRM_BASE_URL/api/contacts/create" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Ivan",
    "lastName": "Petrov",
    "dateOfBirth": "1990-05-15",
    "gender": "MALE",
    "countryCode": "RU",
    "ownerId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "authorId": "7a786a66-3617-48c1-921d-97f4aaefcd35"
  }'

Felder: firstName (erforderlich), lastName, patronymicName, dateOfBirth (date), gender (MALE/FEMALE), countryCode, ownerId, authorId.

6.5. Seitenweises Kontaktlesen (GET /api/contacts/paged)

bash
curl "$CRM_BASE_URL/api/contacts/paged?page=0&size=20&search=Petrov&sort=createdAt,desc" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

7. Deals

7.1. Deal anlegen (POST /api/deals/create)

bash
curl -X POST "$CRM_BASE_URL/api/deals/create" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Server-Hardware-Lieferung",
    "clientId": "9f128931-69fd-493a-9a08-be5be0e6603d",
    "statusId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
    "stageId": "dddd0001-0000-0000-0000-000000000001",
    "probability": 60,
    "amount": 150000.00,
    "ownerId": "7a786a66-3617-48c1-921d-97f4aaefcd35",
    "authorId": "7a786a66-3617-48c1-921d-97f4aaefcd35"
  }'

Wichtige Felder:

FeldTypErforderlichBeschreibung
namestringjaDeal-Name
clientIduuidjaKunden-ID
statusIduuidneinStatus (Phasenstatus)
stageIduuidneinVerkaufsphase
probabilityintegerneinWahrscheinlichkeit 0-100
amountnumberneinBetrag
plannedAmountnumberneinGeplanter Betrag
discountPercentintegerneinRabatt 0-100
startDate / expectedCloseDatedate-timeneinDaten
ownerIduuidneinBesitzer
leadIduuidneinZugehöriger Lead
contactIduuidneinZugehöriger Kontakt
productIdsuuid[]neinProdukte (vereinfachtes Format)
dealProductsarrayneinDeal-Positionen (volles Format)
dealPartiesarrayneinDeal-Parteien

7.2. Seitenweises Deal-Lesen (GET /api/deals/paged)

bash
curl "$CRM_BASE_URL/api/deals/paged?page=0&size=20&stageKind=OPEN&sort=createdAt,desc" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

Wichtige Filter: name (ILIKE), clientId, clientName, statusId, stageId, stageKind (OPEN/WON/LOST), ownerId, search, startDateFrom/startDateTo, expectedCloseDateFrom/expectedCloseDateTo, actualCloseDateFrom/actualCloseDateTo, createdAtFrom/createdAtTo.

8. Marketing-Ereignisse (Attribution)

Zum Senden von UTM-Tags, Werbe-IDs und Traffic-Quellen verwenden Sie:

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

Beispielantwort:

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

Regeln:

Details finden Sie in site-leads-integration-guide.md.

9. Datenexport (NDJSON)

Export-Endpunkte geben alle Datensätze des Mandanten im NDJSON-Format zurück (ein JSON-Objekt pro Zeile, durch \n getrennt).

EndpunktBeschreibung
GET /api/export/leadsAlle Leads des Mandanten
GET /api/export/clientsAlle Kunden des Mandanten
GET /api/export/contactsAlle Kontakte des Mandanten
bash
curl "$CRM_BASE_URL/api/export/leads" \
  -H "Authorization: Bearer $CRM_ACCESS_TOKEN"

Beispielantwort (Zeilenstrom):

text
{"id":"550e8400-e29b-41d4-a716-446655440001","message":"Website-Anfrage","quality":"WARM","statusName":"New","createdAt":"2026-08-20T10:00:00+03:00","ownerName":"Ivan Ivanov","clientName":"Romashka GmbH","contactFirstName":"Petr","contactLastName":"Petrov","leadSourceName":"Paid search"}
{"id":"550e8400-e29b-41d4-a716-446655440002","message":"Telefonanruf","quality":"COOL","statusName":"In progress","createdAt":"2026-08-19T09:00:00+03:00","ownerName":"Maria Smirnova","clientName":null}

Wichtig: NDJSON ist kein gültiges JSON-Array. Lesen Sie die Antwort zeilenweise über ReadableStream (verwenden Sie nicht JSON.parse() auf der gesamten Antwort).

10. Beispiel von Anfang bis Ende

Das folgende Szenario erstellt einen Website-Lead, verknüpft einen Kontakt und einen Kunden, erstellt einen Deal und sendet ein Marketing-Ereignis.

bash
CRM_BASE_URL=https://crm.example.com
CRM_TOKEN="<access-token>"

# 1. Anmelden
curl -s -X POST "$CRM_BASE_URL/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"username": "integration", "password": "secret123"}' | tee /tmp/login.json

CRM_TOKEN=$(jq -r '.token' /tmp/login.json)

OWNER_ID=$(curl -s "$CRM_BASE_URL/api/users/paged?page=0&size=50" \
  -H "Authorization: Bearer $CRM_TOKEN" | jq -r '.content[0].id')

# 2. Kunden anlegen
curl -s -X POST "$CRM_BASE_URL/api/clients/create" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"type\": \"COMPANY\",
    \"name\": \"Romashka GmbH\",
    \"taxId\": \"7700000001\",
    \"country\": \"RU\",
    \"ownerId\": \"$OWNER_ID\",
    \"authorId\": \"$OWNER_ID\"
  }" | tee /tmp/client.json

CLIENT_ID=$(jq -r '.id' /tmp/client.json)

# 3. Kontakt anlegen
curl -s -X POST "$CRM_BASE_URL/api/contacts/create" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"firstName\": \"Ivan\",
    \"lastName\": \"Petrov\",
    \"countryCode\": \"RU\",
    \"ownerId\": \"$OWNER_ID\",
    \"authorId\": \"$OWNER_ID\"
  }" | tee /tmp/contact.json

CONTACT_ID=$(jq -r '.id' /tmp/contact.json)

# 4. Lead anlegen
curl -s -X POST "$CRM_BASE_URL/api/leads/create" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"message\": \"Website-Anfrage\",
    \"clientId\": \"$CLIENT_ID\",
    \"contactId\": \"$CONTACT_ID\",
    \"ownerId\": \"$OWNER_ID\",
    \"authorId\": \"$OWNER_ID\",
    \"quality\": \"WARM\"
  }" | tee /tmp/lead.json

LEAD_ID=$(jq -r '.id' /tmp/lead.json)

# 5. Deal anlegen, der mit dem Lead verknüpft ist
curl -s -X POST "$CRM_BASE_URL/api/deals/create" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"name\": \"Beratung für Ivan Petrov\",
    \"clientId\": \"$CLIENT_ID\",
    \"leadId\": \"$LEAD_ID\",
    \"contactId\": \"$CONTACT_ID\",
    \"amount\": 50000.00,
    \"ownerId\": \"$OWNER_ID\",
    \"authorId\": \"$OWNER_ID\"
  }"

# 6. Marketing-Ereignis senden
curl -s -X POST "$CRM_BASE_URL/api/dashboard/marketing/events" \
  -H "Authorization: Bearer $CRM_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"eventType\": \"lead_submitted\",
    \"occurredAt\": \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",
    \"leadId\": \"$LEAD_ID\",
    \"externalId\": \"request-$(uuidgen)\",
    \"source\": \"website\",
    \"channel\": \"direct\",
    \"landingUrl\": \"https://www.example.com/form\",
    \"metadata\": {\"formName\": \"consultation\"}
  }"

11. Idempotenz und Fehlerbehandlung

12. Schnellstart

  1. Authentifizieren Sie sich über POST /api/auth/login; speichern Sie token und refreshToken.
  2. Fügen Sie Authorization: Bearer <token> zu jeder Anfrage hinzu. Bei 401 aktualisieren Sie über /api/auth/refresh.
  3. Rufen Sie Referenzen ab (Benutzer/Status/Phasen/Lead-Quellen) einmalig ab und cachen Sie die UUIDs.
  4. Erstellen Sie Entitäten in einer logischen Reihenfolge: Kunde → Kontakt → Lead → Deal.
  5. Verwenden Sie Seiten-Endpunkte für Lesevorgänge mit serverseitiger Filterung und Sortierung.
  6. Für Exporte verwenden Sie NDJSON-Endpunkte und lesen Sie den Stream zeilenweise.
  7. Für Massenimporte verwenden Sie Batch-Endpunkte (/api/leads/import/batch, /api/clients/import/batch) mit Rollback-Unterstützung.
  8. Senden Sie Marketing-Attribution über POST /api/dashboard/marketing/events mit einer stabilen externalId.
  9. Speichern oder übergeben Sie niemals personenbeziehbare Daten im metadata-Feld von Marketing-Ereignissen.
  10. Detaillierte API-Dokumentation finden Sie hier: site-leads-integration-guide.md.