Plan en bouw een webapp om e-mailcampagnes te maken, veilig te verzenden, events te volgen en bezorgbaarheid te verbeteren met authenticatie, suppressie en monitoring.

Voordat je een provider kiest, je database ontwerpt of een verzendwachtrij bouwt, definieer wat “succes” betekent voor je e-mailcampagnebeheer-app. Een heldere scope houdt het product nuttig voor marketeers en veilig voor bezorgbaarheid.
Minimaal moet de app een team in staat stellen campagnes te creëren, plannen, verzenden en analyseren terwijl er beschermingen worden afgedwongen die slecht verzendgedrag voorkomen (per ongeluk massaal versturen, opt-outs negeren of herhaaldelijk verzenden naar bouncende adressen).
Zie het resultaat als: betrouwbare bezorging + betrouwbare rapportage + consistente naleving.
Je scope moet deze stromen expliciet opnemen (of uitsluiten), omdat ze verschillende contentbehoeften, cadans en risico’s hebben:
Als je meerdere types ondersteunt, beslis vroeg of ze dezelfde afzenderidentiteit en suppressieregels delen — of aparte configuraties nodig hebben.
Definieer permissies in duidelijke termen zodat teams elkaar niet in de weg zitten:
Vermijd alleen vanity metrics. Volg een klein aantal metrics die zowel bezorgbaarheid als zakelijke impact weerspiegelen:
Schrijf je grenzen nu op:
Een praktisch resultaat voor deze sectie is een éénpagina “productcontract” dat zegt voor wie de app is, welke soorten berichten het verzendt en welke metrics succes definiëren.
Voordat je blokken op een diagram tekent, beslis wat je daadwerkelijk bouwt: een campaign manager (UI + scheduling + reporting) of een e-mailleveringssysteem (MTA-niveau verantwoordelijkheid). De meeste teams slagen door de productervaring te bouwen en specialistische infrastructuur te integreren.
Verzenden: Gebruik een e-mail API/SMTP-provider (SES, Mailgun, SendGrid, Postmark, enz.) tenzij je een toegewijd deliverability-team hebt. Providers regelen IP-reputatie, feedback loops, warm-up tooling en webhook event streams.
Linktracking & analytics: Veel providers bieden click/open tracking, maar je wilt misschien je eigen redirect-domein en kliklogs voor consistente rapportage over providers heen. Als je tracking bouwt, houd het minimaal: een redirect-service plus event-ingest.
Templates: Bouw de bewerkingsworkflow, maar overweeg integratie van een volwassen HTML-e-maileditor (of op zijn minst MJML-rendering). E-mail-HTML is kritisch; het uitbesteden van de editor vermindert de onderhoudslast.
Voor een MVP werkt een modulaire monoliet goed:
Splits in services later alleen als schaal of organisatiegrenzen het vereisen (bijv. een dedicated tracking service of webhook-ingest service).
Gebruik een relationele database als het systeem van registratie voor tenants, gebruikers, audiences, campagnes, templates, schema’s, en suppressiestatus.
Voor verzending en tracking-events plan je een append-only event store/log (bijv. een aparte tabel gepartitioneerd per dag, of een log-systeem). Het doel is high-volume events te verwerken zonder de core CRUD te vertragen.
Als je meerdere merken/clients ondersteunt, definieer tenancy vroeg: tenant-gescopeerde data-access, per-tenant verzenddomeinen en per-tenant suppressieregels. Zelfs als je single-tenant begint, ontwerp je schema zodat het toevoegen van een tenant_id later geen herschrijving vereist.
Als je doel is snel een werkende campaign manager op te leveren (UI, database, background workers en webhook endpoints), kan een vibe-coding platform zoals Koder.ai helpen om sneller te prototypen en te itereren terwijl je toch de architectuur in eigen hand houdt. Je kunt het systeem beschrijven in een chat-gedreven “planning mode”, een React-gebaseerde webapp met een Go + PostgreSQL backend genereren en de broncode exporteren wanneer je klaar bent om de repo en deployment zelf te beheren.
Dit is vooral nuttig voor het bouwen van de “lijm” onderdelen — admin UI, segmentatie CRUD, queue-backed send jobs en webhook-ingest — terwijl je blijft vertrouwen op een specialistische e-mailprovider voor deliverability-kritische verzending.
Een helder datamodel onderscheidt “we hebben een e-mail verzonden” van “we kunnen precies uitleggen wat er gebeurde, naar wie en waarom.” Je wilt entiteiten die segmentatie, compliance en betrouwbare eventverwerking ondersteunen — zonder jezelf vast te zetten.
Modelleer minimaal deze als eersteklas tabellen/collecties:
Een veelgebruikt patroon is: Workspace → Audience → Contact, en Campaign → Send → Event, waarbij Send ook verwijst naar de gebruikte audience/segment snapshot.
Aanbevolen contactvelden:
email (genormaliseerd + lowercase), plus optioneel namestatus (bijv. active, unsubscribed, bounced, complained, blocked)source (import, API, formuliernaam, integratie)consent (meer dan boolean): bewaar consent_status, consent_timestamp en consent_sourceattributes (JSON/aangepaste velden voor segmentatie: plan, stad, tags)created_at, updated_at, en bij voorkeur last_seen_at / last_engaged_atVermijd het verwijderen van contacten voor “netheid”. Verander liever de status en bewaar het record voor compliance en rapportage.
Voor campagnes, houd bij:
subject, from_name, from_email, reply_totemplate_version (immutable snapshot reference)tracking_options (open/click tracking aan/uit, UTM-standaarden)Gebruik vervolgens een send record voor operationele details:
scheduled_at, started_at, completed_atSla events op als een append-only stream met een consistente vorm:
event_type: delivered, opened, clicked, bounced, complained, unsubscribedsend_id, contact_id (en optioneel message_id)Voor kernobjecten (contacts, campagnes, segments) voeg created_by, updated_by toe en overweeg een kleine change log tabel die vastlegt wie wat heeft gewijzigd, wanneer en voor/na waarden. Dit maakt support, compliance-verzoeken en deliverability-onderzoeken veel eenvoudiger.
Audiencebeheer is waar een e-mailcampagne-app vertrouwen verdient — of problemen creëert. Behandel contacten als langlevende records met duidelijke regels voor hoe ze worden toegevoegd, bijgewerkt en mogen worden gemaild.
CSV-import moet voor gebruikers eenvoudig aanvoelen, maar streng achter de schermen zijn.
Valideer verplichte velden (minimaal e-mail), normaliseer casing/whitespace en verwerp duidelijk ongeldige adressen vroeg. Voeg deduplicatieregels toe (meestal op genormaliseerd e-mail) en beslis wat er bij conflict gebeurt: alleen lege velden overschrijven, altijd overschrijven of “vragen tijdens import”.
Veldmapping is belangrijk omdat spreadsheets rommelig zijn (“First Name”, “fname”, “Given name”). Laat gebruikers kolommen mappen naar bekende velden en maak aangepaste velden aan indien nodig.
Segmentatie werkt het beste als opgeslagen regels die automatisch updaten. Ondersteun filters op basis van:
Houd segments uitlegbaar: toon een preview-aantal en een “waarom opgenomen” drill-down voor een sample contact.
Bewaar toestemming als eersteklas data: status (opted-in, opted-out), timestamp, bron (formulier, import, API) en, waar relevant, voor welke lijst of doel het geldt.
Je voorkeurencentrum moet mensen in staat stellen zich uit te schrijven van specifieke categorieën terwijl ze op andere blijven geabonneerd, en elke wijziging moet auditabel zijn. Verwijs naar je voorkeurworkflow vanuit de tekst "blog/compliance-unsubscribe" als je dit elders behandelt.
Namen en adressen zijn niet uniform. Ondersteun Unicode, flexibele naamvelden, landbewuste adresformaten en een contactniveau tijdzone voor het plannen van “9:00 lokale tijd” verzendingen.
Filter vóór enqueueing naar alleen in aanmerking komende contacten: niet uitgeschreven, niet op suppressielijsten en met geldige toestemming voor dat berichttype. Maak de regel zichtbaar in de UI zodat gebruikers begrijpen waarom sommige contacten de campagne niet ontvangen.
Een verzendpipeline kan perfect zijn en toch onderpresteren als de content moeilijk te lezen, inconsistent of ontbrekend is. Behandel compositie als een producteigenschap: maak “goede e-mail” de standaard.
Begin met een templatesysteem opgebouwd uit herbruikbare blokken — header, hero, tekst, knop, productgrid, footer — zodat campagnes consistent blijven over teams heen.
Voeg versioning toe aan templates en blokken. Editors moeten kunnen:
Voeg test sends toe op beide niveaus: stuur een template eerst naar jezelf voordat je het aan een campagne koppelt, en stuur een campagnedraft naar een kleine interne lijst voordat je plant.
De meeste apps ondersteunen uiteindelijk meerdere bewerkingsmodi:
Ongeacht je keuze, sla de “source” (HTML/Markdown/JSON blocks) en de gerenderde HTML apart op zodat je opnieuw kunt renderen na bugfixes.
Bied previews voor gangbare breakpoints (desktop/mobile) en grote client-quirks. Eenvoudige tools helpen: viewport toggles, dark-mode simulatie en een “toon tabelranden” optie.
Genereer en laat altijd een plain-text versie bewerken. Dat helpt toegankelijkheid, vermindert frictie met sommige spamfilters en verbetert leesbaarheid voor gebruikers die text-only prefereren.
Als je clicks trackt, herschrijf links op een manier die leesbaar blijft (bijv. behoud UTM-parameters en toon de bestemming bij hover). Houd interne links relatief in je app-UI (bijv. verwijzingen naar blog/template-guide als tekst, zonder echte links).
Voer voor het verzenden checks uit:
Maak de checker actiegericht: markeer het exacte blok, stel fixes voor en classificeer issues als “moet opgelost worden” vs. “waarschuwing”.
Een verzendpipeline is het “verkeerssysteem” van je e-mailapp: het beslist hoe mail wordt verzonden, wanneer deze wordt vrijgegeven en hoe snel het oploopt zonder bezorgbaarheid te schaden.
De meeste apps starten met een provider-API (SendGrid, Mailgun, SES, Postmark) omdat je daarmee schaal, feedback-webhooks en reputatietooling krijgt met minder moeite. SMTP-relays werken als compatibiliteit met bestaande systemen nodig is. Een zelf beheerde MTA biedt maximale controle, maar vereist veel operationeel werk (IP-warm-up, bounce-processing, misbruikafhandeling, monitoring).
Je datamodel moet de sender behandelen als een configureerbaar “delivery channel” zodat je methodes later kunt wisselen zonder campagnes te herschrijven.
Verstuur nooit direct vanuit een webrequest. Plaats ontvanger-level jobs (of kleine batches) in de wachtrij en laat workers ze afleveren.
Belangrijke mechanics:
{campaign_id}:{recipient_id}:{variant_id}.Scheduling moet tijdzones ondersteunen (sla de voorkeurzone van een gebruiker op; converteer naar UTC voor uitvoering). Voor deliverability throttle per ontvangerdomein (bijv. gmail.com, yahoo.com). Zo kun je “hete” domeinen vertragen zonder de hele campagne te blokkeren.
Een praktische aanpak is het onderhouden van domein-buckets met onafhankelijke token-bucket-limieten en deze dynamisch aan te passen bij deferrals.
Houd transactionele en marketing verzendstromen gescheiden (idealiter aparte subdomeinen en/of IP-pools). Zo vertraagt een grote campagne geen password resets of orderbevestigingen.
Bewaar een onveranderlijk event-pad per ontvanger: queued → sent → delivered/soft bounce/hard bounce/complaint/unsubscribe. Dit ondersteunt support (“waarom kreeg ik het niet?”), audits en correcte suppressiegedraging later.
E-mailbezorgbaarheid begint met aantonen aan mailboxproviders dat je gemachtigd bent om namens je domein te verzenden. De drie kernchecks zijn SPF, DKIM en DMARC — plus hoe je domeinen zijn ingesteld.
SPF is een DNS-record dat opsomt welke servers e-mail mogen verzenden namens je domein. Praktische conclusie: als je app (of ESP) namens yourbrand.com verstuurt, moet SPF de provider bevatten die je gebruikt.
Je UI moet een SPF-waarde (of een “include” snippet) genereren en duidelijk waarschuwen om niet meerdere SPF-records te maken (een veelvoorkomende fout).
DKIM voegt een cryptografische handtekening toe aan elke e-mail. De publieke sleutel staat in DNS; de provider gebruikt de sleutel om te bevestigen dat de e-mail niet is gewijzigd en bij je domein hoort.
Bied in de app “Maak DKIM” per verzenddomein en toon de exacte DNS host/waarde om te kopiëren.
DMARC vertelt inboxes wat te doen als SPF/DKIM falen — en waar je rapporten heen stuurt. Begin met een monitoringbeleid (vaak p=none) om rapporten te verzamelen, en verscherp naar quarantine of reject zodra alles stabiel is.
DMARC is ook waar alignment belangrijk is: het domein in het zichtbare “From”-adres moet uitlijnen met SPF en/of DKIM.
Moedig gebruikers aan de From-domein in lijn te houden met het geauthenticeerde domein. Als je provider een custom return-path (bounce-domein) toestaat, adviseer gebruikers hetzelfde organisatie-domein (bijv. mail.yourbrand.com) om vertrouwen te vergroten.
Voor click/open tracking, ondersteun een custom tracking-domein (CNAME zoals track.yourbrand.com). Vereis TLS (HTTPS) en controleer certificaatstaat automatisch om gebroken links en browserwaarschuwingen te voorkomen.
Bouw een “Verify DNS” knop die propagatie controleert en dempt:
Verwijs gebruikers naar een setup-checklist zoals blog/domain-authentication-checklist voor sneller oplossen.
Als je bounces, klachten en afmeldingen niet als kernfeatures behandelt, zal bezorgbaarheid langzaam verslechteren. Het doel is simpel: neem elk event van je provider op, normaliseer naar één intern formaat en pas suppressieregels automatisch en snel toe.
De meeste providers sturen webhooks voor events zoals delivered, bounced, complained en unsubscribed. Je webhook-endpoint moet zijn:
Een gangbare aanpak is het opslaan van een unieke provider event ID (of een hash van stabiele velden) en herhalingen negeren. Log ook de ruwe payload voor audit/debug.
Verschillende providers noemen hetzelfde anders. Normaliseer naar een intern eventmodel, bijvoorbeeld:
event_type: delivered | bounce | complaint | unsubscribeoccurred_atprovider, provider_message_id, provider_event_idcontact_id (of e-mail), campaign_id, send_idbounce_type: soft | hard (indien van toepassing)reason / smtp_code / categoryDit maakt rapportage en suppressie consistent, ook als je van provider wisselt.
Behandel hard bounces (ongeldig adres, niet-bestaand domein) als onmiddellijke suppressie. Voor soft bounces (vol mailbox, tijdelijke fout), suppress alleen na een drempel — zoals “3 soft bounces binnen 7 dagen” — en pas dan cool-down of permanente suppressie toe afhankelijk van beleid.
Houd suppressie op e-mailidentiteit-niveau (e-mail + domein), niet alleen per campagne, zodat een slecht adres niet steeds opnieuw getracht wordt.
Klachten (via feedback loops) zijn een sterk negatief signaal. Pas directe suppressie toe en stop alle toekomstige verzendingen naar dat adres.
Afmeldingen moeten ook onmiddellijk en globaal worden toegepast voor het bereik dat je belooft. Bewaar afmeldmetadata (bron, timestamp, campagne) zodat support kan beantwoorden “waarom ontvang ik geen e-mails meer?” zonder giswerk.
Je kunt suppressiegedrag koppelen aan je gebruikersinstellingen (bijv. settings/suppression) zodat teams begrijpen wat er achter de schermen gebeurt.
Tracking helpt campagnes te vergelijken en problemen te signaleren, maar cijfers zijn makkelijk te overschrijven. Bouw analytics die bruikbaar zijn voor beslissingen — en eerlijk over onzekerheid.
Open-tracking gebeurt meestal met een klein “pixel” beeld. Als een e-mailclient dat beeld laadt, registreer je een open-event.
Beperkingen om rekening mee te houden:
Praktische aanpak: behandel opens als een richtinggevend signaal (bijv. “deze onderwerpregel presteerde beter”), geen bewijs van aandacht.
Click-tracking is meer actionabel. Gebruikelijk patroon: vervang links door een tracking-URL (jouw redirect-service), en herleid daarna naar de eindbestemming.
Best practices:
Modelleer analytics op twee niveaus:
Wees duidelijk in de UI: “unique” is best-effort, en “open rate” is geen leesgraad.
Als je conversies (aankoop, aanmelding) volgt, verbind ze via UTM-parameters of een lichtgewicht server-side endpoint. Toch is attributie nooit perfect (meerdere apparaten, vertraagde acties, adblockers).
Bied CSV-exports en een API voor events en geaggregeerde stats zodat teams hun BI-tools kunnen gebruiken. Houd endpoints eenvoudig (per campagne, datumbereik, ontvanger) en documenteer tarieflimieten in docs/api.
Je kunt deliverability niet verbeteren als je niet ziet wat er gebeurt. Monitoring moet twee vragen snel beantwoorden: worden berichten geaccepteerd door mailboxproviders, en engageren ontvangers. Bouw rapportage zodat een niet-technische marketeer problemen binnen minuten, niet uren, kan signaleren.
Begin met een eenvoudig “deliverability health” paneel dat combineert:
Vermijd vanity-charts die problemen verbergen. Een campagne met veel opens maar stijgende klachten is een toekomstig blokkadeprobleem.
Echte inboxplaatsing is moeilijk direct te meten. Gebruik proxy-metrics die sterk correleren:
Als je provider feedback loops of postmaster-tools integreert, behandel ze als signalen, niet als absolute waarheid.
Alerts moeten actiegericht zijn en gekoppeld aan drempels en tijdvensters:
Stuur alerts naar e-mail + Slack en link direct naar een gefilterde weergave (bijv. reports?domain=gmail.com&window=24h als tekstvermelding).
Breek metrics uit per ontvangerdomein (gmail.com, outlook.com, yahoo.com). Throttling of blokkering begint vaak bij één provider. Toon verzendsnelheid, deferrals, bounces en klachten per domein om te pinpointen waar je moet vertragen of pauzeren.
Voeg een incidentlog toe met timestamps, scope (campaign/domein), symptomen, vermoedelijke oorzaak, ondernomen acties en resultaat. Na verloop van tijd wordt dit je playbook — en maakt het “we hebben het een keer opgelost” herhaalbaar.
Beveiliging en compliance zijn geen add-ons voor een e-mailcampagnebeheer-app — ze bepalen hoe je data opslaat, hoe je verzendt en wat je met ontvangerinformatie mag doen.
Begin met duidelijke rollen en permissies: bijvoorbeeld “Owner”, “Admin”, “Campaign Creator”, “Viewer” en een beperkte “API-only” rol voor integraties. Maak risicovolle acties expliciet en auditbaar (contacts exporteren, verzenddomeinen wijzigen, suppressielijsten bewerken).
Voeg 2FA toe voor interactieve gebruikers en behandel API-toegang als kernfunctie: scoped API-keys, rotatie, verval en per-key permissies. Voor enterprise-klanten, bied IP-allowlists voor zowel admin UI als API.
Versleutel gevoelige data at-rest (vooral contactidentifiers, toestemmingmetadata en eventuele custom fields). Houd geheimen uit de database waar mogelijk: gebruik een secrets manager voor SMTP-credentials, webhook signing secrets en encryptiesleutels.
Pas least-privilege toe overal: de “sending service” mag bijvoorbeeld niet hele contactexports lezen, en rapportagejobs mogen niet naar billing schrijven. Log toegang tot gevoelige endpoints en exports zodat klanten verdachte activiteit kunnen onderzoeken.
Afmeldverwerking moet onmiddellijk en betrouwbaar zijn. Bewaar suppressierecords (afmeldingen, bounces, klachten) in een duurzame suppressielijst, bewaar ze lang genoeg om per ongeluk opnieuw mailen te voorkomen en bewaar bewijs: timestamp, bron (link klik, webhook event, admin-actie) en campagne.
Registreer toestemming op een manier die je later kunt bewijzen: wat de gebruiker accepteerde, wanneer en hoe (formulier, import, API). Voor meer over authenticatie-grondslagen en vertrouwen, zie blog/email-authentication-basics (als tekstverwijzing).
Respecteer verzendlimieten en bied een “safe mode” voor nieuwe accounts: lagere daglimieten, afgedwongen warm-up schema’s en waarschuwingen voordat grote blasts worden toegestaan. Combineer dit met transparante planlimieten en upgradepaden vermeld bij pricing (als tekstverwijzing).
Je eerste release moet de volledige loop bewijzen: bouw een audience, stuur een echte campagne en verwerk correct wat er daarna gebeurt. Als je de eventstream (bounces, klachten, afmeldingen) niet vertrouwt, heb je geen productiesysteem.
Streef naar een compact feature-set dat echt gebruik ondersteunt:
Behandel segmentatie en webhookverwerking als mission-critical.
Productiestabiliteit is grotendeels operatie:
campaign_id, message_id)Begin met interne campagnes, daarna een kleine pilotgroep en bouw het volume geleidelijk op. Handhaaf conservatieve rate limits in het begin en breid alleen uit als bounce/klachtpercentages binnen targets blijven. Houd een “kill switch” om verzendingen globaal te pauzeren.
Als de kernloop betrouwbaar is, voeg A/B-tests, automation journeys, een voorkeurencentrum en meertalige templates toe. Een lichtgewicht onboarding-gids (tekstverwijzing naar blog/deliverability-basics) vermindert vroege verzendfouten.
Als je snel iterereert, kunnen features zoals snapshots en rollback ook risico’s verkleinen wanneer je segmentatie, suppressielogica of webhookverwerking wijzigt. (Koder.ai ondersteunt bijvoorbeeld snapshots zodat teams snel kunnen terugdraaien na een regressie — nuttig bij opschalen van MVP naar productie.)
Begin met het definiëren van “succes” als betrouwbare levering + betrouwbare rapportage + consistente naleving. Praktisch betekent dit dat je content kunt maken, verzendingen kunt plannen, bounces/klachten/afmeldingen automatisch kunt verwerken en precies kunt uitleggen wat er met een ontvanger is gebeurd.
Een goede éénpagina-scope omvat: welke berichttypes worden ondersteund, vereiste rollen/permssies, kernmetrics en randvoorwaarden (budget, compliance, volumegroei).
Behandel ze als aparte “stromen” omdat ze verschillen in urgentie, risico en volume:
Als je meerdere stromen ondersteunt, plan dan aparte configuraties (bij voorkeur aparte subdomeinen/IP-pools) zodat marketingpieken geen ontvangstmails of wachtwoordherstel blokkeren.
De meeste teams moeten een ESP integreren (SES, SendGrid, Mailgun, Postmark) en zich richten op de productervaring (UI, scheduling, segmentatie, rapportage). Providers regelen al reputatietooling, feedback loops en schaalbare levering.
Je bouwt alleen een eigen MTA als je toegewijd deliverability- en operatieteam hebt (warm-up, misbruikafhandeling, monitoring en constant tunen).
Gebruik een relationele database als systeem van registratie (tenants, gebruikers, contacten, audiences, campagnes, sends, suppressiestatus). Voor high-volume events (delivered/opened/clicked/bounced) gebruik je een append-only eventlog (tijdspartitionering of een log-pijplijn) zodat eventing de CRUD niet vertraagt.
Bewaar ruwe provider-payloads voor debugging en audits.
Modelleer zowel intentie als uitvoering:
Deze scheiding maakt ondersteuningsvragen (“wat is er met deze ontvanger gebeurd?”) beantwoordbaar en houdt rapportage consistent.
Filter vóór het plaatsen in de wachtrij naar in aanmerking komende contacten:
Maak regel zichtbaar in de UI (en laat bij voorkeur zien “waarom uitgesloten” voor een voorbeeld) om verwarring te verminderen en niet-conforme verzendingen te voorkomen.
Gebruik webhooks van je provider, maar ga uit van duplicaten en uit-van-volgorde events. Je webhook-handler moet:
Pas vervolgens suppressieregels automatisch toe (hard bounce, klacht, afmelding) en werk de contactstatus direct bij.
Plan een queue-first pipeline:
{campaign_id}:{contact_id}:{variant_id} om duplicaten te vermijdenHoud ook transactionele en marketing-queues gescheiden zodat kritieke e-mails niet geblokkeerd worden door grote campagnes.
Ondersteun SPF, DKIM en DMARC met een begeleide setup:
Als je click/open tracking doet, bied een custom tracking-domein (CNAME) aan en eist TLS om gebroken redirects en vertrouwenproblemen te voorkomen.
Behandel opens als richtinggevend en clicks als actiegerichter:
Label metrics eerlijk in de UI (bijv. “unique = beste inspanning”) en bied exports/API-toegang zodat teams resultaten in hun eigen BI-tools kunnen valideren.