# DataFirefly Push: volledige handleiding

> Overzicht en vereisten DataFirefly Push maakt van uw WooCommerce-winkel een volwaardig platform voor Web Push-meldingen. Zonder SDK en zonder tracking van derden: de volledige cryptografie (VAPID en versleuteling volgens RFC…

- Pagina: <https://www.datafirefly.com/nl/documentation/datafirefly-push/>
- Taal: nl
- Bijgewerkt op: 2026-08-19
- Andere talen: [fr](https://www.datafirefly.com/documentation/datafirefly-push/index.md), [en](https://www.datafirefly.com/en/documentation/datafirefly-push/index.md), [es](https://www.datafirefly.com/es/documentation/datafirefly-push/index.md), [de](https://www.datafirefly.com/de/documentation/datafirefly-push/index.md), [it](https://www.datafirefly.com/it/documentation/datafirefly-push/index.md), [pl](https://www.datafirefly.com/pl/documentation/datafirefly-push/index.md), [pt](https://www.datafirefly.com/pt/documentation/datafirefly-push/index.md)
- Index: <https://www.datafirefly.com/nl/documentation/llms.txt>

## Overzicht en vereisten

DataFirefly Push maakt van uw WooCommerce-winkel een volwaardig platform voor Web Push-meldingen. Zonder SDK en zonder tracking van derden: de volledige cryptografie (VAPID en versleuteling volgens RFC 8291) draait in pure PHP op uw eigen server via OpenSSL. De plugin biedt een slimme opt-in met meerdere stijlen, tien automatische triggers, handmatige campagnes met een visuele builder en segmentatie, een volledig analysedashboard, een eigen pagina in Mijn account voor uw klanten en ingebouwde AVG-conformiteit.

- WordPress 6.2 en hoger.
- WooCommerce 7.0 en hoger, getest tot 9.6, compatibel met HPOS en Cart/Checkout Blocks.
- PHP 8.1 en hoger.
- Meertalig (FR/EN/ES/DE/IT), compatibel met Polylang en WPML.
- Compatibel met LiteSpeed Cache, WP Rocket en andere cacheplugins: de Service Worker wordt als standalone PHP geserveerd.

Er hoeft geen externe dienst te worden aangesloten en geen Composer-bibliotheek te worden onderhouden. De VAPID-sleutels worden bij activering automatisch gegenereerd, en de abonnementen en gebeurtenissen blijven in uw eigen database staan.

## Installatie

1. Download het archief `df-push.zip` vanuit uw klantaccount.
2. Ga in het WordPress-beheer naar **Plugins > Nieuwe plugin > Plugin uploaden** en plaats daar het archief.
3. Klik op **Activeren**.
4. Het menu **DF Push** verschijnt in de beheerzijbalk met zeven submenu's: Dashboard, Campagnes, Abonnees, Triggers, Opt-in, Instellingen, Webhooks en API.

Bij activering maakt de plugin acht eigen tabellen aan met het voorvoegsel `dfpush_`, genereert ze uw VAPID-sleutels, plant ze de dagelijkse cron `df_push_daily_lifecycle` in en registreert ze het endpoint voor Mijn account. Handmatig ingrijpen is niet nodig.

## Eerste configuratie: VAPID-sleutels en opt-in

Na activering werkt de plugin meteen met de standaardinstellingen: het zwevende belletje verschijnt na vijf seconden rechtsonder, de pre-prompt staat aan en de automatische triggers zijn klaar. Controleer alleen twee zaken in **DF Push > Instellingen** voordat u de dienst aankondigt:

- **Openbare VAPID-sleutel**: het blok toont uw automatisch gegenereerde openbare sleutel (de application server key die de browser gebruikt). U kunt die opnieuw genereren, maar dan vervallen alle bestaande abonnementen.
- **PWA-manifest** en **standaardpictogram**: voeg uw pictogram toe (minstens 192×192) als `site_icon` niet op de site is ingesteld.

Er is geen externe dienst om te registreren en geen ontwikkelaarsaccount bij Firebase of OneSignal nodig. De VAPID-sleutels die de plugin genereert volstaan: ze authenticeren uw applicatieserver bij de pushdiensten FCM, Mozilla Push en WNS.

## Tabblad Opt-in: prompt, stijlen en triggers

Dit tabblad stuurt de abonnementsvraag aan. Er zijn vijf stijlen beschikbaar, elk met eigen positie en vormgeving:

- **Zwevend belletje** (standaard): een discrete knop rechtsonder of linksonder.
- **Banner** boven- of onderaan de pagina.
- **Modal** in het midden met overlay.
- **Slide-in** aan de zijkant.
- **Sticky bar** vast bovenaan.

De **pre-prompt (soft ask)**, die wordt aanbevolen, toont uw eigen boodschap vóór de ingebouwde vraag van de browser. Dat mechanisme spaart uw opt-in-quotum: in Chrome verbruikt het weigeren van de pre-prompt het quotum aan ingebouwde vragen niet (drie kansen in plaats van één zonder pre-prompt).

Vijf instelbare triggers, die u kunt combineren:

- **Vertraging** (in seconden) na het laden van de pagina.
- **Scroll** in procenten van de pagina (0 betekent uit).
- **Exit intent** bij een muisbeweging naar buiten (alleen desktop).
- **X paginaweergaven** binnen de sessie.
- **Toevoegen aan winkelwagen** (vangt de WooCommerce-gebeurtenis `added_to_cart` op).

Schakel de **A/B-test van de prompt** in met een titel en boodschap als variant B, en een instelbare verdeling. De toewijzing wordt in localStorage bewaard, zodat elke bezoeker over sessies heen dezelfde variant ziet.

Zodra de browsertoestemming is geweigerd, kan een script die niet opnieuw vragen. Besteed dus zorg aan uw pre-prompt en laat er niet meteen bij de eerste scroll een vraag op volgen: dan ziet men 70 procent weigeringen, tegenover 20 tot 30 procent met een pre-prompt op het juiste moment.

## Tabblad Triggers: de automatismen

Tien automatische triggers, elk afzonderlijk in te schakelen via het tabblad **Triggers**. Elke trigger gebruikt Action Scheduler voor uitgestelde verzending, met een synchrone terugval als Action Scheduler niet beschikbaar is.

### Verlaten winkelwagen

Drie instelbare herinneringen, standaard 1 uur, 24 uur en 72 uur na het verlaten. De detectie vangt de gebeurtenis `added_to_cart` op voor bezoekers die op Push zijn geabonneerd en plant drie acties `df_push_abandoned_cart` met afnemende tussenpozen. De herinneringen worden automatisch geannuleerd als de bestelling intussen wordt geplaatst.

### Weer op voorraad (back in stock)

Op de productpagina kunnen uw geabonneerde bezoekers zich per product op een wachtlijst zetten. Wanneer WooCommerce `woocommerce_product_set_stock_status` uitstuurt met een terugkeer naar _instock_, verstuurt de plugin een melding naar de wachtlijst van dat product en maakt die daarna leeg.

### Prijsverlaging

De plugin houdt per product een meta `_df_push_last_price` bij. Bij elke productwijziging vergelijkt ze de oude en de nieuwe prijs. Overschrijdt de verlaging de ingestelde **minimale drempel in procenten**, dan gaat er een melding naar het topic _Promoties_.

### Bevestiging, verzending, review

- **Orderbevestiging**: directe verzending bij `woocommerce_thankyou` naar de abonnee als de gebruikersidentificatie overeenkomt.
- **Verzending**: detecteert het trackingnummer op de bestelling door achtereenvolgens de meta `_tracking_number`, `_wc_shipment_tracking_items` (WooCommerce Shipment Tracking) en `_aftership_tracking_number` (AfterShip) te lezen. Wordt er een nummer gevonden, dan neemt de melding het op in de boodschap.
- **Reviewverzoek**: ingepland X dagen nadat de bestelling de status _completed_ heeft gekregen (instelbare termijn).

### Verjaardag, heractivering, nieuw product

- **Verjaardag**: de dagelijkse cron `df_push_daily_lifecycle` leest het WooCommerce-veld `billing_birthday` en stuurt een melding naar de abonnees die jarig zijn.
- **Heractivering**: verzending naar abonnees die 30, 60 en 90 dagen inactief zijn (vensters instelbaar als CSV: `30,60,90`).
- **Nieuw product**: bij publicatie van een product gaat er een melding naar het topic _Nieuw_.

Elke trigger accepteert een payload met sjabloonvariabelen: `{firstname}`, `{product_name}`, `{product_price}`, `{old_price}`, `{order_number}`, `{tracking_number}`, `{category}` en `{discount_code}`. De variabelen worden op het moment van verzending ingevuld, niet bij het inplannen.

## Tabblad Campagnes: visuele builder, segmentatie, A/B-test

Bouw een handmatige campagne in **DF Push > Campagnes > Nieuwe campagne**. De builder toont een live voorbeeld van de melding zoals die op het toestel van de abonnee verschijnt.

- **Inhoud**: titel, boodschap, bestemmings-URL, hero-afbeelding en tot twee actieknoppen met een eigen label en URL.
- **Blijvende melding** (optie _requireInteraction_): de melding blijft staan tot de gebruiker erop reageert.
- **Segmentatie** op taal, land, toesteltype en topic, en op RFM-gedrag: minimum aantal bestellingen, minimale gemiddelde bestelwaarde, dagen inactiviteit en gekochte categorie. De gedragssegmenten worden bij de start berekend via `wc_get_orders`.
- **A/B-test**: schakel een variant B in (titel en boodschap); de verdeling is in procenten instelbaar. De toewijzing is willekeurig per abonnee en deterministisch op basis van de identificatie, zodat de analyses consistent blijven.
- **Planning**: kies datum en tijd, of start meteen.
- **Testmodus**: verstuur de campagne vanuit de builder alleen naar beheerders, vóór de productiestart.

De verzendmotor deelt het segment automatisch op, respecteert de stille uren in de tijdzone van de abonnee, past de ingestelde frequentielimiet toe en ruimt gaandeweg de endpoints op die 404 of 410 teruggeven (uitschrijving aan browserzijde).

## Dashboard en analyses

Het dashboard **DF Push > Dashboard** bundelt uw KPI's over 30 dagen. Chart.js wordt lokaal meegeleverd (geen externe CDN-afhankelijkheid).

- **KPI's**: actieve abonnees, opt-in-percentage, verzendingen, doorklikratio (CTR), conversies en toegewezen omzet.
- **Tijdreeks over 30 dagen**: verzendingen tegenover kliks, met een lijn per dag.
- **Heatmap 7 × 24**: de beste verzendmomenten op basis van kliks, uitgezet per weekdag en uur van de dag.
- **Funnel per campagne**: verzonden, afgeleverd, geklikt, geconverteerd.
- **Toegewezen omzet**: een instelbaar attributievenster (standaard 72 uur) koppelt elke klik aan de eerste aankoop die die abonnee binnen het venster doet.
- **CSV-export** van alle gebeurtenissen voor een AVG-audit of een BI-integratie.

## Klantpagina: Mijn account → Meldingen

Er wordt automatisch een eigen pagina **Mijn account → Meldingen** aan het WooCommerce-dashboard toegevoegd. De klant vindt daar vier blokken:

- **Dit apparaat**: de huidige status (ingeschakeld, uitgeschakeld, geblokkeerd door de browser, niet ondersteund), met een knop om meldingen op dit apparaat in of uit te schakelen.
- **Al uw apparaten**: lijst van geabonneerde toestellen (type, browser, taal, laatste activiteit), met de mogelijkheid om per apparaat of in één klik voor alles uit te schrijven.
- **Mijn voorkeuren**: selectievakjes voor de ingebouwde topics (Nieuw, Promoties, Weer op voorraad). Opslaan verloopt via REST met een bevestiging.
- **Meldingsgeschiedenis**: de 30 laatst ontvangen meldingen, met titel, tekst, pictogram, link en datum.

De URL is in het Frans `/my-account/df-push-notifications/`. Het rewrite endpoint wordt geregistreerd met het masker `EP_ROOT | EP_PAGES`, met een zelfherstel op `init:999` dat een ontbrekende regel opmerkt (bijvoorbeeld na een gelijktijdige permalinkflush) en automatisch opnieuw flusht.

De klantacties (uitschrijven, voorkeuren) verlopen via de REST-routes onder `df-push/v1/account/*`, geauthenticeerd met cookie plus de nonce `wp_rest`. Er kan geen enkele actie op een ander account worden uitgevoerd, ook niet door de apparaatidentificatie in het verzoek aan te passen.

## AVG en toestemmingsregister

De AVG-conformiteit is ingebouwd, niet cosmetisch toegevoegd. Elke opt-in en elke uitschrijving wordt vastgelegd in de tabel `dfpush_consent_log` met:

- de identificatie van de abonnee;
- de actie: _subscribe_ of _unsubscribe_;
- het IP-adres gehasht in SHA-256 (het leesbare IP-adres wordt nooit bewaard);
- de user-agent;
- een tijdstempel in UTC.

De ingebouwde WordPress Privacy Exporters en Erasers zijn aangesloten: een klant kan de export of verwijdering van zijn persoonsgegevens aanvragen via **Gereedschap → Persoonlijke gegevens exporteren** of **Gereedschap → Persoonlijke gegevens wissen**. De plugin neemt dan zijn abonnementen, topics, inbox en toestemmingsregister op in het antwoord, of verwijdert die naargelang de aanvraag.

## Tabblad Instellingen: antispam en attributie

Dit tabblad bundelt de instellingen die uw abonnees ontzien, plus het attributievenster:

- **Stille uren**: de periode waarin geen enkele melding wordt verstuurd. Houdt rekening met de tijdzone van de abonnee (bij de opt-in van zijn toestel gelezen via `Intl.DateTimeFormat().resolvedOptions().timeZone`). Standaard van 22 tot 8 uur lokale tijd.
- **Frequentielimiet**: maximaal aantal meldingen per dag per abonnee. 0 betekent onbeperkt.
- **Smart send time**: optimaliseert het verzendmoment per abonnee op basis van zijn historische kliktijdstippen.
- **Attributievenster**: het aantal uren tussen een klik en een bestelling waarbinnen de bestelling aan de melding wordt toegeschreven. Standaard 72 uur.
- **Inbox op de site**: schakelt het zwevende belletje met de meldingsgeschiedenis aan de voorkant in of uit.
- **PWA-manifest**: schakelt het genereren van het manifest in, zodat de site op mobiel installeerbaar wordt.

## Tabblad Webhooks en REST API

Het tabblad **Webhooks en API** behandelt twee integratiemechanismen.

### Uitgaande webhooks

Stel per gebeurtenis een of meer HTTP-endpoints in. Er zijn drie formaten beschikbaar:

- **Slack**: payload `{ text }`, compatibel met Slack Incoming Webhooks.
- **Discord**: payload `{ content }`, compatibel met Discord Webhooks.
- **Generic**: volledige JSON-payload met event, timestamp en data, compatibel met Zapier, n8n en Make.

Beschikbare gebeurtenissen: `subscriber.created`, `campaign.launched`, `notification.clicked` en `order.attributed`. De verzoeken zijn niet-blokkerend (`wp_remote_post` met `blocking=false`), zodat de hoofdverzending nooit wordt vertraagd.

### REST API

Onder de namespace `df-push/v1` biedt de plugin een publieke verzendroute met token: `POST /wp-json/df-push/v1/send` met de header `X-DF-Push-Token`. Het token is met één klik opnieuw te genereren vanuit het beheer.

```
curl -X POST https://uw-site.com/wp-json/df-push/v1/send
  -H "Content-Type: application/json"
  -H "X-DF-Push-Token: UW_TOKEN"
  -d '{
    "title": "Flitsactie",
    "body": "20 procent op de hele catalogus tot middernacht",
    "url": "https://uw-site.com/promoties",
    "segment": { "lang": "nl", "topic": "promos" }
  }'
```

Behandel dit token als een wachtwoord. Wie het heeft, kan meldingen naar uw abonnees sturen. Genereer het meteen opnieuw als u een lek vermoedt.

## Inbox op de site, PWA en meertaligheid

Drie aanvullende functies dekken de gevallen waarin de gebruiker geen toestemming voor Push heeft gegeven.

- **Inbox op de site**: een zwevend belletje (instelbaar aan de voorkant) opent een lijst met de laatste meldingen die de gebruiker heeft ontvangen, gelezen of niet, ook als hij nooit toestemming voor Push heeft gegeven. Vooral nuttig voor iOS Safari vóór 16.4 en voor PWA-gebruikers.
- **PWA-manifest**: dynamisch gegenereerd op `/df-push-manifest.json`, op basis van `site_icon` of een eigen pictogram. Het filter `df_push_manifest` is beschikbaar om theme color, display, scope en start_url aan te passen.
- **Meertaligheid**: compatibel met Polylang en WPML. De meldingen gaan uit in de taal van de abonnee (bij de opt-in vastgesteld), met terugval op de standaardtaal van de site. De `.po`- en `.mo`-bestanden voor FR, EN, ES, DE en IT zijn inbegrepen.

## Service Worker en technische architectuur

De Service Worker wordt geserveerd door een standalone PHP-bestand op de URL `/wp-content/plugins/df-push/sw.php`. Die aanpak omzeilt de routing van WordPress volledig: er is geen enkele kans op interferentie met een cacheplugin, een canonical redirect of een andere `template_redirect`-handler.

De header `Service-Worker-Allowed: /` wordt in het antwoord meegestuurd, zodat registratie met het rootbereik mogelijk is (`scope: '/'`), ook al staat het script onder `/wp-content/`.

Aan de databasezijde zijn er acht tabellen met het voorvoegsel `dfpush_`:

- `dfpush_subscribers`: abonnees en hun Push-endpoint.
- `dfpush_topic_subs`: koppelingen tussen topic en abonnee.
- `dfpush_campaigns`: handmatige campagnes met payload, segment en planning.
- `dfpush_notifications`: logboek van de individueel verstuurde meldingen.
- `dfpush_events`: ruwe gebeurtenissen (opt-in, sent, delivered, clicked, converted) voor de analyses.
- `dfpush_inbox`: blijvende kopie van de meldingen voor de inbox op de site.
- `dfpush_stock_waitlist`: wachtlijsten voor producten die weer op voorraad komen.
- `dfpush_consent_log`: het AVG-register.

Bij het **verwijderen** (volledige verwijdering via Plugins) worden deze acht tabellen gedropt en alle opties gewist. Alleen deactiveren behoudt de gegevens voor een latere heractivering.

## Hooks voor ontwikkelaars

De plugin biedt acties en filters op de belangrijkste punten om het gedrag uit te breiden zonder de kern aan te passen.

- `df_push_booted` (actie): gaat af nadat de plugin is opgestart, handig om eigen uitbreidingen te registreren.
- `df_push_payload_build` (filter): de JSON-payload die naar de pushdienst gaat aanpassen vóór de versleuteling.
- `df_push_should_send` (filter): de verzending op eigen voorwaarden onderbreken (geef _false_ terug om over te slaan).
- `df_push_segment_query` (filter): de criteria voor gedragssegmentatie uitbreiden.
- `df_push_webhook_payload` (filter): de payloads van de uitgaande webhooks bijstellen.
- `df_push_manifest` (filter): het gegenereerde PWA-manifest aanpassen.
- Geregistreerde Action Scheduler-acties: `df_push_send_one`, `df_push_fan_out`, `df_push_abandoned_cart`, `df_push_review_request` en `df_push_dispatch_campaign`.

## Veelgestelde vragen en probleemoplossing

### De opt-in-prompt verschijnt niet

Drie mogelijke oorzaken: de browsertoestemming is al geweigerd (controleer dat in de browserinstellingen), de toestemming is al gegeven (dan heeft de prompt geen zin meer), of een trigger is niet bereikt (de vertraging is nog niet verstreken, of er is te weinig gescrold). Voer in de JavaScript-console `window.DFPush.isSubscribed()` uit om de huidige status te controleren.

### Het abonneescherm is leeg terwijl een opt-in is gelukt

Controleer in het netwerkpaneel of het verzoek `POST /wp-json/df-push/v1/subscribe` een code 200 teruggeeft. Vanaf versie 1.0.1 synchroniseert de plugin bij elk paginabezoek automatisch een bestaande `PushSubscription` opnieuw met de server, en logt ze elke insertfout van de database in `error_log`.

### De Service Worker geeft een registratiefout

Meldt de browser "The script resource is behind a redirect" of "Unexpected token '<'", test dan rechtstreeks de URL `https://uw-site.com/wp-content/plugins/df-push/sw.php`. U hoort de JavaScript-code van de Service Worker te zien, met `Content-Type: application/javascript` en de header `Service-Worker-Allowed: /`. Ziet u een HTML-pagina met 403, controleer dan de htaccess-regels die het rechtstreeks uitvoeren van PHP-bestanden onder `wp-content/plugins/` kunnen blokkeren.

### De meldingen komen niet aan op iOS

Safari op iOS ondersteunt Push-meldingen pas vanaf versie 16.4 en alleen voor sites die als PWA zijn geïnstalleerd via de knop **Zet op beginscherm**. Het PWA-manifest dat de plugin genereert, vergemakkelijkt die installatie. Richt u zich niet specifiek op iOS, dan is dit geen probleem: de andere browsers ontvangen de meldingen gewoon.

### Hoe migreer ik vanaf OneSignal of Pusher?

Bestaande abonnees bij die externe diensten zijn niet overdraagbaar: de Push-cryptografie bindt elk abonnement aan een uniek paar (de VAPID-sleutel van de server en het browserendpoint). Uw bezoekers moeten zich dus opnieuw abonneren na de overstap naar DataFirefly Push. U kunt de overgang voorbereiden door de oude SDK enkele dagen vooraf uit te schakelen en de nieuwe ervaring via een aankondigingsbanner te communiceren.

### Wat gebeurt er bij het verwijderen?

Alleen **deactiveren** behoudt alle tabellen en opties: u kunt de plugin opnieuw activeren en verdergaan waar u was. Het **volledig verwijderen** via Plugins voert `uninstall.php` uit, dat de acht `dfpush_`-tabellen dropt, alle opties van de plugin wist (ook de VAPID-sleutels en het API-token) en de crons uit de planning haalt. De permalinks worden bij het volgende verzoek automatisch geflusht.
