Index: src/routes/paid.js
===================================================================
--- src/routes/paid.js	(revision 6cbd0142768e2cd623437742cd6c08cc33fda44f)
+++ src/routes/paid.js	(revision c3d12a6f5721ed2faee19362b8d7e0caeea854d5)
@@ -54,9 +54,12 @@
   const payload = verifyBlob(String(req.query.state || ''));
   if (!payload || payload.purpose !== 'patron' || payload.siteId !== r.site.id) {
-    return res.status(400).send('Ongeldige of verlopen aanvraag. Probeer opnieuw vanaf de post.');
+    return renderPage(req, res, 'pages/paid-result', {
+      pageTitle: 'Ontgrendelen', bodyClass: 'on-special', ok: false, reason: 'expired',
+    });
   }
+  const patronUrl = PaidPatreon.patreonUrl(r.site.id);
   const code = String(req.query.code || '');
   if (req.query.error || !code) {
-    return renderPage(req, res, 'pages/paid-result', { pageTitle: 'Ontgrendelen', bodyClass: 'on-special', ok: false, reason: 'declined', postSlug: payload.post });
+    return renderPage(req, res, 'pages/paid-result', { pageTitle: 'Ontgrendelen', bodyClass: 'on-special', ok: false, reason: 'declined', postSlug: payload.post, patronUrl });
   }
   const membership = await PaidPatreon.verifyPatron(r.site.id, code, baseUrl(req) + '/paid/callback').catch(() => null);
@@ -66,5 +69,5 @@
     return renderPage(req, res, 'pages/paid-result', {
       pageTitle: 'Ontgrendelen', bodyClass: 'on-special', ok: false,
-      reason: active ? 'tier' : 'notpatron', neededCents: payload.cents, haveCents: cents, postSlug: payload.post,
+      reason: active ? 'tier' : 'notpatron', neededCents: payload.cents, haveCents: cents, postSlug: payload.post, patronUrl,
     });
   }
