Version 2.0.1 — March 30, 2026
New Features
- IP Anonymization — New setting to control how visitor IP addresses are stored in consent logs. Options: Anonymized (last octet removed, default), Hashed (SHA-256, irreversible), Do not store, or Full IP. Recommended setting for GDPR compliance: Anonymized.
- Privacy Notice on /consent page — Automatic privacy notice explaining what data is collected, how the IP is handled (adapts to the selected setting), and how long data is retained. References GDPR Art. 7(1).
- Setup Guide — New admin page with step-by-step instructions for setting up Google Funding Choices via AdSense or Ad Manager, and configuring the Revenue Dashboard via OAuth2. Includes direct links to Google Cloud Console, API Library and OAuth credential pages. Shows your dynamic callback URI with a copy button. Available in 8 languages (EN, DE, ES, FR, IT, NL, PL, PT).
- Publishing status reminder — Setup guide now includes a step to change the OAuth consent screen from testing to production, preventing token expiration after 7 days.
Bug Fixes
- Fixed: Database migration now ensures all required columns exist regardless of which version you upgrade from (device_type, country_code, referrer, adblock_detected)
- Fixed: Fresh installations now include all columns in the initial table creation
- Fixed: Cookie declaration page (/consent) crashed on fresh installations due to a reference to the removed Vendor repository
- Fixed: OAuth scope for Ad Manager was incorrect (admanager.report does not exist, corrected to admanager)
- Fixed: number_currency template function does not exist in XenForo, replaced with number
- Fixed: Cookie scanner now detects XenForo style_variation cookie (set without prefix)
- Fixed: Reopen consent button on /consent page now uses Google FC API (googlefc.showRevocationMessage) instead of removed custom banner JS
- Fixed: Removed reference to non-existent deb_consent_cmp.js on the /consent page
Translation System
- All 8 languages (EN, DE, ES, FR, IT, NL, PL, PT) are now automatically imported and compiled on every install and upgrade
- Translations are guaranteed to work regardless of upgrade path or version history
- Templates are automatically recompiled after phrase import to ensure correct language display
Version 2.0.0 (Patches 1 to 3)
Patch 3
- Fixed: Cookie declaration page (/consent) crashed on fresh installations due to a reference to the removed Vendor repository
Patch 2
- Fixed: Database migration now ensures all required columns exist regardless of which version you upgrade from (device_type, country_code, referrer, adblock_detected)
- Fixed: Fresh installations now include all columns in the initial table creation
Patch 1
Why this major update?
Version 1.x included a custom-built IAB TCF 2.2 consent banner with full TC String encoding, cross-frame TCF API, Google Consent Mode v2 integration and vendor management. While technically compliant and validated by external tools (Kukie.io, Consentik, IAB TCF Decoder), real-world testing revealed a significant problem: Google's ad systems (AdSense, Ad Manager, GPT) consistently delivered lower bidding rates and served more non-personalized ads (npa=1) when consent came from a third-party CMP — even with an identical TC String. This isn't a bug. It's how Google's ecosystem works. Google trusts its own CMP (Google Funding Choices, CMP ID 300) more than any third-party implementation. Rather than fighting this, v2.0.0 embraces it: Google handles the banner, we handle everything else.
What's new
- Google Funding Choices as consent provider — Google FC displays the banner and manages consent. No more custom banner.
- Analytics Dashboard — 5 KPI cards (Impressions, Accept Rate, Reject Rate, Custom Rate, Ad Blocker Rate), 30-day trend chart with week-over-week alerts, consent distribution donut chart, per-purpose acceptance rates, device breakdown, top 10 referrer sources
- Google Ad Manager Revenue Dashboard — OAuth2 integration with Google AdSense API v2. Revenue overview (Today / 7 Days / 30 Days) with page views, clicks and RPM directly in your XenForo admin panel
- Revenue Forecast — Estimated monthly revenue at your current consent rate, at 80%, 90% and 100%
- Consent Rate by Device & Country — Pulled from Google Ad Manager reporting API
- Ad Blocker Detection — Client-side detection of blocked ad scripts with daily tracking and dashboard percentage
- Cookie Scanner — Hybrid scan (server-side HTTP headers + client-side JavaScript cookies) with integrated Open Cookie Database (2200+ known cookies) and automatic XenForo cookie prefix detection
- Consent Rate Email Alerts — Automatic daily check against a configurable threshold. Get notified when your accept rate drops below target
- GDPR Compliance Report — CSV export of all consent data for audits (30-day report with daily breakdown)
- 9-Point Configuration Validator — Checks GCM defaults, tracking script, footer link, TC String format, API connection and more
- Scheduled Re-Consent — Configurable interval to automatically re-trigger the consent banner (GDPR recommends every 12 months)
- Manual API Sync — Instant data refresh button in the dashboard, plus automatic cron sync with configurable cache TTL
- Bot Filtering — Intelligent exclusion of Googlebot, Bingbot, crawlers, API clients and headless browsers from all tracking
What changed
- Google Consent Mode v2 defaults are now injected automatically in <head> before any Google tag
- Google Publisher Tag (GPT) auto-loads for Ad Manager users
- Consent tracking now uses Google's native __tcfapi and googlefc.callbackQueue APIs
- User and page criteria now control Google FC via googlefc.controlledMessagingFunction
- Footer link triggers googlefc.showRevocationMessage() for re-consent
- Settings simplified from 7 tabs to 4 (General, Google API, User Criteria, Page Criteria)
What was removed
- Custom DEBtech consent banner (3-layer system, colors, logo, position, animations)
- Built-in TC String encoder/decoder
- Built-in __tcfapi JavaScript stub
- Banner design settings (colors, position, custom CSS)
- Purposes configuration tab (Google FC manages this)
- Google Consent Mode mapping tab (Google FC handles this automatically)
- Vendor management UI (GVL import, AC import, vendor activation)
Version 1.0.4
New Features — Google Revenue Fix
- Google Additional Consent (AC) Spec: addtlConsent cookie is now set alongside euconsent-v2 — 199 Google AC vendors (Google #229, Xandr #80, Index Exchange #126, Criteo #154, Amazon #7, LiveRamp #12 etc.) can now bid in auctions
- GVL Import: Now also fetches Google's commonly-used-providers.json and stores google_ac_id per vendor — fully automatic, no manual setup
- __tcfapiLocator iframe: IAB-required cross-frame locator so iframed ad scripts (Prebid, Google GPT, etc.) can discover the CMP
- postMessage handler: Full cross-frame TCF API — ad iframes can query consent via postMessage (both in head stub and CMP JS)
- ping command in stub: Head stub now responds to ping immediately (before CMP loads) with cmpStatus: 'stub'
New Features — Dashboard
- Re-request Consent: Dashboard button to invalidate all existing consents — increases consent version, all visitors see the banner again on next visit
- Reset Statistics: Dashboard button to delete all consent stats and logs with one click
- Consent version display: Shows current consent version in the dashboard Consent Management section
New Features — Validator
Validator extended from 8 to
12 checks with 4 new Google integration tests:
- __tcfapiLocator iframe present
- Cross-frame postMessage handler active
- Google Additional Consent (AC) cookie support
- Active Google AC vendors count
Bug Fixes
- Fixed 4 missing phrase definitions (deb_consent_vendor_special_purposes, _explain, deb_consent_vendor_features, _explain) — previously showed raw phrase keys in vendor edit form
- Fixed __tcfapi getTCData response now includes addtlConsent field for programmatic access
Technical
- New DB column: google_ac_id (UINT, nullable) on xf_deb_consent_vendor
- New config key: consent_version in xf_deb_consent_config
- Head stub rewritten: TCF API stub with ping, __tcfapiLocator iframe, postMessage handler
- CMP JS: restoreConsent() now checks cmpVersion against consentVersion for re-consent
- CMP JS: persistConsent() encodes current consentVersion as cmpVersion in TC string
- New Repository method: Vendor::findByAcId()