Integrationen & API
Kontor spricht mit deinen Formularen, Postfächern und Werbekonten.
Leads kommen signiert über die API, Mails über IMAP und SMTP, Termine aus dem Kalender. Ergebnisse gehen zurück an Meta und Google. Alles ohne Zusatz-Abo – und was fehlt, bauen wir im Projekt an.
{
"201": {"ok": true, "status": "created", "id": 4711},
"200": {"ok": true, "status": "duplicate", "id": 4711},
"400": {"ok": false, "error": "bad_json | bad_email"},
"401": {"ok": false, "error": "stale_timestamp | bad_signature"},
"405": {"ok": false, "error": "method_not_allowed"},
"503": {"ok": false, "error": "not_configured"}
}Überblick
Was angebunden ist.
Diese Anbindungen sind im Code vorhanden. Weitere Systeme (z. B. dein Shop oder deine Buchhaltung) binden wir im Projekt an.
POST mit JSON, abgesichert per HMAC-SHA256 und Zeitfenster.
Jedes Postfach mit Standardprotokollen, Voreinstellungen für gängige Anbieter.
Termine werden abgerufen und dem Kontakt zugeordnet – ohne Webhook-Tarif.
Versand von Folgen, Rückkanal für Zustellung, Öffnung, Klick, Bounce, Abmeldung; Import aus Listen.
Termin und Kunde als Ereignis zurück an Meta.
Offline-Conversions mit Klick-ID oder gehashten Kontaktdaten.
Deine Websites melden Version, Fehler und Kennzahlen ans CRM – signiert und nur lesend.
Excel (.xlsx) und CSV mit Spaltenzuordnung, Zahlungsexporte per Datei.
Lead-API
Leads signiert übergeben – in drei Zeilen.
Der Eingang braucht kein Login. Stattdessen signiert der Absender jeden Aufruf mit einem gemeinsamen Geheimnis: HMAC-SHA256 über Zeitstempel, Punkt und Body. Kontor lehnt alles ab, was älter als fünf Minuten ist oder nicht passt.
- Kopfzeilen: X-Elevatem-Timestamp (Unix-Zeit) und X-Elevatem-Signature (hex)
- Dubletten sind kein Fehler: Antwort 200 mit vorhandener ID, Vermerk im Verlauf
- Einwilligung (consent) wird mit Zeitpunkt und Nachweis gespeichert
- Unbekannte Quelle landet unter „Unbekannt“, nicht im Nirgendwo
BODY='{"source":"website","company":"Metallbau Krüger GmbH","first_name":"Jana","email":"jana@metallbau-krueger.example","consent":1,"consent_text":"Kontaktformular, Haken gesetzt","note":"Bitte Rückruf"}'
TS=$(date +%s)
SIG=$(printf '%s.%s' "$TS" "$BODY" | openssl dgst -sha256 -hmac "$INTAKE_SECRET" | sed 's/^.* //')
curl -X POST https://crm.deine-firma.example/api/lead-intake.php \
-H "Content-Type: application/json" \
-H "X-Elevatem-Timestamp: $TS" \
-H "X-Elevatem-Signature: $SIG" \
--data "$BODY"
# → 201 {"ok":true,"status":"created","id":4711}
# → 200 {"ok":true,"status":"duplicate","id":4711} (Kontakt existiert, leere Felder ergänzt)Serverseite
So prüft Kontor die Signatur.
Der Vergleich läuft zeitkonstant (hash_equals), damit die Signatur nicht erraten werden kann. Ohne hinterlegtes Geheimnis ist der Endpunkt gar nicht aktiv.
- Geheimnis liegt nur auf dem Server, nicht im Code
- Abgefangene Anfragen lassen sich nach 5 Minuten nicht wiederholen
- Fehlversuche werden protokolliert
// Prüfung auf der Seite von Kontor (api/lead-intake.php, gekürzt)
$body = file_get_contents('php://input') ?: '';
$zeit = (string) ($_SERVER['HTTP_X_ELEVATEM_TIMESTAMP'] ?? '');
$signatur = (string) ($_SERVER['HTTP_X_ELEVATEM_SIGNATURE'] ?? '');
// Alte Anfragen ablehnen: höchstens 5 Minuten Abweichung
if (!ctype_digit($zeit) || abs(time() - (int) $zeit) > 300) {
antwort(401, ['ok' => false, 'error' => 'stale_timestamp']);
}
$erwartet = hash_hmac('sha256', $zeit . '.' . $body, $geheimnis);
if (!hash_equals($erwartet, $signatur)) {
antwort(401, ['ok' => false, 'error' => 'bad_signature']);
}Felder
Was der Lead-Eingang annimmt.
Kontakt
- company, first_name, last_name
- Firma und Person
- email, phone, phone2
- E-Mail wird geprüft
- shop_url, social, industry, city, country
- Website, Profil, Branche, Ort, Land
Zuordnung
- source
- Quelle (Slug), unbekannt → „Unbekannt“
- projekt
- Projekt oder Marke
- note
- Notiz, bis 500 Zeichen
- revenue_month
- Monatsumsatz für die Pipeline
Einwilligung
- consent, consent_text
- Einwilligung mit Nachweis
- marketing_consent
- Marketing-Einwilligung (Voraussetzung für Conversions)
Herkunft
- gclid, gbraid, wbraid
- Google-Klick (auch iOS)
- fbclid, fbc, fbp
- Meta-Klick und Cookies
- ttclid
- TikTok-Klick
- utm_source … utm_content
- Kampagnenparameter
- keyword, match_type, device
- Suchanzeigen
- referrer, landing_page, submit_page
- Seitenpfad
- attribution
- alternativ alles als Objekt
IMAP & SMTP
Jedes Postfach, keine Erweiterung nötig.
Kontor bringt einen eigenen IMAP-Client mit Zertifikatsprüfung mit. Für gängige Anbieter sind Server, Ports und Ordner vorbelegt. Postfach-Passwörter werden verschlüsselt gespeichert.
- Posteingang und „Gesendet“ werden gelesen
- Gesendete Mails landen als Kopie in „Gesendet“
- Antworten im selben Verlauf (In-Reply-To/References)
- Antwort-Adresse (Reply-To) je Postfach
| Anbieter | SMTP | IMAP |
|---|---|---|
| Google Workspace | smtp.gmail.com:465 | imap.gmail.com:993 |
| Microsoft 365 | smtp.office365.com:587 | outlook.office365.com:993 |
| IONOS | smtp.ionos.de:465 | imap.ionos.de:993 |
| Strato | smtp.strato.de:465 | imap.strato.de:993 |
| Hostinger-Mail | smtp.hostinger.com:465 | imap.hostinger.com:993 |
Kalender
Gebuchte Termine landen am richtigen Kontakt.
Kontor fragt die Termine bei Calendly ab – das geht auch ohne Webhook-Tarif. Geprüft wird ein Fenster von 14 Tagen zurück bis 90 Tage voraus, Absagen werden erkannt. Zugeordnet wird über E-Mail, dann Telefon, dann eindeutigen Namen.
- Unbekannte Buchende werden zum warmen Kontakt
- Stufe „Termin“ und Wiedervorlage auf den Termintag
- Historie nachtragen in Portionen
- Wiederholte Abrufe erzeugen keine Dubletten
- Jana KrügerDo 10:00 · Erstgespräch · 30 Min.Termin
- Tom BergerFr 14:00 · abgesagtAbgesagt
- Lea SommerMo 09:30 · FolgeterminTermin
Newsletter-Versand
Brevo als Versandweg und Rückkanal.
Folgen für warme Kontakte können über Brevo laufen. Der Rückkanal meldet Zustellung, Öffnung, Klick, Bounce, Spam-Beschwerde und Abmeldung zurück an den Kontakt. Kontakte aus Brevo-Listen lassen sich übernehmen.
- Double-Opt-In wird vor der ersten Mail geprüft
- Harte Bounces und Abmeldungen sperren
- Öffnungen und Klicks stehen an der Mail im Verlauf
Statusmelder
Deine Websites melden sich beim CRM.
Eine kleine PHP-Datei in deinen Projekten meldet auf signierte Abfrage Version, Datenbankstand, Fehler, Technik und Kennzahlen als Summen. Sie antwortet nur auf Anfragen mit gültiger Signatur, höchstens 5 Minuten alt – sonst 404.
- Liest nie Passwörter, Schlüssel oder Konfigurationsdateien
- Ändert nichts, nur lesend
- Schwere Prüfungen nur auf Abruf
- Leads von Partner-Websites können ins CRM übernommen werden
{
"melder": "1.2.0",
"version": "3.4.1",
"php": "8.3",
"fehler": {"24h": 0},
"leads": {"7_tage": 12}
}Import & Export
Rein mit deinen Daten – und sie bleiben deine.
Der Import nimmt Excel (.xlsx) und CSV, schlägt die Spaltenzuordnung selbst vor und zeigt eine Vorschau. Im Modus „Vorhandene ergänzen“ werden leere Felder bestehender Kontakte gefüllt, nie überschrieben. Textspalten können als Notiz an die Akte.
- Dubletten beim Import übersprungen und gezählt
- Zahlungsexporte werden am Dateikopf erkannt
- Daten liegen in deiner MySQL-Datenbank – direkter Zugriff jederzeit
- CSV-Export einzelner Listen im Projekt
| Spalte in der Datei | Feld in Kontor |
|---|---|
| Firmenname | Firma |
| E-Mail-Adresse | |
| Tel. | Telefon |
| Kampagne | Kampagne (utm_campaign) |
| Bemerkung | als Notiz |
Welches System soll mit Kontor sprechen?
Shop, Buchhaltung, Telefonanlage: Was nicht vorhanden ist, bauen wir im Projekt an.