Add the airgap.js loader snippet to the <head> of every page, referencing your Transcend-hosted bundle URL with your organization's bundle key as a query parameter.
Configure consent purposes in the Transcend dashboard (e.g., Analytics, Advertising) and map each third-party tag to a purpose; airgap.js will block those tags from loading until the user grants consent.
Register a consent-change listener: transcend.on('consent', (consent) => { /* update downstream */ }); use the consent object to drive gtag('consent', 'update', {ad_storage: ..., analytics_storage: ..., ad_user_data: ..., ad_personalization: ...}) for Google Consent Mode v2.
Set default consent states before user interaction by calling gtag('consent', 'default', {ad_storage: 'denied', analytics_storage: 'denied', ad_user_data: 'denied', ad_personalization: 'denied', wait_for_update: 500}) in a script tag before the Google tag loads.
Verify that airgap.js fires the IAB TCF consent string into the __tcfapi stub so TCF-compliant vendor tags receive the correct signal.
Test with browser devtools: confirm blocked tags show a 'blocked by airgap' network entry before consent, and fire normally after consent is granted.
Known gotchas
Google Consent Mode v2 requires all four parameters (ad_storage, analytics_storage, ad_user_data, ad_personalization) to be set; omitting ad_user_data or ad_personalization prevents remarketing audience building for EEA users as of March 2024.
airgap.js must load synchronously before any third-party scripts; placing it in an async or deferred script tag allows trackers to fire before consent is evaluated.
Cross-domain consent sync requires an additional Transcend configuration step; without it, consent is not shared between subdomains or related properties.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp