Doelgroepen
Met Doelgroepen bouw je een herbruikbare, gerichte groep bezoekers op basis van gedrag, bestelhistorie, klantwaarde en evenement-affiniteit. Je ziet live hoeveel bezoekers eraan voldoen, slaat de doelgroep op en gebruikt 'm voor een e-mail campagne.
Je vindt het onder Bezoekers & berichten → Doelgroepen. Klik op Nieuwe doelgroep om er een te maken.
Doelgroepen vs. Selecties maken? Selecties is de oudere filter-tool. Doelgroepen is de nieuwe, krachtigere builder: geneste EN/OF/GEEN-logica, "kocht X maar niet Y", en voorberekende klantwaarde-velden (RFM, recency, levensfase).
Hoe het werkt

Een doelgroep heeft een Naam, een optionele Omschrijving, een Type en Voorwaarden. De voorwaarden zijn opgebouwd uit groepen en voorwaarden.
- Voorwaarde — één regel: een veld, een operator en een waarde. Bijvoorbeeld: Woonplaats · bevat · Amsterdam.
- Groep — bundelt voorwaarden met een logica-schakelaar:
- EN — voldoet aan álle voorwaarden.
- OF — voldoet aan mínstens één.
- GEEN — voldoet aan géén ervan (uitsluiten).
- Subgroep — een groep binnen een groep, voor combinaties als A EN (B OF C).
- Heeft (niet) gekocht — een speciaal blok dat test of de bezoeker wél of géén ticket heeft dat aan criteria voldoet. Hiermee maak je "kocht X maar niet Y". Zie hieronder.
Onderaan toont de Live preview het aantal bezoekers en een voorbeeldlijst. Die beweegt mee terwijl je bouwt; met Ververs reken je opnieuw.
Heeft (niet) gekocht
Met de knop Heeft (niet) gekocht voeg je een blok toe. Bovenin het blok kies je:
- Heeft wél — de bezoeker heeft een ticket dat aan álle voorwaarden in het blok voldoet.
- Heeft géén — de bezoeker heeft géén ticket dat aan de voorwaarden voldoet.
Binnen het blok kun je alleen velden kiezen die over een ticket of bestelling gaan (zoals Evenement, Hoofd-evenement, Categorie, Tags, Kaartsoort, Locatie, Besteldatum). Alle voorwaarden in één blok gelden voor hetzelfde ticket: Evenement = X en Besteldatum na -1y betekent "een ticket voor X, besteld in het afgelopen jaar".
Heeft géén telt per e-mailadres. Heeft iemand meerdere accounts met hetzelfde e-mailadres, en is met één daarvan een passend ticket gekocht, dan valt die persoon buiten de doelgroep. Zo krijgt iemand die al een kaartje heeft niet alsnog de mail via een ander account. Heeft wél kijkt per account.
Opgelost (september 2026): een "heeft (niet) gekocht"-blok waarvan de voorwaarden als "één van" (OF) of "geen van" zijn gecombineerd, bijvoorbeeld uit een opgeslagen of door AI voorgestelde doelgroep, selecteerde (bijna) iedereen. Zo'n blok selecteert nu alleen de juiste mensen. Twijfel je over een oudere doelgroep, open 'm dan en controleer het aantal in de Live preview.
Datums
Datumvelden accepteren een vaste datum (2024-01-01) of een relatieve waarde
die altijd actueel blijft: today, -30d, -90d, -1y. Onder elk datumveld staan
snelknoppen (Vandaag · 7 dgn · 30 dgn · 90 dgn · 1 jaar). De standaard-operator voor
datums is "na" — meestal wil je "in de laatste N dagen".
Type: dynamisch of statisch
- Dynamisch — herberekenen bij gebruik (standaard) — de doelgroep wordt op het moment van gebruik opnieuw berekend. Voor een campagne is dat het verzendmoment: iemand die dan aan de voorwaarden voldoet, zit erin.
- Statisch — bevroren lijst — een vaste momentopname.
Genereer met AI
In het blok Genereer met AI beschrijf je je doelgroep in gewone taal, bijvoorbeeld Trouwe klanten uit Utrecht die het afgelopen jaar niets kochten, maar wel ooit een jazzconcert bezochten. Klik op Genereer voorwaarden: de AI vult de voorwaarden hieronder in. Er wordt niets automatisch opgeslagen; controleer en pas aan vóór je opslaat.
- Met CRM+ kun je onbeperkt genereren.
- Zonder CRM+ heb je 10 gratis AI-generaties. Naast de knop zie je hoeveel je er nog over hebt. Zijn ze op, dan zie je dat je kunt upgraden naar CRM+.
- Alleen een geslaagde generatie telt mee.
- Het tegoed is gedeeld met Nieuwe campagne met AI bij E-mail campagnes: daar maakt de AI in één poging een doelgroep, een mail en een verzendmoment.
Beschikbare velden
| Groep | Velden |
|---|---|
| Klanten | E-mailadres, Woonplaats, Postcode, Land, AVG opt-in (incidentele e-mail), Nieuwsbrief opt-in, Extra opt-in |
| Bestelling | Besteldatum, Betaalstatus, Orderbedrag, Betaalmethode, Ticketstatus, Check-in datum, Kaartsoort, Locatie, Taal, Actiecode |
| Evenementen | Evenement, Hoofd-evenement, Categorie, Tags, Evenementdatum |
| Wachtlijst | Wachtlijst-evenement, Wachtlijst-type, Wachtlijst-aanmelddatum |
| Klantwaarde (voorberekend, CRM+) | Laatste bestelling, Eerste bestelling, Aantal bestellingen, Aantal verschillende events, Aantal tickets (lifetime), Aantal keer ingecheckt, Lifetime besteed (€), Gem. orderbedrag (€), Totaal gedoneerd (€), Laatste evenementdatum, Klantsegment (RFM), Levensfase |
De opt-in-velden hebben de waarden Aangemeld en Niet aangemeld.
Opt-in en campagnes: een campagne slaat bij verzending altijd iedereen over bij wie de AVG opt-in (incidentele e-mail) uit staat. Wil je alleen nieuwsbrief-abonnees mailen, voeg dan zelf Nieuwsbrief opt-in · is · Aangemeld toe.
Klantsegment (RFM) en Levensfase
De Klantwaarde-velden zijn per klant voorberekend (zie Voor beheerders onderaan) en horen bij het CRM+ pakket. Zonder CRM+ zijn ze niet te kiezen en staat (CRM+ pakket) achter de naam.
- Klantsegment (RFM) — op basis van Recency (hoe recent), Frequency (hoe vaak) en Monetary (hoeveel besteed): Kampioenen, Trouwe klanten, Nieuw, Potentieel, Risico (afhakend), Eenmalige koper, Sluimerend, Verloren, Nog niet gekocht.
- Levensfase — op basis van hoe lang geleden de laatste bestelling was: Nieuw, Actief, Sluimerend (6-12 mnd), Lapsed (1-2 jaar), Verloren (>2 jaar), Nog niet gekocht.
Kies je zo'n veld, dan legt Hoe worden deze segmenten bepaald? onder de voorwaarde uit hoe elk segment wordt berekend.
Wachtlijst
Wie zich via de webshop voor een wachtlijst aanmeldt, leg je hiermee vast — en blijft selecteerbaar, óók nadat ze een seintje hebben gehad. (De operationele wachtrij wordt namelijk geleegd zodra mensen genotificeerd zijn; dit signaal blijft bestaan.)
- Wachtlijst-evenement — voor welk evenement ze op de wachtlijst staan/stonden. Met de operator heeft een waarde selecteer je iedereen die op een wachtlijst staat.
- Wachtlijst-type — Seintje (notify) of Auto-bestelling (order).
- Wachtlijst-aanmelddatum — wanneer ze zich aanmeldden (datumveld, relatieve
waarden zoals
-30dmogelijk).
Voorbeelden van selecties
Elke rij hieronder is een complete doelgroep. Blokken "Heeft wél/géén gekocht" staan cursief.
Bedanken & nazorg
| Doel | Bouw 'm zo |
|---|---|
| Bedankmail aan kopers van een event | Heeft wél gekocht: Evenement = Concert X |
| Doneerders bedanken | Totaal gedoneerd (€) · groter dan · 0 |
| Pre-event mail voor een hele festivalreeks | Heeft wél gekocht: Hoofd-evenement = Festival X |
Retentie & win-back
| Doel | Bouw 'm zo |
|---|---|
| Lapsed (al een jaar niets gekocht) | Laatste bestelling · voor · -1y |
| Sluimerende VIP's (gerichte win-back) | Laatste bestelling · voor · -1y EN Lifetime besteed (€) · groter of gelijk aan · 100 |
| One-and-done activeren | Aantal bestellingen · is · 1 |
| Verloren klanten via segment | Klantsegment (RFM) · is · Verloren |
Loyaliteit & waarde
| Doel | Bouw 'm zo |
|---|---|
| Trouwe fans | Aantal verschillende events · groter of gelijk aan · 3 |
| Topklanten | Klantsegment (RFM) · is · Kampioenen |
| VIP op besteding | Lifetime besteed (€) · groter of gelijk aan · 500 |
| Nieuwe klanten verwelkomen | Levensfase · is · Nieuw |
Cross-sell & gedrag (kocht X maar niet Y)
| Doel | Bouw 'm zo |
|---|---|
| Kocht X, mist het vervolg | Heeft wél gekocht: Evenement = X EN Heeft géén gekocht: Evenement = Y |
| Genre-fan die een titel mist | Heeft wél gekocht: Categorie = Jazz EN Heeft géén gekocht: Evenement = Z |
| Bezoekers van een locatie | Heeft wél gekocht: Locatie = Theater Y |
Wachtlijst
| Doel | Bouw 'm zo |
|---|---|
| Wachtlijst van een event informeren | Wachtlijst-evenement = Concert X |
| Wilde erbij, maar kocht niet | Wachtlijst-evenement = Concert X EN Heeft géén gekocht: Evenement = Concert X |
| Iedereen die ooit op een wachtlijst stond | Wachtlijst-evenement · heeft een waarde |
Demografisch & combinaties
| Doel | Bouw 'm zo |
|---|---|
| Lokale doelgroep | Woonplaats · bevat · Amsterdam |
| Nieuwsbrief-abonnees in een regio | Nieuwsbrief opt-in · is · Aangemeld EN Postcode · begint met · 10 |
| Loyaal in een categorie | Aantal verschillende events · groter of gelijk aan · 2 EN Heeft wél gekocht: Categorie = Theater |
Tip: combineer de Klantwaarde-velden met "Heeft (niet) gekocht" voor scherpe doelgroepen — bijv. Lapsed EN Heeft wél gekocht: Festival X = oud-bezoekers van precies dat festival om terug te halen.
Voor beheerders
De Klantwaarde-velden (RFM, recency, aantallen, levensfase) staan in een
voorberekende tabel user_stats (1 rij per klant). Die wordt herberekend met:
php artisan segments:rebuild-stats --tenant=<database>
In productie draait dit nachtelijk per tenant. Een nieuwe doelgroep gebruikt altijd de
laatst berekende waarden; tussentijdse aankopen tellen pas mee na de volgende herberekening.
Klanten zonder user_stats-rij (aangemaakt na de laatste herberekening) hebben lege
Klantwaarde-velden.
Wachtlijst-data — aanmeldingen worden duurzaam vastgelegd in waitlist_signup
(geschreven door tickets bij aanmelding via WaitinglistController), los van de
vluchtige waiting-queue die na notificatie + grace wordt opgeschoond. De engine joint
hierop net als op order/seat. Dit werkt vooruit: alleen aanmeldingen vanaf het live
gaan van de feature worden bewaard — al geprunde aanmeldingen zijn weg. De migratie
2026-05-31-waitlist-signup-tenant.sql doet eenmalig een backfill van wie er op dat
moment nog in waiting staat.
Aandachtspunten in de data:
- Check-in / aanwezigheid —
seat_checked_dategebruikt nuldatums in plaats van leeg. Gebruik daarom het veld "Aantal keer ingecheckt" (≥ 1) voor wie echt is geweest, niet "Check-in datum · heeft een waarde". - Geldige bestellingen — statistieken tellen alleen bestellingen met status
ord(niet geannuleerd/verwijderd). - Heeft géén gekocht correleert op
User.user_email(stoelen van elk account met hetzelfde adres); heeft wél gekocht opseat_user_id = user_id. De eigenmatchvan het blok staat genest binnen de correlatie;none= "een ticket dat aan geen van de regels voldoet". - Opt-in staat per account. Heeft één account van een e-mailadres opt-in aan en een ander account uit, dan kan het adres in de doelgroep vallen via het account mét opt-in.
- Negaties laten lege waarden vallen: "GEEN: Woonplaats = Amsterdam" en is niet sluiten ook mensen zonder woonplaats uit.
Gerelateerd
- E-mail campagnes - gerichte mails versturen
- Selecties maken - de oudere filter-tool
- Tags & segmentatie - handmatige labels op bezoekers
- Technisch ontwerp:
planning/crm-segmentatie-engine.md(in vdm-docs)