Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
+++ src/config/database.js	(revision 1794facfb2038892f72a7971dc25ad2d2e1faef5)
@@ -146,4 +146,10 @@
     );
     CREATE INDEX IF NOT EXISTS idx_stat_visitor_day ON stat_visitor_day(site_id, day);
+    CREATE TABLE IF NOT EXISTS stat_referrer (
+      site_id TEXT NOT NULL,
+      host TEXT NOT NULL,
+      count INTEGER NOT NULL DEFAULT 0,
+      PRIMARY KEY (site_id, host)
+    );
   `);
 
Index: src/routes/admin-stats.js
===================================================================
--- src/routes/admin-stats.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
+++ src/routes/admin-stats.js	(revision 1794facfb2038892f72a7971dc25ad2d2e1faef5)
@@ -31,8 +31,9 @@
     } catch { linkClicks = []; }
   }
+  const days = [7, 14, 30, 90].includes(parseInt(req.query.days, 10)) ? parseInt(req.query.days, 10) : 14;
   renderPage(req, res, 'pages/admin-stats', {
     pageTitle: 'Statistieken',
     bodyClass: 'on-admin',
-    stats: getStats(14),
+    stats: getStats(days),
     linkClicks,
   });
Index: src/services/StatsService.js
===================================================================
--- src/services/StatsService.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
+++ src/services/StatsService.js	(revision 1794facfb2038892f72a7971dc25ad2d2e1faef5)
@@ -58,6 +58,24 @@
     bumpPost: db.prepare('UPDATE posts SET view_count = COALESCE(view_count, 0) + 1 WHERE id = ?'),
     bumpTrack: db.prepare('UPDATE audio_tracks SET play_count = COALESCE(play_count, 0) + 1 WHERE id = ?'),
+    bumpReferrer: db.prepare(`
+      INSERT INTO stat_referrer (site_id, host, count) VALUES (?, ?, 1)
+      ON CONFLICT(site_id, host) DO UPDATE SET count = count + 1
+    `),
   };
   return _s;
+}
+
+// Externe referrer-host uit de Referer-header (pro-stats #5). Lege/eigen-site/
+// ongeldige referrers worden overgeslagen → alleen echte externe bronnen tellen.
+function recordReferrer(siteId, req) {
+  try {
+    const ref = req && req.headers && (req.headers.referer || req.headers.referrer);
+    if (!ref) return;
+    const host = new URL(ref).host.replace(/^www\./, '').toLowerCase();
+    if (!host) return;
+    const own = ((req.headers && req.headers.host) || '').replace(/^www\./, '').toLowerCase();
+    if (host === own) return; // interne navigatie telt niet als bron
+    stmts().bumpReferrer.run(siteId, host.slice(0, 120));
+  } catch { /* geen geldige referrer-URL → overslaan */ }
 }
 
@@ -68,4 +86,5 @@
     stmts().bumpDaily.run(siteId, d);
     stmts().addVisitor.run(siteId, d, visitorHash(req));
+    recordReferrer(siteId, req);
   } catch { /* statistieken mogen nooit een request breken */ }
 }
@@ -86,4 +105,5 @@
 // Instance-brede statistieken (solo = de site, hub = alle sites samen).
 export function getStats(days = 14) {
+  days = [7, 14, 30, 90].includes(Number(days)) ? Number(days) : 14;
   const pvMap = Object.fromEntries(
     db.prepare('SELECT day, SUM(pageviews) AS pv FROM stat_daily GROUP BY day').all().map((r) => [r.day, r.pv]),
@@ -113,4 +133,16 @@
     ORDER BY play_count DESC LIMIT 5
   `).all();
-  return { totals, series, topPosts, topTracks, days };
+  // Top externe bronnen (pro #5) — instance-breed geaggregeerd per host.
+  let referrers = [];
+  try {
+    referrers = db.prepare(
+      'SELECT host, SUM(count) AS n FROM stat_referrer GROUP BY host ORDER BY n DESC LIMIT 10'
+    ).all();
+  } catch { referrers = []; }
+  // All-time totalen (cookieloze unieke bezoekers = som van dag-uniques).
+  const allTime = {
+    pageviews: db.prepare('SELECT COALESCE(SUM(pageviews),0) AS n FROM stat_daily').get().n,
+    visitorDays: db.prepare('SELECT COUNT(*) AS n FROM stat_visitor_day').get().n,
+  };
+  return { totals, series, topPosts, topTracks, referrers, allTime, days };
 }
Index: src/views/pages/admin-stats.ejs
===================================================================
--- src/views/pages/admin-stats.ejs	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
+++ src/views/pages/admin-stats.ejs	(revision 1794facfb2038892f72a7971dc25ad2d2e1faef5)
@@ -9,13 +9,24 @@
 
   <div class="stats-cards">
-    <div class="stat-card"><div class="stat-num"><%= s.totals.visitors %></div><div class="stat-label">Bezoekers (14d)</div></div>
-    <div class="stat-card"><div class="stat-num"><%= s.totals.pageviews %></div><div class="stat-label">Weergaven (14d)</div></div>
+    <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.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>
     <div class="stat-card"><div class="stat-num"><%= s.totals.postViews %></div><div class="stat-label">Post-weergaven (totaal)</div></div>
   </div>
 
+  <% if (typeof s.allTime !== 'undefined') { %>
+    <p class="stats-note">All-time: <strong><%= s.allTime.pageviews %></strong> weergaven · <strong><%= s.allTime.visitorDays %></strong> bezoeker-dagen.</p>
+  <% } %>
+
+  <div class="stats-period">
+    Periode:
+    <% [7,14,30,90].forEach(function(n){ %>
+      <a href="/admin/stats?days=<%= n %>" class="<%= s.days === n ? 'is-on' : '' %>"><%= n %>d</a>
+    <% }); %>
+  </div>
+
   <section class="stats-chart-wrap">
     <div class="stats-chart-head">
-      <h2>Laatste 14 dagen</h2>
+      <h2>Laatste <%= s.days %> dagen</h2>
       <div class="stats-legend">
         <span class="lg lg-vis">Bezoekers</span>
@@ -66,4 +77,15 @@
   </div>
 
+  <% if (typeof s.referrers !== 'undefined' && s.referrers.length) { %>
+    <section class="stats-top" style="margin-top:1.2rem">
+      <h2>🌐 Bronnen (waar bezoekers vandaan komen)</h2>
+      <ol>
+        <% s.referrers.forEach(function(r){ %>
+          <li><span><%= r.host %></span><span class="stats-count"><%= r.n %></span></li>
+        <% }); %>
+      </ol>
+    </section>
+  <% } %>
+
   <% if (typeof linkClicks !== 'undefined' && linkClicks.length) { %>
     <section class="stats-top" style="margin-top:1.2rem">
@@ -112,3 +134,6 @@
 .stats-count { color: var(--accent); font-weight: 700; font-variant-numeric: tabular-nums; }
 .stats-empty { color: var(--ink-muted); font-size: .88rem; margin: 0; }
+.stats-period { margin: .2rem 0 1.2rem; font-size: .9rem; color: var(--ink-muted); }
+.stats-period a { display: inline-block; margin-left: .4rem; padding: .2rem .6rem; border: 1px solid var(--rule); border-radius: 999px; text-decoration: none; color: var(--ink); }
+.stats-period a.is-on { background: var(--accent); color: #fff; border-color: var(--accent); }
 </style>
