Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 91094a44a78eaba7694534a039a5d0843f451e10)
+++ src/config/database.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
@@ -219,4 +219,16 @@
     );
   `);
+
+  // Link-in-bio klikstatistiek (premium #6). Per (site, url) een teller; de
+  // link-in-bio-pagina linkt via /links/go/:i dat de klik telt en doorstuurt.
+  db.exec(`
+    CREATE TABLE IF NOT EXISTS link_clicks (
+      site_id TEXT NOT NULL,
+      url TEXT NOT NULL,
+      clicks INTEGER DEFAULT 0,
+      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+      PRIMARY KEY (site_id, url)
+    );
+  `);
 }
 
Index: src/routes/admin-stats.js
===================================================================
--- src/routes/admin-stats.js	(revision 91094a44a78eaba7694534a039a5d0843f451e10)
+++ src/routes/admin-stats.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
@@ -10,4 +10,5 @@
 
 import express from 'express';
+import db from '../config/database.js';
 import { renderPage } from '../middleware/render.js';
 import { requireGod } from '../middleware/auth.js';
@@ -21,8 +22,18 @@
     return res.status(403).send('Statistieken is een premium-functie — koppel Patreon in Beheer → Instellingen.');
   }
+  // Link-in-bio klikken (premium #6) voor de huidige site.
+  let linkClicks = [];
+  if (res.locals.site) {
+    try {
+      linkClicks = db.prepare(
+        'SELECT url, clicks FROM link_clicks WHERE site_id = ? AND clicks > 0 ORDER BY clicks DESC LIMIT 50'
+      ).all(res.locals.site.id);
+    } catch { linkClicks = []; }
+  }
   renderPage(req, res, 'pages/admin-stats', {
     pageTitle: 'Statistieken',
     bodyClass: 'on-admin',
     stats: getStats(14),
+    linkClicks,
   });
 });
Index: src/routes/linkbio.js
===================================================================
--- src/routes/linkbio.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
+++ src/routes/linkbio.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
@@ -0,0 +1,61 @@
+/**
+ * Link-in-bio + klikstats (premium feature #6).
+ *
+ *   GET /links          -> Linktree-achtige pagina met de profile_links van de site
+ *   GET /links/go/:i     -> telt de klik (per url) en stuurt door naar de externe URL
+ *
+ * Hergebruikt de bestaande sites.profile_links (JSON [{platform,url}]) + de
+ * PLATFORMS-iconen/labels. Klikken landen in link_clicks (zie /admin/stats).
+ * Open-redirect-veilig: /links/go/:i stuurt ALLEEN door naar een url die in de
+ * eigen profile_links staat. Hub: via /user/:slug/links.
+ */
+
+import express from 'express';
+import db from '../config/database.js';
+import { renderPage } from '../middleware/render.js';
+import { premiumUnlocked } from '../services/PatreonService.js';
+import { PLATFORMS } from '../services/PlatformIcons.js';
+
+const router = express.Router();
+
+function parseLinks(site) {
+  if (!site || !site.profile_links) return [];
+  try { return JSON.parse(site.profile_links) || []; } catch { return []; }
+}
+
+router.get('/links', (req, res, next) => {
+  if (!premiumUnlocked()) return next();
+  const site = res.locals.site;
+  if (!site) return next();
+  const links = parseLinks(site).map((l, i) => {
+    const meta = PLATFORMS[l.platform] || {};
+    return { i, url: l.url, platform: l.platform, label: meta.label || l.platform, svg: meta.svg || '', brand: meta.brand || '' };
+  });
+  renderPage(req, res, 'pages/linkbio', {
+    pageTitle: (site.title || '') + ' — links',
+    bodyClass: 'on-linkbio',
+    lbLinks: links,
+  });
+});
+
+router.get('/links/go/:i', (req, res, next) => {
+  if (!premiumUnlocked()) return next();
+  const site = res.locals.site;
+  if (!site) return next();
+  const links = parseLinks(site);
+  const idx = parseInt(req.params.i, 10);
+  const link = (Number.isInteger(idx) && idx >= 0) ? links[idx] : null;
+  if (!link || !link.url) return next();
+  const url = String(link.url);
+  // Alleen externe http(s)- of mailto-links (geen open redirect / javascript:).
+  if (!/^https?:\/\//i.test(url) && !/^mailto:/i.test(url)) return res.status(400).send('Bad link');
+  try {
+    db.prepare(
+      `INSERT INTO link_clicks (site_id, url, clicks, updated_at) VALUES (?, ?, 1, CURRENT_TIMESTAMP)
+       ON CONFLICT(site_id, url) DO UPDATE SET clicks = clicks + 1, updated_at = CURRENT_TIMESTAMP`
+    ).run(site.id, url);
+  } catch { /* telling mag de redirect nooit breken */ }
+  res.redirect(302, url);
+});
+
+export default router;
Index: src/server.js
===================================================================
--- src/server.js	(revision 91094a44a78eaba7694534a039a5d0843f451e10)
+++ src/server.js	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
@@ -56,4 +56,5 @@
 import adminNewsletterRoutes from './routes/admin-newsletter.js';
 import downloadRoutes from './routes/download.js';
+import linkbioRoutes from './routes/linkbio.js';
 
 if (!process.env.SESSION_SECRET) {
@@ -273,4 +274,5 @@
 app.use('/', newsletterRoutes); // /nieuwsbrief in/uitschrijven (premium; niet-premium: next())
 app.use('/', downloadRoutes); // /downloads + /download/:id download-voor-email (premium)
+app.use('/', linkbioRoutes); // /links link-in-bio + klikstats (premium)
 app.use('/', postsRoutes);
 
Index: src/views/pages/admin-stats.ejs
===================================================================
--- src/views/pages/admin-stats.ejs	(revision 91094a44a78eaba7694534a039a5d0843f451e10)
+++ src/views/pages/admin-stats.ejs	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
@@ -65,4 +65,15 @@
     </section>
   </div>
+
+  <% if (typeof linkClicks !== 'undefined' && linkClicks.length) { %>
+    <section class="stats-top" style="margin-top:1.2rem">
+      <h2>🔗 Link-in-bio klikken</h2>
+      <ol>
+        <% linkClicks.forEach(function(l){ %>
+          <li><a href="<%= l.url %>" target="_blank" rel="noopener"><%= l.url.replace(/^https?:\/\//,'').slice(0,48) %></a><span class="stats-count"><%= l.clicks %></span></li>
+        <% }); %>
+      </ol>
+    </section>
+  <% } %>
 </div>
 
Index: src/views/pages/admin.ejs
===================================================================
--- src/views/pages/admin.ejs	(revision 91094a44a78eaba7694534a039a5d0843f451e10)
+++ src/views/pages/admin.ejs	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
@@ -36,4 +36,5 @@
       <% if (tenancy !== 'hub' && primarySite) { %><a href="/pers" class="btn" target="_blank">📰 Perskit</a><% } %>
       <% if (tenancy !== 'hub' && primarySite) { %><a href="/downloads" class="btn" target="_blank">⬇ Downloads</a><% } %>
+      <% if (tenancy !== 'hub' && primarySite) { %><a href="/links" class="btn" target="_blank">🔗 Link-in-bio</a><% } %>
     <% } %>
     <a href="/admin/updates" class="btn">🔄 Updates</a>
Index: src/views/pages/linkbio.ejs
===================================================================
--- src/views/pages/linkbio.ejs	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
+++ src/views/pages/linkbio.ejs	(revision 37edecd7c1a492799587f07cc44fb88fbd1567ee)
@@ -0,0 +1,44 @@
+<%
+  var links = (typeof lbLinks !== 'undefined') ? lbLinks : [];
+  var _photo = (site && site.profile_photo) ? site.profile_photo : (typeof siteOwnerAvatar !== 'undefined' ? siteOwnerAvatar : '');
+  var _name = (site && (site.profile_name || site.title)) || '';
+  var _bio = (site && (site.profile_bio || site.tagline)) || '';
+%>
+<section class="lb">
+  <div class="lb-head">
+    <% if (_photo) { %><span class="lb-photo" style="background-image:url('<%= _photo %>')"></span><% } else { %><span class="lb-photo lb-photo-empty">♪</span><% } %>
+    <h1 class="lb-name"><%= _name %></h1>
+    <% if (_bio) { %><p class="lb-bio"><%= _bio %></p><% } %>
+  </div>
+
+  <% if (!links.length) { %>
+    <p class="lb-empty">Nog geen links ingesteld.</p>
+  <% } else { %>
+    <div class="lb-links">
+      <% links.forEach(function(l){ %>
+        <a class="lb-link" href="<%= siteUrlBase %>/links/go/<%= l.i %>" target="_blank" rel="noopener" <%= l.brand ? ('style="--lb-brand:' + l.brand + '"') : '' %>>
+          <% if (l.svg) { %><span class="lb-ico"><%- l.svg %></span><% } %>
+          <span class="lb-label"><%= l.label %></span>
+        </a>
+      <% }); %>
+    </div>
+  <% } %>
+
+  <p class="lb-foot"><a href="<%= siteUrlBase %>/">← naar de site</a></p>
+</section>
+
+<style>
+  .lb { max-width: 480px; margin: 0 auto; padding: 40px 18px 64px; text-align: center; }
+  .lb-photo { display: inline-block; width: 96px; height: 96px; border-radius: 50%; background-size: cover; background-position: center; margin-bottom: 14px; }
+  .lb-photo-empty { background: var(--accent,#6b8f71); color: #fff; display: grid; place-items: center; font-size: 36px; }
+  .lb-name { font-size: 24px; margin: 0 0 6px; }
+  .lb-bio { opacity: .8; margin: 0 0 26px; }
+  .lb-links { display: flex; flex-direction: column; gap: 12px; }
+  .lb-link { display: flex; align-items: center; gap: 12px; justify-content: center; padding: 14px 18px; border-radius: 14px; border: 1px solid rgba(128,128,128,.28); text-decoration: none; color: inherit; font-weight: 600; transition: transform .08s ease, border-color .15s ease; }
+  .lb-link:hover { transform: translateY(-1px); border-color: var(--lb-brand, var(--accent,#6b8f71)); }
+  .lb-ico { width: 22px; height: 22px; display: inline-flex; color: var(--lb-brand, currentColor); }
+  .lb-ico svg { width: 22px; height: 22px; }
+  .lb-empty { opacity: .7; }
+  .lb-foot { margin-top: 30px; font-size: 13px; opacity: .6; }
+  .lb-foot a { color: inherit; }
+</style>
