Skip to content
MethodInsights

An honest cookie banner: consent that matches what you set

The banner is honest when no is one click, and the network afterwards is boring.

A cookie banner is honest when reject is as easy as accept, and when the network after no is empty. A CMP logo is not consent.

13 min read
Stylised process diagram with checks and gates — a cookie banner as a gate in front of scripts, not a logo in the footer.

Method & consent

If you are searching for cookie banner rules, or for cookie consent on a website, you are usually here: you have a banner, you have a CMP, and you are unsure whether it counts. Someone has hidden 'necessary only' under an extra click. Someone has pre-ticked statistics. Someone has a neat Cookiebot layer, and Tag Manager still fires before anyone has clicked. Someone puts up a cookie wall: read the article, or accept.

The GDPR post is about the three layers — policy, cookies and what the browser actually sends — and about legal basis. The analytics post is about what you measure after an honest yes, or without cookies. This one is about the control you show: the buttons, the categories, and whether the scripts you said yes to are the scripts that wait. An honest cookie banner is a UI contract. It is not a logo you can buy finished.

TL;DR

The main points

  • Reject must be as visible and one click as accept. Otherwise the consent is not a choice.
  • No non-necessary script may run before there is a yes — not even via Tag Manager.
  • The categories on the banner must be the tags you actually gate. Otherwise the copy is fiction.
  • A CMP is a product. If it tracks itself, or hides no, it is part of the breach.
  • Necessary cookies are few. 'To improve the site' is a purpose, not a basis.
  • The test is: reject, reload, new browser, network tab. If it is busy, the banner is graphics.

Why this matters at all

A banner that is not a choice costs you what you thought you had bought: a consent you can defend. Cookie rules in Denmark — the order that implements ePrivacy — require a valid yes before you set or read anything that is not strictly necessary for the service the user asked for. Valid means free, specific, informed. A huge 'Accept all' and a grey 'Settings' three clicks down is the opposite. You have a design problem you call compliance.

Teams buy the wrong finished pack. They drop in a CMP because it looks like what other sites have, and think the work is done. The work is knowing your tags, letting no turn them off, and letting the buttons be honest. Without that the CMP is a layer on top of the same leak. The GDPR post is the map of the streams. Here is the UI that has to hold the map.

It is also a trust and SEO question, not only a legal one. A cookie wall that blocks the article is a bad way to ask for yes — and a bad way to let Google read the page. A banner that shoves LCP because it fetches a heavy vendor script before first paint is a performance problem you have called 'necessary'. The banner may be there. It must not be the thing that kills the site, or the only thing you have done.

We write this because 'cookie banner' has become a product you install before you have a sentence about what may run on no. An honest banner is boring: two buttons, few categories, scripts that wait, and a network tab you dare show a supervisor. Without that sentence you have an overlay. You do not have consent.

What an honest banner actually is — and what it is not

An honest cookie banner is three things on one screen: you say what you want to set, you let the user say yes or no without a hunt, and you keep the promise afterwards. Reject and accept sit next to each other. 'Customise' is allowed as a third — it must not be the only path to no. When the choice is given, you remember it, and you fire only what got a yes.

It is not the GDPR map. The map is the policy, the cookie list and the network — we have written that elsewhere. The banner is the control that must match the map. If the control is pretty and the map is a leak, you have a theatre banner. If the map is honest and the control hides no, you have theatre consent. You need both. This post is only the control.

It is also not your measurement. First-party analytics after consent is what you do with a yes, or how you measure without cookies. The banner must not be where you 'solve' analytics by calling everything necessary, or by turning on Consent Mode and letting the call go anyway. If measurement needs a yes, wait. If it can run without cookies, let it run without lying in the banner.

And it is not a cookie wall. Blocking the content behind accept is not a free choice. The user came to read or to buy. You may ask for yes to statistics. You may not hold the page hostage. Necessary cookies for the cart and login may be set because the service otherwise does not work. The rest waits. If you cannot show the page without ten tags, the problem is the tags — not that the user said no.

What typically goes wrong when someone says the banner is in place

The first failure is the buttons. Accept is large. Reject is 'Settings', then 'Turn everything off', then 'Save'. Three clicks to no, one to yes. That is a dark pattern, even when the legal text in the footer is fine. Put the two choices on the first screen. Customise may come along. It must not be the trap.

The second failure is that scripts do not wait. The banner renders. GTM is already in `<head>`. Facebook, LinkedIn, a heatmap, a chat — they run on pageview, 'because the container is set up that way'. The CMP has a callback you never hung tags on. Then the banner is a layer. The test is the network before a click, and the network after no. Both should be boring, except what you have called necessary.

The third failure is that the CMP itself is the tracker. Some consent products set their own cookies, call home, or show 'partners' in a catalogue you have never read. The banner must be able to explain itself. If the vendor requires a yes in order to show the banner, you have bought the wrong vendor. Necessary is remembering the choice. It is not profiling the person who has not chosen yet.

The fourth failure is categories that do not match tags. The banner says 'statistics and marketing'. In GTM sit ten tags, three of which are chat, session replay and an A/B tool you stuffed into 'statistics'. The user said yes to one thing. You turned on another. Map tag to category, or cut the categories to what you actually have. A lie in the UI is still a lie when it is set in a CMP.

Theatre banner vs honest banner — two overlays, two kinds of no

The theatre banner

A logo and a yes. No is hidden. Scripts run anyway.

  • Accept all in brand colour; reject three clicks down or not at all
  • Categories pre-ticked, or 'legitimate interest' switched on
  • GTM fires on load; the CMP is a layer on top
  • A cookie wall, or a vendor catalogue you have not read

The honest banner

Two choices on the first screen. Scripts wait. The network after no is boring.

  • Reject and accept next to each other, same weight, one click
  • No pre-ticks; necessary is a short, honest list
  • Every non-necessary tag hangs on a yes in the right category
  • You dare open the network tab after no and show it

How to make a banner that is actually consent

Without this order you get an overlay you call finished.

  1. 01

    Inventory scripts — not cookies first

    Open the network on a cold browser. Write every call you do not host yourselves: analytics, pixels, chat, A/B, replay, video embeds that set cookies. Cookies come from calls. If you start from a cookie list from 2022, you miss CNAMEs and tags without a cookie. The GDPR post is the map. Here you just need the list the banner must control.

  2. 02

    Split necessary from the rest — and be stingy

    Necessary is what the service the user asked for dies without: cart, login session, load-balancing, the consent choice itself. Statistics, marketing, a chat that sends page content, session replay, most embeds — that is a yes. 'We use it to improve the site' is a purpose. It does not move anything onto the necessary list.

  3. 03

    Draw two buttons on the first screen — then customise

    Accept all. Necessary only. Same size, same place. Customise is a third if you have more categories. No pre-ticks. No 'closing the cross means yes'. No wall in front of the article. If the designer says the no button 'kills conversion', that is an honest argument that you want fewer yeses. It is not an argument for hiding the button.

  4. 04

    Gate every tag — including the ones in Tag Manager

    The banner's callback is the truth only when tags listen. In Next.js that typically means: do not load vendor scripts before the choice, and load them only in the category that got a yes. In WordPress it means: the plugin must not inject on pageview 'to be safe'. GTM is a pipe. If something sits in the pipe without a gate, it is your call, not Google's tags.

  5. 05

    Test no, reload and a new browser — then write what you remember

    Reject. Reload. Open a private profile. The network should be boring. Repeat after a deploy and after someone has 'just added a pixel'. Store the choice so you do not ask every hour — and so you can show that no was remembered. If you cannot reproduce a no without clearing cookies by hand, you are not remembering consent. You are remembering a hope.

“The banner is honest when no is one click, and the network afterwards is boring.”

CMP, WordPress and Next.js — the same duty, different traps

A CMP can be right when you have many tags and several sites, and you want one place to turn things off. It is wrong when you buy it to avoid knowing your calls. Read what the vendor itself sets. Turn their 'partners' off if you do not have them. If the CMP cannot show reject beside accept without an enterprise flag, you have the wrong product — or you have configured theatre. A small custom banner on a site with three tags is often more honest than a catalogue you do not maintain.

A WordPress site typically dies in the plugin layer. A cache plugin, a 'performance' plugin, a chat plugin, a pixel plugin that writes in `head` without asking the CMP. The banner can be pretty, and the theme still fires. Inventory with a cache bypass and a cold browser. If you cannot point at the filter that stops the script, you have not gated. You have installed.

A Next.js site typically dies in someone putting GA or a chat widget in `layout.tsx` 'temporarily', or in a tag-manager container sitting in root because a campaign had to go live yesterday. The App Router makes it easy to load something globally. It also makes it easy to load it before the choice. Keep vendor scripts out of root. Load them in a component that reads consent. Preview deploys are a good place to show a colleague the network tab after no — before it reaches prod.

If you already have the GDPR map and first-party measurement in place, and the banner still feels like the weak link, that is because it is. A map without buttons is a PDF. Measurement without an honest no is a hope. The banner is what the user sees. It has to be able to carry the other two.

What you should typically do in the situation you are in

The left is what you typically say. The right is the next step we typically recommend.

  • Situation

    We have a CMP, and 'necessary only' sits under Settings

    Next step

    Put reject on the first screen. A more expensive CMP does not fix a hidden no

  • Situation

    The banner is pretty, and the network runs before anyone has clicked

    Next step

    Gate the tags. The overlay is not the consent. The network is

  • Situation

    We want to call analytics necessary so the graph does not die

    Next step

    Then it is not necessary. Measure after yes, or measure without cookies — that is another post

  • Situation

    We have three tags and are considering a large consent platform

    Next step

    A small honest banner beats a catalogue you will not maintain. Buy the CMP when the tag list is long

  • Situation

    We want to block the content until they accept

    Next step

    That is not a free yes. Show the page. Ask for statistics. Let no mean no

Checklist before you call the banner honest

If you are missing several of these, the sentence is consent — the overlay is graphics.

  • Reject and accept sit on the first screen, same weight, one click
  • No category is pre-ticked, and the cross does not mean yes
  • The network before a choice and after no is boring, except what you have called necessary
  • Every tag has a category you can point at on the banner
  • The CMP or your own banner does not track before a yes
  • You have repeated the test after the last pixel and the last plugin update

Questions we get again and again

  • What do cookie rules require of the banner on a Danish site?

    Valid consent before you set or read anything that is not strictly necessary for the service the user asked for. Valid means free, specific and informed — reject as easy as accept, no pre-ticks, and information about what you set. The banner is the UI for that yes. It is not the whole of GDPR. The data streams and the policy are another post. Here the buttons and the gate have to be able to carry the yes you claim you have.

  • Is a cookie banner the same as complying with GDPR?

    No. A banner is the control. GDPR is also purpose, basis, minimisation, processors and what the browser actually sends. We have written that map elsewhere. You can have a pretty banner and a leak, or an honest map and a hidden no. This post fixes the control. It does not replace the map, and it does not replace a first-party measurement you can still defend after a no.

  • May we use a CMP, or should we build the banner ourselves?

    Both can be honest. A CMP is right when the tag list is long and you want to turn things off in one place. It is wrong when you buy it to avoid the inventory, or when the vendor itself tracks before yes. A small custom banner is right on a site with few tags, where you can point at every gate. Choose what you can maintain. A catalogue you never open is theatre with a better logo.

  • May we block the site behind accept so we do not lose measurement?

    Not if you want to call it free consent. The user came to read or to buy. You may ask for yes to statistics. You may not hold the page hostage. If the graph dies on no, that is the price of an honest choice — or you measure without cookies, which the analytics post is about. A wall is how you get clicks on yes and a consent you cannot defend.

  • How do we test that the banner actually controls scripts?

    Cold browser. No click yet — the network should be boring. Reject — reload — still boring. Accept one category — only those tags. A new private profile, so you are not testing your own stored yes. Repeat after every pixel and every plugin. If you only look at the banner rendering, you are testing the overlay. Consent sits in the calls that do not happen.

If you have a CMP and a busy network tab after no

Let us separate buttons, tags and theatre.

Two honest buttons and a boring tab beat an overlay you call consent.

Why we wrote this

This is how we think — and it's what we build.

Our insights are about the work we actually do. If this hit something you're working on, there's a concrete service that lines up.