[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fr-JjEUoYjx_8CzTuy3X6qvfAAMU1a57eOaZUZyWE9XM":3,"$fG91H0FDD3CAFuK-YOL8kl5neaXL1I49nQHChF_QgrjE":14},{"slug":4,"locale":5,"title":6,"section":7,"orderIndex":8,"blocks":9,"seoTitle":7,"seoDescription":7,"updatedAt":13},"70-notifications","de","70 — Notification-System",null,70,[10],{"type":11,"value":12},"markdown","# 70 — Notification-System\n\nPartnerDesk hat ein eigenes Notification-System für Multi-Channel-Benachrichtigungen an Partner (und teilweise Tenant-Admins). Notifications können automatisch durch System-Events ausgelöst oder manuell vom Admin verschickt werden.\n\n## Was kann das System?\n\n- **In-App-Notifications** (Bell-Icon im Partner-Portal mit Badge + Detail-Modal).\n- **Email-Benachrichtigungen** (mit Tenant-Whitelabel-From-Adresse).\n- **Trigger durch System-Events** (TX approved, Payout fertig, Partner aktiviert).\n- **Manuelle Massen-Notifications** (Tenant-Admin schickt eine Ankündigung an alle aktiven Partner).\n- **Geplante Notifications** (Sendezeitpunkt in der Zukunft).\n- **Templates mit Platzhaltern** (`{partner.firstName}`, `{payout.amount}`).\n- **Live-Preview** im Template-Editor.\n- **Block-Editor** für reiche Inhalte (Heading, Text, Bild, Button).\n\n## Auslöser-Events (automatisch)\n\nDas System hört auf vier Domain-Events und triggert die entsprechende Notification, falls ein aktives Template dafür existiert:\n\n| Event | Default-Template | Empfänger |\n|-------|------------------|-----------|\n| `transaction.approved` | „Neue Provision freigegeben\" | Partner |\n| `payout.approved` | „Gutschrift erstellt\" | Partner |\n| `commission.earned` | „Provision verdient\" | Partner |\n| `partner.activated` | „Willkommen!\" | Partner (selbst), zusätzlich Sponsor |\n\nPlus Lifecycle-Events für Tenant-Owner (siehe **[73 — Lifecycle-Mails](73-lifecycle-mails.md)**).\n\n## Manuelle Notifications anlegen\n\nAdmin → **„Benachrichtigungen\"** → **„Neue Notification\"**.\n\n### Editor-Aufbau\n\n| Bereich | Funktion |\n|---------|----------|\n| **Titel** | Erscheint im Bell-Panel des Partners |\n| **Block-Editor** | Strukturierter Inhalt mit Heading\u002FText\u002FBild\u002FButton-Blöcken |\n| **Sendezeitpunkt** | Sofort, geplant für später, oder als Entwurf |\n| **Zielgruppe** | Alle aktiven Partner \u002F nach Status \u002F nach CommissionGroup |\n| **Kanäle** | In-App, Email — pro Partner gemäß seinen Präferenzen |\n| **Live-Preview** | Rechts neben dem Editor zeigt die Mail- und In-App-Vorschau |\n\n### Send-Modi\n\n- **Sofort senden** — Verarbeitung startet im Hintergrund (Messenger-Queue, Chunks von 50\u002FBatch).\n- **Geplant** — Symfony-Scheduler triggert den Versand zum gewünschten Zeitpunkt.\n- **Entwurf** — speichern, später anpassen, später senden.\n\n## Templates\n\nSie können wiederverwendbare Vorlagen anlegen:\n\nAdmin → **„Benachrichtigungen\"** → **„Templates\"**.\n\n### Platzhalter\n\nIn Texten verwendbar (werden vor Versand ersetzt):\n\n| Platzhalter | Inhalt |\n|-------------|--------|\n| `{partner.firstName}` | Vorname |\n| `{partner.lastName}` | Nachname |\n| `{partner.email}` | Email |\n| `{tenant.name}` | Tenant-Name |\n| `{tenant.companyName}` | Firmenname aus Legal-Settings |\n| `{transaction.commissionAmount}` | (bei TX-Event) Provisionsbetrag |\n| `{transaction.productName}` | Produkt |\n| `{payout.payoutNumber}` | Gutschriftnummer |\n| `{payout.grossAmount}` | Brutto-Auszahlung |\n| `{payout.period}` | Zeitraum |\n\nBei Event-Triggern werden die Platzhalter automatisch aus den Event-Daten gefüllt.\n\n### Live-Preview im Editor\n\nDas Editor-Modal lädt einen `\u002Fpreview`-Endpoint mit Sample-Entities:\n\n- Bei `transaction.approved` → Fake-Partner + Fake-TX mit Beispielwerten.\n- Bei `payout.approved` → Fake-Payout (z. B. `PA-2026-0042`, 250 €).\n- Etc.\n\nDer Preview rendert in Echtzeit (debounced 350 ms nach letzter Eingabe).\n\n## Test-Send\n\nVor dem Massen-Versand können Sie eine **Test-Notification** an eine Wunschadresse schicken — verifiziert Look & Feel ohne echte Empfänger zu spammen.\n\n## Webhook-Notifications\n\nExterne Systeme können Notifications via HMAC-signiertem Webhook senden:\n\n```\nPOST \u002Fapi\u002Fwebhooks\u002F{slug}\u002Fnotification\n```\n\nSinnvoll für: CRM-Trigger („Lead-Status hat sich geändert\"), externe Marketing-Tools.\n\n## Empfänger-Filter\n\nBeim Erstellen einer Notification können Sie filtern:\n\n- **Alle Partner** des Tenants.\n- **Nur aktive** Partner.\n- **Nach Status** (`pending` für Aktivierungs-Erinnerungen, `suspended` für Reaktivierungs-Angebote).\n- **Nach CommissionGroup** (z. B. nur Premium-Partner).\n- **Nach Sprache** (`language`-Feld am Partner).\n\n## In-App-UX\n\nPartner sieht:\n\n- **Bell-Icon** in der Top-Bar mit **Unread-Badge** (`99+` bei mehr als 99).\n- **Slide-In-Panel** beim Klick mit Liste der letzten Notifications.\n- **Detail-Modal** beim Klick auf eine Notification — markiert als gelesen.\n- **Tabs**: „Aktiv\", „Archiviert\", „Geplant\" (für Partner mit Self-Schedule-Rechten, derzeit nicht aktiv).\n\n## Asynchrone Verarbeitung\n\nNotifications werden über die **Symfony-Messenger-Queue** verarbeitet (`notifications`-Transport):\n\n- Massen-Versendungen werden in **Batches von 50** zerlegt.\n- Bei Fehlschlag pro Empfänger: andere Empfänger sind nicht betroffen.\n- Gescheiterte Messages landen im **Failed-Transport** (Superadmin kann retry'en — siehe **[113](113-failed-messages.md)**).\n\n## Notification-Statistiken\n\nIm Detail einer versendeten Notification sehen Sie:\n\n- Empfänger-Anzahl.\n- Wie viele wurden zugestellt.\n- Wie viele gelesen (für In-App-Channel).\n- Click-Rate (wenn CTA-Buttons enthalten).\n\n## Verwandte Kapitel\n\n- **[71 — Email-Whitelabel](71-email-whitelabel.md)** — From-Adresse anpassen\n- **[72 — Email-Templates](72-email-templates.md)** — Welche Mails es gibt\n- **[73 — Lifecycle-Mails](73-lifecycle-mails.md)** — Automatische Mails zu Tenant-Status\n\n---\n\n**Technische Tiefen-Doku**: [`..\u002F007-partner-notifications.md`](..\u002F007-partner-notifications.md), [`..\u002F033-admin-dashboard-chart-preview.md`](..\u002F033-admin-dashboard-chart-preview.md) (Live-Preview)\n","2026-06-01T21:39:08+02:00",{"data":15},[16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,177,181,185,189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257,261,265,269],{"slug":17,"locale":5,"title":18,"section":7,"orderIndex":19},"01-ueberblick","01 — Kurzüberblick & Architektur",1,{"slug":21,"locale":5,"title":22,"section":7,"orderIndex":23},"02-schnellstart","02 — Schnellstart für neue Tenants",2,{"slug":25,"locale":5,"title":26,"section":7,"orderIndex":27},"03-rollen","03 — Rollen & Berechtigungen",3,{"slug":29,"locale":5,"title":30,"section":7,"orderIndex":31},"10-kampagnen","10 — Kampagnen verwalten",10,{"slug":33,"locale":5,"title":34,"section":7,"orderIndex":35},"11-provisionen","11 — Provisionsmodelle (Tiers & Gruppen)",11,{"slug":37,"locale":5,"title":38,"section":7,"orderIndex":39},"12-mlm","12 — MLM-Struktur & Downline",12,{"slug":41,"locale":5,"title":42,"section":7,"orderIndex":43},"13-bonus","13 — Bonusprogramme",13,{"slug":45,"locale":5,"title":46,"section":7,"orderIndex":47},"14-holdback-reserve","14 — Reifezeit & Reserve (Schutz vor Rückbuchungen)",14,{"slug":49,"locale":5,"title":50,"section":7,"orderIndex":51},"15-programm-bewertungen","15 — Programm-Bewertungen im Marktplatz",15,{"slug":53,"locale":5,"title":54,"section":7,"orderIndex":55},"16-externe-bewertungen","16 — Externe Bewertungen verbinden (Anbieter)",16,{"slug":57,"locale":5,"title":58,"section":7,"orderIndex":59},"17-joint-venture-partner","17 — Joint-Venture-Partner",17,{"slug":61,"locale":5,"title":62,"section":7,"orderIndex":63},"18-vertriebsmitarbeiter","18 — Vertriebsmitarbeiter (VM)",18,{"slug":65,"locale":5,"title":66,"section":7,"orderIndex":67},"19-profitabilitaet","19 — Profitabilität einer Kampagne",19,{"slug":69,"locale":5,"title":70,"section":7,"orderIndex":71},"20-partner-anlegen","20 — Partner anlegen",20,{"slug":73,"locale":5,"title":74,"section":7,"orderIndex":75},"21-partner-status","21 — Partner-Status & Lifecycle",21,{"slug":77,"locale":5,"title":78,"section":7,"orderIndex":79},"22-partner-profile","22 — Partner-Profile & Stammdaten",22,{"slug":81,"locale":5,"title":82,"section":7,"orderIndex":83},"23-customers","23 — Customers (Endkunden)",23,{"slug":85,"locale":5,"title":86,"section":7,"orderIndex":87},"24-partner-merge","24 — Doppelte Partner zusammenführen",24,{"slug":89,"locale":5,"title":90,"section":7,"orderIndex":91},"30-webhooks","30 — Webhook-Übersicht",30,{"slug":93,"locale":5,"title":94,"section":7,"orderIndex":95},"31-stripe","31 — Stripe-Integration",31,{"slug":97,"locale":5,"title":98,"section":7,"orderIndex":99},"32-digistore24","32 — Digistore24-Integration",32,{"slug":101,"locale":5,"title":102,"section":7,"orderIndex":103},"33-copecart","33 — CopeCart-Integration",33,{"slug":105,"locale":5,"title":106,"section":7,"orderIndex":107},"34-ablefy","34 — Ablefy-Integration (vormals elopage)",34,{"slug":109,"locale":5,"title":110,"section":7,"orderIndex":111},"35-easybill","35 — easybill-Integration",35,{"slug":113,"locale":5,"title":114,"section":7,"orderIndex":115},"36-lexoffice","36 — lexoffice-Integration",36,{"slug":117,"locale":5,"title":118,"section":7,"orderIndex":119},"37-custom-webhook","37 — Custom Webhook (Zapier, Make, n8n, eigene Systeme)",37,{"slug":121,"locale":5,"title":122,"section":7,"orderIndex":123},"40-auszahlungen","40 — Auszahlungs-Workflow",40,{"slug":125,"locale":5,"title":126,"section":7,"orderIndex":127},"41-gutschriften","41 — Gutschriften (§14 UStG)",41,{"slug":129,"locale":5,"title":130,"section":7,"orderIndex":131},"42-sepa","42 — SEPA-XML-Export",42,{"slug":133,"locale":5,"title":134,"section":7,"orderIndex":135},"43-stripe-connect","43 — Stripe Connect (Express-Auszahlungen)",43,{"slug":137,"locale":5,"title":138,"section":7,"orderIndex":139},"44-buchhaltung-sync","44 — Externe Buchhaltung-Sync (easybill \u002F lexoffice)",44,{"slug":141,"locale":5,"title":142,"section":7,"orderIndex":143},"50-tracking","50 — Tracking-Cookie & Klick-Erfassung",50,{"slug":145,"locale":5,"title":146,"section":7,"orderIndex":147},"51-attribution","51 — Attribution-Modelle",51,{"slug":149,"locale":5,"title":150,"section":7,"orderIndex":151},"52-utm-subid","52 — UTM, Sub-IDs & Fingerprint",52,{"slug":153,"locale":5,"title":154,"section":7,"orderIndex":155},"53-werbemittel","53 — Werbemittel: Banner & Coupons",53,{"slug":157,"locale":5,"title":158,"section":7,"orderIndex":159},"54-links-landingpages","54 — Short-Links & Landing-Pages",54,{"slug":161,"locale":5,"title":162,"section":7,"orderIndex":163},"60-marketing-site","60 — Marketing-Site (Apex-Domain)",60,{"slug":165,"locale":5,"title":166,"section":7,"orderIndex":167},"61-popup-widget","61 — Popup-Widget für Tenant-Sites",61,{"slug":169,"locale":5,"title":170,"section":7,"orderIndex":171},"62-cross-promotion","62 — PartnerDesk Cross-Promotion (PartnerDesk empfehlen)",62,{"slug":173,"locale":5,"title":174,"section":7,"orderIndex":175},"63-lead-aff","63 — Lead-Affiliate-Programm (Partner werben Partner)",63,{"slug":4,"locale":5,"title":6,"section":7,"orderIndex":8},{"slug":178,"locale":5,"title":179,"section":7,"orderIndex":180},"71-email-whitelabel","71 — Email-Whitelabel",71,{"slug":182,"locale":5,"title":183,"section":7,"orderIndex":184},"72-email-templates","72 — Email-Templates",72,{"slug":186,"locale":5,"title":187,"section":7,"orderIndex":188},"73-lifecycle-mails","73 — Lifecycle-Mails",73,{"slug":190,"locale":5,"title":191,"section":7,"orderIndex":192},"80-akademie","80 — Akademie: Kurse & Lektionen",80,{"slug":194,"locale":5,"title":195,"section":7,"orderIndex":196},"81-quiz","81 — Quiz-System",81,{"slug":198,"locale":5,"title":199,"section":7,"orderIndex":200},"82-zertifikate","82 — Zertifikate nach Kurs-Komplettierung",82,{"slug":202,"locale":5,"title":203,"section":7,"orderIndex":204},"90-2fa","90 — Two-Factor-Authentication (2FA)",90,{"slug":206,"locale":5,"title":207,"section":7,"orderIndex":208},"91-rate-limiting","91 — Rate-Limiting",91,{"slug":210,"locale":5,"title":211,"section":7,"orderIndex":212},"92-audit-log","92 — Audit-Log",92,{"slug":214,"locale":5,"title":215,"section":7,"orderIndex":216},"93-dsgvo","93 — DSGVO-Tools",93,{"slug":218,"locale":5,"title":219,"section":7,"orderIndex":220},"94-legal","94 — Legal-Pages",94,{"slug":222,"locale":5,"title":223,"section":7,"orderIndex":224},"95-cookie-consent","95 — Cookie-Consent",95,{"slug":226,"locale":5,"title":227,"section":7,"orderIndex":228},"100-billing-plaene","100 — Stripe-Billing-Pläne",100,{"slug":230,"locale":5,"title":231,"section":7,"orderIndex":232},"101-trial","101 — Trial & Subscription-Status",101,{"slug":234,"locale":5,"title":235,"section":7,"orderIndex":236},"102-customer-portal","102 — Stripe Customer-Portal",102,{"slug":238,"locale":5,"title":239,"section":7,"orderIndex":240},"110-superadmin","110 — Plattform-Admin (Superadmin)",110,{"slug":242,"locale":5,"title":243,"section":7,"orderIndex":244},"111-health","111 — Health-Endpoints",111,{"slug":246,"locale":5,"title":247,"section":7,"orderIndex":248},"112-webhook-event-log","112 — Webhook-Event-Log",112,{"slug":250,"locale":5,"title":251,"section":7,"orderIndex":252},"113-failed-messages","113 — Failed-Messages",113,{"slug":254,"locale":5,"title":255,"section":7,"orderIndex":256},"120-pwa-partner","120 — PWA Partner-Portal",120,{"slug":258,"locale":5,"title":259,"section":7,"orderIndex":260},"121-cross-tenant-hub","121 — Cross-Tenant-Hub",121,{"slug":262,"locale":5,"title":263,"section":7,"orderIndex":264},"130-public-api","130 — Public-API (für Tenant-Integratoren)",130,{"slug":266,"locale":5,"title":267,"section":7,"orderIndex":268},"131-outgoing-webhooks","131 — Outgoing-Webhooks",131,{"slug":270,"locale":5,"title":271,"section":7,"orderIndex":272},"132-exports","132 — Datenexporte (CSV, PDF-Report)",132]