Beexy / Consent / Technical Reference
Beexy Consent
The complete cookie consent solution for Google Tag Manager. 143+ jurisdictions. 33 languages. WCAG 2.2 AA. One-time purchase from €79.
Segment 01 / 03
Coverage
Which laws the banner covers, which regions it targets, which languages it speaks. Start here if you're checking whether Beexy Consent fits your legal footprint.
In this segment
01 Coverage
Consent Models
Beexy Consent automatically applies the correct consent model for each visitor's jurisdiction. Four models cover every legal scenario.
- Default state
- All categories denied except Necessary
- Explicit consent required
- Yes. Banner blocks until user chooses.
- Close (X) button
- Hidden. GDPR prohibits ambiguous dismiss.
- Buttons
- Allow All, Deny All, Customize
- Applies to
- EU/EEA, UK, Brazil, India, and 66 more
- Default state
- All categories granted
- Explicit consent required
- No. Notice plus opt-out.
- Close (X) button
- Shown. Accepts current defaults.
- Buttons
- Allow All, Manage Preferences
- Applies to
- Australia, NZ, US (general), Canada, Singapore, and 34 more
- Default state
- All categories granted
- GPC signal
- Auto-denies Analytics and Marketing if detected
- Close (X) button
- Shown
- DNSMPI link
- "Do Not Sell or Share My Personal Information" shown in all tabs
- Applies to
- CA, CO, CT, DE, MD, MN, MT, NE, NH, OR, TX
- Default state
- All categories auto-granted
- Banner shown
- No. Silent grant, no UI displayed.
- Applies to
- Countries with no applicable cookie law (PK, MM, KH, FJ, PG, IQ, IR, VE, BO, PY, GT, HN, MZ, CD, BS)
Unmapped countries default to opt-in, the strictest model.
02 Coverage
Region Coverage
143+ jurisdictions covered. US state-level and Canadian province-level granularity. Unmapped regions fall back to opt-in.
EU/EEA (30): Austria, Belgium, Bulgaria, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France (182-day cookie cap), Germany (X button prohibited), Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden, Iceland, Liechtenstein, Norway
Europe non-EU (8): UK, Switzerland, Serbia, North Macedonia, Albania, Montenegro, Bosnia & Herzegovina, Kosovo
Asia-Pacific (13): China, India, Indonesia, Japan, South Korea, Vietnam, Thailand, Malaysia, Bangladesh, Sri Lanka, Mongolia, Macao, Russia
Middle East (9): Turkey, Israel, Saudi Arabia, UAE, Qatar, Bahrain, Oman, Jordan, Georgia
Africa (9): South Africa, Nigeria, Kenya, Egypt, Ghana, Morocco, Tunisia, Senegal, Zambia
Americas (7): Brazil, Canada (Quebec), Colombia, Argentina, Chile, Peru, Dominican Republic
Australia, New Zealand, United States (general), Canada (excl. Quebec), Singapore, Taiwan, Hong Kong, Philippines, Laos, Nepal, Uzbekistan, Kuwait, Lebanon, Kazakhstan, Azerbaijan, Ukraine, Moldova, Belarus, Mexico, Uruguay, Ecuador, Costa Rica, Panama, El Salvador, Jamaica, Trinidad & Tobago, Algeria, Ethiopia, Tanzania, Uganda, Rwanda, Côte d'Ivoire, Cameroon, Zimbabwe, Angola, Bermuda, Cayman Islands, Barbados, Mauritius
| State | Law |
|---|---|
| California (US-CA) | CCPA / CPRA |
| Colorado (US-CO) | CPA |
| Connecticut (US-CT) | CTDPA |
| Delaware (US-DE) | DPDPA |
| Maryland (US-MD) | MODPA |
| Minnesota (US-MN) | MCDPA |
| Montana (US-MT) | MCDPA-MT |
| Nebraska (US-NE) | CDPA-NE |
| New Hampshire (US-NH) | NHIPA |
| Oregon (US-OR) | OCPA |
| Texas (US-TX) | TDPSA |
Pakistan, Myanmar, Cambodia, Fiji, Papua New Guinea, Iraq, Iran, Venezuela, Bolivia, Paraguay, Guatemala, Honduras, Mozambique, DR Congo, Bahamas
03 Coverage
Language Support
33 languages. English is embedded in the core config. All others are loaded on-demand from the CDN (~3KB each).
Localization runs end to end. It is not only the banner buttons and category descriptions: the entire cookie-purpose database and the cookie-duration labels are translated into every one of the 33 languages too, so a non-English visitor never drops back to English mid-panel. See Multilingual cookie purposes.
Auto-detection chain
window.beexyConsentLang(GTM field override, Pro/Agency)<html lang>attributenavigator.languagesbrowser preference- English fallback
04 Coverage
Legal Compliance Status
Compliance is a moving target. This table reflects the current version. Consent records age out automatically when they pass the region's retention limit (365 days default, 182 days in France per CNIL Deliberation 2020-091), with a 1-day grace window for clock skew; expired records trigger a fresh prompt before any restoration. "Partial" means the core mechanism is implemented but optional add-ons (e.g. operator-side consent-proof backend) remain operator-supplied.
| Framework | Jurisdiction | Status |
|---|---|---|
| GDPR | EU/EEA (27 member states) | Compliant |
| UK GDPR + PECR | United Kingdom | Compliant |
| revFADP | Switzerland | Compliant |
| Privacy Act 1988 | Australia | Compliant |
| Privacy Act 2020 | New Zealand | Compliant |
| CCPA / CPRA | California, USA | Compliant |
| CPA, CTDPA, DPDPA, MODPA, MCDPA, MCDPA-MT, CDPA-NE, NHIPA, OCPA, TDPSA | 10 additional US states | Partial |
| LGPD | Brazil | Compliant |
| PIPEDA / Quebec Law 25 | Canada | Compliant |
| European Accessibility Act / WCAG 2.2 AA | EU + UK | Compliant |
Dark pattern prevention: structural button equality
The single most-enforced cookie-banner violation is asymmetric consent, making "Accept" visually prominent while pushing "Reject" into a lower-contrast or lower-prominence treatment. Regulators have converged on a "deny as easy as accept" doctrine and enforce it: the CNIL fined Google EUR 150M and Meta EUR 60M in 2022 specifically because rejecting was harder than accepting; the CPPA fined American Honda USD 632,500 in March 2025 for asymmetric opt-out; and the EDPB Cookie Banner Taskforce (2023) made equal-weight buttons effectively mandatory across the EEA.
Beexy Consent makes that violation impossible to build, not merely discouraged. Every action button (Accept, Customise, Decline) is rendered from one shared CSS class, derived from a single primaryColor and one buttonStyle. There is no per-button color path in the code, so accept and decline always share the same color, fill, border, and size by construction. Competing consent platforms that expose independent Background / Text / Border controls per button hand this responsibility to the installer, which is exactly the surface regulators sweep. Beexy takes the responsibility on itself: equal weight is a property of the markup, not a configuration the operator can get wrong.
Outline-button affordance. When buttonStyle is set to outline, every action button carries a small rest-state drop shadow (box-shadow: 0 2px 6px rgba(0,0,0,0.14), lifting to 0 4px 10px rgba(0,0,0,0.20) on hover). The shadow uses a neutral black alpha rather than the outline color, so it reads as tappable on light or busy pages while staying visibly lighter than a filled button. The same neutral shadow is applied to the secondary button (the opt-out-region deny action), so every action button shares the affordance: still no per-button surface a deployer can desync.
Not covered in this version
- IAB TCF 2.2 / 2.3 (deferred to v2.0)
- Children / age-specific consent
- Cross-TLD multidomain consent (e.g.
brand.com↔brand.nl), research only - Right to erasure of consent records
- ePrivacy Regulation (pending EU law)
Segment 02 / 03
Mechanics
How the banner behaves once it's live: Google Consent Mode wiring, cookie detection, privacy signals, accessibility, and how it decides which region a visitor belongs to.
05 Mechanics
Google Consent Mode v2, Advanced
Beexy Consent implements the Advanced mode (not Basic). This enables cookieless conversion and behavioral modeling even when consent is denied.
How it works
consent defaultfires on every page load with all types denied pluswait_for_update: 500- For returning visitors: consent is read synchronously from the
beexy_consentcookie. Zero async gap beforeconsent update. consent updatefires immediately on any user action
Category to storage-type mapping
| Consent Category | Google Storage Types |
|---|---|
| Necessary | security_storage |
| Preferences | functionality_storage, personalization_storage |
| Analytics | analytics_storage |
| Marketing | ad_storage, ad_user_data, ad_personalization |
security_storagefunctionality_storage, personalization_storageanalytics_storagead_storage, ad_user_data, ad_personalizationConfigurable via GTM fields
url_passthrough: preserve click IDs in URLs for cookieless measurementads_data_redaction: redact ad click identifiers in pings when marketing deniedwait_for_update: configurable ms to wait before GTM fires tags (default 500)
06 Mechanics
Cookie Auto-Detection
Beexy Consent automatically detects which third-party cookies are active on the page and displays them in the banner's Details tab. No manual configuration. v1.4.0 introduces a two-layer detection model + tier-selectable database scaling from ~50 to 370+ services.
4-layer detection (v1.4.0+)
- Layer 1: Banner's own cookies (
beexy_consent,beexy_geo): always shown in Necessary. - Layer 0 (full coverage, v1.4.0+): Scans
document.cookieon the live page and regex-matches each name against the loaded tier database. On match, surfaces the cookie with full metadata (provider, duration, purpose, category). Works for any service in the active tier with zero per-service curation. This is the path that makes Medium and Large tiers genuinely useful: every actually-set cookie gets metadata if its name is in the database. - Layer 2 (pre-consent transparency): When a known service's script is detected on the page (
window[scriptGlobal]exists OR a<script src>contains the service's URL pattern), ALL its cookies surface even before they are set. Gives visitors the "these cookies will be set if you accept" view ahead of any actual storage. Applies only to the 44 curated services that carry script-presence signals. - Layer 3: Custom cookies defined in the
customCookiesGTM SIMPLE_TABLE field (Pro / Agency), for proprietary cookies not in any tier database.
All four layers merge with de-duplication by cookie name (Layer 0 wins on collision — same metadata source either way, idempotent).
Cookie database tier (v1.4.0+, Pro+ field)
A new Pro+ GTM template SELECT field, Cookie database tier, controls which cookie-database tier the banner loads at init. Three tiers, all served from the jsDelivr CDN:
| Tier | Services | Cookies | Raw size | Gzipped (CDN wire) | Composition |
|---|---|---|---|---|---|
| Small (default) | 44 | 115 | 29 KB | 4.4 KB | Curated set, full script-presence detection signals. Covers the ~50 most-prevalent trackers (Google, Meta, LinkedIn, TikTok, HotJar, Microsoft Clarity, Stripe, Intercom, etc.). |
| Medium (Pro+ opt-in) | 150 | 829 | 248 KB | 35.5 KB | Curated 44 + 106 additional platforms ranked by global tracker prevalence. Adds mid-tail SaaS + ad-tech vendors. |
| Large (Pro+ opt-in) | 372 | 2,071 | 591 KB | 81.3 KB | Curated 44 + the full catalogued platform set. Full coverage for sites with heavy ad-tech stacks. |
Data source. A curated, regularly-updated cookie database covering the most prevalent global trackers. Each larger tier adds progressively broader ad-tech and SaaS coverage. The database is refreshed periodically and served from the CDN, so updates reach every install automatically.
Defaults + tier fallback. New installs default to small. Existing installs without the field set fall through to small (smallest visual change). Basic tier hard-codes small because cookieDeclarationsGroup is stripped from the Basic template entirely; banner JS defaults window.beexyConsentCookieDatabaseTier || 'small' so the missing window var is harmless.
Fetch failure behavior. If the tier file fails to load (CDN incident, network block), banner falls through to empty knownCookies. Cookie display is informational, not consent-blocking. Consent still works. Layer 0 finds zero matches in that state; any actual cookies on the page surface in the Unknown section instead.
Multilingual cookie purposes & durations (v1.5.0+)
Detection metadata is fully localized. Every cookie purpose in the curated database is translated into all 33 supported languages, and the duration labels are localized too. A visitor on the banner in Polish or Japanese reads the Purpose column in their own language, and the Duration column renders in-language as well: 30 days shows as 30 dni (Polish) or 30 日 (Japanese), and Session as Sesja / セッション.
- Purposes. The purpose catalogue is maintained once in English, then translated per language. The banner fetches only the slice for the active language and selected tier, on demand, from
cookie-purposes/{tier}/{lang}.jsonon the CDN. English visitors load nothing extra. A missing slice falls back to the English purpose per entry, so display never breaks. - Durations. Each language ships a small duration lexicon (unit words plus keywords like Session, Persistent, Unknown). Free-text durations such as
1 yearorSessionare parsed and re-rendered in-language; anything unrecognised is shown verbatim.
This closes the last English-only surface in the consent UI: for a non-English visitor the banner text, the category descriptions, the individual cookie purposes, and the durations are now all in one language.
Browse the cookie database
Explore exactly which services and cookies each tier covers. Beexy Consent uses the same tiered database structure in production: Small for the curated default set, Medium for broader SaaS and ad-tech coverage, and Large for the full catalogued platform set.
- Services
- 44
- Cookies
- 115
- Best for
- Most common analytics, ads, chat, payment and embed tools.
- Services
- 150
- Cookies
- 829
- Best for
- Sites with a broader SaaS and ad-tech stack.
- Services
- 372
- Cookies
- 2,071
- Best for
- Heavy ad-tech stacks that need the widest database coverage.
Download the complete cookie database appendix covering Small, Medium and Large tiers: 3,015 cookie rows across 44, 150 and 372 services.
Upload the PDF appendix to WordPress Media Library using the exact filename beexy-consent-cookie-database-appendix.pdf. If WordPress gives it a different URL, replace the button href with the Media Library file URL.
Unknown cookies (v1.4.0+)
The Details panel surfaces every cookie the browser is currently storing for the visitor's session, including ones the banner does not yet recognise. Unknown cookies appear in a dedicated Unknown group beneath the four category accordions, so the visitor sees the full picture rather than only what we have catalogued.
Two reasons this matters:
- Transparency. Visitors see exactly what is on their device, not a filtered subset that hides third-party tags the banner has not learned yet.
- Discoverability for site owners. If a cookie that is meaningful for the site keeps appearing in Unknown, the site owner knows to categorise it explicitly.
Pro and Agency tiers include a customCookies simple-table field in the GTM template's Cookie Declarations group, letting the site owner promote a specific Unknown cookie into the appropriate category. The Category column is a SELECT with four values (necessary, preferences, analytics, marketing); default is analytics. Help text inside GTM enumerates the four valid values inline so the choice is unambiguous.
Basic tier does not expose customCookies (the field is stripped from the Basic .tpl by build-tiers.js). Unknown cookies still surface in the Details panel on Basic, they just cannot be promoted into a category without upgrading.
| Service | Category | Detection method |
|---|---|---|
| Google Analytics 4 | Analytics | window.gtag, window.dataLayer |
| Google Ads | Marketing | window.google_conversion_id |
| Facebook / Meta Pixel | Marketing | window.fbq |
| LinkedIn Insight | Marketing | window._linkedin_data_partner_ids |
| HotJar | Analytics | window.hj |
| Microsoft Clarity | Analytics | window.clarity |
| TikTok Pixel | Marketing | window.ttq |
| HubSpot | Marketing | window._hsq |
| Stripe | Necessary | window.Stripe |
| Intercom | Preferences | window.Intercom |
| YouTube Embed | Marketing | script src youtube.com/embed |
| Twitter / X | Marketing | window.twq |
| Zendesk | Preferences | window.zE |
| Vimeo Embed | Preferences | script src player.vimeo.com |
| Crisp Chat | Preferences | window.$crisp |
| Calendly | Preferences | script src calendly.com |
| Google reCAPTCHA | Necessary | window.grecaptcha |
| Pinterest Tag | Marketing | window.pintrk |
| Snapchat Pixel | Marketing | window.snaptr |
| Criteo | Marketing | window.criteo_q |
| Bing UET | Marketing | window.uetq |
| Mixpanel | Analytics | window.mixpanel |
| Amplitude | Analytics | window.amplitude |
| LiveChat | Preferences | window.LiveChatWidget |
| Drift | Preferences | window.drift |
| Reddit Pixel | Marketing | window.rdt |
| FullStory | Analytics | window.FS |
| Tawk.to | Preferences | window.Tawk_API |
| Klaviyo | Marketing | window._learnq |
| Optimizely | Analytics | window.optimizely |
| Taboola | Marketing | window._taboola |
| Outbrain | Marketing | window.obApi |
| Mouseflow | Analytics | window.mouseflow |
| Crazy Egg | Analytics | window.CE2 |
| AdRoll | Marketing | window.__adroll |
| Freshchat | Preferences | window.fcWidget |
| ActiveCampaign | Marketing | window.vgo |
| Shopify Analytics | Analytics | window.ShopifyAnalytics |
| Quora Pixel | Marketing | window.qp |
| Mailchimp | Marketing | window.mc |
| Salesforce Pardot | Marketing | window.piAId |
| Marketo Munchkin | Marketing | window.Munchkin |
| Heap Analytics | Analytics | window.heap |
| PostHog | Analytics | window.posthog |
| Google Maps | Preferences | script src maps.googleapis.com |
07 Mechanics
Global Privacy Control & Do Not Sell
Beexy Consent is the only GTM consent template that natively supports the Global Privacy Control (GPC) browser signal and the "Do Not Sell or Share My Personal Information" mechanism required by US state privacy laws.
Global Privacy Control (GPC)
- Detects
navigator.globalPrivacyControl === trueat banner init - In
opt-out-gpcregions: automatically denies Analytics and Marketing - GPC state is included in all consent events and server-side log payloads
- Legally required in: CA, CO, CT, DE, MD, MN, MT, NE, NH, OR, TX
Do Not Sell or Share My Personal Information (DNSMPI)
- Plain-text opt-out link shown in all 3 banner tabs (Consent, Details, About)
- Only visible to visitors in
opt-out-gpcregions - Clicking immediately denies Analytics plus Marketing and fires
consent_outcome: 'do_not_sell'
08 Mechanics
Accessibility, WCAG 2.2 AA
10 out of 11 commercial CMPs fail WCAG 2.2 AA. Beexy Consent passes.
Compliant since v1.0.25. Also satisfies the European Accessibility Act (EAA), in force June 28, 2025.
Keyboard navigation
| Key | Action | WCAG criterion |
|---|---|---|
Tab / Shift+Tab | Cycle focus within banner (focus trap) | 2.1.2 |
Enter / Space | Activate focused button or toggle | 2.1.1 |
Escape | Close banner (opt-out regions only, disabled in opt-in per GDPR) | 2.1.1 |
← / → Arrow keys | Navigate between Consent / Details / About tabs | ARIA tablist pattern |
Tab / Shift+TabEnter / SpaceEscape← / → Arrow keysScreen reader support
| Implementation | WCAG criterion |
|---|---|
role="dialog" + aria-modal="true" on banner | 1.3.1 |
aria-live="polite" region announces banner title on open | 4.1.3 |
inert attribute on all page content behind banner | 1.3.1 |
role="tablist", role="tab", role="tabpanel" on 3-tab interface | ARIA pattern |
role="switch" + aria-checked on consent toggles | 4.1.2 |
| Focus enters Consent tab on open; returns to previously focused element on close | 2.4.3 |
3px :focus-visible outline on all interactive elements | 2.4.7 |
Shell-level focus ring (3px primary-color outline, offset 0, flush against the banner border) painted whenever the banner first opens; persists through mouse clicks; yields to the inner :focus-visible ring once the visitor presses Tab / Shift+Tab / arrow. New in v1.4.0 (BACKLOG #20). | 2.4.7 + 2.4.13 (AAA) |
.beexy-consent-sr-only class for visually-hidden screen-reader text | 1.3.1 |
role="dialog" + aria-modal="true" on banneraria-live="polite" region announces banner title on openinert attribute on all page content behind bannerrole="tablist", role="tab", role="tabpanel" on 3-tab interfacerole="switch" + aria-checked on consent toggles:focus-visible outline on all interactive elements:focus-visible ring once the visitor presses Tab / Shift+Tab / arrow. New in v1.4.0 (BACKLOG #20)..beexy-consent-sr-only class for visually-hidden screen-reader text09 Mechanics
Automatic Geo-Detection
Beexy Consent automatically determines each visitor's jurisdiction and applies the correct consent model. No manual country lists required.
Detection chain (in priority order)
window.beexyConsentRegion: manual override (e.g. for testing)beexy_geocookie: 30-day cached result from previous detection- Cloudflare Worker at
beexy-geo.voxxycreativelab.workers.dev: real-time IP-based detection 'unknown'fallback → opt-in model (strictest)
Granularity
- US state-level: Distinguishes all 11 GPC-required states from general US
- Canadian province-level: Distinguishes Quebec (opt-in) from rest of Canada (opt-out)
- EU/EEA member state: France gets 182-day cookie cap; Germany's X button is hidden
Geo cookie: beexy_geo, 30-day TTL. Prevents repeated geo API calls on subsequent page loads.
Segment 03 / 03
Integration
Pick a tier, import the template, wire the fields, ship. This segment covers the setup surface: what's in each tier, every GTM field, the banner UI, the dataLayer events, the JavaScript API, and how the assets are stored and served.
10 Integration
Product Tiers
Three tiers, three separate .tpl files. No runtime license key. Features are enforced by the template itself.
- All compliance features
- Unlimited installs
- 143+ regions, 33 languages, WCAG 2.2 AA
- Google Consent Mode v2 (Advanced)
- GPC + DNSMPI
- Cookie auto-detection
- Consent logging endpoint
- 6 GTM fields
- 15 test scenarios
- Branding locked to Voxxy defaults
- No color/font/style customization
- Everything in Basic, plus:
- Unlimited installs
- Full color system (4 brand colors)
- Widget color control (2 colors)
- Button style (filled / outline / bordered)
- Corner style (rounded / square / pill)
- Border width control
- Surface intensity control
- Custom font URL + font family name (v1.2.1+)
- Client logo (top-left)
- Cookie declarations table
- Language override
- Widget position (left / right)
- Overlay toggle
- Privacy-page suppression (v1.2.0+, default ON)
- Banner density preset (v1.3.0+, default Standard)
- Mobile banner density preset (v1.5.0+, default Standard)
- Custom cookies (SIMPLE_TABLE, v1.4.0+)
- 27 GTM fields
- 26 test scenarios
- Monochrome Beexy badge (not removable)
- Everything in Pro, plus:
- Unlimited client implementations
- Agency logo replaces Beexy badge
- Agency URL on badge link
- Custom widget logo
- Full white-label
- 30 GTM fields
- 28 test scenarios
The Agency tier permits unlimited client implementations as part of the agency's own services. It does not permit standalone resale of the template.
11 Integration
GTM Template Setup
Import the template file directly into your GTM container as a custom template. No code editing required.
Installation (3 steps)
- Import the Beexy Consent template (.tpl file) into GTM as a custom template
- Configure fields: set Privacy Policy URL and Data Controller Name (required), plus any optional branding/consent fields
- Publish the GTM container
Required fields (all tiers)
| Field | Description |
|---|---|
privacyUrl | URL of your privacy policy page |
dataController | Legal name of the data controller |
privacyUrldataController| Field | Group | Basic | Pro | Agency |
|---|---|---|---|---|
privacyUrl | Legal | ✓ | ✓ | ✓ |
dataController | Legal | ✓ | ✓ | ✓ |
waitForUpdate | Consent Mode | ✓ | ✓ | ✓ |
urlPassthrough | Consent Mode | ✓ | ✓ | ✓ |
adsDataRedaction | Consent Mode | ✓ | ✓ | ✓ |
logEndpoint | Consent Logging | ✓ | ✓ | ✓ |
primaryColor | Branding | ✗ | ✓ | ✓ |
bgColor | Branding | ✗ | ✓ | ✓ |
textColor | Branding | ✗ | ✓ | ✓ |
buttonTextColor | Branding | ✗ | ✓ | ✓ |
widgetBgColor | Branding | ✗ | ✓ | ✓ |
widgetContentColor | Branding | ✗ | ✓ | ✓ |
logoUrl | Branding | ✗ | ✓ | ✓ |
fontUrl | Branding | ✗ | ✓ | ✓ |
fontFamily | Branding | ✗ | ✓ | ✓ |
buttonStyle | Branding | ✗ | ✓ | ✓ |
borderWidth | Branding | ✗ | ✓ | ✓ |
cornerStyle | Branding | ✗ | ✓ | ✓ |
surfaceIntensity | Branding | ✗ | ✓ | ✓ |
customCookies | Cookie Declarations | ✗ | ✓ | ✓ |
lang | Additional Settings | ✗ | ✓ | ✓ |
widgetPosition | Additional Settings | ✗ | ✓ | ✓ |
disableOverlay | Additional Settings | ✗ | ✓ | ✓ |
enableDebugLogging | Additional Settings | ✗ | ✓ | ✓ |
rootDomainOverride | Additional Settings | ✗ | ✓ | ✓ |
agencyLogoUrl | Agency Branding | ✗ | ✗ | ✓ |
agencyUrl | Agency Branding | ✗ | ✗ | ✓ |
widgetLogoUrl | Agency Branding | ✗ | ✗ | ✓ |
privacyUrldataControllerwaitForUpdateurlPassthroughadsDataRedactionlogEndpointprimaryColorbgColortextColorbuttonTextColorwidgetBgColorwidgetContentColorlogoUrlfontUrlfontFamilybuttonStyleborderWidthcornerStylesurfaceIntensitycustomCookieslangwidgetPositiondisableOverlayenableDebugLoggingrootDomainOverrideagencyLogoUrlagencyUrlwidgetLogoUrl12 Integration
Banner UI & Behavior
3-tab interface
| Tab | Contents |
|---|---|
| Consent | Category toggles, main action buttons, DNSMPI link (GPC regions) |
| Details | Per-category cookie declaration tables (auto-detected + custom) |
| About | Data controller info, privacy policy link, "Legal details" link to the product details page (v1.4.0+, all tiers, opens in a new tab), "Privacy by" badge |
Model-aware button layouts
| Model | Buttons shown | X button |
|---|---|---|
| opt-in | Allow All · Deny All · Customize | Hidden |
| opt-out | Allow All · Manage Preferences | Shown (accepts defaults) |
| opt-out-gpc | Allow All · Manage Preferences + DNSMPI link | Shown |
| none | No banner shown | N/A |
Other UI elements
- Floating re-open widget: Fixed button (left or right, configurable) that re-opens the banner after it's been dismissed
- Privacy-page suppression (Pro+, v1.2.0): When the visitor lands on the configured Privacy Policy URL, the consent popup is hidden so they can read the policy. The floating widget stays visible so consent remains reachable. Default ON for Pro and Agency. Basic tier always shows the banner. Initial page load only: SPA route changes are not detected.
- Background overlay: Semi-transparent backdrop behind banner. Toggleable via GTM field (Pro+). Page remains scrollable (no cookie wall).
- "Privacy by" badge: Basic = colored Beexy logo; Pro = monochrome Voxxy; Agency = custom agency logo
- Responsive: Adapts at desktop, tablet, mobile, and landscape breakpoints
Banner density (Pro+, v1.3.0+)
Three density presets control vertical occupancy on desktop. Selectable via the GTM SELECT field bannerDensity in the Branding > Style section.
| Preset | Banner height (Consent tab, English copy) | Width | Position vs peers |
|---|---|---|---|
| Compact | ~308px tall | 800px | Shorter than CookieBot and CookieConfirm |
| Standard (new-install default) | ~356px tall | 850px | Close to peer banner heights |
| Spacious | ~421px tall | 900px | v1.1.x / v1.2.x baseline |
Each preset scales 19 CSS tokens together: banner width, padding (large + small variants), tab sizing (margin, padding, gap), title font-size + margin-bottom, body font-size + line-height, category headers + content padding, action row padding + gap, button padding + font-size, logo cap, badge cap, content panel max-height. The About and Details panels inherit the same tokens via shared classes; nothing has to be configured separately.
Accessibility. All three presets pass WCAG 2.5.5 AAA target sizes (>= 44px) on the primary CTA buttons. Compact-preset button height measures 48px (4px AAA headroom). Width also clears the 24px AA threshold by orders of magnitude (416-422px across presets, driven by flex: 1 distributing button width within the banner).
Mobile is independent. Desktop density does not affect mobile rendering. Mobile is controlled by the separate mobileBannerDensity field, see the next subsection.
Existing-client migration. Pro and Agency clients on upgrade keep their current visuals: undefined density falls through to spacious, which matches the pre-v1.3.0 hardcoded sizing exactly. No re-consent event, no surprise visual change. Basic tier renders at spacious always (no field in Basic).
Mobile banner density (Pro+, v1.5.0+)
Three density presets control vertical occupancy on mobile viewports (below 600px wide). Selectable via the GTM SELECT field mobileBannerDensity in the Branding > Style section, directly under the desktop banner density field.
Each preset scales 19 mobile-specific CSS custom properties (--beexy-consent-md-*) together: shell margin, padding (x/y, actions bottom), title (size + margin), body (size + line-height), tab strip (margin x/y, button padding x/y, font size), action gap, buttons (padding + font-size), logo height, badge height. New-install default: standard. Existing clients on upgrade fall through to spacious (D10 contract; no re-consent event).
Approximate total height at 393x750 viewport: Compact ~290px (~39%), Standard ~360px (~48%), Spacious ~440px (~59%). All presets preserve WCAG 2.5.5 AAA touch target (44px via padding) and the EDPB equal-prominence rule (Allow and Manage buttons render at identical dimensions). The Spacious preset matches the pre-v1.5.0 rendering for rules previously set explicitly on mobile; five rules that previously inherited desktop values (header pad-y, content pad-y, tabs margin-top, tab padding) intentionally tighten by 2-3px per the spec table.
Desktop density (bannerDensity) is configured independently. A client can ship Spacious desktop and Compact mobile, etc. Above the 600px breakpoint, mobile density has no effect. The landscape emergency block (@media (max-height: 500px)) remains hardcoded and not density-aware.
Basic tier: field stripped via brandingGroup removal. Banner JS D10 fallback renders Spacious.
13 Integration
dataLayer Events
Beexy Consent fires structured dataLayer events on every consent action and on every page load for returning visitors.
Main event: cookie_consent_update
| Property | Values |
|---|---|
consentType | 'update' | 'existing' | 'auto_grant' |
consent_outcome | 'granted_all' | 'denied_all' | 'partial' | 'auto_grant' | 'existing' | 'do_not_sell' |
permissions | Object: { necessary, preferences, analytics, marketing } (booleans) |
gpcEnabled | true | false |
region | Region code string (e.g. 'DE', 'US-CA') |
consentType'update' | 'existing' | 'auto_grant'consent_outcome'granted_all' | 'denied_all' | 'partial' | 'auto_grant' | 'existing' | 'do_not_sell'permissions{ necessary, preferences, analytics, marketing } (booleans)gpcEnabledtrue | falseregion'DE', 'US-CA')Per-category events
| Event name | Fires when |
|---|---|
cookie_consent_statistics | Analytics consent is granted (new or existing) |
cookie_consent_marketing | Marketing consent is granted (new or existing) |
cookie_consent_preferences | Preferences consent is granted (new or existing) |
cookie_consent_statisticscookie_consent_marketingcookie_consent_preferencesServer-side consent logging
When a logEndpoint is configured, Beexy Consent sends a POST via navigator.sendBeacon (XHR fallback) with the following payload, providing GDPR Art. 7 consent proof:
{
"timestamp": "ISO 8601 datetime",
"action": "consent_outcome value",
"permissions": { necessary, preferences, analytics, marketing },
"bannerVersion": "1.5.0 (current BANNER_VERSION constant; cookie schema cfg.version is frozen at '1')",
"gpcEnabled": true | false,
"region": "XX",
"pageUrl": "https://..."
}
14 Integration
JavaScript API
Available as window.beexyConsentAPI once the banner script loads. Use it to integrate with custom cookie preference links, analytics conditions, or programmatic consent flows.
| Method | Returns | Description |
|---|---|---|
showBanner() | void | Re-opens the consent banner on the Consent tab |
getConsent() | { necessary, preferences, analytics, marketing } | null | Current permissions object, or null if no consent cookie exists |
getRegion() | string | Detected region code (e.g. 'DE', 'US-CA', 'unknown') |
getLanguage() | string | Resolved language code (e.g. 'nl', 'en') |
getMode() | string | Active consent model name ('opt-in' | 'opt-out' | 'opt-out-gpc' | 'none') |
isGpcEnabled() | boolean | Whether the browser's GPC signal is active |
updateConsent(permissions) | void | Programmatically update consent. Writes cookie, fires dataLayer events, calls log endpoint. |
resetConsent() | void | Deletes the consent cookie and re-opens the banner |
showBanner()voidgetConsent(){ necessary, preferences, analytics, marketing } | nullgetRegion()string'DE', 'US-CA', 'unknown')getLanguage()string'nl', 'en')getMode()string'opt-in' | 'opt-out' | 'opt-out-gpc' | 'none')isGpcEnabled()booleanupdateConsent(permissions)voidresetConsent()void15 Integration
Consent Storage & CDN
Cookie scope (cross-subdomain consent, v1.1.0)
beexy_consent and beexy_geo are written at the registrable-domain scope (e.g. .example.com, .example.co.uk). A user who consents on shop.example.com is silently recognized on blog.example.com. No second prompt. For unusual deployments (apex-only, *.pages.dev, etc.) Pro and Agency tiers can override the auto-detected root via the rootDomainOverride GTM field. Hosts where root-domain cookies don't apply (localhost, IP literals, single-label hosts) fall back to host-only.
Migration: existing visitors with the legacy host-only cookie are migrated to the root scope automatically on their next page load. No re-consent required.
Consent cookie: beexy_consent
| Property | Value |
|---|---|
| Format | JSON |
| Fields | version, permissions, explicitConsent, timestamp, region, gpcApplied |
| Default expiry | 365 days |
| France (FR) expiry | 182 days (CNIL requirement) |
| Versioned consent | Major version bump triggers re-consent from all visitors |
version, permissions, explicitConsent, timestamp, region, gpcAppliedGeo cookie: beexy_geo
Caches the detected region code for 30 days. Prevents a geo API call on every page load.
CDN delivery
All assets served via jsDelivr from the VoxxyCreativeLab/cdn-beexy-consent@v1 GitHub repository. The @v1 alias automatically serves the latest tagged release.
| Asset | URL pattern | Size |
|---|---|---|
| Banner JS | cdn.jsdelivr.net/gh/VoxxyCreativeLab/cdn-beexy-consent@v1/beexy-consent.js | ~76KB |
| Global config | cdn.jsdelivr.net/gh/VoxxyCreativeLab/cdn-beexy-consent@v1/beexy-global.json | ~8KB |
| Language files | cdn.jsdelivr.net/gh/VoxxyCreativeLab/cdn-beexy-consent@v1/lang/[code].json | ~3KB each |
cdn.jsdelivr.net/gh/VoxxyCreativeLab/cdn-beexy-consent@v1/beexy-consent.jscdn.jsdelivr.net/gh/VoxxyCreativeLab/cdn-beexy-consent@v1/beexy-global.jsoncdn.jsdelivr.net/gh/VoxxyCreativeLab/cdn-beexy-consent@v1/lang/[code].jsonReady to get consent right?
Install the template into your GTM container, set two required fields, publish. That's the whole setup.