One snippet,
then a dashboard.
Add one script tag, drop in a Google Tag Manager template, and you are done. Banners, regions, categories and Consent Mode v2 are configured in the dashboard, so the code you ship never has to change again.
The consent layer behind 100+ marketing teams
Live in two lines
Paste the tag once, near the top of your <head>. Velo loads asynchronously, blocks every tag until the visitor decides, and applies the right regional regime on its own.
<!-- 1 · Add Velo once. Manage everything else in the dashboard. --> <script src="https://cdn.veloconsent.com/v1/velo.js" data-site="your-site-id" defer></script> <!-- 2 · Optional. Run code once the visitor has chosen. --> <script> window.velo = window.velo || []; velo.push('onConsent', function(state) { // state.analytics, state.ad, state.region }); </script>
A tag template, not a tag rewrite
Import the Velo template into your Google Tag Manager workspace once. It reads consent state straight from the data layer and gates every tag by category, so analytics fires on analytics consent and your pixels fire on advertising consent. No custom triggers to wire, no exceptions to chase.
How Consent Mode v2 fitsRead consent, react to changes
One global queue, a handful of methods. Ask Velo for the current state, listen for updates, or reopen the preferences panel from anywhere on the page.
// velo.get('consent') returns the visitor's current choice { "region": "EEA", "regime": "opt-in", "timestamp": "2026-06-25T09:41:07Z", "categories": { "necessary": "granted", "analytics": "granted", "advertising": "denied", "functional": "granted" }, "consent_mode": { "analytics_storage": "granted", "ad_storage": "denied", "ad_user_data": "denied", "ad_personalization": "denied" } }
velo.get('consent')
Returns the payload above, synchronously, for the current visitor. Returns the pending default before a choice is made.
velo.push('onConsent', fn)
Runs your callback the moment consent is set, and again on every change. Perfect for loading a tag the instant its category is allowed.
velo.open('preferences')
Reopens the preference panel from your own button or footer link, so visitors can change their mind without hunting for it.
velo.get('region')
The region resolved at the edge: EEA, UK, a US state code or rest of world. Use it to branch your own logic without a geo lookup.
Served from the edge, close to your visitor
Velo runs on Cloudflare's global edge, so the banner is decided and painted near the visitor rather than round tripping to a far off server. The region is resolved at the edge too, which means the right regime is applied before your page even finishes loading.
Drop Velo into any CMS
One snippet, the same API, on every platform. Our install guides get Velo live in minutes, with no rebuild and no separate plugin to babysit.
Two lines now. Nothing to maintain later.
Add the snippet, import the GTM template, and let the dashboard handle the banner, the regions and Consent Mode v2. Live in 72 hours.