<TrackbridgeProvider>
The root client-side wiring for a Next.js (App Router) integration. Renders three things:
- A
beforeInteractive<Script>that pushesgtag('consent', 'default', { ... })so Consent Mode v2 takes effect from the very first gtag call. - An
afterInteractive<Script>that loadshttps://www.googletagmanager.com/gtag/js?id=<adsConversionId>. - A React context provider holding a
BrowserTrackerinstance created once viauseRef.
Drop it into app/layout.tsx and stop thinking about gtag-loading order.
Signature
Section titled “Signature”import { TrackbridgeProvider } from '@trackbridge/sdk/next';
<TrackbridgeProvider config={config} consentDefaults={consentDefaults}> {children}</TrackbridgeProvider>;type TrackbridgeProviderProps = { config: BrowserTrackerConfig; consentDefaults?: Partial<ConsentState>; children: ReactNode;};| Prop | Required | Notes |
|---|---|---|
config | yes | The same BrowserTrackerConfig accepted by createBrowserTracker. |
consentDefaults | no | Per-field overrides for the all-denied default Consent Mode v2 snippet. Useful for non-EEA regions where you want 'granted' defaults. Merged over { ad_storage: 'denied', ad_user_data: 'denied', ad_personalization: 'denied', analytics_storage: 'denied' }. |
children | yes | Your app. |
Behavior
Section titled “Behavior”- The default
gtag('consent', 'default', ...)snippet emits all four signals as'denied', not'unknown'. Defaults exist for the gap before the CMP loads; treating that gap as denied is the GDPR-safe choice. - The
gtag.jsloader URL usesconfig.adsConversionIdasid=(one gtag.js script handles multipleconfigcalls for both Ads and GA4). - The
BrowserTrackeris created insideuseRef, so React strict-mode double-renders don’t re-create it. <TrackbridgeProvider>is not marked'use client'itself — the innerTrackbridgeContextProvideris. The provider component is server-renderable, only the context bridge is client-only.
Example
Section titled “Example”import { TrackbridgeProvider, TrackbridgePageViews } from '@trackbridge/sdk/next';
export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html> <body> <TrackbridgeProvider config={{ adsConversionId: process.env.NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_ID!, ga4MeasurementId: process.env.NEXT_PUBLIC_GA4_MEASUREMENT_ID!, consentMode: 'v2', conversionLabels: { purchase: process.env.NEXT_PUBLIC_GOOGLE_ADS_PURCHASE_LABEL, }, }} > <TrackbridgePageViews /> {children} </TrackbridgeProvider> </body> </html> );}For a non-EEA deployment that wants permissive defaults:
<TrackbridgeProvider config={config} consentDefaults={{ ad_storage: 'granted', ad_user_data: 'granted', ad_personalization: 'granted', analytics_storage: 'granted', }}>See also
Section titled “See also”<TrackbridgePageViews />— companion component for SPA navigations.useTracker()— read the tracker from any client component.- Next.js App Router setup guide
- Consent Mode v2