08
Technisches Dokument
08

4leads Integration -- Technische Architektur

Bidirektionaler Sync HubSpot - 4leads. Forms API, Cloudflare Worker, 3 Varianten im Detail. Komplett ohne Zapier-Abhaengigkeit moeglich.

QMH Consulting GmbH09.03.2026Prozessfaktor GmbH
Scrollen

1. Ausgangslage

Was heute existiert und welche technischen Einschraenkungen gelten

0
Kontakte in 4leads migriert
0
Webhook-Events
0
Integrations-Workflows
0
EUR laufende Kosten

Kriterien fuer 4leads-Kontakte

E-Mail-Adresse vorhanden
Produktgruppe zugeordnet (produkt_interesse hat Wert)
Sales-Status ist NICHT "Opening Lead" oder "In Bearbeitung"

Warum kein Zapier?

FaktorZapierDirekte Integration
KostenAb ~20 EUR/Monat (Starter)0 EUR (oder Cloudflare Worker: kostenlos)
Latenz1-15 Minuten (Polling-Intervall)Echtzeit (Webhook) oder <1 Min (Cron)
WartungEigenes Dashboard, eigene FehlerAlles in HubSpot oder dokumentiert
DebuggingZapier-Logs separatHubSpot Workflow-Logs + 4leads-Logs
AbhaengigkeitDrittanbieter-Ausfall = Sync-StoppKein Mittelsmann

Technische Einschraenkung: HubSpot Sales Hub Professional

FeatureVerfuegbar?
Workflows (Contact/Deal-basiert)Ja
Workflow-Trigger auf Property-AenderungJa
Outgoing Webhooks aus WorkflowsNein (Data Hub Pro)
Incoming Webhook-TriggerNein (Data Hub Pro)
Custom Code in WorkflowsNein (Data Hub Pro)
CRM API (Contacts erstellen/updaten)Ja
Forms API (Daten empfangen)Ja

Konsequenz: Fuer 4leads → HubSpot nutzen wir die Forms API. Fuer HubSpot → 4leads gibt es 3 Varianten (siehe Abschnitt 3).

2. Richtung 1: 4leads → HubSpot (Forms API)

Echtzeit-Webhook ueber unsichtbares HubSpot-Formular

4leads Event
Email/Click/Unsub/Bounce
HTTP POST
Webhook (JSON)
Forms API
submissions/v3/
Kontakt Update
Erstellen/Aktualisieren
Workflow
Score + Status
Ergebnis
Task/Notification

2.1 Unsichtbares HubSpot-Formular

Name: [SYSTEM] 4leads Webhook Empfaenger -- wird NICHT auf einer Website eingebettet, dient ausschliesslich als API-Endpunkt.

FeldHubSpot-PropertyTypZweck
E-MailemailE-MailKontakt-Identifikation (Pflicht)
4leads Interaktionstypfl_interaktionstypDropdownWas ist passiert?
4leads Kampagnennamefl_kampagnennameTextWelche Kampagne?
4leads Interaktionsdatumletzte_4leads_interaktionDatumWann?
4leads Kontakt-IDfl_kontakt_idTextMapping-ID

2.2 Neue HubSpot-Properties

Property-Gruppe: 4leads Integration

PropertyInterner NameTypWerte
4leads Interaktionstypfl_interaktionstypDropdownEmail Opened / Link Clicked / Unsubscribed / Bounced / Campaign Completed
4leads Kampagnennamefl_kampagnennameEinzeiliger Text--
Letzte 4leads-Interaktionletzte_4leads_interaktionDatum--
4leads Kontakt-IDfl_kontakt_idEinzeiliger Text--
4leads Sync-Statusfl_sync_statusDropdownSynced / Pending / Error

2.3 Webhook-URL fuer 4leads

// Ziel-URL fuer ALLE 4leads-Webhooks
POST https://api.hsforms.com/submissions/v3/integration/submit/{portalId}/{formGuid}

Beispiel-Payload (JSON):

{
  "fields": [
    { "name": "email", "value": "max.mustermann@firma.de" },
    { "name": "fl_interaktionstyp", "value": "Link Clicked" },
    { "name": "fl_kampagnenname", "value": "FMEA-Serie Q1 2026" },
    { "name": "letzte_4leads_interaktion", "value": "2026-03-09" },
    { "name": "fl_kontakt_id", "value": "4L-12345" }
  ],
  "context": {
    "hutk": "",
    "pageUri": "https://4leads.de/webhook",
    "pageName": "4leads Webhook"
  }
}

Content-Type: application/json

2.4 Integrations-Workflows (3 Stueck)

WF-4L-1

4leads-Interaktion verarbeiten

Einstellungen
Name[NEU] 4leads-Interaktion verarbeiten
TypContact-based
TriggerFormular "[SYSTEM] 4leads Webhook Empfaenger" eingereicht
Re-EnrollmentJa (bei jeder neuen Einreichung)
Actions (If/Then Branch)
Email Opened → lead_score_custom +5
Link Clicked → lead_score_custom +15
Unsubscribed → Siehe WF-4L-3
Campaign Completed → Keine Score-Aenderung
Abschluss: fl_sync_status = "Synced"
WF-4L-2

4leads-Reaktivierung → Sales

Einstellungen
Name[NEU] 4leads-Reaktivierung → Sales
TypContact-based
Triggerfl_interaktionstyp = "Link Clicked" UND sales_status = "Kalt" oder leer
Re-EnrollmentNein (einmalig)
Actions (4 Schritte)
1.Set sales_status = "Opening Lead"
2.Set kontakt_segment = "Hoch"
3.Create Task: "Reaktivierter Lead: [Name] hat auf 4leads-Mail geklickt"
4.Send Notification an Tim: "Marketing-Lead reaktiviert!"
WF-4L-3

4leads-Unsubscribe verarbeiten

Einstellungen
Name[NEU] 4leads-Unsubscribe verarbeiten
TypContact-based
Triggerfl_interaktionstyp = "Unsubscribed"
Re-EnrollmentNein
Actions (3 Schritte)
1.Set in_4leads_migriert = "Nein"
2.Set fl_sync_status = "Synced"
3.If/Then: sales_status = "Kalt" → Set "Disqualifiziert"

2.5 In 4leads konfigurieren: Events → HubSpot

4leads-Eventfl_interaktionstypScoreWeitere Aktion
E-Mail geoeffnetemail_opened+5--
Link geklicktlink_clicked+15Falls Status Kalt: Reaktivierung → Sales
Abmeldungunsubscribed0in_4leads_migriert → Nein, Sync gestoppt
E-Mail gebouncedbounced0Nur Logging, kein Score-Impact
Kampagne abgeschlossencampaign_completed0Info fuer Tim: Serie durchlaufen

WICHTIG: Die Werte muessen EXAKT so geschrieben werden (Kleinbuchstaben, Unterstriche). HubSpot erkennt sie sonst nicht.

Pflichtfeld in jedem Webhook: email (E-Mail-Adresse des Kontakts) -- damit HubSpot den richtigen Kontakt zuordnen kann.

3. Richtung 2: HubSpot → 4leads (3 Varianten)

HubSpot Sales Hub Professional kann keine Webhooks aus Workflows senden. Wenn ein Kontakt als in_4leads_migriert = Ja markiert wird, muss die Information anderweitig zu 4leads gelangen.

Variante A

Manueller Export ueber Aktive Liste

Aktive Liste
4leads Sync Queue
CSV Export
manuell, 1x/Woche
4leads Import
CSV hochladen
Bulk-Update
fl_sync_status = Synced

Setup

1.Aktive Liste: [NEU] 4leads Sync Queue
Filter: in_4leads_migriert = Ja UND fl_sync_status != "Synced"
2.Export-Spalten: E-Mail, Vorname, Nachname, Firma, Branche, norm_standard, dienstleistung_interesse, produkt_interesse, sales_status, kundenkategorie
3.Tims Workflow (1x/Woche, 5 Min): Liste oeffnen → CSV exportieren → In 4leads importieren → Bulk-Update fl_sync_status = "Synced"

Bewertung

Setup-Aufwand15 Min
Laufende Kosten0 EUR
AutomatisierungNiedrig (manuell)
FehleranfaelligkeitMittel (Tim muss dran denken)
SkalierbarkeitNiedrig (>50/Woche unpraktisch)
Empfohlen fuer424 Kontakte einmalig, <10/Woche
Variante B (empfohlen)

Cloudflare Worker als automatische Bruecke

HubSpot CRM API
Kontakte mit Pending
Cloudflare Worker
Cron alle 15 Min
4leads Webhook
POST Kontaktdaten
HubSpot PATCH
fl_sync_status=Synced

Cloudflare Worker Code (worker.js)

// worker.js -- HubSpot → 4leads Sync Bridge
// Laeuft als Cron-Trigger alle 15 Minuten

const HUBSPOT_API_KEY = "pat-xxx";
const FOURLEADS_WEBHOOK_URL = "https://app.4leads.de/webhook/xxx";

export default {
  async scheduled(event, env, ctx) {
    await syncContacts(env);
  },

  // Optional: Manueller Trigger via HTTP
  async fetch(request, env, ctx) {
    if (request.headers.get("X-Sync-Key") !== env.SYNC_SECRET) {
      return new Response("Unauthorized", { status: 401 });
    }
    const result = await syncContacts(env);
    return new Response(JSON.stringify(result));
  }
};

async function syncContacts(env) {
  const results = { synced: 0, errors: 0, contacts: [] };

  // 1. Hole Kontakte mit sync_status = "Pending"
  const searchPayload = {
    filterGroups: [{
      filters: [
        { propertyName: "in_4leads_migriert", operator: "EQ", value: "Ja" },
        { propertyName: "fl_sync_status", operator: "EQ", value: "Pending" }
      ]
    }],
    properties: [
      "email", "firstname", "lastname", "company",
      "norm_standard", "dienstleistung_interesse",
      "produkt_interesse", "sales_status",
      "kundenkategorie", "lead_score_custom"
    ],
    limit: 50
  };

  const searchResponse = await fetch(
    "https://api.hubapi.com/crm/v3/objects/contacts/search",
    {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${env.HUBSPOT_API_KEY}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify(searchPayload)
    }
  );
  const searchData = await searchResponse.json();

  if (!searchData.results?.length) {
    return { ...results, message: "Keine neuen Kontakte" };
  }

  // 2. Fuer jeden Kontakt: An 4leads senden
  for (const contact of searchData.results) {
    try {
      const payload = {
        email: contact.properties.email,
        firstname: contact.properties.firstname,
        lastname: contact.properties.lastname,
        company: contact.properties.company,
        tags: [
          contact.properties.norm_standard,
          contact.properties.dienstleistung_interesse,
          contact.properties.sales_status
        ].filter(Boolean),
        custom_fields: {
          hubspot_id: contact.id,
          kundenkategorie: contact.properties.kundenkategorie,
          lead_score: contact.properties.lead_score_custom
        }
      };

      const res = await fetch(env.FOURLEADS_WEBHOOK_URL, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(payload)
      });

      // 3. Status in HubSpot aktualisieren
      await fetch(
        `https://api.hubapi.com/crm/v3/objects/contacts/${contact.id}`,
        {
          method: "PATCH",
          headers: {
            "Authorization": `Bearer ${env.HUBSPOT_API_KEY}`,
            "Content-Type": "application/json"
          },
          body: JSON.stringify({
            properties: {
              fl_sync_status: res.ok ? "Synced" : "Error"
            }
          })
        }
      );
      res.ok ? results.synced++ : results.errors++;
    } catch (e) { results.errors++; }
  }
  return results;
}

Cloudflare Cron-Trigger (wrangler.toml)

name = "qmh-hubspot-4leads-sync"
main = "worker.js"
compatibility_date = "2026-03-01"

[triggers]
crons = ["*/15 * * * *"]  # Alle 15 Minuten

[vars]
HUBSPOT_PORTAL_ID = "143675260"

# Secrets (via wrangler secret put):
# HUBSPOT_API_KEY
# FOURLEADS_WEBHOOK_URL
# SYNC_SECRET

HubSpot Workflow: Sync-Vorbereitung

Name[NEU] 4leads-Sync vorbereiten
Triggerin_4leads_migriert wird auf "Ja" gesetzt
Actionfl_sync_status = "Pending"
Re-EnrollmentJa

Der Worker holt dann automatisch alle "Pending"-Kontakte und synct sie.

Bewertung

Setup-Aufwand2-3 Stunden
Laufende Kosten0 EUR
AutomatisierungHoch (alle 15 Min)
FehleranfaelligkeitNiedrig (auto Error-Tracking)
SkalierbarkeitHoch (50+ pro Zyklus)

Voraussetzungen

Cloudflare-Account (kostenlos)
HubSpot Private App (Scopes: crm.objects.contacts.read/write)
4leads Webhook-URL
Cloudflare Free: 100.000 Requests/Tag, Cron inklusive
Variante C

Einzelner Zapier-Zap (minimaler Zapier-Einsatz)

HubSpot Workflow
fl_sync_status=Pending
Zapier Trigger
Property Changed
POST an 4leads
Webhook Action
Update HubSpot
fl_sync_status=Synced

Zap-Konfiguration

NameHubSpot → 4leads Kontakt-Sync
TriggerHubSpot: New or Updated Contact
Filterfl_sync_status = "Pending"
Action 1Webhooks by Zapier: POST an 4leads
Action 2HubSpot: Update → fl_sync_status = "Synced"

Bewertung

Setup-Aufwand30 Min
Laufende Kosten0 EUR (Free) oder 20 EUR/M (Starter)
AutomatisierungHoch (Echtzeit bei Starter)
FehleranfaelligkeitNiedrig (Zapier Error-Handling)
SkalierbarkeitMittel (Task-Limit)

Zapier Action 1 -- Payload-Mapping an 4leads:

{
  "email": "{{contact.email}}",
  "firstname": "{{contact.firstname}}",
  "lastname": "{{contact.lastname}}",
  "company": "{{contact.company}}",
  "tags": "{{contact.norm_standard}},{{contact.dienstleistung_interesse}}",
  "custom_fields": {
    "hubspot_id": "{{contact.hs_object_id}}",
    "kundenkategorie": "{{contact.kundenkategorie}}",
    "lead_score": "{{contact.lead_score_custom}}",
    "sales_status": "{{contact.sales_status}}"
  }
}

Zapier-Plan-Anforderungen

PlanPreisTasks/MonatReicht?
Free0 EUR100Ja
Starter~20 EUR/Monat750Ja
Professional~50 EUR/Monat2.000Unnoetig

Realistisch: Bei QMH werden geschaetzt <20 neue Kontakte pro Monat zu 4leads gesynct. Der Zapier Free Plan reicht.

4. Variantenvergleich: HubSpot → 4leads

Vollstaendige Gegenuberstellung aller drei Varianten

KriteriumA: ManuellB: Cloudflare WorkerC: Zapier-Zap
Setup-Aufwand15 Min2-3 Stunden30 Min
Laufende Kosten0 EUR0 EUR0-20 EUR/Mon
AutomatisierungManuell (1x/Woche)Automatisch (15 Min)Automatisch (Echtzeit)
Technisches Know-howKeinsJavaScript + CFZapier-Grundlagen
WartungKeineWorker-Code pflegenZap ueberwachen
DebuggingCSV pruefenWorker-LogsZapier-Dashboard
AusfallsicherheitAbhaengig von TimCF: 99.9% UptimeZapier: 99.9% Uptime
SkalierbarkeitNiedrigHochMittel
DrittanbieterKeinerCloudflare (kostenlos)Zapier (kostenl./bezahlt)

Empfehlung nach Szenario

Sofort starten, <10 Kontakte/Woche
Variante A (Manuell) -- kein Setup, sofort nutzbar
Langfristig, volle Automatisierung
Variante B (Cloudflare Worker) -- einmal aufsetzen, laeuft ewig
Schnell automatisieren, wenig Technik
Variante C (Zapier) -- bester Kompromiss aus Aufwand und Nutzen
Stufenweise (empfohlen)
A jetzt → C in 2 Wochen → B spaeter bei Bedarf

5. Feldmapping: HubSpot ↔ 4leads

Unabhaengig von der Variante werden folgende Felder synchronisiert

Kontaktdaten (Pflicht)

HubSpot PropertyInterner Name→ 4leads FeldRichtung
E-MailemailE-MailHubSpot → 4leads
VornamefirstnameVornameHubSpot → 4leads
NachnamelastnameNachnameHubSpot → 4leads
FirmacompanyFirma / TagHubSpot → 4leads

Segmentierungsdaten (fuer 4leads-Kampagnenzuordnung)

HubSpot PropertyInterner Name→ 4leads FeldNutzung in 4leads
Norm / Standardnorm_standardTagsKampagnen-Zuordnung (FMEA, ISO 9001, etc.)
Dienstleistungs-Interessedienstleistung_interesseTagsKampagnen-Zuordnung
Produkt-Interesse (Legacy)produkt_interesseTagsErweiterte Segmentierung
Sales-Statussales_statusCustom FieldKontakt-Klassifizierung
KundenkategoriekundenkategorieCustom FieldVIP-Behandlung
Lead Scorelead_score_customCustom FieldPriorisierung

Tracking-Daten (Sync-Management)

HubSpot PropertyInterner NameZweck
HubSpot Contact IDhs_object_idMapping-Key
4leads Kontakt-IDfl_kontakt_idMapping-Key (Gegenrichtung)
4leads Sync-Statusfl_sync_statusPending / Synced / Error
In 4leads migriertin_4leads_migriertJa / Nein (Trigger)

Rueckkanal: 4leads → HubSpot (via Forms API)

4leads Event→ HubSpot PropertyWert
E-Mail geoeffnetfl_interaktionstypEmail Opened
Link geklicktfl_interaktionstypLink Clicked
Abmeldungfl_interaktionstypUnsubscribed
E-Mail gebouncedfl_interaktionstypBounced
Kampagne abgeschlossenfl_interaktionstypCampaign Completed
Interaktionsdatumletzte_4leads_interaktionISO-Datum
Kampagnennamefl_kampagnennameFreitext

6. Gesamtarchitektur

HubSpot (Sales Hub Pro)

Properties (6 neue)
in_4leads_migriert (Ja/Nein)
fl_sync_status (Pending/Synced/Error)
fl_interaktionstyp (Dropdown)
fl_kampagnenname (Text)
fl_kontakt_id (Text)
letzte_4leads_interaktion (Datum)
Workflows (4)
WF-4L-1: Interaktion verarbeiten
WF-4L-2: Reaktivierung → Sales
WF-4L-3: Unsubscribe verarbeiten
WF-4L-Sync: Status → Pending
Weitere Objekte
Formular: [SYSTEM] 4leads Webhook Empf.
Liste: [NEU] 4leads Sync Queue
Bidirektionaler Sync
HubSpot
Variante A/B/CForms API
4leads
Ohne Zapier-Abhaengigkeit moeglich

4leads

Sendet Webhooks bei
E-Mail geoeffnet
Link geklickt
Abmeldung
Bounce
Kampagne abgeschlossen
Empfaengt
Kontaktdaten (Name, E-Mail, Firma)
Tags (fuer Kampagnen-Zuordnung)
Custom Fields (hubspot_id, etc.)
Kampagnen
FMEA-Serie (10 E-Mails)
ISO 9001-Serie (10 E-Mails)
Lieferantenentwicklung-Serie
Grossprojekte-Serie
Custom Fields (4 neu)
hubspot_id (Text)
kundenkategorie (Dropdown)
lead_score (Zahl)
sales_status (Dropdown)

7. Implementierungsreihenfolge

Phase 1: Sofort (unabhaengig von Variante) -- ~1.5 Stunden

Neue Properties anlegen (6 Stueck)

fl_interaktionstyp, fl_kampagnenname, letzte_4leads_interaktion, fl_kontakt_id, fl_sync_status + Property-Gruppe

Property-Gruppe erstellen

'4leads Integration' als neue Gruppe in HubSpot

System-Formular erstellen

[SYSTEM] 4leads Webhook Empfaenger -- unsichtbar, nur als API-Endpunkt

WF-4L-1: Interaktion verarbeiten

Trigger auf Formular-Einreichung, If/Then Branch nach Interaktionstyp, Score-Anpassung

WF-4L-2: Reaktivierung → Sales

Kalte Kontakte mit Link-Klick reaktivieren, Aufgabe + Notification fuer Tim

WF-4L-3: Unsubscribe verarbeiten

4leads-Markierung entfernen, ggf. Status auf Disqualifiziert

Aktive Liste erstellen

[NEU] 4leads Sync Queue -- Filter: in_4leads_migriert = Ja UND fl_sync_status != Synced

4leads Webhook-Konfiguration

5 Webhook-Events an HubSpot Forms API URL konfigurieren

Phase 2: HubSpot → 4leads (je nach Variante)

Variante A
Fertig
Liste reicht nach Phase 1
Variante B
+2-3 Std
Worker + Private App + Test
Variante C
+30 Min
1 Zap konfigurieren

Phase 3: Testen

TestWie
4leads → HubSpotTest-E-Mail in 4leads oeffnen, pruefen ob HubSpot-Property aktualisiert wird
HubSpot → 4leadsKontakt auf in_4leads_migriert = Ja setzen, pruefen ob in 4leads ankommt
UnsubscribeIn 4leads abmelden, pruefen ob HubSpot-Status aktualisiert wird
ReaktivierungKalten Kontakt in 4leads klicken lassen, pruefen ob Sales-Aufgabe erstellt wird

8. Was in 4leads konfiguriert werden muss

Komplette Anleitung fuer die 4leads-Seite der Integration

8.1 Uebersicht: Setup-Schritte

#SchrittWerAufwand
1Webhook-Ausgang konfigurieren (5 Events → HubSpot)QMH / 4leads-Admin15 Min
2Webhook-Eingang konfigurieren (Kontakte empfangen)QMH / 4leads-Admin10 Min
3Custom Fields anlegen (falls nicht vorhanden)QMH / 4leads-Admin10 Min
4Kampagnen-Zuordnung ueber Tags pruefenQMH10 Min
5Testlauf durchfuehrenQMH + Prozessfaktor15 Min

8.2 Webhook-Ausgang: Ziel-URL (fuer ALLE Events identisch)

// Content-Type Header: application/json
POST https://api.hsforms.com/submissions/v3/integration/submit/143675260/659bb1af-32ef-4a0f-9882-8b387299b4bc

Webhook-Payloads fuer alle 5 Events

Event 1: E-Mail geoeffnet

{ "fields": [
  { "name": "email", "value": "{{kontakt_email}}" },
  { "name": "fl_interaktionstyp", "value": "email_opened" },
  { "name": "fl_kampagnenname", "value": "{{kampagnen_name}}" },
  { "name": "fl_kontakt_id", "value": "{{kontakt_id}}" }
],
"context": {
  "pageUri": "https://4leads.de/webhook",
  "pageName": "4leads Email Opened"
}}

Lead Score +5, fl_sync_status -> Synced

Event 2: Link geklickt

{ "fields": [
  { "name": "email", "value": "{{kontakt_email}}" },
  { "name": "fl_interaktionstyp", "value": "link_clicked" },
  { "name": "fl_kampagnenname", "value": "{{kampagnen_name}}" },
  { "name": "fl_kontakt_id", "value": "{{kontakt_id}}" }
],
"context": {
  "pageUri": "https://4leads.de/webhook",
  "pageName": "4leads Link Clicked"
}}

Lead Score +15. Falls Status Kalt: Reaktivierung -> Opening Lead, Aufgabe fuer Tim

Event 3: Abmeldung (Unsubscribe)

{ "fields": [
  { "name": "email", "value": "{{kontakt_email}}" },
  { "name": "fl_interaktionstyp", "value": "unsubscribed" },
  { "name": "fl_kampagnenname", "value": "{{kampagnen_name}}" },
  { "name": "fl_kontakt_id", "value": "{{kontakt_id}}" }
],
"context": {
  "pageUri": "https://4leads.de/webhook",
  "pageName": "4leads Unsubscribed"
}}

in_4leads_migriert -> Nein, Kontakt erhaelt KEINE weiteren 4leads-E-Mails

Event 4: E-Mail gebounced

{ "fields": [
  { "name": "email", "value": "{{kontakt_email}}" },
  { "name": "fl_interaktionstyp", "value": "bounced" },
  { "name": "fl_kampagnenname", "value": "{{kampagnen_name}}" },
  { "name": "fl_kontakt_id", "value": "{{kontakt_id}}" }
],
"context": {
  "pageUri": "https://4leads.de/webhook",
  "pageName": "4leads Bounced"
}}

Kein Score-Impact. Sichtbar in Kontakt-Sidebar unter 4leads Integration

Event 5: Kampagne abgeschlossen

{ "fields": [
  { "name": "email", "value": "{{kontakt_email}}" },
  { "name": "fl_interaktionstyp", "value": "campaign_completed" },
  { "name": "fl_kampagnenname", "value": "{{kampagnen_name}}" },
  { "name": "fl_kontakt_id", "value": "{{kontakt_id}}" }
],
"context": {
  "pageUri": "https://4leads.de/webhook",
  "pageName": "4leads Campaign Completed"
}}

Kein Score-Impact. Info fuer Tim: Kontakt hat komplette Serie durchlaufen

8.4 Platzhalter-Variablen in 4leads

PlatzhalterBedeutung4leads-Variable (typisch)
{{kontakt_email}}E-Mail-Adresse des Kontakts{email} oder {subscriber.email}
{{kampagnen_name}}Name der aktuellen Kampagne/Serie{campaign.name} oder {sequence.name}
{{kontakt_id}}Interne 4leads-ID des Kontakts{subscriber.id} oder {contact.id}

Die genauen Variablennamen haengen von der 4leads-Version ab. Bitte in der 4leads-Webhook-Dokumentation nachschlagen.

8.5 Webhook-Eingang: HubSpot → 4leads (Kontakte empfangen)

Falls Variante B oder C gewaehlt wird. In 4leads: Einstellungen → Webhooks → Incoming.

Erwartetes Payload-Format:

{
  "email": "max.mustermann@firma.de",
  "firstname": "Max",
  "lastname": "Mustermann",
  "company": "Muster GmbH",
  "tags": ["ISO 9001", "FMEA", "Schulung"],
  "custom_fields": {
    "hubspot_id": "12345678",
    "kundenkategorie": "Stammkunde",
    "lead_score": "45",
    "sales_status": "kalt"
  }
}

Feldmapping in 4leads:

Feld im Webhook→ 4leads FeldZweck
emailE-Mail (Pflicht)Kontakt-Identifikation
firstnameVornamePersonalisierung
lastnameNachnamePersonalisierung
companyFirma oder Custom FieldSegmentierung
tagsTags/LabelsKampagnen-Zuordnung (entscheidend)
custom_fields.hubspot_idCustom FieldRueck-Referenz zu HubSpot
custom_fields.kundenkategorieCustom FieldVIP-Erkennung
custom_fields.lead_scoreCustom FieldPriorisierung in 4leads
custom_fields.sales_statusCustom FieldAktueller Vertriebsstatus

Tags → Kampagnen-Zuordnung in 4leads

Tag (aus HubSpot)→ 4leads Kampagne
ISO 9001, Einfuehrung QM-System, Internes AuditISO 9001-Serie (10 E-Mails)
FMEA, FMEA-Moderation, FMEA-Schulung, FMEA-ReviewFMEA-Serie (10 E-Mails)
Lieferantenentwicklung, LieferantenauditLieferantenentwicklung-Serie
IATF 16949, QMB-Uebernahme, TaskforceGrossprojekte-Serie

Bei mehreren Tags: In die Kampagne mit dem hoechsten Prioritaets-Tag einordnen, oder in mehrere Kampagnen parallel.

8.7 Checkliste: 4leads Setup

1Webhook-Ausgangs-URL in 4leads hinterlegen (Forms API URL)
2Event E-Mail geoeffnet: fl_interaktionstyp = email_opened
3Event Link geklickt: fl_interaktionstyp = link_clicked
4Event Abmeldung: fl_interaktionstyp = unsubscribed
5Event Bounce: fl_interaktionstyp = bounced
6Event Kampagne abgeschlossen: fl_interaktionstyp = campaign_completed
7Platzhalter-Variablen pruefen (kontakt_email, kampagnen_name, kontakt_id)
8Content-Type Header auf application/json setzen
9Webhook-Eingangs-URL erstellen (fuer Variante B/C)
10Custom Fields anlegen (hubspot_id, kundenkategorie, lead_score, sales_status)
11Tag-basierte Kampagnen-Zuordnung konfigurieren
12TESTLAUF: E-Mail oeffnen, Link klicken, in_4leads_migriert testen

9. Offene Fragen (vor Implementierung)

#FrageAntwort noetig vonStatus
1Wie heisst die 4leads Webhook-Eingangs-URL?QMH / 4leads-AdminOFFEN
2Welche 4leads-Variablennamen fuer E-Mail, Kampagne, Kontakt-ID?QMH / 4leads-AdminOFFEN
3Kann 4leads Kontakte per E-Mail matchen oder braucht es eine ID?QMH / 4leads-AdminOFFEN
4Welche Variante (A/B/C) fuer HubSpot → 4leads?QMHOFFEN
5Soll bei mehreren Tags der Kontakt in mehrere Kampagnen oder nur eine?QMHOFFEN
6Gibt es in 4leads bereits Custom Fields oder muessen alle neu angelegt werden?QMH / 4leads-AdminOFFEN
7Soll der Sync auch Updates umfassen (geaenderter Sales-Status → 4leads)?QMHOFFEN