Preference Center: die öffentliche Opt-in/Opt-out-Seite
Das Preference Center ist eine öffentliche Seite, auf der ein Kontakt seine eigenen Kanal-Opt-ins, Abonnement-Themen, Nachrichtenfrequenz und (wenn aktiviert) einen Datenlöschungsantrag verwaltet — kein Konto, kein Login. Jeder Kontakt erreicht sie über einen signierten Link: Die URL trägt ein HMAC-SHA256-Token (v1.<payload>.<signature>), das nach 30 Tagen abläuft, sodass die Seite Self-Service bleibt, aber auf genau einen Kontakt in genau einer Organisation beschränkt ist.
Die zusammengefasste Endpunkt-Oberfläche lebt auch in Send Gates; dieser Leitfaden ist die vollständige Schritt-für-Schritt-Anleitung: jedes Konfigurationsfeld, wo der Link platziert wird, was die öffentliche Seite zurückgibt und welche Compliance-Oberflächen ein Opt-out oder Opt-in beschreibt.
Alle Endpunkte unten laufen unter https://api.orbit.devotel.io/api/v1/compliance.
Englisches Original: Preference center: the public opt-in/opt-out page.
Das Preference Center ist ein mandantenseitiges Steuerungselement: Sie wählen die Kanäle, Themen und das Branding, und Ihre Organisation hält die Einwilligungsnachweise. Orbit betreibt die Plattform; die Einwilligungsentscheidung gehört dem Kontakt. Dieser Leitfaden ist keine Rechtsberatung — bestätigen Sie Ihre Pflichten mit Ihrer Rechtsabteilung.
1. Einmal konfigurieren: POST/GET /preference-center
Setzen Sie die Konfiguration mitPOST /preference-center (Owner/Admin-API-Schlüssel). Der Endpunkt upsertet die Konfiguration in die Einstellungen Ihrer Organisation und gibt das gespeicherte Objekt zurück — erneut ausführen, um zu aktualisieren. GET /preference-center liest die aktuelle Konfiguration zurück; vor der Konfiguration gibt sie enabled: false mit einem Hinweistext zurück.
Konfigurationsfelder
Jedes Feld wird serverseitig validiert — eine abgelehnte POST gibt422 mit Feld-Level-Problemen (field, message) zurück, damit Sie erkennen, welches Feld fehlgeschlagen ist.
Abonnement-Themen
Ein Thema ist eine benannte Gruppe — Newsletter, Produkt-Updates, Rechnungswarnungen — die ein Kontakt ohne den ganzen Kanal zu berühren ein- oder ausschaltet. Thema-ids müssen einzigartig sein und dem Slug-Muster ([a-z0-9][a-z0-9_-]{0,63}) entsprechen; jeder Eintrag hat:
name(1–120 Zeichen) — der auf der Seite angezeigte Name.description(optional, ≤500) — eine Zeile Kontext neben der Kachel.defaultOptIn(Standardfalse) — wie ein Kontakt ohne aufgezeichnete Präferenz behandelt wird.archived(optional) — archivierte Themen bleiben im Audit-Trail, erscheinen aber nicht mehr auf der Seite.
http(s)-Schema-Überprüfung nicht bestehen, werden vorab abgelehnt, und doppelte Thema-ids schlagen mit „Thema-IDs müssen einzigartig sein” fehl, statt still überschrieben zu werden.
2. Pro-Kontakt-Link erstellen
Nach der Konfiguration generieren Sie mitPOST /preference-center/link einen Link für jeweils einen Kontakt:
link zurück — eine URL der Form ${DEVOTEL_WEB_URL}/preferences?token=v1…. Beachtenswerte Punkte:
- Der Link zielt auf die gehostete Seite, nicht auf das JSON-Endpunkt. Kopieren Sie ihn wörtlich in Ihre Fußzeilen-/Absender-Vorlagen; die Seite selbst ruft den Daten-Endpunkt unter der Haube ab.
- 30-Tage-TTL. Danach wird das Token als abgelaufen geprüft und der Kontakt muss einen neuen Link anfordern (das Erstellen eines neuen erfordert einen API-Aufruf).
- Die Seite ist zum Erstellungszeitpunkt sprachagnostic. Die Web-App löst eine Umleitung unter Beibehaltung der
?token=-Abfrage, sodass Sie das Locale des Kontakts nicht erraten müssen.
Wo er platziert wird
- E-Mail-Fußzeile (primär). Hängen Sie den generierten Link (oder die kurze, verfolgte Variante, die Ihr Mailer verwendet) in den Abmeldebereich der Marketingvorlagen an.
- SMS / WhatsApp-Fallback. Wenn die Nachricht keinen Fußzeilenblock hat, hängen Sie den Link inline an:
{optOutMessage}: {link}. Der Helfer, der ausgehende Körper erstellt, akzeptiert einen vorab erstellten Kurzlink, sodass Ihr Abmeldeklick weiterhin die normale Klick-Attribution erhält. - Suppression-getriebener Wieder-Opt-in. Wenn ein Kontakt über einen anderen Ablauf wieder opt-int, können Sie ihm einen frischen Link geben, damit er dieselbe Self-Service-Seite erhält.
3. Die öffentliche Token-Seite
Die gehostete Seite liest und schreibt über zwei nicht authentifizierte Endpunkte, die vom signierten Token geschützt sind:GET /preferences/:token— gibt die Seiten-Ladung zurück.PUT /preferences/:token— wendet Aktualisierungen an.
400 INVALID_TOKEN zurück; abgelaufene oder manipulierte Token geben 401 TOKEN_EXPIRED mit „Bitte einen neuen Link anfordern.”
GET-Antwort
Die Ladung bündelt den aktuellen Zustand des Kontakts und die Organisations-Konfiguration:consentHistory ist der Newest-First-Opt-in/Opt-out-Audit-Trail des Kontakts, auf 20 Zeilen begrenzt, gezogen aus demselben Einwilligungsledger, den Ihre Operatoren im Dashboard sehen.
PUT-Anfragetext
channelPreferences— Teilabbildung erlaubt (Zod-Partial-Record); mindestens ein Kanal erforderlich.frequencyPreference— optional, einer vonall,important_only,weekly_digest,monthly_digest.topicPreferences— optional{ topicId: opted_in | opted_out }Abbildung, validiert gegen Ihre konfigurierten Themen; unbekannte IDs werden ignoriert.requestDataDeletion— setzt neben dem Opt-out einen GDPR-Löschungsantrag (siehe Abschnitt 6).
4. Wie Aktualisierungen fließen
Ein hier geschriebenes Opt-in/Opt-out ist nicht nur ein UI-Flag — dieselben vier Compliance-Oberflächen, die ein STOP-Keyword beschreibt, werden aktualisiert:- Einwilligungsledger. Eine
consent_records-Zeile pro Kanal (oder pro Thema) wird mitsource: preference_centerangehängt — Ihr GDPR-Artikel-7-Beweislast-Audit-Trail. - Suppression-Liste. Auf jedem abgemeldeten Kanal wird die kanonischierte Telefon/E-Mail des Kontakts mit Scope
alleingefügt — eine kanalübergreifende Sperre, die jedes Send-Gate liest. - STOP-Zaun. Bei Opt-out wird ein Redis-Schnellpfad-Zaun gesetzt (und bei vollständigem Wieder-Opt-in gelöscht), sodass in-flight-Kampagnen-Batches die Änderung vor der langsameren Datenbank-Suppression-Propagation sehen.
- Audit-Log.
compliance.preference_center_updatedwird aufgezeichnet, wenn Sie die Konfiguration ändern, und Kontakt-Level-Opt-in/out-Ereignisse werden im Einwilligungsledger erfasst.
opted_in) widerruft aktive Suppression-Zeilen für die Telefonnummer des Kontakts und löscht den STOP-Zaun, während das Einwilligungsledger den umgekehrten Eintrag erhält.
Thema vs. Kanal. Ein Opt-out auf Kanalebene gewinnt immer — eine Themen-Kachel verengt die Einwilligung innerhalb der Kanäle, die der Kontakt noch akzeptiert. Unbekannte Thema-IDs in einem PUT werden ignoriert statt persistent zu werden, sodass ein veraltetes Formular keine beliebigen Attributschlüssel schreiben kann.
5. GDPR-Lösch-Kachel-Semantik
WennshowGdprDelete aktiviert ist und der Kontakt im PUT requestDataDeletion: true markiert, zeichnet die API einen Legacy-GDPR-Löschungsantrag auf — eine pending-Zeile, die für Ihren Datenlöschungsprozess markiert ist — neben dem Opt-out. Diese Markierung ist beabsichtigt: die Preference-Center-Lösch-Kachel markiert den Kontakt, sie startet nicht die verfolgte DSAR-Pipeline.
6. Testen
Zwei ausgearbeitete curl-Beispiele, die Sie in ein Smoke-Skript einfügen können: Konfiguration speichern:201 mit der gespeicherten Konfiguration widergespiegelt.
Link erstellen und öffentliche Endpunkte ausüben:
updated: true plus die angewendeten Präferenzen zurück und, wenn angefordert, einen gdprRequest-Eintrag.
Gängige Fehler zum Prüfen: 400 INVALID_TOKEN (malformiertes Token), 401 TOKEN_EXPIRED (TTL abgelaufen oder Signaturkonflikt — neuen Link erstellen), 422 VALIDATION_ERROR (Feld-Level-Probleme in der Konfiguration oder dem Aktualisierungstext) und 404 NOT_FOUND, wenn das Preference Center deaktiviert ist oder die Kontakt-ID nicht existiert.
Verwandt
- Send Gates und Pre-Send-Schutz — wo die Preference-Center-Zusammenfassung neben Ruhezeiten, Notfall-Stopp und Drosseln lebt.
- Opt-Out & Suppression-Listen — wie Scope
allund Bulk-CSV-Importe mit dieser Oberfläche zusammenhängen. - Einwilligungsverwaltung — die Operator-seitige API, die dasselbe Einwilligungsledger speichert.
- DSAR-Referenz — die verfolgte Löschpipeline, zu der
requestDataDeletion-Anträge geroutet werden.