feat: Implement unsubscribe link for marketing automation [31188f42]

This commit introduces a new unsubscribe feature to allow contacts to opt-out
from marketing automation.

Key changes include:
- Database schema migration: Added  (UUID) to the  model.
- Data population: Implemented a script to assign unique tokens to existing contacts.
- API endpoint: Created a public GET  endpoint to handle opt-out requests.
- Automation: New contacts automatically receive an unsubscribe token upon creation.
- Integration: The full unsubscribe link is now returned via the provisioning API
  for storage in SuperOffice UDFs (ProgID: SuperOffice:9).
- Documentation: Updated  and
  to reflect the new feature and its integration requirements.
- Added  for quick overview and next steps.
This commit is contained in:
2026-02-24 12:18:13 +00:00
parent 0c7088e5fd
commit 7c82e4b5d7
10 changed files with 185 additions and 4 deletions

View File

@@ -180,7 +180,21 @@ Contacts stehen in 1:n Beziehung zu Accounts. Accounts können einen "Primary Co
**Status (Marketing Automation):**
* *Manuell:* Soft Denied, Bounced, Redirect, Interested, Hard denied.
* *Automatisch:* Init, 1st Step, 2nd Step, Not replied.
* *Automatisch:* Init, 1st Step, 2nd Step, Not replied, Unsubscribed.
### 6.1 Feature: Unsubscribe-Funktionalität (v2.1 - Feb 2026)
**Konzept:**
Um DSGVO-konforme Marketing-Automatisierung zu ermöglichen, wurde eine sichere Unsubscribe-Funktion implementiert.
**Technische Umsetzung:**
1. **Token:** Jeder Kontakt in der `contacts`-Tabelle erhält ein einzigartiges, nicht erratbares `unsubscribe_token` (UUID).
2. **Link-Generierung:** Der Company Explorer generiert einen vollständigen, personalisierten Link (z.B. `https://<APP_BASE_URL>/unsubscribe/<token>`).
3. **API-Endpunkt:** Ein öffentlicher GET-Endpunkt `/unsubscribe/{token}` nimmt Abmeldungen ohne Authentifizierung entgegen.
4. **Logik:**
* Bei Aufruf des Links wird der Status des zugehörigen Kontakts auf `"unsubscribed"` gesetzt.
* Der Benutzer erhält eine simple HTML-Bestätigungsseite.
5. **CRM-Integration:** Der generierte Link wird über die Provisioning-API an den `connector-superoffice` zurückgegeben, der ihn in ein entsprechendes UDF in SuperOffice schreibt.
## 7. Historie & Fixes (Jan 2026)