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.

index.html

The consent layer behind 100+ marketing teams

One script tagGTM templateConsent Mode v2Runs on Cloudflare's edge
Quick start

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.

index.html
<!-- 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 fits
tagmanager.google.com
GA4 configurationrequires: analytics_storage
gated
Google Ads remarketingrequires: ad_storage
gated
Meta pixelrequires: ad_storage
gated
Velo consent templatereads the data layer
v1.0
JavaScript API

Read 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.

consent.payload.json
// 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.

Where it runs

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.

Edgebanner and region decided at the nearest Cloudflare location
Asyncthe snippet defers and never blocks your page render
One filecached and versioned, so the tag you ship stays stable
Works with your stack

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.

Consent saved