Troubleshooting
Symptom first. If you are not sure which one you have, start with how to check what actually happened at the bottom.
đźš« The banner never appears
Check the console first. A few messages account for nearly all of it.
[Consentio Loader] script not found- The tag is missing
data-consentio-loader. The script finds itself by that attribute and cannot start without it. Put it on exactly one tag. - A 404 on
consentio.min.js - The two files are not in the same folder. The small one works out where the big one is by looking next to itself, so moving one without the other breaks it. Put them back together.
[Consentio Loader] Initialization failed: Error: /data/consentio-settings.json did not load: HTTP 404- Your settings file did not load. Check
data-settings-urlis the path in the message and that your site serves it. The file is optional — remove the attribute and the banner still runs on built-in defaults, which is a quick way to prove the rest works. A language file or a cookie table that does not load is not this: the banner still appears, in English or with empty tables, and says so on the console. [Consentio Loader] the loader tag has no src, so the banner cannot be located- The tag was pasted inline. The small file finds the big one next to its own
src, so it has to be linked, not pasted. - Nothing on the console at all
- The tag is probably not running. View source on the built page and confirm the tag is really in the
<head>— a template or build step may be stripping or reordering it.
You have already answered. That is the most common one of all, and it is not a fault. Clear the
consentio cookie and reload. The try-it page has a button that does it.
🍪 The banner comes back every time
The answer is not being stored, or not being read back.
You are on plain http and expected otherwise. Over https the cookie is written with Secure; over
plain http it is written without it, on purpose, so that local development behaves like the deployed site.
If a choice does not stick on http://localhost, that is a fault, not the design.
You changed version or data-version. Raising it deliberately throws away every stored answer. That
is what it is for. See Versioning stored consent.
The two halves are reading different cookie names. On the HTML route, data-cookie-name on the tag is
the only place the name is read from — cookieName in a settings file does nothing there, and Consentio says
so on the console. The Tag Manager route always uses consentio and cannot be changed. If you are running
the same site through both — do not — and you renamed the cookie, they will disagree.
Something else is refusing the cookie. Consentio reads the cookie back after writing it and prints
the answer did not read back when it is not there, whatever data-debug says. Nothing Consentio asks the
browser for should be refused, so this points at something else on the page: another consent tool, an
extension, or a browser set to block cookies for the site.
Something else is clearing cookies. A consent tool, a privacy extension, or a Clear-Site-Data header
will take this cookie with the rest.
⏱️ Tags fire before anyone answers
This is the failure that matters, and it is almost always ordering.
async or defer is on the tag. Take it off. Both let the browser run the script after your tag
manager has already decided what it may do, and a tag manager reads consent once, at load — it never asks
again. The script prints a warning when it sees either, whatever data-debug says.
The tag manager snippet is above the Consentio tag. Consentio has to be first, in <head>, above
everything.
On the Tag Manager route, the tag is on the wrong trigger. It has to be Consent Initialization - All Pages, not All Pages. Only that trigger is guaranteed to run before everything else in the container.
On the Tag Manager route, a tag is not in the container. Anything pasted straight into a page — a video embed, a chat widget, a pixel in a footer include — is outside the container’s reach. The fix is to move it into the container, or to mark the script — marking works on either route. Choose a route has the two side by side.
A script you pasted into the page is not marked. Consentio holds back only a tag
carrying type="text/plain" and data-consentio; everything else runs as it always did.
Hold a script until consent is the one change to make.
đźš§ A held script never runs
You marked a script with type="text/plain" data-consentio="..." and it does not run after the visitor
accepts.
- The category is misspelled.
data-consentiohas to be one ofstrictly_necessary,preferences_functionality,statistics_performanceormarketing_advertising, exactly. Anything else matches nothing and the tag is left alone. - Nobody has answered yet. A category’s default state is not an answer, so on a page the visitor has
not answered nothing marked runs —
strictly_necessaryincluded. A script that needs no consent does not get marked. - The category was not granted. Read the cookie, below, and check which categories say
granted. - It ran, and then the visitor revoked. A script that has run has run; revoking stops it on the next page load, not this one.
🌍 The banner is in English, not the language you chose
The language file did not load, and the banner fell back to its built-in English rather than not showing. The console says which file:
[Consentio Loader] the language file did not load, so the banner keeps its built-in English: <url>- On the HTML route. Check
data-language-urlis a path your site serves, or that the code indata-languageis one a published pack exists for —el, notgr. Consentio Tag: the language pack did not load, so the banner keeps its built-in English- On the Tag Manager route, with Language set to A published language pack. The tag loads the pack from the CDN at the same version as the banner, so something between the visitor and the CDN stopped it.
đź§© Two banners at once
You installed both routes. Pick one and remove the other. The template does not use
consentio-loader.min.js; it loads the main file itself. The template from this release stands down on a
page where the script tag ran, and says so on the console; an older one does not, and you get two copies
that do not know about each other, each writing over the other’s answer.
đź“‹ The settings panel tables are empty
The cookie list is a separate file and it is optional, so an empty table is what “not configured yet” looks like.
data-cookies-urlis missing, or points at a 404 — the console then saysthe cookie table did not load, so the settings panel shows no table, with the address.- The file loads, but every entry’s
categorymatches none of the four category keys. An entry whosecategorymatches nothing is never shown. The keys arestrictly_necessary,preferences_functionality,statistics_performanceandmarketing_advertising— spelled exactly.
🔀 A category is denied when it should be granted
Deny wins. A Google signal is granted only when every category routed to it is granted, and a signal
nothing is routed to stays denied. preferences_functionality and marketing_advertising each cover more
than one signal — the mapping shows which.
You tried to add a fifth category. The four are fixed. An entry whose key is not one of them is
ignored, with a warning on the console, and the banner runs on the four. You cannot add one, remove one, or
point one at a different Google signal.
You are comparing a consent default with a consent update. The default is what the visitor gets
before answering; the update is their answer. Both name all seven signals. Look at which one you are
reading.
🔍 How to check what actually happened
In order, cheapest first:
1. Turn on logging. Put data-debug="true" on the tag. It prints each address the script fetches, what
came back, and the consent default it pushed. Every other line is printed either way.
Every console message is at the bottom.
2. Read the cookie. In the console:
decodeURIComponent(document.cookie.split('; ').find(c => c.startsWith('consentio=')).slice(10))
You should get {"version":1,"consents":{...},"date":"..."} with all four categories. Anything else — no
cookie, broken JSON, a different version, no consents key — reads as no stored answer and the banner
shows again. A cookie with no date is not one of those: it was written before dates existed and is still a
good answer.
The cookie page has the rules in order.
3. Read what the first message to Google was built from.
window.ConsentioDefault
If it is undefined on a page that should be running the HTML route, the script did not run. If it is
undefined on the Tag Manager route, that is correct — only the script tag sets it.
4. Read the dataLayer.
window.dataLayer.filter(e => e[0] === 'consent')
The first entry should be consent default, and it should be there before your tag manager’s own entries.
What reaches the dataLayer goes through it properly,
including with Tag Assistant.
5. Watch for the answer.
document.addEventListener('consentio:consent-update', (e) => console.log(e.detail));
Fires every time someone saves settings or accepts all. See Events.
🖨️ Every console message
Everything Consentio prints, and when. The loader’s lines are always printed unless the table says
data-debug; the banner’s warnings are always printed, and its [Consentio:Event] and [Consentio:GTM]
lines only with debug on in the settings file.
| Message | When |
|---|---|
[Consentio Loader] script not found |
no tag carries data-consentio-loader |
[Consentio Loader] loaded with async or defer, so the consent default cannot arrive before the tag manager |
the tag has async or defer |
[Consentio Loader] Consent default pushed: |
the first message to Google went out. data-debug |
[Consentio Loader] data-version "<value>" is not a whole number, so version 1 is used |
the attribute holds something other than a whole number |
[Consentio Loader] Consentio is already initialized |
a second loader tag, or the banner already running. data-debug |
[Consentio Loader] the loader tag has no src, so the banner cannot be located |
the tag was pasted inline |
[Consentio Loader] Failed to load script: |
consentio.min.js did not load from the address shown |
[Consentio Loader] Constructor not found after script load |
the file at that address loaded but is not the banner |
[Consentio Loader] settings URL:, language URL:, cookies URL: |
the address about to be fetched. data-debug |
[Consentio Loader] both data-language and data-language-url are set - data-language-url wins |
both attributes are on the tag |
[Consentio Loader] the language file did not load, so the banner keeps its built-in English: |
the address that failed, and the reason |
[Consentio Loader] the cookie table did not load, so the settings panel shows no table: |
the address that failed, and the reason |
[Consentio Loader] settings loaded:, language loaded:, cookies loaded: |
what each file held. data-debug |
[Consentio Loader] Initialized successfully |
the banner is built |
[Consentio Loader] Initialization failed: |
the settings file did not load — <url> did not load: HTTP 404 — or the banner threw while being built |
[Consentio] unknown consent category "<key>" ignored - the four categories are fixed |
a settings file or language pack names a fifth category |
[Consentio] "cookieName" in the settings file is ignored - the loader tag reads the cookie before the file arrives. Set data-cookie-name on the tag instead. |
the settings file names a cookie the tag does not. The same line for "version" and data-version, and for "urlPassthrough" and data-url-passthrough |
[Consentio] policy URL "<value>" ignored - it must start with http://, https:// or / |
a policyUrl in either file that is not one of those |
[Consentio] hideFloatingButton is set - the site now owes the visitor a link of its own calling window.ConsentioInstance.openSettings() |
the setting is on |
[Consentio] the answer did not read back - the browser did not keep the "<name>" cookie. Nothing Consentio asks for should be refused, so look for something else on the page clearing cookies. |
the cookie was written and was not there afterwards |
[Consentio] openSettings ignored - the banner is not on the page yet |
openSettings() was called too early. debug |
[Consentio:Event] open-settings, accept-all-consents, reject-all-consents, cancel-settings, save-settings |
a button was pressed. debug |
[Consentio:GTM] Pushed event: consent, Pushed event: set, Consent updated |
the update went out. debug |
The Tag Manager template prints only in preview mode, and every line starts with Consentio Tag:
| Message | When |
|---|---|
Consentio Tag = |
what the pickers held, on every run |
Consentio Tag: the direct install route is on this page, so the tag stands down |
window.ConsentioDefault was already set by the script tag |
Consentio Tag: already initialized |
the tag fired twice on one page |
Consentio Tag: the Settings is not a JSON object, so it is ignored |
the Settings picker gave something that is not an object. The same line for Language pack |
Consentio Tag: cookieName is fixed to consentio on this route, so <name> is ignored |
the settings file names another cookie |
Consentio Tag: the Cookie table is not a JSON array, so the settings panel shows no table |
the Cookie table picker gave something that is not an array |
consent default = |
the signals it set, before loading anything |
settings =, language =, cookies = |
the three inputs as handed to the banner |
Consentio Tag: the language pack did not load, so the banner keeps its built-in English |
the pack’s address follows; the banner still loads |
Consentio Tag: the banner script did not load |
the tag fails; the consent default was already set |