====== Website-Formular ins CRM ====== Mit einer **Formular-Verbindung** und dem Endpunkt ''/crm/form/submit'' landen Eingänge von Deiner Website **direkt im Snapper-CRM** — im **Posteingang** oder im **Kontakt-Thread**. Dein Team kann Anfragen wie Support-Tickets bearbeiten: zuordnen, per E-Mail antworten und optional eine Aufgabe anlegen. **Wichtig:** Das API-Secret gehört **nur auf Deinen Server** (PHP, Node o. Ä.). Niemals im HTML, JavaScript oder als verstecktes Formularfeld. Siehe auch: [[whitepaper:formular|Website-Formular (nur Ordner)]] · [[api:crm|CRM in Snapper]] ===== Kurzüberblick ===== Besucher (Website) → Dein Server (Secret nur hier) → POST https://api.snapper.network/crm/form/submit → Snapper-CRM **Was Snapper automatisch macht:** ^ Situation ^ Ergebnis ^ | E-Mail ist **einem Kontakt** zugeordnet | Nachricht erscheint im **Kontakt-Thread** | | E-Mail ist **neu** | Kontakt wird **angelegt**, dann Thread | | E-Mail passt zu **mehreren Kontakten** | Nachricht landet im **Posteingang** zur manuellen Zuordnung | Optional legt Snapper zusätzlich eine **Archiv-Kopie** im Zielordner Deiner Formular-Verbindung ab. ===== Checkliste — Schritt für Schritt ===== **1 — Vorbereiten** - [ ] Snapper-Account mit CRM ([[https://base.snapper.network/crm/|CRM öffnen]]) - [ ] **SMTP-Verbindung** anlegen (Profil → Verbindungen → SMTP) und in den **CRM-Einstellungen** (Zahnrad) auswählen — für Antworten an Kunden - [ ] Optional: Ordner für Formular-Archiv (Roh-Eingänge) **2 — Formular-Verbindung anlegen** - [ ] Profil → **Verbindungen** → Typ **Formular** - [ ] **Zielordner** wählen (Archiv der Eingänge) - [ ] **Secret** einmalig sichern — danach nicht mehr einsehbar; bei Verlust **Secret neu generieren** - [ ] Optional: **IP-Whitelist** (IP Deines Webservers, komma-separiert) - [ ] Endpunkt notieren: ''%%https://api.snapper.network/crm/form/submit%%'' **3 — Website anbinden** - [ ] Kontaktformular auf Deiner Website (z. B. Name, E-Mail, Betreff, Nachricht) - [ ] Unsichtbares **Honeypot-Feld** ''_hp'' (muss leer bleiben) - [ ] Formular sendet an **Deinen** Server (z. B. ''/kontakt-senden.php'') - [ ] Server leitet per POST an Snapper weiter (Beispiel unten) - [ ] Test: Eingang in **CRM → Posteingang** oder **Kontakt-Thread** **4 — Anfragen bearbeiten** - [ ] **Posteingang** prüfen (unzugeordnete Nachrichten) - [ ] Kontakt zuordnen oder Thread öffnen - [ ] **E-Mail an Kunden** senden (Composer im CRM) - [ ] Optional: **Aufgabe** aus der Nachricht anlegen ===== Empfohlenes Muster ===== Browser → Deine Website (ohne Secret) → PHP auf Deinem Server → POST https://api.snapper.network/crm/form/submit ===== HTML-Formular (ohne Secret) =====
===== Beispiel: PHP auf Deinem Server ===== $name, 'email' => $email, 'subject' => $subject, 'message' => $message, ]; $ch = curl_init($snapperEndpoint); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $snapperSecret, 'Content-Type: application/json', 'Accept: application/json', ], CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE), CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 20, ]); $responseBody = curl_exec($ch); $httpCode = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($responseBody === false || $httpCode < 200 || $httpCode >= 300) { error_log('Snapper CRM-Formular fehlgeschlagen: HTTP ' . $httpCode); http_response_code(502); exit('Senden fehlgeschlagen. Bitte später erneut versuchen.'); } header('Location: /danke.html'); exit; Secret z. B. in der Server-Umgebung (nicht in Git committen): export SNAPPER_CRM_FORM_SECRET='dein-secret-hier' Optional: In den Formular-Verbindungs-Einstellungen die **IP-Whitelist** auf die ausgehende IP Deines Servers setzen. ===== Test mit curl (vom Server) ===== curl -X POST 'https://api.snapper.network/crm/form/submit' \ -H 'Authorization: Bearer DEIN_SECRET' \ -H 'Content-Type: application/json' \ -d '{ "name": "Max Mustermann", "email": "max@example.com", "subject": "Support-Anfrage", "message": "Hallo, ich habe eine Frage." }' Bei Erfolg: HTTP **200** und ''"status": "success"'' in der Antwort. Danach Eingang im CRM prüfen. ===== Technische Details (API) ===== **Endpunkt:** ''POST https://api.snapper.network/crm/form/submit'' **Anmeldung:** Formular-Secret (kein Snapper-Login nötig) ^ Variante ^ Verwendung ^ | ''Authorization: Bearer '' | empfohlen | | ''X-Snapper-Form-Key: '' | Alternative | **Pflichtfelder im JSON-Body:** ^ Feld ^ Beschreibung ^ | ''email'' | E-Mail des Absenders | | ''message'' | Nachrichtentext | **Optionale Felder:** ''name'', ''subject'', ''category'' (z. B. ''support'', ''sales'', ''other'') **Format:** JSON empfohlen; max. 128 KB gesamt, einzelne Texte max. 8000 Zeichen. Kein HTML oder Script in Feldwerten. **Typische Fehler:** ^ Code ^ Bedeutung ^ | 400 | Pflichtfeld fehlt oder ungültiger Inhalt | | 403 | Secret ungültig oder IP nicht erlaubt | | 429 | Zu viele Anfragen — später erneut versuchen | | 503 | CRM oder Formular derzeit nicht verfügbar | **Schutz:** ca. 30 Anfragen pro Minute pro Server-IP; Honeypot-Feld ''_hp'' muss leer bleiben. ===== Nur Ordner, ohne CRM? ===== Wenn Eingänge **nur in einem Ordner** gespeichert werden sollen (ohne CRM), nutze den Endpunkt ''/webhook/form'' — Anleitung: [[whitepaper:formular|Website-Formular anbinden]]. Für **Support und Kundenanfragen im CRM** immer ''/crm/form/submit'' (dieses Whitepaper). ===== Hinweise ===== * Secret **nie** im Browser oder öffentlich im Quellcode der Website. * Auf Deiner Website eine eigene **Danke-Seite** nach erfolgreichem Senden anzeigen. * Antworten an Besucher: im CRM **E-Mail an Kunden** (SMTP-Verbindung muss eingerichtet sein). * Details zu Verbindungen: [[api:connections|Verbindungen]] · CRM-Oberfläche: [[api:crm|CRM]]