Add Velo to
Google Tag Manager.
Install the Velo cookie banner and Google Consent Mode v2 with one tag imported from the Velo CMP template. No code on the page, no Custom HTML — configure the tag, set the trigger, publish. About ten minutes end to end.
Two ways in.
Pick one.
One community template, imported from the Velo CMP repo. It sets the Consent Mode v2 default for the EEA, UK and Switzerland before any other tag fires, then loads the banner — which applies your regional policy, records every decision, and updates Google on each one.
Three things
to have ready.
Publish access
A Tag Manager account with permission to add templates and publish the container. That is the only access the install needs.
Your Velo site ID
It is in the Velo dashboard. A single site account can leave the field as its default value and skip this entirely.
One consent stack
Remove any other CMP first. Two tools setting Consent Mode defaults produce conflicting signals — pause the old tag before publishing Velo.
Six steps,
one publish.
Import the Velo CMP template
Download template.tpl from github.com/ampliodata/velo-cmp. In your container, open Templates → Tag Templates → New, then open the ⋮ menu at the top right of the editor and choose Import. Pick the file you just downloaded, save, and the Velo CMP tag is ready to configure. Velo CMP is awaiting its listing in Google’s Community Template Gallery — until it lands, importing the file is the way in, and the tag behaves identically.
Create the tag
Go to Tags → New and choose the Velo template. Enter your Velo site ID — lowercase letters, digits and dashes, exactly as the dashboard shows it — and pick the light or dark theme to match your site. Leave the API endpoint blank unless Velo issued one for your account: the banner and Consent Mode work fully without it, and when it is set the dashboard's remote configuration takes over copy and categories.

Tick the two recovery options
Under Advanced, two checkboxes are worth switching on. url_passthrough lets ad click, client and session identifiers survive navigation through URL parameters while storage consent is denied — it recovers attribution for the traffic your banner would otherwise lose. ads_data_redaction additionally drops ad click identifiers and goes cookieless on requests while ad_storage is denied — recommended for strict EU setups. The copy override fields can stay empty; prefer editing copy in the Velo dashboard.

Fire it on Consent Initialization – All Pages
This is the trigger Google provides specifically for consent defaults: it runs before every other trigger in the container, which is what guarantees the denied default is in place before any measurement tag can fire. Do not use Initialization or All Pages — both run too late. This one choice is most of what a correct consent install comes down to.

Turn on consent overview under Admin
In Admin → Container Settings, tick Enable consent overview. This switches the container’s consent features on: the shield icon in the Tags view that shows each tag’s consent status, and the consent state readings you are about to check in Preview. Do it before you open Preview — without it, GTM gives you no consent overview to debug against.

Preview, then publish
In Preview, check three things: the Velo tag fired on Consent Initialization before every other tag; the Consent tab in Tag Assistant shows every signal except security_storage denied by default from an EEA, UK or Swiss location; and accepting or declining in the banner flips the matching update row while a velo_consent_update event lands in the data layer. Then Submit → Publish. The banner is live on the next page load, and the Velo console flips to installed on its own when the first real signal arrives.

Gate any tag on
the decision.
GA4, Google Ads and Floodlight need nothing extra — Consent Mode's built in consent checks hold and release them automatically. For everything else, a chat widget, a heatmap script, a pixel without Consent Mode support, the SDK pushes a velo_consent_update event to the data layer every time consent becomes effective, including a stored decision reapplied for a returning visitor. Three pieces wire it up:
A variable
Create a Data Layer Variable named velo_categories. It is an object of booleans — analytics, ads, functional, personalization — reflecting the visitor's current decision.
A trigger
Create a Custom Event trigger on velo_consent_update with a condition on the category you care about — for example, velo_categories.analytics equals true.

Attach it
Put that trigger on the tag you want gated. Because the event also fires for returning visitors with a stored decision, the tag fires on every pageview where consent is granted — no "only fires once after the click" gap.
Paste one
line of code.
Running without a tag manager? The direct snippet behaves identically — same banner, same Consent Mode wiring, same audit log. On a CMS, the matching platform guide shows exactly where the line goes.
One line, before your analytics and advertising tags. It loads without blocking your page and sets the Consent Mode default first. Your site ID is in the Velo dashboard.
Paste the snippet into the <head>
Place the tag high in the <head>, before any analytics or marketing script — that order is what lets Velo set the Consent Mode default first. On WordPress, Shopify, Webflow, Wix and the other platforms, the matching guide shows the exact field to paste into.

Reload and verify
The banner renders on the next page load, the denied default is set before any tag fires, and the Velo console flips to installed when the first real signal arrives.

If something
looks off.
The banner does not appear.
Almost always one of two things: the tag is not on the Consent Initialization – All Pages trigger, or the container version was never published. Open Preview and check where the tag fires — the fix is usually visible in ten seconds.
Signals show granted by default in the EU.
Something else is racing Velo — an old CMP tag, a consent default snippet in a Custom HTML tag, or a gtag default hard coded in the page. Only one thing in the stack may set defaults. Find the other one and remove it.
Two banners show at once.
The direct velo.js snippet is also installed in the page markup. Use one install path, not both. If both are present, the attributes on the inline snippet win over the tag's configuration, which makes debugging confusing — remove one.
My gated tag never fires.
Check the event name on the Custom Event trigger is exactly velo_consent_update — underscores, no typos — and that regex matching was not switched on by accident. Then confirm the condition reads the velo_categories variable, not the event name.
Is a Tag Manager install different from the snippet install?
No. Same banner, same Consent Mode wiring, same audit log, same dashboard. The template route just keeps the whole measurement stack in one container — which is why it is the path we recommend on every platform guide.
Can an agent do this for me?
Yes. Copy the prompt in Install with agents, just below, into Claude, ChatGPT, Cursor or whichever assistant you already use. It carries the template, the trigger, the gating pattern for tags Consent Mode does not cover, and the checks the agent has to run before it tells you the job is done.
Or hand it
to an agent.
Copy the prompt below into Claude, ChatGPT, Cursor or whichever assistant you already use. It carries everything on this page — the gallery template, the Consent Initialization trigger, how to gate the tags Consent Mode does not cover, and the checks that prove it worked — so the agent can walk the container with you and tell you exactly what it changed.
# Install Velo in Google Tag Manager — banner + Consent Mode v2
You are installing Velo, a consent management platform, in my Google Tag
Manager container. Velo sets the Consent Mode v2 defaults before any
other tag fires, shows the cookie banner, and records every decision.
Nothing goes into the page markup.
Ask me for these before you touch the container:
- My Velo site id — it is in the Velo dashboard. No account yet? Send me
to https://veloconsent.com/get-started and wait for the id.
- The container id, and whether I can publish or only submit for review.
- Which consent tool is live on the site today.
## The install
1. Templates → Tag Templates → New, then ⋮ → Import. Import the
template.tpl from github.com/ampliodata/velo-cmp ("Velo CMP").
2. Create a tag from that template. Set my Velo site id and pick the
light or dark theme.
3. Fire it on the "Consent Initialization – All Pages" trigger. Not
Initialization, not All Pages — both run too late to set consent
defaults.
4. Preview, then Submit and Publish.
## Gating tags that are not Google tags
GA4, Google Ads and Floodlight need nothing extra — their built in
consent checks hold and release them on their own. For a chat widget, a
heatmap or a pixel without Consent Mode support:
1. Create a Data Layer Variable named velo_categories. It is an object of
booleans: analytics, ads, functional, personalization.
2. Create a Custom Event trigger on velo_consent_update, with a condition
such as velo_categories.analytics equals true.
3. Put that trigger on the tag. The event also fires for returning
visitors with a stored decision, so the tag is not limited to the one
pageview where the click happened.
## Rules
- Install one path only. If the velo.js snippet is also in the page
markup, remove it — two installs means two banners.
- Only one tool may set Consent Mode defaults. If another CMP tag is in
the container, pause it before publishing Velo. Leave no hard coded
gtag('consent', 'default', ...) in the page or in a Custom HTML tag.
- Change no other tag, trigger or variable. Tell me first if one has to
move.
## Verify, then report back
- The banner renders on a fresh load in a private window.
- Before I choose, every consent signal except security_storage is denied
from an EEA, UK or Swiss location.
- Accepting and rejecting each flip the matching signals, and a
velo_consent_update event lands in the data layer.
- Google tags stay in their cookieless mode until consent is granted, and
any tag gated by hand fires only after it.
- window.Velo is defined, and Velo.open() reopens the preferences panel.
- On a Tag Manager install, Tag Assistant shows the Velo tag firing on
Consent Initialization ahead of every other tag.
Tell me what you changed, where you changed it, and what each check
showed. If a check fails, fix it and run the checks again.
Full guide: https://veloconsent.com/google-tag-manager
More context for agents: https://veloconsent.com/llms.txt
Working with an agent that reads the web? Point it at veloconsent.com/llms.txt and /install.md for the same context in plain text.
Compliant on Google Tag Manager.
Signal recovered.
The banner, the regions, the audit log and Consent Mode v2,
working together from one tag in your container, live in minutes.