Index: src/routes/auth.js
===================================================================
--- src/routes/auth.js	(revision 706790632e4a72af669a386ed996eff6a9dc70f2)
+++ src/routes/auth.js	(revision b919a67397d06a47a68126c93ca221802faa8cca)
@@ -236,5 +236,5 @@
 router.get('/google', (req, res) => {
   if (!fanLoginReady()) {
-    return res.redirect('/auth/login?error=' + encodeURIComponent('Inloggen met Google is op deze site niet beschikbaar.'));
+    return res.redirect('/auth/login?gerr=unavailable');
   }
   const state = crypto.randomBytes(16).toString('hex');
@@ -256,9 +256,9 @@
 
 router.get('/google/callback', async (req, res) => {
-  const fail = (msg) => res.redirect('/auth/login?error=' + encodeURIComponent(msg));
-  if (!fanLoginReady()) return fail('Inloggen met Google is op deze site niet beschikbaar.');
+  const fail = (code) => res.redirect('/auth/login?gerr=' + code);
+  if (!fanLoginReady()) return fail('unavailable');
   try {
     const { code, state } = req.query;
-    if (!code || !state || state !== req.session.oauthState) return fail('Login afgebroken of ongeldige sessie.');
+    if (!code || !state || state !== req.session.oauthState) return fail('session');
     const next = safeNext(req.session.oauthNext) || '';
     delete req.session.oauthState;
@@ -268,5 +268,5 @@
     const info = await fetchUserinfo(tok.access_token);
     const email = (info.email || '').trim().toLowerCase();
-    if (!email || info.email_verified === false) return fail('Geen geverifieerd Google-e-mailadres.');
+    if (!email || info.email_verified === false) return fail('email');
 
     let user = db.prepare('SELECT * FROM users WHERE LOWER(email) = ?').get(email);
@@ -277,10 +277,10 @@
       if (user.role === 'god' || user.role === 'admin') {
         // Eigen, duidelijke uitleg-pagina (zie auth-login.ejs) i.p.v. een kale melding.
-        return res.redirect('/auth/login?gerr=admin');
+        return fail('admin');
       }
       // Bestaande luisteraar: koppel google_sub/avatar als die ontbreken; weiger
       // als al aan een ander Google-account gekoppeld.
       if (user.google_sub && info.sub && user.google_sub !== info.sub) {
-        return fail('Dit e-mailadres is al aan een ander Google-account gekoppeld.');
+        return fail('linked');
       }
       db.prepare(`
@@ -307,5 +307,5 @@
   } catch (e) {
     console.error('[auth/google/callback]', e.message);
-    fail('Google-login mislukt. Probeer opnieuw.');
+    fail('failed');
   }
 });
Index: src/views/pages/auth-login.ejs
===================================================================
--- src/views/pages/auth-login.ejs	(revision 706790632e4a72af669a386ed996eff6a9dc70f2)
+++ src/views/pages/auth-login.ejs	(revision b919a67397d06a47a68126c93ca221802faa8cca)
@@ -2,15 +2,23 @@
   <h1>Inloggen</h1>
   <% if (typeof success !== 'undefined' && success) { %><div class="alert alert-success"><%= success %></div><% } %>
-  <% if (typeof gerr !== 'undefined' && gerr === 'admin') { %>
+  <%
+    var GMAP = {
+      admin: { icon: '🔐', title: 'Dit is een beheerders-account',
+        body: 'Je logde in met Google, maar dit e-mailadres hoort bij de beheerder van deze site. Inloggen met Google is alleen voor luisteraars/fans — beheerders gebruiken altijd hun wachtwoord (zo kan een Google-login nooit per ongeluk beheerrechten geven).',
+        list: ['<strong>Ben je de beheerder?</strong> Log hieronder in met je <strong>gebruikersnaam + wachtwoord</strong>.', '<strong>Wil je als fan inloggen?</strong> Gebruik een <strong>ander Google-account</strong> (niet je beheerdersadres).'] },
+      session: { icon: '⏱️', title: 'Login afgebroken', body: 'De Google-login is afgebroken of de sessie was verlopen. Probeer het gewoon opnieuw.' },
+      email: { icon: '✉️', title: 'Geen geverifieerd e-mailadres', body: 'Je Google-account heeft geen geverifieerd e-mailadres. Verifieer je adres bij Google, of log in met je wachtwoord.' },
+      linked: { icon: '🔗', title: 'Adres al gekoppeld', body: 'Dit e-mailadres is al aan een ander Google-account gekoppeld. Gebruik dat account, of neem contact op met de beheerder.' },
+      unavailable: { icon: '🚫', title: 'Google-login niet beschikbaar', body: 'Inloggen met Google is op deze site (nog) niet ingesteld. Log in met je gebruikersnaam en wachtwoord.' },
+      failed: { icon: '⚠️', title: 'Google-login mislukt', body: 'Er ging iets mis bij het inloggen met Google. Probeer het opnieuw.' },
+    };
+    var _g = (typeof gerr !== 'undefined' && gerr && GMAP[gerr]) ? GMAP[gerr] : null;
+  %>
+  <% if (_g) { %>
     <div class="auth-notice">
-      <div class="auth-notice-icon">🔐</div>
-      <h2 class="auth-notice-title">Dit is een beheerders-account</h2>
-      <p>Je logde in met Google, maar dit e-mailadres hoort bij de <strong>beheerder</strong> van deze site.
-         Inloggen met Google is alleen voor luisteraars/fans — beheerders gebruiken altijd hun wachtwoord
-         (zo kan een Google-login nooit per ongeluk beheerrechten geven).</p>
-      <ul class="auth-notice-list">
-        <li><strong>Ben je de beheerder?</strong> Log hieronder in met je <strong>gebruikersnaam + wachtwoord</strong>.</li>
-        <li><strong>Wil je als fan inloggen?</strong> Gebruik een <strong>ander Google-account</strong> (niet je beheerdersadres).</li>
-      </ul>
+      <div class="auth-notice-icon"><%= _g.icon %></div>
+      <h2 class="auth-notice-title"><%= _g.title %></h2>
+      <p><%= _g.body %></p>
+      <% if (_g.list) { %><ul class="auth-notice-list"><% _g.list.forEach(function(li){ %><li><%- li %></li><% }); %></ul><% } %>
     </div>
   <% } else if (error) { %><div class="alert alert-error"><%= error %></div><% } %>
