Je winkelwagen is leeg
Producten die je toevoegt, verschijnen hier.
In deze handleiding leer je alles over de cookie verklaring. We behandelen wat het precies is, welke soorten cookies er zijn en hoe je zelf eentje maakt.
Samenvatting: Cookie melding verplicht
Een cookie melding (cookie banner) is verplicht onder de AVG en Nederlandse Telecommunicatiewet. Je moet bezoekers informeren over cookies en toestemming vragen vóórdat je niet-noodzakelijke cookies plaatst. Boetes kunnen oplopen tot 20 miljoen euro. Gebruik WordPress
KeurigOnline zegtWordPress
KeurigOnline zegtHTML
KeurigOnline zegtCSS
Je hebt net je website gelanceerd. Alles werkt perfect. Maar dan krijg je een bericht: "Waar is je cookie melding?" De AVG
In deze handleiding leer je alles over de cookie verklaring. We behandelen wat het precies is, welke soorten cookies er zijn, en hoe je zelf een cookie banner maakt. Je krijgt kant-en-klare code voor een custom banner. En we vergelijken de beste WordPress plugins. Binnen 15 minuten heb je je cookie melding werkend.
Dit leer je in dit artikel
Definitie: Een cookieverklaring is een pagina op je website die uitlegt welke cookies je plaatst, waarom je ze gebruikt, hoe lang ze bewaard blijven, en met wie je gegevens deelt. Het is verplicht onder de AVG en Telecommunicatiewet.
Een cookieverklaring is niet hetzelfde als een cookie banner. De banner is de popup die bezoekers zien. De verklaring is de volledige uitleg erachter.[2]
Een privacyverklaring beschrijft alle persoonsgegevens die je verwerkt. Denk aan namen, e-mailadressen en betalingsgegevens. Een cookieverklaring gaat specifiek over cookies. Veel websites combineren beide. Maar technisch gezien zijn het aparte documenten.[3]
De verplichting komt uit drie wetten:
Zodra je cookies plaatst die niet strikt noodzakelijk zijn, moet je toestemming vragen. En uitleggen waarvoor je ze gebruikt.
Volgens de Autoriteit Persoonsgegevens
Niet alle cookies zijn gelijk. De wet maakt onderscheid tussen drie categorieën. Dit bepaalt of je toestemming moet vragen.
Functionele cookies zijn strikt noodzakelijk voor je website. Zonder deze cookies werkt je site niet goed. Denk aan:
PHPSESSID — Houdt je sessie bijcart_token — Onthoudt je winkelwagenlanguage — Slaat je taalvoorkeur opcsrf_token — Beveiligt formulierenToestemming nodig? Nee. Deze cookies mag je altijd plaatsen.[5]
Analytische cookies meten hoe bezoekers je website gebruiken. Ze helpen je site te verbeteren. Voorbeelden:
_ga — Google Analytics hoofd-cookie_gid — Google Analytics sessie-identifier_pk_id — Matomo/Piwik analyticsToestemming nodig? Soms. Met de juiste instellingen (IP-anonimisering, geen data delen met Google) kan het zonder. Maar standaard Google Analytics 4 vereist toestemming.[6]
Marketing cookies volgen bezoekers over verschillende websites. Ze worden gebruikt voor gepersonaliseerde advertenties. Dit zijn de "zware" cookies:
_fbp — Facebook Pixelfr — Facebook advertentiesIDE — Google DoubleClickNID — Google personalisatieToestemming nodig? Altijd. Zonder expliciete toestemming mag je deze cookies niet plaatsen.
| Type | Toestemming? | Voorbeelden |
|---|---|---|
| Functioneel | Nee | PHPSESSID, cart_token |
| Analytisch | Soms | _ga, _gid |
| Marketing | Altijd | _fbp, fr, IDE |
De makkelijkste manier om een cookie banner toe te voegen? Een WordPress plugin. Er zijn tientallen opties. Maar deze vier zijn het populairst en het meest compleet.
| Plugin | Gratis | Nederlands | GA4 | Consent Mode v2 |
|---|---|---|---|---|
| Complianz |
✓ | ✓ | ✓ | ✓ |
| CookieYes |
✓ | ✓ | ✓ | ✓ |
| Cookie Notice |
✓ | Deels | ✓ | — |
| GDPR Cookie Consent |
✓ | ✓ | ✓ | ✓ |
Complianz
De wizard scant automatisch je website op cookies. Na 5-10 minuten heb je een werkende cookie banner én een complete cookieverklaring pagina.
Sinds maart 2024 vereist Google Consent Mode v2
Wil je volledige controle? Maak je eigen cookie banner. Hieronder vind je drie werkende voorbeelden — van simpel tot uitgebreid.
Modern design met gelijke knoppen (AVG-compliant sinds 2025). Bottom-left positie heeft de hoogste interactie.
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&display=swap" rel="stylesheet">
<div id="cookie-banner" class="cookie-banner">
<div class="cookie-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<circle cx="8" cy="9" r="1.5" fill="currentColor"/>
<circle cx="15" cy="8" r="1" fill="currentColor"/>
<circle cx="10" cy="14" r="1" fill="currentColor"/>
<circle cx="16" cy="13" r="1.5" fill="currentColor"/>
</svg>
</div>
<div class="cookie-content">
<p>Wij gebruiken cookies voor een betere ervaring. <a href="/cookieverklaring">Meer info</a></p>
<div class="cookie-buttons">
<button onclick="decline()" class="btn">Weigeren</button>
<button onclick="accept()" class="btn btn-primary">Accepteren</button>
</div>
</div>
</div>
@import url('https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&display=swap');
* { box-sizing: border-box; }
body { margin: 0; font-family: 'Geist', system-ui, sans-serif; min-height: 320px; background: #fafafa; }
.cookie-banner {
position: fixed;
bottom: 1.25rem;
left: 1.25rem;
max-width: 380px;
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 16px;
padding: 1.25rem;
box-shadow: 0 4px 24px rgba(0,0,0,0.08), 0 0 0 1px rgba(0,0,0,0.02);
z-index: 9999;
animation: slideUp 0.4s cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
.cookie-icon {
width: 40px;
height: 40px;
background: #f3f4f6;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0.875rem;
color: #6b7280;
}
.cookie-content p {
margin: 0 0 1rem 0;
font-size: 0.9375rem;
line-height: 1.5;
color: #374151;
}
.cookie-content a {
color: #2563eb;
text-decoration: none;
}
.cookie-content a:hover {
text-decoration: underline;
}
.cookie-buttons {
display: flex;
gap: 0.625rem;
}
.btn {
flex: 1;
padding: 0.6875rem 1rem;
border-radius: 10px;
font-size: 0.875rem;
font-weight: 500;
font-family: inherit;
cursor: pointer;
transition: all 0.15s ease;
border: 1px solid #e5e7eb;
background: #fff;
color: #374151;
}
.btn:hover {
background: #f9fafb;
border-color: #d1d5db;
}
.btn-primary {
background: #18181b;
color: #fff;
border-color: #18181b;
}
.btn-primary:hover {
background: #27272a;
border-color: #27272a;
}
function accept() {
localStorage.setItem('cookieConsent', 'accepted');
hide();
}
function decline() {
localStorage.setItem('cookieConsent', 'declined');
hide();
}
function hide() {
const banner = document.getElementById('cookie-banner');
banner.style.animation = 'slideDown 0.3s ease forwards';
setTimeout(() => banner.remove(), 300);
}
// Add exit animation
const style = document.createElement('style');
style.textContent = '@keyframes slideDown { to { opacity: 0; transform: translateY(16px); } }';
document.head.appendChild(style);
// Check existing consent
if (localStorage.getItem('cookieConsent')) {
document.getElementById('cookie-banner').style.display = 'none';
}
Granulaire toestemming per categorie. Moderne toggle switches en gelijke "Alles weigeren" / "Alles accepteren" knoppen (AVG 2025 vereist).
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&display=swap" rel="stylesheet">
<div id="cookie-overlay" class="cookie-overlay">
<div class="cookie-modal">
<div class="modal-header">
<h2>Privacy voorkeuren</h2>
<p>Kies welke cookies je accepteert. Je kunt dit later aanpassen.</p>
</div>
<div class="cookie-categories">
<div class="cookie-category">
<div class="category-info">
<strong>Noodzakelijk</strong>
<p>Basisfuncties zoals navigatie en beveiliging.</p>
</div>
<span class="badge">Vereist</span>
</div>
<div class="cookie-category">
<div class="category-info">
<strong>Analytisch</strong>
<p>Helpt ons de website te verbeteren.</p>
</div>
<label class="toggle">
<input type="checkbox" id="analytics">
<span class="slider"></span>
</label>
</div>
<div class="cookie-category">
<div class="category-info">
<strong>Marketing</strong>
<p>Gepersonaliseerde advertenties.</p>
</div>
<label class="toggle">
<input type="checkbox" id="marketing">
<span class="slider"></span>
</label>
</div>
</div>
<div class="modal-buttons">
<button onclick="rejectAll()" class="btn">Alles weigeren</button>
<button onclick="saveChoices()" class="btn">Opslaan</button>
<button onclick="acceptAll()" class="btn btn-primary">Alles accepteren</button>
</div>
</div>
</div>
@import url('https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&display=swap');
* { box-sizing: border-box; }
body { margin: 0; font-family: 'Geist', system-ui, sans-serif; background: #f8fafc; }
.cookie-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.4);
backdrop-filter: blur(4px);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
padding: 1rem;
animation: fadeIn 0.3s ease;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.cookie-modal {
background: #fff;
border-radius: 20px;
padding: 1.75rem;
max-width: 420px;
width: 100%;
box-shadow: 0 24px 48px rgba(0,0,0,0.12);
animation: scaleIn 0.3s cubic-bezier(0.16, 1, 0.3, 1);
}
@keyframes scaleIn {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
.modal-header h2 {
margin: 0 0 0.375rem 0;
font-size: 1.25rem;
font-weight: 600;
color: #18181b;
}
.modal-header p {
margin: 0 0 1.25rem 0;
font-size: 0.875rem;
color: #71717a;
}
.cookie-categories {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.cookie-category {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem;
background: #fafafa;
border-radius: 12px;
border: 1px solid #f4f4f5;
}
.category-info strong {
display: block;
font-size: 0.9375rem;
font-weight: 500;
color: #18181b;
}
.category-info p {
margin: 0.125rem 0 0 0;
font-size: 0.8125rem;
color: #71717a;
}
.badge {
font-size: 0.6875rem;
font-weight: 500;
color: #71717a;
background: #f4f4f5;
padding: 0.25rem 0.625rem;
border-radius: 6px;
}
.toggle {
position: relative;
width: 44px;
height: 24px;
flex-shrink: 0;
}
.toggle input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
inset: 0;
background: #e4e4e7;
border-radius: 24px;
cursor: pointer;
transition: 0.2s;
}
.slider:before {
content: '';
position: absolute;
width: 18px;
height: 18px;
left: 3px;
bottom: 3px;
background: #fff;
border-radius: 50%;
transition: 0.2s;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.toggle input:checked + .slider {
background: #18181b;
}
.toggle input:checked + .slider:before {
transform: translateX(20px);
}
.modal-buttons {
display: flex;
gap: 0.5rem;
margin-top: 1.5rem;
}
.btn {
flex: 1;
padding: 0.75rem 0.875rem;
border-radius: 10px;
font-size: 0.875rem;
font-weight: 500;
font-family: inherit;
cursor: pointer;
transition: all 0.15s ease;
border: 1px solid #e4e4e7;
background: #fff;
color: #3f3f46;
}
.btn:hover {
background: #fafafa;
border-color: #d4d4d8;
}
.btn-primary {
background: #18181b;
color: #fff;
border-color: #18181b;
}
.btn-primary:hover {
background: #27272a;
}
function saveChoices() {
save(
document.getElementById('analytics').checked,
document.getElementById('marketing').checked
);
}
function acceptAll() {
document.getElementById('analytics').checked = true;
document.getElementById('marketing').checked = true;
save(true, true);
}
function rejectAll() {
document.getElementById('analytics').checked = false;
document.getElementById('marketing').checked = false;
save(false, false);
}
function save(analytics, marketing) {
const consent = { necessary: true, analytics, marketing, ts: Date.now() };
localStorage.setItem('cookieConsent', JSON.stringify(consent));
const overlay = document.getElementById('cookie-overlay');
overlay.style.animation = 'fadeOut 0.2s ease forwards';
setTimeout(() => overlay.remove(), 200);
console.log('Consent:', consent);
}
// Add fadeOut animation
const style = document.createElement('style');
style.textContent = '@keyframes fadeOut { to { opacity: 0; } }';
document.head.appendChild(style);
// Check existing
if (localStorage.getItem('cookieConsent')) {
document.getElementById('cookie-overlay').style.display = 'none';
}
Een subtielere optie: een banner die elegant van onderaf inschuift. Minder opdringerig, maar nog steeds AVG-compliant.
<link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&display=swap" rel="stylesheet">
<div id="cookie-banner" class="cookie-banner">
<div class="cookie-icon">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<circle cx="12" cy="12" r="10"/>
<circle cx="8" cy="9" r="1.5" fill="currentColor"/>
<circle cx="15" cy="8" r="1" fill="currentColor"/>
<circle cx="10" cy="14" r="1" fill="currentColor"/>
<circle cx="16" cy="13" r="1.5" fill="currentColor"/>
</svg>
</div>
<div class="cookie-text">
<p>We gebruiken cookies voor een betere ervaring. <a href="/cookieverklaring">Meer info</a></p>
</div>
<div class="cookie-actions">
<button onclick="decline()" class="btn">Weigeren</button>
<button onclick="accept()" class="btn btn-primary">Accepteren</button>
</div>
</div>
@import url('https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&display=swap');
* { box-sizing: border-box; }
body {
margin: 0;
font-family: 'Geist', system-ui, sans-serif;
background: #f8fafc;
min-height: 100vh;
}
.cookie-banner {
position: fixed;
bottom: 1rem;
left: 1rem;
right: 1rem;
transform: translateY(150%);
background: white;
border-radius: 16px;
padding: 1rem 1.25rem;
display: flex;
align-items: center;
gap: 1rem;
box-shadow:
0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -2px rgba(0, 0, 0, 0.1),
0 0 0 1px rgba(0, 0, 0, 0.05);
z-index: 9999;
animation: slideIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) 0.3s forwards;
}
@keyframes slideIn {
from { transform: translateY(150%); }
to { transform: translateY(0); }
}
.cookie-icon {
color: #71717a;
display: flex;
flex-shrink: 0;
}
.cookie-text {
flex: 1;
}
.cookie-text p {
margin: 0;
font-size: 0.875rem;
color: #3f3f46;
line-height: 1.5;
}
.cookie-text a {
color: #18181b;
text-decoration: underline;
text-underline-offset: 2px;
}
.cookie-text a:hover {
color: #52525b;
}
.cookie-actions {
display: flex;
align-items: center;
gap: 0.5rem;
flex-shrink: 0;
}
.btn {
font-family: 'Geist', system-ui, sans-serif;
font-size: 0.875rem;
font-weight: 500;
padding: 0.5rem 1rem;
border-radius: 8px;
cursor: pointer;
transition: all 0.15s ease;
border: 1px solid #e4e4e7;
background: #fff;
color: #3f3f46;
}
.btn:hover {
background: #fafafa;
border-color: #d4d4d8;
}
.btn-primary {
background: #18181b;
color: #fff;
border-color: #18181b;
}
.btn-primary:hover {
background: #27272a;
}
.hidden {
animation: slideOut 0.3s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes slideOut {
to {
transform: translateY(150%);
opacity: 0;
}
}
@media (max-width: 640px) {
.cookie-banner {
flex-wrap: wrap;
gap: 0.75rem;
padding: 1rem;
left: 0.75rem;
right: 0.75rem;
bottom: 0.75rem;
}
.cookie-actions {
width: 100%;
justify-content: stretch;
}
.btn {
flex: 1;
}
}
function accept() {
localStorage.setItem("cookieConsent", "accepted");
hide();
}
function decline() {
localStorage.setItem("cookieConsent", "declined");
hide();
}
function hide() {
const banner = document.getElementById("cookie-banner");
banner.classList.add("hidden");
setTimeout(() => banner.remove(), 300);
}
// Verberg als al gekozen
if (localStorage.getItem("cookieConsent")) {
document.getElementById("cookie-banner").style.display = "none";
}
Het belangrijkste deel: de localStorage API
// Consent opslaan
function acceptCookies() {
localStorage.setItem('cookieConsent', 'accepted');
document.getElementById('cookie-banner').style.display = 'none';
// Nu kun je analytics laden
loadGoogleAnalytics();
}
// Bij page load checken of al gekozen is
window.addEventListener('DOMContentLoaded', function() {
const consent = localStorage.getItem('cookieConsent');
if (consent === 'accepted') {
// Verberg banner, laad scripts
document.getElementById('cookie-banner').style.display = 'none';
loadGoogleAnalytics();
} else if (consent === 'declined') {
// Verberg banner, laad geen tracking
document.getElementById('cookie-banner').style.display = 'none';
}
// Anders: toon banner (eerste bezoek)
});
// Scripts voorwaardelijk laden
function loadGoogleAnalytics() {
const script = document.createElement('script');
script.src = 'https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX';
script.async = true;
document.head.appendChild(script);
}Wanneer heb je cookie consent nodig?
Niet iedereen gebruikt WordPress. Hier zijn de opties voor andere populaire platforms.
Shopify heeft geen ingebouwde cookie banner. Je hebt een app nodig:
Je kunt ook custom code toevoegen via Online Store → Themes → Edit code → theme.liquid.
Wix heeft een ingebouwde cookie banner:
De Wix banner is basis, maar voldoet aan de belangrijkste eisen.
Squarespace biedt ook een ingebouwde oplossing:
Wat schrijf je precies in je banner? Hier zijn drie kant-en-klare teksten. Copy-paste en je bent klaar.
"Wij gebruiken cookies om je ervaring te verbeteren. Accepteer je alle cookies of pas je je voorkeuren aan?"
"Deze website gebruikt cookies. Functionele cookies zijn noodzakelijk voor de werking van de site. Analytische cookies helpen ons de website te verbeteren. Marketing cookies worden gebruikt voor gepersonaliseerde advertenties. Lees onze cookieverklaring voor meer informatie."
"[Bedrijfsnaam] gebruikt cookies en vergelijkbare technologieën om je een optimale gebruikservaring te bieden. Door op 'Accepteren' te klikken ga je akkoord met het plaatsen van alle cookies zoals beschreven in onze cookieverklaring. Je kunt je voorkeuren altijd wijzigen via 'Cookie-instellingen'."
Een cookie banner is niet zomaar een popup. De Autoriteit Persoonsgegevens
AVG-vereisten voor je cookie banner
Let op: Dit mag niet volgens de AVG
De Autoriteit Persoonsgegevens heeft specifieke vuistregels voor cookiebanners
Ja, zodra je cookies plaatst die niet strikt noodzakelijk zijn. Dit is verplicht volgens de AVG en de Nederlandse Telecommunicatiewet. Alleen functionele cookies (sessie, winkelwagen, CSRF-bescherming) mag je zonder toestemming plaatsen.[9]
Er zijn drie hoofdcategorieën: functionele cookies (noodzakelijk voor je website, geen toestemming nodig), analytische cookies (statistieken
KeurigOnline zegtStatistieken
Dat hangt af van je configuratie. Met IP-anonimisering én zonder data delen met Google kan het soms zonder toestemming. Maar standaard Google Analytics 4 vereist toestemming omdat het gegevens deelt met Google. Sinds maart 2024 is Google Consent Mode v2 ook verplicht voor advertenties in de EU.[10]
Een cookieverklaring gaat specifiek over cookies: welke je plaatst, waarom, en hoe lang ze bewaard blijven. Een privacyverklaring beschrijft alle verwerkingen van persoonsgegevens: namen, e-mails, betalingen, etc. Veel websites hebben beide als aparte documenten.
Een cookiewall blokkeert toegang tot je website totdat iemand cookies accepteert. Dit is niet toegestaan volgens de AVG. Je moet een echte keuze bieden, zonder nadelige gevolgen bij weigeren. De Autoriteit Persoonsgegevens heeft dit expliciet verboden.[11]
Regelmatig. Onderzoek toont aan dat ongeveer 30% van cookies maandelijks verandert door updates van plugins en diensten. Scan je website minstens elk kwartaal op nieuwe cookies. Plugins zoals Complianz kunnen dit automatisch doen.[12]
De AVG kent boetes tot 20 miljoen euro of 4% van de wereldwijde jaaromzet, afhankelijk van welke hoger is. In de praktijk zijn boetes voor kleine websites lager, maar het risico is reëel en de Autoriteit Persoonsgegevens controleert actief.
Complianz is de meest aanbevolen Nederlandse plugin met 300.000+ installaties. Het biedt automatische cookie scanning, Nederlands taalondersteuning, Google Consent Mode v2 integratie, en volledige AVG-compliance. Alternatieven zijn CookieYes en GDPR Cookie Consent.
Een cookie verklaring is verplicht voor elke website met niet-noodzakelijke cookies. Je hebt drie opties: een WordPress plugin zoals Complianz
KeurigOnline zegtHTML
KeurigOnline zegtCSS
De belangrijkste punten:
localStorage om de keuze van bezoekers op te slaanBegin vandaag met je cookie melding. Met de code voorbeelden hierboven heb je binnen 15 minuten een werkende, AVG-compliant banner.
Bronnen en verificatie
Dit artikel is gebaseerd op 20 officiële bronnen, waaronder de Autoriteit Persoonsgegevens, Telecommunicatiewet, Google Developers documentatie, en MDN Web Docs. Alle code voorbeelden zijn getest in moderne browsers. Laatst bijgewerkt: december 2025.