Index: src/services/StatsService.js
===================================================================
--- src/services/StatsService.js	(revision 92bad27d251073f907aba9df34ad8232371cc8e0)
+++ src/services/StatsService.js	(revision bb82e7f535924ac5fd2cb71fd321257132f8b64d)
@@ -45,4 +45,13 @@
 }
 
+// Bekende bots/crawlers + link-preview-fetchers + scripts overslaan, zodat ze de
+// weergaven/bezoeker-dagen niet opblazen. Geen UA = vrijwel altijd geautomatiseerd.
+const BOT_RE = /bot|crawl|spider|slurp|mediapartners|bingpreview|facebookexternalhit|whatsapp|telegram|discord|twitter|linkedin|embedly|pinterest|redditbot|applebot|petalbot|yandex|baidu|duckduckbot|semrush|ahrefs|mj12|dotbot|uptimerobot|pingdom|statuscake|headless|lighthouse|gptbot|claude|ccbot|perplexity|bytespider|amazonbot|googleother|google-read-aloud|python-requests|scrapy|curl|wget|axios|node-fetch|go-http|java\/|okhttp|libwww|httpclient/i;
+function isBot(req) {
+  const ua = (req && req.headers && req.headers['user-agent']) || '';
+  if (!ua) return true;          // lege UA = script/bot
+  return BOT_RE.test(ua);
+}
+
 // Lazy prepares — tabellen bestaan pas ná initializeDatabase(); dit module wordt
 // geïmporteerd vóór die call.
@@ -81,5 +90,5 @@
 
 export function recordPageview(siteId, req) {
-  if (!siteId || isOperator(req)) return;
+  if (!siteId || isOperator(req) || isBot(req)) return;
   try {
     const d = today();
@@ -91,5 +100,5 @@
 
 export function recordPostView(post, req) {
-  if (!post || !post.id || isOperator(req)) return;
+  if (!post || !post.id || isOperator(req) || isBot(req)) return;
   try {
     stmts().bumpPost.run(post.id);
Index: src/views/pages/admin-stats.ejs
===================================================================
--- src/views/pages/admin-stats.ejs	(revision 92bad27d251073f907aba9df34ad8232371cc8e0)
+++ src/views/pages/admin-stats.ejs	(revision bb82e7f535924ac5fd2cb71fd321257132f8b64d)
@@ -3,11 +3,11 @@
   <h1>Statistieken</h1>
   <p class="stats-note">Cookievrij gemeten — geen tracking-cookies, geen toestemmingsbanner.
-    Unieke bezoekers via een dagelijks roterende, anonieme hash (IP/browser worden niet bewaard).
-    Je eigen beheerder-bezoeken tellen niet mee.</p>
+    Bezoekers worden per dag geteld via een dagelijks roterende, anonieme hash (IP/browser worden
+    niet bewaard). Je eigen beheerder-bezoeken en bekende bots/crawlers tellen niet mee.</p>
 
   <% var s = stats; var _max = Math.max(1, ...s.series.map(function(d){ return d.pageviews; })); %>
 
   <div class="stats-cards">
-    <div class="stat-card"><div class="stat-num"><%= s.totals.visitors %></div><div class="stat-label">Bezoekers (<%= s.days %>d)</div></div>
+    <div class="stat-card"><div class="stat-num"><%= s.totals.visitors %></div><div class="stat-label">Bezoeker-dagen (<%= s.days %>d)</div></div>
     <div class="stat-card"><div class="stat-num"><%= s.totals.pageviews %></div><div class="stat-label">Weergaven (<%= s.days %>d)</div></div>
     <div class="stat-card"><div class="stat-num"><%= s.totals.plays %></div><div class="stat-label">Plays (totaal)</div></div>
@@ -18,4 +18,15 @@
     <p class="stats-note">All-time: <strong><%= s.allTime.pageviews %></strong> weergaven · <strong><%= s.allTime.visitorDays %></strong> bezoeker-dagen.</p>
   <% } %>
+
+  <details class="stats-help">
+    <summary>Wat betekenen deze cijfers?</summary>
+    <ul>
+      <li><strong>Bezoeker-dagen</strong> — het aantal unieke bezoekers <em>per dag, bij elkaar opgeteld</em>. Eén persoon die 5 dagen langskomt = 5 bezoeker-dagen. Cookieloos kan er niet over dagen heen geteld worden, dus dit is géén aantal unieke personen — het echte aantal mensen ligt (vaak fors) lager.</li>
+      <li><strong>Weergaven</strong> — hoe vaak de home/feed of een post geladen is (ook bij klikken binnen de site). Andere pagina's (agenda, downloads, links) tellen hier niet in mee.</li>
+      <li><strong>Plays</strong> — totaal aantal keren dat een track is gestart.</li>
+      <li><strong>Post-weergaven</strong> — totaal over alle posts samen.</li>
+    </ul>
+    <p>Beheerder-bezoeken en bekende bots/crawlers worden overgeslagen. Het ruwe IP wordt nooit bewaard. Goed voor trends; neem absolute aantallen met een korrel zout.</p>
+  </details>
 
   <div class="stats-period">
@@ -30,5 +41,5 @@
       <h2>Laatste <%= s.days %> dagen</h2>
       <div class="stats-legend">
-        <span class="lg lg-vis">Bezoekers</span>
+        <span class="lg lg-vis">Bezoeker-dagen</span>
         <span class="lg lg-pv">Weergaven</span>
       </div>
@@ -40,5 +51,5 @@
            var visPct = Math.round(d.visitors / _max * 100);
       %>
-        <div class="sc-col" title="<%= d.day %> — <%= d.pageviews %> weergaven, <%= d.visitors %> bezoekers">
+        <div class="sc-col" title="<%= d.day %> — <%= d.pageviews %> weergaven, <%= d.visitors %> bezoeker-dagen">
           <div class="sc-bar">
             <span class="sc-pv" style="height: <%= pvPct %>%"></span>
