@c15t/scripts 3.0.0-alpha.1 → 3.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +129 -59
- package/README.md +8 -29
- package/SKILL.md +33 -0
- package/dist/adobe-analytics.js +2 -0
- package/dist/ahrefs-analytics.js +2 -0
- package/dist/amplitude.js +2 -0
- package/dist/clearbit.js +2 -0
- package/dist/cloudflare-web-analytics.js +2 -0
- package/dist/cloudflare-zaraz.js +2 -0
- package/dist/crisp.js +2 -0
- package/dist/databuddy.js +2 -0
- package/dist/e2e-test-utils.js +2 -137
- package/dist/engine/compile.js +2 -89
- package/dist/engine/runtime.js +2 -448
- package/dist/events.js +2 -0
- package/dist/fathom-analytics.js +2 -0
- package/dist/front-chat.js +2 -0
- package/dist/google-tag-manager.js +2 -0
- package/dist/google-tag.js +2 -0
- package/dist/heap.js +2 -0
- package/dist/hightouch.js +2 -0
- package/dist/hotjar.js +2 -0
- package/dist/intercom.js +2 -0
- package/dist/klaviyo.js +2 -0
- package/dist/linkedin-insights.js +2 -0
- package/dist/logrocket.js +2 -0
- package/dist/matomo-analytics.js +2 -0
- package/dist/meta-pixel.js +2 -0
- package/dist/microsoft-clarity.js +2 -0
- package/dist/microsoft-uet.js +2 -0
- package/dist/mixpanel-analytics.js +2 -0
- package/dist/one-dollar-stats.js +2 -0
- package/dist/openai-pixel.js +2 -0
- package/dist/pinterest-tag.js +2 -0
- package/dist/pirsch.js +2 -0
- package/dist/plausible-analytics.js +2 -0
- package/dist/posthog.js +2 -0
- package/dist/promptwatch.js +2 -0
- package/dist/reddit-pixel.js +2 -0
- package/dist/registry.js +2 -392
- package/dist/resolve.js +2 -33
- package/dist/rudderstack.js +2 -0
- package/dist/rybbit-analytics.js +2 -0
- package/dist/segment.js +2 -0
- package/dist/snapchat-pixel.js +2 -0
- package/dist/tiktok-pixel.js +2 -0
- package/dist/types.js +2 -16
- package/dist/umami-analytics.js +2 -0
- package/dist/vendors/_shared/attributes.js +2 -14
- package/dist/vendors/_shared/google-consent.js +2 -27
- package/dist/vendors/_shared/install-builders.js +2 -21
- package/dist/vendors/_shared/required-id.js +2 -0
- package/dist/vendors/_shared/script-url.js +2 -28
- package/dist/vendors/ads-and-pixels/linkedin-insights.js +2 -48
- package/dist/vendors/ads-and-pixels/meta-pixel.js +2 -153
- package/dist/vendors/ads-and-pixels/microsoft-uet.js +2 -110
- package/dist/vendors/ads-and-pixels/openai-pixel.js +2 -88
- package/dist/vendors/ads-and-pixels/pinterest-tag.js +2 -0
- package/dist/vendors/ads-and-pixels/reddit-pixel.js +2 -107
- package/dist/vendors/ads-and-pixels/snapchat-pixel.js +2 -87
- package/dist/vendors/ads-and-pixels/tiktok-pixel.js +2 -89
- package/dist/vendors/ads-and-pixels/x-pixel.js +2 -48
- package/dist/vendors/analytics/adobe-analytics.js +2 -49
- package/dist/vendors/analytics/ahrefs-analytics.js +2 -27
- package/dist/vendors/analytics/amplitude.js +2 -134
- package/dist/vendors/analytics/clearbit.js +2 -28
- package/dist/vendors/analytics/cloudflare-web-analytics.js +2 -32
- package/dist/vendors/analytics/databuddy.js +2 -103
- package/dist/vendors/analytics/fathom-analytics.js +2 -35
- package/dist/vendors/analytics/google-tag.js +2 -66
- package/dist/vendors/analytics/heap.js +2 -134
- package/dist/vendors/analytics/hightouch.js +2 -109
- package/dist/vendors/analytics/hotjar.js +2 -44
- package/dist/vendors/analytics/logrocket.js +2 -58
- package/dist/vendors/analytics/matomo-analytics.js +2 -191
- package/dist/vendors/analytics/microsoft-clarity.js +2 -100
- package/dist/vendors/analytics/mixpanel-analytics.js +2 -93
- package/dist/vendors/analytics/one-dollar-stats.js +2 -0
- package/dist/vendors/analytics/pirsch.js +2 -67
- package/dist/vendors/analytics/plausible-analytics.js +2 -81
- package/dist/vendors/analytics/posthog.js +2 -200
- package/dist/vendors/analytics/promptwatch.js +2 -29
- package/dist/vendors/analytics/rudderstack.js +2 -183
- package/dist/vendors/analytics/rybbit-analytics.js +2 -63
- package/dist/vendors/analytics/segment.js +2 -56
- package/dist/vendors/analytics/umami-analytics.js +2 -39
- package/dist/vendors/analytics/vercel-analytics.js +2 -53
- package/dist/vendors/email-and-sms/klaviyo.js +2 -0
- package/dist/vendors/functional/crisp.js +2 -100
- package/dist/vendors/functional/front-chat.js +2 -0
- package/dist/vendors/functional/intercom.js +2 -45
- package/dist/vendors/tag-managers/cloudflare-zaraz.js +2 -98
- package/dist/vendors/tag-managers/google-tag-manager.js +2 -59
- package/dist/vercel-analytics.js +2 -0
- package/dist/x-pixel.js +2 -0
- package/dist-types/adobe-analytics.d.ts +2 -0
- package/dist-types/ahrefs-analytics.d.ts +2 -0
- package/dist-types/amplitude.d.ts +2 -0
- package/dist-types/clearbit.d.ts +2 -0
- package/dist-types/cloudflare-web-analytics.d.ts +2 -0
- package/dist-types/cloudflare-zaraz.d.ts +2 -0
- package/dist-types/crisp.d.ts +2 -0
- package/dist-types/databuddy.d.ts +2 -0
- package/dist-types/e2e-test-utils.d.ts +2 -0
- package/dist-types/engine/compile.d.ts +2 -3
- package/dist-types/engine/runtime.d.ts +2 -3
- package/dist-types/events.d.ts +2 -0
- package/dist-types/fathom-analytics.d.ts +2 -0
- package/dist-types/front-chat.d.ts +2 -0
- package/dist-types/google-tag-manager.d.ts +2 -0
- package/dist-types/google-tag.d.ts +2 -0
- package/dist-types/heap.d.ts +2 -0
- package/dist-types/hightouch.d.ts +2 -0
- package/dist-types/hotjar.d.ts +2 -0
- package/dist-types/intercom.d.ts +2 -0
- package/dist-types/klaviyo.d.ts +2 -0
- package/dist-types/linkedin-insights.d.ts +2 -0
- package/dist-types/logrocket.d.ts +2 -0
- package/dist-types/matomo-analytics.d.ts +2 -0
- package/dist-types/meta-pixel.d.ts +2 -0
- package/dist-types/microsoft-clarity.d.ts +2 -0
- package/dist-types/microsoft-uet.d.ts +2 -0
- package/dist-types/mixpanel-analytics.d.ts +2 -0
- package/dist-types/one-dollar-stats.d.ts +2 -0
- package/dist-types/openai-pixel.d.ts +2 -0
- package/dist-types/pinterest-tag.d.ts +2 -0
- package/dist-types/pirsch.d.ts +2 -0
- package/dist-types/plausible-analytics.d.ts +2 -0
- package/dist-types/posthog.d.ts +2 -0
- package/dist-types/promptwatch.d.ts +2 -0
- package/dist-types/reddit-pixel.d.ts +2 -0
- package/dist-types/registry.d.ts +2 -458
- package/dist-types/resolve.d.ts +2 -9
- package/dist-types/rudderstack.d.ts +2 -0
- package/dist-types/rybbit-analytics.d.ts +2 -0
- package/dist-types/segment.d.ts +2 -0
- package/dist-types/snapchat-pixel.d.ts +2 -0
- package/dist-types/tiktok-pixel.d.ts +2 -0
- package/dist-types/types.d.ts +2 -314
- package/dist-types/umami-analytics.d.ts +2 -0
- package/dist-types/vendors/_shared/attributes.d.ts +2 -35
- package/dist-types/vendors/_shared/google-consent.d.ts +2 -47
- package/dist-types/vendors/_shared/install-builders.d.ts +2 -30
- package/dist-types/vendors/_shared/required-id.d.ts +2 -0
- package/dist-types/vendors/_shared/script-url.d.ts +2 -75
- package/dist-types/vendors/ads-and-pixels/linkedin-insights.d.ts +2 -92
- package/dist-types/vendors/ads-and-pixels/meta-pixel.d.ts +2 -289
- package/dist-types/vendors/ads-and-pixels/microsoft-uet.d.ts +2 -105
- package/dist-types/vendors/ads-and-pixels/openai-pixel.d.ts +2 -211
- package/dist-types/vendors/ads-and-pixels/pinterest-tag.d.ts +2 -0
- package/dist-types/vendors/ads-and-pixels/reddit-pixel.d.ts +2 -210
- package/dist-types/vendors/ads-and-pixels/snapchat-pixel.d.ts +2 -171
- package/dist-types/vendors/ads-and-pixels/tiktok-pixel.d.ts +2 -106
- package/dist-types/vendors/ads-and-pixels/x-pixel.d.ts +2 -183
- package/dist-types/vendors/analytics/adobe-analytics.d.ts +2 -75
- package/dist-types/vendors/analytics/ahrefs-analytics.d.ts +2 -62
- package/dist-types/vendors/analytics/amplitude.d.ts +2 -234
- package/dist-types/vendors/analytics/clearbit.d.ts +2 -60
- package/dist-types/vendors/analytics/cloudflare-web-analytics.d.ts +2 -67
- package/dist-types/vendors/analytics/databuddy.d.ts +2 -147
- package/dist-types/vendors/analytics/fathom-analytics.d.ts +2 -90
- package/dist-types/vendors/analytics/google-tag.d.ts +2 -93
- package/dist-types/vendors/analytics/heap.d.ts +2 -316
- package/dist-types/vendors/analytics/hightouch.d.ts +2 -285
- package/dist-types/vendors/analytics/hotjar.d.ts +2 -73
- package/dist-types/vendors/analytics/logrocket.d.ts +2 -101
- package/dist-types/vendors/analytics/matomo-analytics.d.ts +2 -41
- package/dist-types/vendors/analytics/microsoft-clarity.d.ts +2 -97
- package/dist-types/vendors/analytics/mixpanel-analytics.d.ts +2 -113
- package/dist-types/vendors/analytics/one-dollar-stats.d.ts +2 -0
- package/dist-types/vendors/analytics/pirsch.d.ts +2 -96
- package/dist-types/vendors/analytics/plausible-analytics.d.ts +2 -122
- package/dist-types/vendors/analytics/posthog.d.ts +2 -175
- package/dist-types/vendors/analytics/promptwatch.d.ts +2 -36
- package/dist-types/vendors/analytics/rudderstack.d.ts +2 -330
- package/dist-types/vendors/analytics/rybbit-analytics.d.ts +2 -82
- package/dist-types/vendors/analytics/segment.d.ts +2 -158
- package/dist-types/vendors/analytics/umami-analytics.d.ts +2 -93
- package/dist-types/vendors/analytics/vercel-analytics.d.ts +2 -66
- package/dist-types/vendors/email-and-sms/klaviyo.d.ts +2 -0
- package/dist-types/vendors/functional/crisp.d.ts +2 -78
- package/dist-types/vendors/functional/front-chat.d.ts +2 -0
- package/dist-types/vendors/functional/intercom.d.ts +2 -135
- package/dist-types/vendors/tag-managers/cloudflare-zaraz.d.ts +2 -39
- package/dist-types/vendors/tag-managers/google-tag-manager.d.ts +2 -94
- package/dist-types/vercel-analytics.d.ts +2 -0
- package/dist-types/x-pixel.d.ts +2 -0
- package/docs/README.md +129 -59
- package/docs/assets/v3/bottom-bar.png +0 -0
- package/docs/assets/v3/brand-card.png +0 -0
- package/docs/assets/v3/brand-preferences.png +0 -0
- package/docs/assets/v3/choice-wall.png +0 -0
- package/docs/assets/v3/headless-bar-html.png +0 -0
- package/docs/assets/v3/headless-bar-mobile.png +0 -0
- package/docs/assets/v3/headless-bar.png +0 -0
- package/docs/assets/v3/slim-bar.png +0 -0
- package/docs/concepts/choose-your-setup.md +87 -0
- package/docs/concepts/consent-categories.md +84 -0
- package/docs/concepts/consent-state.md +357 -0
- package/docs/{guides → concepts}/data-fetching.md +31 -27
- package/docs/concepts/how-consent-works.md +123 -0
- package/docs/concepts/policies.md +71 -0
- package/docs/customization/class-names.md +202 -0
- package/docs/customization/dark-mode.md +157 -0
- package/docs/customization/motion.md +119 -0
- package/docs/customization/overview.md +67 -33
- package/docs/customization/recipes.md +839 -47
- package/docs/customization/slots.md +216 -35
- package/docs/customization/stylesheets.md +147 -0
- package/docs/customization/tailwind.md +842 -0
- package/docs/customization/tokens.md +166 -36
- package/docs/customization/translations.md +61 -3
- package/docs/frameworks/astro/embeds.md +160 -0
- package/docs/frameworks/astro/network-blocker.md +86 -0
- package/docs/frameworks/astro/scripts.md +146 -0
- package/docs/frameworks/html/embeds.md +142 -0
- package/docs/frameworks/html/network-blocker.md +105 -0
- package/docs/frameworks/html/scripts.md +164 -0
- package/docs/frameworks/javascript/scripts.md +119 -0
- package/docs/frameworks/next/embeds.md +90 -0
- package/docs/frameworks/next/network-blocker.md +153 -0
- package/docs/frameworks/next/scripts.md +196 -0
- package/docs/frameworks/nuxt/embeds.md +81 -0
- package/docs/frameworks/nuxt/network-blocker.md +97 -0
- package/docs/frameworks/nuxt/scripts.md +89 -0
- package/docs/frameworks/react/embeds.md +89 -0
- package/docs/frameworks/react/network-blocker.md +140 -0
- package/docs/frameworks/react/scripts.md +115 -0
- package/docs/frameworks/svelte/embeds.md +96 -0
- package/docs/frameworks/svelte/network-blocker.md +141 -0
- package/docs/frameworks/svelte/scripts.md +137 -0
- package/docs/frameworks/sveltekit/embeds.md +103 -0
- package/docs/frameworks/sveltekit/network-blocker.md +149 -0
- package/docs/frameworks/sveltekit/scripts.md +141 -0
- package/docs/frameworks/tanstack-start/embeds.md +96 -0
- package/docs/frameworks/tanstack-start/network-blocker.md +145 -0
- package/docs/frameworks/tanstack-start/scripts.md +103 -0
- package/docs/frameworks/vue/embeds.md +84 -0
- package/docs/frameworks/vue/network-blocker.md +99 -0
- package/docs/frameworks/vue/scripts.md +93 -0
- package/docs/guides/banner-experiments.md +654 -0
- package/docs/guides/troubleshooting.md +120 -47
- package/docs/guides/verify-consent.md +81 -49
- package/docs/integrations/adobe-analytics.md +168 -160
- package/docs/integrations/ahrefs-analytics.md +153 -155
- package/docs/integrations/amplitude.md +163 -157
- package/docs/integrations/building-integrations.md +136 -37
- package/docs/integrations/clearbit.md +155 -155
- package/docs/integrations/cloudflare-web-analytics.md +157 -157
- package/docs/integrations/cloudflare-zaraz.md +210 -262
- package/docs/integrations/crisp.md +165 -159
- package/docs/integrations/databuddy.md +158 -174
- package/docs/integrations/fathom-analytics.md +159 -157
- package/docs/integrations/front-chat.md +322 -0
- package/docs/integrations/google-maps.md +119 -84
- package/docs/integrations/google-tag-manager.md +179 -164
- package/docs/integrations/google-tag.md +164 -161
- package/docs/integrations/heap.md +164 -156
- package/docs/integrations/hightouch.md +162 -158
- package/docs/integrations/hotjar.md +160 -156
- package/docs/integrations/intercom.md +184 -154
- package/docs/integrations/klaviyo.md +486 -0
- package/docs/integrations/linkedin-insights.md +175 -151
- package/docs/integrations/logrocket.md +161 -157
- package/docs/integrations/matomo-analytics.md +189 -179
- package/docs/integrations/meta-pixel.md +189 -151
- package/docs/integrations/microsoft-clarity.md +164 -156
- package/docs/integrations/microsoft-uet.md +149 -155
- package/docs/integrations/mixpanel-analytics.md +156 -161
- package/docs/integrations/one-dollar-stats.md +306 -0
- package/docs/integrations/openai-pixel.md +205 -302
- package/docs/integrations/overview.md +143 -83
- package/docs/integrations/pinterest-tag.md +329 -0
- package/docs/integrations/pirsch.md +170 -160
- package/docs/integrations/plausible-analytics.md +173 -159
- package/docs/integrations/posthog.md +227 -242
- package/docs/integrations/promptwatch.md +155 -155
- package/docs/integrations/reddit-pixel.md +186 -158
- package/docs/integrations/rudderstack.md +202 -187
- package/docs/integrations/rybbit-analytics.md +172 -161
- package/docs/integrations/segment.md +183 -155
- package/docs/integrations/snapchat-pixel.md +187 -157
- package/docs/integrations/tiktok-pixel.md +172 -151
- package/docs/integrations/umami-analytics.md +164 -159
- package/docs/integrations/vercel-analytics.md +167 -158
- package/docs/integrations/x-pixel.md +177 -151
- package/docs/integrations/youtube.md +122 -87
- package/docs/upgrade-v3.md +490 -354
- package/package.json +12 -236
- package/dist-types/__tests__/helpers.d.ts +0 -141
- package/docs/assets/v3/brand-bar.png +0 -0
- package/docs/assets/v3/mobile-card.png +0 -0
- package/docs/assets/v3/preferences.png +0 -0
- package/docs/frameworks/javascript/script-loader.md +0 -94
- package/docs/frameworks/next/script-loader.md +0 -210
- package/docs/frameworks/react/script-loader.md +0 -63
- package/docs/guides/consent-state.md +0 -60
- package/docs/guides/deployment-modes.md +0 -75
- package/docs/integrations/clear-on-revocation.md +0 -167
- package/docs/integrations/granular-consent.md +0 -208
|
@@ -1,38 +1,43 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Google Tag Manager
|
|
3
|
-
description: Load
|
|
3
|
+
description: Load a Google Tag Manager container with c15t Consent Mode v2
|
|
4
|
+
signals, configure consent checks inside the container, and verify both in
|
|
5
|
+
DevTools.
|
|
6
|
+
icon: google-tag-manager
|
|
4
7
|
group: integrations
|
|
5
8
|
---
|
|
6
9
|
|
|
7
|
-
##
|
|
10
|
+
## Configure Google Tag Manager
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
|
14
|
-
|
|
|
12
|
+
Copy the container ID, which starts with `GTM-`, from your GTM workspace.
|
|
13
|
+
Remove the existing GTM snippet, its `<noscript>` iframe and any framework
|
|
14
|
+
plugin that loads the same container.
|
|
15
|
+
|
|
16
|
+
| Package manager | Command |
|
|
17
|
+
| :-------------- | :------------------------------------- |
|
|
18
|
+
| npm | `npm install @c15t/integrations@alpha` |
|
|
19
|
+
| pnpm | `pnpm add @c15t/integrations@alpha` |
|
|
20
|
+
| yarn | `yarn add @c15t/integrations@alpha` |
|
|
21
|
+
| bun | `bun add @c15t/integrations@alpha` |
|
|
15
22
|
|
|
16
23
|
```ts title="src/consent-scripts.ts"
|
|
17
|
-
import { googleTagManager } from '@c15t/
|
|
24
|
+
import { googleTagManager } from '@c15t/integrations/google-tag-manager';
|
|
18
25
|
|
|
19
26
|
export const scripts = [googleTagManager({ id: 'GTM-XXXXXXX' })];
|
|
20
27
|
```
|
|
21
28
|
|
|
22
|
-
Replace the container ID and pass `scripts` to your existing provider options.
|
|
23
|
-
Remove the previous GTM snippet and any duplicate framework integration. The
|
|
24
|
-
helper sends a `consent-update` event after consent changes; `updateEventName`
|
|
25
|
-
customizes that event name.
|
|
26
|
-
|
|
27
29
|
## Register the scripts
|
|
28
30
|
|
|
29
31
|
Complete your [framework quickstart](https://c15t.com/docs/frameworks) first. Keep its Inth
|
|
30
32
|
endpoint, policy, styles and consent UI. Remove the vendor's original script,
|
|
31
|
-
SDK initializer or tag-manager entry so
|
|
33
|
+
SDK initializer or tag-manager entry, so the vendor loads only through c15t.
|
|
32
34
|
|
|
33
|
-
The
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
|
|
36
|
+
quickstart already created a scripts file, such as `lib/scripts.ts` in the
|
|
37
|
+
Next.js guide, add the helper to that array instead of creating a second file.
|
|
38
|
+
The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
|
|
39
|
+
point for your framework below. These are edits to that provider, not a second
|
|
40
|
+
provider.
|
|
36
41
|
|
|
37
42
|
**Next.js**
|
|
38
43
|
|
|
@@ -53,158 +58,106 @@ router guide. Its manifest, init and save URLs stay in effect. Add
|
|
|
53
58
|
</ConsentRoot>
|
|
54
59
|
```
|
|
55
60
|
|
|
56
|
-
|
|
57
|
-
`
|
|
58
|
-
|
|
61
|
+
App Router, Pages Router and static export all use this `ConsentRoot` in
|
|
62
|
+
the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
|
|
63
|
+
because a Server Component cannot pass script callbacks to it. See
|
|
64
|
+
[Next.js scripts and embeds](../frameworks/next/scripts.md).
|
|
59
65
|
|
|
60
66
|
**TanStack Start**
|
|
61
67
|
|
|
62
|
-
|
|
63
|
-
`ConsentRoot
|
|
68
|
+
Import the configuration into your root route and pass it to the existing
|
|
69
|
+
`ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
|
|
70
|
+
`initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
|
|
64
71
|
|
|
65
|
-
```tsx
|
|
66
|
-
import { Outlet } from '@tanstack/react-router';
|
|
67
|
-
import { ConsentRoot } from 'c15t/tanstack-start';
|
|
72
|
+
```tsx title="src/routes/__root.tsx"
|
|
68
73
|
import { scripts } from '../consent-scripts';
|
|
69
74
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
</ConsentRoot>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
75
|
+
<ConsentRoot
|
|
76
|
+
state={consent}
|
|
77
|
+
backendURL={backendURL}
|
|
78
|
+
initRoute={false}
|
|
79
|
+
scripts={scripts}
|
|
80
|
+
>
|
|
79
81
|
```
|
|
80
82
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
instead. Do not return script callbacks from a server function or route loader.
|
|
83
|
+
Import vendor helpers in the root route module, not in a server function.
|
|
84
|
+
A server function's return value must be serializable, and script
|
|
85
|
+
configurations carry callbacks. See
|
|
86
|
+
[TanStack Start scripts](../frameworks/tanstack-start/scripts.md).
|
|
86
87
|
|
|
87
88
|
**React**
|
|
88
89
|
|
|
89
|
-
|
|
90
|
+
Add the configuration to the existing `ConsentProvider` options, next to
|
|
91
|
+
`mode`:
|
|
90
92
|
|
|
91
|
-
```
|
|
92
|
-
import { ConsentProvider } from 'c15t/react';
|
|
93
|
+
```tsx title="src/consent.tsx"
|
|
93
94
|
import { scripts } from './consent-scripts';
|
|
94
|
-
```
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
```tsx
|
|
99
|
-
<ConsentProvider options={{ ...consentOptions, scripts }}>
|
|
100
|
-
{children}
|
|
101
|
-
</ConsentProvider>
|
|
96
|
+
<ConsentProvider options={{ mode, scripts }}>
|
|
102
97
|
```
|
|
103
98
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
link inside the provider. See
|
|
99
|
+
`mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
|
|
100
|
+
from the [React quickstart](https://c15t.com/docs/frameworks/react/quickstart). Keep the banner,
|
|
101
|
+
dialog and preferences link inside the provider. See
|
|
102
|
+
[React scripts and embeds](../frameworks/react/scripts.md).
|
|
107
103
|
|
|
108
104
|
**Nuxt**
|
|
109
105
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
than serialized `nuxt.config.ts` runtime configuration.
|
|
106
|
+
Register the scripts under the `c15t` key in `app/app.config.ts`. Adjust the
|
|
107
|
+
relative import to where you created `consent-scripts.ts`:
|
|
113
108
|
|
|
114
|
-
```
|
|
115
|
-
<script setup lang="ts">
|
|
116
|
-
import { onUnmounted } from 'vue';
|
|
117
|
-
import { createScriptLoader } from 'c15t/modules/script-loader';
|
|
109
|
+
```ts title="app/app.config.ts"
|
|
118
110
|
import { scripts } from '../src/consent-scripts';
|
|
119
111
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
let loader: ReturnType<typeof createScriptLoader> | undefined;
|
|
123
|
-
|
|
124
|
-
const removeMountedHook = nuxtApp.hook('app:mounted', () => {
|
|
125
|
-
loader = createScriptLoader({ kernel, scripts });
|
|
112
|
+
export default defineAppConfig({
|
|
113
|
+
c15t: { scripts },
|
|
126
114
|
});
|
|
127
|
-
onUnmounted(() => {
|
|
128
|
-
removeMountedHook();
|
|
129
|
-
loader?.dispose();
|
|
130
|
-
});
|
|
131
|
-
</script>
|
|
132
|
-
|
|
133
|
-
<template>
|
|
134
|
-
<ConsentRoot />
|
|
135
|
-
<NuxtPage />
|
|
136
|
-
</template>
|
|
137
115
|
```
|
|
138
116
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
117
|
+
The Nuxt module merges this over its options in `nuxt.config.ts` and starts
|
|
118
|
+
one script loader in the browser after hydration, once it has applied the
|
|
119
|
+
visitor's stored choice and privacy signals. Keep `scripts` out of
|
|
120
|
+
`nuxt.config.ts`, which reaches the browser as JSON and drops the vendor
|
|
121
|
+
callbacks. Write the vendor IDs into `consent-scripts.ts`. See
|
|
122
|
+
[Nuxt scripts and embeds](../frameworks/nuxt/scripts.md).
|
|
145
123
|
|
|
146
124
|
**Vue**
|
|
147
125
|
|
|
148
|
-
|
|
149
|
-
`App.vue`, whose lifetime covers the application:
|
|
126
|
+
Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
|
|
150
127
|
|
|
151
|
-
```
|
|
152
|
-
<script setup lang="ts">
|
|
153
|
-
import { onMounted, onUnmounted } from 'vue';
|
|
154
|
-
import { createScriptLoader } from 'c15t/modules/script-loader';
|
|
155
|
-
import { useConsentKernel } from 'c15t/vue/vue-plugin';
|
|
156
|
-
import ConsentRoot from 'c15t/vue/consent-root';
|
|
128
|
+
```ts title="src/main.ts"
|
|
157
129
|
import { scripts } from './consent-scripts';
|
|
158
130
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
onMounted(() => {
|
|
163
|
-
loader = createScriptLoader({ kernel, scripts });
|
|
131
|
+
app.use(c15tVue, {
|
|
132
|
+
backendURL: 'https://your-project.inth.app',
|
|
133
|
+
scripts,
|
|
164
134
|
});
|
|
165
|
-
onUnmounted(() => loader?.dispose());
|
|
166
|
-
</script>
|
|
167
|
-
|
|
168
|
-
<template>
|
|
169
|
-
<ConsentRoot />
|
|
170
|
-
<main>Your application</main>
|
|
171
|
-
</template>
|
|
172
135
|
```
|
|
173
136
|
|
|
174
|
-
Keep your existing
|
|
175
|
-
the
|
|
176
|
-
Do not
|
|
177
|
-
[Vue
|
|
137
|
+
Keep your existing backend URL and other options. The plugin starts one
|
|
138
|
+
script loader when the app mounts, after it has applied the visitor's stored
|
|
139
|
+
choice. Do not also call `createScriptLoader` from a component. See
|
|
140
|
+
[Vue scripts and embeds](../frameworks/vue/scripts.md).
|
|
178
141
|
|
|
179
142
|
**Astro**
|
|
180
143
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
import { fileURLToPath } from 'node:url';
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
Add this option to the existing `c15t({ ... })` call. Resolve the path from
|
|
190
|
-
the configuration file because Astro injects the import into a virtual module:
|
|
191
|
-
|
|
192
|
-
```js
|
|
193
|
-
clientEntrypoint: fileURLToPath(new URL('./src/c15t.client.ts', import.meta.url)),
|
|
194
|
-
```
|
|
144
|
+
Add the scripts to the client entrypoint from the
|
|
145
|
+
[Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
|
|
146
|
+
integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
|
|
147
|
+
framework integration in `astro.config.mjs` as they are. If the module
|
|
148
|
+
already exports scripts, combine the two arrays.
|
|
195
149
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
```ts title="src/c15t.client.ts"
|
|
199
|
-
import type { C15tClientOptionsExtension } from '@c15t/astro';
|
|
150
|
+
```ts title="src/consent-client.ts"
|
|
151
|
+
import type { C15tClientOptionsExtension } from 'c15t/astro';
|
|
200
152
|
import { scripts } from './consent-scripts';
|
|
201
153
|
|
|
202
154
|
export default { scripts } satisfies C15tClientOptionsExtension;
|
|
203
155
|
```
|
|
204
156
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
157
|
+
Vendor helpers contain callbacks, and the integration options in
|
|
158
|
+
`astro.config.mjs` are serialized into the page, so do not put helpers in
|
|
159
|
+
the integration's `scripts` option. The integration passes the client
|
|
160
|
+
entrypoint to the one runtime every page shares, including across
|
|
208
161
|
`ClientRouter` navigation.
|
|
209
162
|
|
|
210
163
|
**Svelte**
|
|
@@ -217,9 +170,7 @@ pass them as a top-level prop:
|
|
|
217
170
|
import { ConsentManagerProvider, hosted } from '@c15t/svelte';
|
|
218
171
|
import { scripts } from './consent-scripts';
|
|
219
172
|
|
|
220
|
-
const
|
|
221
|
-
if (!backendURL) throw new Error('Set VITE_C15T_BACKEND_URL');
|
|
222
|
-
const mode = hosted({ url: backendURL });
|
|
173
|
+
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
223
174
|
</script>
|
|
224
175
|
|
|
225
176
|
<ConsentManagerProvider {mode} {scripts}>
|
|
@@ -241,7 +192,7 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
|
|
|
241
192
|
import { scripts } from '../consent-scripts';
|
|
242
193
|
|
|
243
194
|
let { children, data } = $props();
|
|
244
|
-
const mode = hosted({ url:
|
|
195
|
+
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
245
196
|
</script>
|
|
246
197
|
|
|
247
198
|
<ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
|
|
@@ -250,37 +201,72 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
|
|
|
250
201
|
</ConsentManagerProvider>
|
|
251
202
|
```
|
|
252
203
|
|
|
253
|
-
Import vendor helpers in the layout component, not in `+layout.server.ts
|
|
254
|
-
|
|
255
|
-
|
|
204
|
+
Import vendor helpers in the layout component, not in `+layout.server.ts`:
|
|
205
|
+
a server load cannot send functions to the browser. Prerendered, static and
|
|
206
|
+
SPA-mode pages use the same `scripts` prop. If you pass an externally owned
|
|
256
207
|
`runtime` to the provider, register scripts when creating that runtime instead.
|
|
257
208
|
|
|
209
|
+
**HTML**
|
|
210
|
+
|
|
211
|
+
The helpers in `@c15t/integrations` are ES modules that need a bundler. On a
|
|
212
|
+
page that loads the c15t script tag, paste the vendor's own snippet instead
|
|
213
|
+
and keep it inert until its category is allowed:
|
|
214
|
+
|
|
215
|
+
```html
|
|
216
|
+
<script type="text/plain" data-c15t-category="measurement">
|
|
217
|
+
// The vendor's snippet, unchanged
|
|
218
|
+
</script>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Use the category this guide names for the vendor. c15t runs the snippet
|
|
222
|
+
once that category is allowed, and reloads the page when the visitor
|
|
223
|
+
withdraws it. Helper options on this page, such as `loadMode`, do not apply
|
|
224
|
+
to a pasted snippet. See [HTML scripts](../frameworks/html/scripts.md).
|
|
225
|
+
|
|
258
226
|
**JavaScript**
|
|
259
227
|
|
|
260
|
-
|
|
261
|
-
|
|
228
|
+
Pass the scripts to `init()` from `@c15t/browser`, next to your backend
|
|
229
|
+
URL:
|
|
262
230
|
|
|
263
231
|
```ts
|
|
264
|
-
import {
|
|
232
|
+
import { init } from '@c15t/browser';
|
|
265
233
|
import { scripts } from './consent-scripts';
|
|
266
234
|
|
|
267
|
-
const
|
|
235
|
+
const consent = init({
|
|
236
|
+
backendURL: 'https://your-project.inth.app',
|
|
237
|
+
scripts,
|
|
238
|
+
});
|
|
268
239
|
```
|
|
269
240
|
|
|
270
|
-
|
|
271
|
-
`
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
241
|
+
Keep the backend URL from your quickstart. With
|
|
242
|
+
`createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
|
|
243
|
+
A kernel you create yourself needs a loader from
|
|
244
|
+
`c15t/modules/script-loader`. Attach one loader per kernel. See
|
|
245
|
+
[JavaScript scripts](../frameworks/javascript/scripts.md).
|
|
246
|
+
|
|
247
|
+
## Options
|
|
248
|
+
|
|
249
|
+
| Option | Default | Behavior |
|
|
250
|
+
| ----------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------ |
|
|
251
|
+
| `id` | Required | Container ID, for example `GTM-1234XXX`. The helper trims it. Empty or whitespace-only values throw. |
|
|
252
|
+
| `dataLayer` | `'dataLayer'` | Queue name. A custom name adds `&l=<name>` to the container URL and renames the helper's queue function to `<name>Gtag`. |
|
|
253
|
+
| `updateEventName` | `'consent-update'` | `dataLayer` event pushed after every consent update. Use it as a GTM trigger. |
|
|
254
|
+
| `consentMapping` | The table below | Replaces the category-to-Google mapping. |
|
|
255
|
+
|
|
256
|
+
## Google loads before a choice
|
|
257
|
+
|
|
258
|
+
The `googleTagManager` and `gtag` helpers set `alwaysLoad: true`. Before the
|
|
259
|
+
visitor chooses, the helper creates the `dataLayer` queue, sends
|
|
260
|
+
`gtag('consent', 'default', ...)` with the current permissions and loads
|
|
261
|
+
Google's script. After each permission change it sends
|
|
262
|
+
`gtag('consent', 'update', ...)`. Google's tags then adjust what they store and
|
|
263
|
+
send; see Google's
|
|
281
264
|
[Consent Mode overview](https://developers.google.com/tag-platform/security/concepts/consent-mode).
|
|
282
265
|
|
|
283
|
-
|
|
266
|
+
So the browser does contact Google before consent. If your policy requires no
|
|
267
|
+
Google request until the visitor allows it, do not use these helpers unchanged.
|
|
268
|
+
|
|
269
|
+
## How categories map to Google consent types
|
|
284
270
|
|
|
285
271
|
| c15t category | Google consent types |
|
|
286
272
|
| --------------- | -------------------------------------------------- |
|
|
@@ -290,17 +276,46 @@ The default mapping is:
|
|
|
290
276
|
| `marketing` | `ad_storage`, `ad_user_data`, `ad_personalization` |
|
|
291
277
|
| `experience` | `personalization_storage` |
|
|
292
278
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
Configure
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
279
|
+
Each Google type is `granted` when its category is allowed and `denied`
|
|
280
|
+
otherwise. If a visitor turns off the helper's vendor, every optional type is
|
|
281
|
+
sent as `denied`. The `consentMapping` option replaces the whole table, so
|
|
282
|
+
include every category you still want signalled.
|
|
283
|
+
|
|
284
|
+
Under an opt-out policy, the default command can grant types before the
|
|
285
|
+
visitor has chosen anything. That is a permission, not a recorded choice.
|
|
286
|
+
|
|
287
|
+
## Configure consent inside the container
|
|
288
|
+
|
|
289
|
+
`googleTagManager` uses the `necessary` category and `alwaysLoad`, so the
|
|
290
|
+
container loads on every page. Consent signals reach Google tags that support
|
|
291
|
+
Consent Mode. Other tags in the container, such as a third-party pixel added as
|
|
292
|
+
Custom HTML, ignore those signals and fire on their triggers.
|
|
293
|
+
|
|
294
|
+
For each non-Google tag, add a consent requirement in the tag's consent
|
|
295
|
+
settings, or fire it from a Custom Event trigger on `consent-update`. If a
|
|
296
|
+
vendor must make no request before consent, remove it from the container and
|
|
297
|
+
register its own c15t helper instead.
|
|
298
|
+
|
|
299
|
+
## Measure opt-in rate
|
|
300
|
+
|
|
301
|
+
If you run a banner experiment, the backend already counts visitors and
|
|
302
|
+
choices per arm. To see the arm in GTM as well, forward the `onSurfaceShown` and
|
|
303
|
+
`onChoiceRecorded` callbacks, which carry `experiment: { id, arm }`. See
|
|
304
|
+
[banner experiments](../guides/banner-experiments.md#send-the-events-to-your-own-analytics-too).
|
|
305
|
+
|
|
306
|
+
## Verify Google Tag Manager
|
|
307
|
+
|
|
308
|
+
1. In a private window with an opt-in policy, load the page. `gtm.js` loads.
|
|
309
|
+
In Google Tag Assistant, the first consent command is `default` with
|
|
310
|
+
`analytics_storage` and `ad_storage` set to `denied`.
|
|
311
|
+
2. Click Reject, then reload. The `default` command still denies every
|
|
312
|
+
optional type, and in DevTools Network no non-Google tag in the container
|
|
313
|
+
fires.
|
|
314
|
+
3. Open Privacy settings and allow measurement. Tag Assistant shows an
|
|
315
|
+
`update` command with `analytics_storage` set to `granted`, followed by a
|
|
316
|
+
`consent-update` event, and measurement tags fire.
|
|
317
|
+
4. Turn measurement off again and save. c15t reloads the page, and the new
|
|
318
|
+
page starts with `analytics_storage` denied.
|
|
319
|
+
|
|
320
|
+
See the [consent verification guide](../guides/verify-consent.md) for
|
|
321
|
+
navigation and hosting checks.
|