@c15t/react 3.0.0-alpha.9 → 3.0.0

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.
Files changed (147) hide show
  1. package/AGENTS.md +7 -9
  2. package/README.md +41 -70
  3. package/SKILL.md +1 -1
  4. package/dist/aggregate-components.js +1 -1
  5. package/dist/components/consent-gate/atoms.js +1 -1
  6. package/dist/components/consent-gate/frame.js +2 -0
  7. package/dist/components/consent-gate/index.js +1 -1
  8. package/dist/components/iab-panel/atoms/root.js +1 -1
  9. package/dist/components/iab-panel/iab-panel.js +1 -1
  10. package/dist/components/iab-prompt/atoms/root.js +1 -1
  11. package/dist/components/iab-prompt/iab-prompt.js +1 -1
  12. package/dist/components/panel/atoms/root.js +1 -1
  13. package/dist/components/panel-trigger/atoms/root.js +1 -1
  14. package/dist/components/panel-trigger/panel-trigger.js +1 -1
  15. package/dist/components/panel-trigger/toolbar-loader.js +2 -0
  16. package/dist/components/preferences/atoms/root.js +1 -1
  17. package/dist/components/prompt/atoms/early-tap-script.js +2 -0
  18. package/dist/components/prompt/atoms/root.js +1 -1
  19. package/dist/components/shared/primitives/button.js +1 -1
  20. package/dist/components/shared/surface-styles.js +1 -1
  21. package/dist/consent-gate.js +1 -1
  22. package/dist/context/index.js +1 -1
  23. package/dist/devtools.js +1 -1
  24. package/dist/iab/styles.tw3.css +2 -2
  25. package/dist/iab-dialog-deferred.js +2 -0
  26. package/dist/iab.js +1 -1
  27. package/dist/index-parts/consent-gate.js +1 -1
  28. package/dist/index-parts/core.js +1 -1
  29. package/dist/index-parts/frame.js +1 -0
  30. package/dist/index-parts/hosted.js +1 -0
  31. package/dist/index-parts/offline.js +1 -0
  32. package/dist/index-parts/presets.js +1 -0
  33. package/dist/index.js +1 -1
  34. package/dist/modes.js +1 -0
  35. package/dist/panel-link.js +1 -1
  36. package/dist/panel-trigger.js +1 -1
  37. package/dist/provider.js +1 -1
  38. package/dist/styles.tw3.css +2 -2
  39. package/dist/transports/hosted.js +1 -0
  40. package/dist/transports/manifest.js +1 -0
  41. package/dist/utils/deferred-module.js +1 -1
  42. package/dist/version.js +1 -1
  43. package/dist-types/chunk-warming.d.ts +7 -6
  44. package/dist-types/components/consent-gate/frame.d.ts +19 -0
  45. package/dist-types/components/consent-gate/index.d.ts +3 -19
  46. package/dist-types/components/iab-prompt/iab-prompt.d.ts +1 -1
  47. package/dist-types/components/panel/index.d.ts +1 -1
  48. package/dist-types/components/panel-trigger/toolbar-loader.d.ts +34 -0
  49. package/dist-types/components/preferences/index.d.ts +1 -1
  50. package/dist-types/components/prompt/atoms/early-tap-script.d.ts +17 -0
  51. package/dist-types/components/prompt/index.d.ts +1 -1
  52. package/dist-types/components/shared/surface-styles.d.ts +26 -2
  53. package/dist-types/consent-gate.d.ts +1 -1
  54. package/dist-types/context/index.d.ts +3 -3
  55. package/dist-types/context.d.ts +2 -0
  56. package/dist-types/gpp.d.ts +1 -1
  57. package/dist-types/iab-dialog-deferred.d.ts +36 -0
  58. package/dist-types/iab.d.ts +3 -2
  59. package/dist-types/index-parts/consent-gate.d.ts +1 -1
  60. package/dist-types/index-parts/core.d.ts +1 -2
  61. package/dist-types/index-parts/frame.d.ts +7 -0
  62. package/dist-types/index-parts/hosted.d.ts +7 -0
  63. package/dist-types/index-parts/offline.d.ts +7 -0
  64. package/dist-types/index-parts/presets.d.ts +7 -0
  65. package/dist-types/index.d.ts +5 -1
  66. package/dist-types/modes.d.ts +26 -0
  67. package/dist-types/panel-link.d.ts +1 -1
  68. package/dist-types/panel-trigger.d.ts +1 -1
  69. package/dist-types/provider.d.ts +3 -3
  70. package/dist-types/transports/hosted.d.ts +36 -0
  71. package/dist-types/transports/manifest.d.ts +48 -0
  72. package/dist-types/version.d.ts +1 -1
  73. package/docs/README.md +7 -9
  74. package/docs/concepts/choose-your-setup.md +45 -10
  75. package/docs/concepts/consent-categories.md +1 -1
  76. package/docs/concepts/consent-state.md +5 -2
  77. package/docs/concepts/data-fetching.md +100 -42
  78. package/docs/concepts/modes.md +281 -0
  79. package/docs/customization/dark-mode.md +1 -1
  80. package/docs/customization/motion.md +2 -2
  81. package/docs/customization/recipes.md +4 -4
  82. package/docs/customization/slots.md +25 -25
  83. package/docs/customization/stylesheets.md +12 -14
  84. package/docs/customization/tailwind.md +17 -11
  85. package/docs/customization/tokens.md +36 -7
  86. package/docs/frameworks/react/components/consent-banner.md +14 -10
  87. package/docs/frameworks/react/components/consent-dialog.md +14 -10
  88. package/docs/frameworks/react/components/consent-provider.md +51 -44
  89. package/docs/frameworks/react/components.md +14 -10
  90. package/docs/frameworks/react/content-security-policy.md +21 -12
  91. package/docs/frameworks/react/hooks.md +2 -2
  92. package/docs/frameworks/react/iab.md +20 -2
  93. package/docs/frameworks/react/quickstart.md +63 -97
  94. package/docs/frameworks/react/rendering.md +168 -94
  95. package/docs/frameworks/react/scripts.md +19 -28
  96. package/docs/frameworks/react/troubleshooting.md +57 -25
  97. package/docs/frameworks/react/upgrade-v3.md +110 -62
  98. package/docs/guides/banner-experiments.md +21 -6
  99. package/docs/guides/troubleshooting.md +89 -25
  100. package/docs/guides/verify-consent.md +23 -8
  101. package/docs/integrations/adobe-analytics.md +60 -64
  102. package/docs/integrations/ahrefs-analytics.md +58 -63
  103. package/docs/integrations/amplitude.md +60 -64
  104. package/docs/integrations/clearbit.md +59 -63
  105. package/docs/integrations/cloudflare-web-analytics.md +56 -60
  106. package/docs/integrations/cloudflare-zaraz.md +55 -57
  107. package/docs/integrations/crisp.md +64 -69
  108. package/docs/integrations/databuddy.md +62 -64
  109. package/docs/integrations/fathom-analytics.md +56 -60
  110. package/docs/integrations/front-chat.md +56 -60
  111. package/docs/integrations/google-maps.md +25 -13
  112. package/docs/integrations/google-tag-manager.md +153 -77
  113. package/docs/integrations/google-tag.md +134 -78
  114. package/docs/integrations/heap.md +56 -60
  115. package/docs/integrations/hightouch.md +55 -60
  116. package/docs/integrations/hotjar.md +60 -64
  117. package/docs/integrations/intercom.md +55 -60
  118. package/docs/integrations/klaviyo.md +65 -66
  119. package/docs/integrations/linkedin-insights.md +58 -63
  120. package/docs/integrations/logrocket.md +55 -60
  121. package/docs/integrations/matomo-analytics.md +58 -60
  122. package/docs/integrations/meta-pixel.md +56 -60
  123. package/docs/integrations/microsoft-clarity.md +57 -60
  124. package/docs/integrations/microsoft-uet.md +58 -61
  125. package/docs/integrations/mixpanel-analytics.md +73 -75
  126. package/docs/integrations/one-dollar-stats.md +53 -59
  127. package/docs/integrations/openai-pixel.md +58 -60
  128. package/docs/integrations/overview.md +59 -42
  129. package/docs/integrations/pinterest-tag.md +56 -60
  130. package/docs/integrations/pirsch.md +54 -60
  131. package/docs/integrations/plausible-analytics.md +55 -60
  132. package/docs/integrations/posthog.md +56 -60
  133. package/docs/integrations/promptwatch.md +57 -63
  134. package/docs/integrations/reddit-pixel.md +57 -60
  135. package/docs/integrations/rudderstack.md +65 -67
  136. package/docs/integrations/rybbit-analytics.md +70 -75
  137. package/docs/integrations/segment.md +56 -60
  138. package/docs/integrations/sentry.md +65 -60
  139. package/docs/integrations/snapchat-pixel.md +54 -60
  140. package/docs/integrations/tiktok-pixel.md +59 -63
  141. package/docs/integrations/umami-analytics.md +54 -60
  142. package/docs/integrations/vercel-analytics.md +53 -59
  143. package/docs/integrations/vercel-speed-insights.md +317 -0
  144. package/docs/integrations/x-pixel.md +57 -63
  145. package/docs/integrations/youtube.md +25 -13
  146. package/package.json +18 -8
  147. package/docs/upgrade-v3.md +0 -429
@@ -3,22 +3,34 @@ title: OpenAI Pixel
3
3
  description: Load the ChatGPT Ads Measurement Pixel only after marketing consent
4
4
  with the c15t openaiPixel helper, guard oaiq conversion calls, and check it in
5
5
  DevTools.
6
+ seoTitle: OpenAI Pixel cookie consent with c15t
7
+ seoDescription: Load the OpenAI ChatGPT Ads Measurement Pixel only after
8
+ marketing consent. The c15t openaiPixel helper sends oaiq consent signals for
9
+ you.
6
10
  icon: chatgpt
7
11
  group: integrations
8
12
  ---
9
13
 
14
+ The c15t `openaiPixel` helper keeps the OpenAI ChatGPT Ads Measurement Pixel off
15
+ the page until `marketing` has consent. Until then, c15t does not define the
16
+ `oaiq` queue. When `marketing` has consent, the helper queues
17
+ `oaiq('consent', false)`, `init`, and `oaiq('consent', true)` before the SDK
18
+ loads. If the visitor withdraws consent, the helper calls
19
+ `oaiq('consent', false)`. The SDK stays on the page. By default, c15t also
20
+ reloads the page.
21
+
10
22
  ## Configure the OpenAI Pixel
11
23
 
12
24
  Copy the pixel ID from the conversions tab in OpenAI Ads Manager. Remove the
13
25
  standalone OpenAI installation snippet, because the helper creates the `oaiq`
14
26
  queue and initializes the pixel itself.
15
27
 
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` |
28
+ | Package manager | Command |
29
+ | :-------------- | :------------------------------- |
30
+ | npm | `npm install @c15t/integrations` |
31
+ | pnpm | `pnpm add @c15t/integrations` |
32
+ | yarn | `yarn add @c15t/integrations` |
33
+ | bun | `bun add @c15t/integrations` |
22
34
 
23
35
  ```ts title="src/consent-scripts.ts"
24
36
  import { openaiPixel } from '@c15t/integrations/openai-pixel';
@@ -33,51 +45,41 @@ endpoint, policy, styles and consent UI. Remove the vendor's original script,
33
45
  SDK initializer or tag-manager entry, so the vendor loads only through c15t.
34
46
 
35
47
  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.
48
+ quickstart already has a `scripts` array, such as the one in `c15t.config.ts`
49
+ in the Next.js guide, add the helper to that array instead of creating a
50
+ second file.
38
51
  The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
39
52
  point for your framework below. These are edits to that provider, not a second
40
53
  provider.
41
54
 
42
55
  **Next.js**
43
56
 
44
- Import the configuration into the client boundary from your router guide:
45
-
46
- ```ts
47
- import { ConsentRoot } from 'c15t/next';
48
- import { scripts } from './consent-scripts';
49
- ```
57
+ Add the configuration to `scripts` in `c15t.config.ts`, next to
58
+ `next.config.ts`:
50
59
 
51
- Keep the server-resolved `state` and shared `consentConfig` from your
52
- router guide. Its manifest, init and save URLs stay in effect. Add
53
- `scripts` as a top-level prop on the existing root:
60
+ ```ts title="c15t.config.ts"
61
+ import { defineConsentConfig } from 'c15t/next';
62
+ import { scripts } from './src/consent-scripts';
54
63
 
55
- ```tsx
56
- <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
57
- {children}
58
- </ConsentRoot>
64
+ export default defineConsentConfig({ scripts });
59
65
  ```
60
66
 
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
67
+ Keep the rest of your config, such as `mode` and `routePrefix`, in the
68
+ same call. `ConsentRoot` reads the config in the browser, so the layout
69
+ keeps passing only `state`. App Router, Pages Router and static export all
70
+ read the same file. See
64
71
  [Next.js scripts and embeds](https://c15t.com/docs/frameworks/next/scripts).
65
72
 
66
73
  **TanStack Start**
67
74
 
68
75
  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):
76
+ `ConsentRoot` as a top-level prop. Keep the loader from the
77
+ [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
71
78
 
72
79
  ```tsx title="src/routes/__root.tsx"
73
80
  import { scripts } from '../consent-scripts';
74
81
 
75
- <ConsentRoot
76
- state={consent}
77
- backendURL={backendURL}
78
- initRoute={false}
79
- scripts={scripts}
80
- >
82
+ <ConsentRoot state={consent} scripts={scripts}>
81
83
  ```
82
84
 
83
85
  Import vendor helpers in the root route module, not in a server function.
@@ -96,8 +98,8 @@ import { scripts } from './consent-scripts';
96
98
  <ConsentProvider options={{ mode, scripts }}>
97
99
  ```
98
100
 
99
- `mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
100
- from the [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
101
+ `mode` is the `manifest()` value from the
102
+ [React quickstart](../frameworks/react/quickstart.md). Keep the banner,
101
103
  dialog and preferences link inside the provider. See
102
104
  [React scripts and embeds](../frameworks/react/scripts.md).
103
105
 
@@ -126,15 +128,16 @@ callbacks. Write the vendor IDs into `consent-scripts.ts`. See
126
128
  Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
127
129
 
128
130
  ```ts title="src/main.ts"
131
+ import { c15tVue, manifest } from 'c15t/vue/vue-plugin';
129
132
  import { scripts } from './consent-scripts';
130
133
 
131
134
  app.use(c15tVue, {
132
- backendURL: 'https://your-project.inth.app',
135
+ mode: manifest(),
133
136
  scripts,
134
137
  });
135
138
  ```
136
139
 
137
- Keep your existing backend URL and other options. The plugin starts one
140
+ Keep your existing `mode` and other options. The plugin starts one
138
141
  script loader when the app mounts, after it has applied the visitor's stored
139
142
  choice. Do not also call `createScriptLoader` from a component. See
140
143
  [Vue scripts and embeds](https://c15t.com/docs/frameworks/vue/scripts).
@@ -142,12 +145,11 @@ choice. Do not also call `createScriptLoader` from a component. See
142
145
  **Astro**
143
146
 
144
147
  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.
148
+ [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), `src/c15t.client.ts`,
149
+ which the integration finds on its own. Keep `astro.config.mjs` as it is.
150
+ If the module already exports scripts, combine the two arrays.
149
151
 
150
- ```ts title="src/consent-client.ts"
152
+ ```ts title="src/c15t.client.ts"
151
153
  import type { C15tClientOptionsExtension } from 'c15t/astro';
152
154
  import { scripts } from './consent-scripts';
153
155
 
@@ -167,15 +169,13 @@ pass them as a top-level prop:
167
169
 
168
170
  ```svelte title="src/App.svelte"
169
171
  <script lang="ts">
170
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
172
+ import { ConsentProvider, manifest } from '@c15t/svelte';
171
173
  import { scripts } from './consent-scripts';
172
-
173
- const mode = hosted({ url: 'https://your-project.inth.app' });
174
174
  </script>
175
175
 
176
- <ConsentManagerProvider {mode} {scripts}>
176
+ <ConsentProvider mode={manifest()} {scripts}>
177
177
  <!-- Keep your application, consent UI and preferences link here. -->
178
- </ConsentManagerProvider>
178
+ </ConsentProvider>
179
179
  ```
180
180
 
181
181
  Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
@@ -183,22 +183,21 @@ The provider owns the loader and disposes it on unmount.
183
183
 
184
184
  **SvelteKit**
185
185
 
186
- Add the scripts to the existing root layout provider. Keep the server load
187
- and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
186
+ Add the scripts to the existing `ConsentRoot` in the root layout. Keep the
187
+ handle and the layout load from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
188
188
 
189
189
  ```svelte title="src/routes/+layout.svelte"
190
190
  <script lang="ts">
191
- import { ConsentManagerProvider, hosted } from '@c15t/svelte';
191
+ import { ConsentRoot } from '@c15t/svelte';
192
192
  import { scripts } from '../consent-scripts';
193
193
 
194
194
  let { children, data } = $props();
195
- const mode = hosted({ url: 'https://your-project.inth.app' });
196
195
  </script>
197
196
 
198
- <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
197
+ <ConsentRoot state={data.consent} {scripts}>
199
198
  {@render children()}
200
199
  <!-- Keep your consent UI and preferences link here. -->
201
- </ConsentManagerProvider>
200
+ </ConsentRoot>
202
201
  ```
203
202
 
204
203
  Import vendor helpers in the layout component, not in `+layout.server.ts`:
@@ -225,20 +224,19 @@ to a pasted snippet. See [HTML scripts](https://c15t.com/docs/frameworks/html/sc
225
224
 
226
225
  **JavaScript**
227
226
 
228
- Pass the scripts to `init()` from `@c15t/browser`, next to your backend
229
- URL:
227
+ Pass the scripts to `init()` from `@c15t/browser`, next to your mode:
230
228
 
231
229
  ```ts
232
- import { init } from '@c15t/browser';
230
+ import { init, manifest } from '@c15t/browser';
233
231
  import { scripts } from './consent-scripts';
234
232
 
235
233
  const consent = init({
236
- backendURL: 'https://your-project.inth.app',
234
+ mode: manifest(),
237
235
  scripts,
238
236
  });
239
237
  ```
240
238
 
241
- Keep the backend URL from your quickstart. With
239
+ Keep the mode from your quickstart. With
242
240
  `createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
243
241
  A kernel you create yourself needs a loader from
244
242
  `c15t/modules/script-loader`. Attach one loader per kernel. See
@@ -248,7 +246,7 @@ A kernel you create yourself needs a loader from
248
246
 
249
247
  | Option | Default | Behavior |
250
248
  | ----------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
251
- | `pixelId` | Required | Pixel ID passed to `oaiq('init', ...)`. The helper trims it. Empty or whitespace-only values throw. |
249
+ | `pixelId` | Required | Pixel ID passed to `oaiq('init', ...)`. The helper trims it. Empty or whitespace-only values log an error and the script does not load. |
252
250
  | `debug` | `false` | Logs SDK activity, including queued and dropped events, to the browser console. |
253
251
  | `user` | None | User matching fields passed to `init`: `email_sha256`, `phone_number_sha256`, `external_id_sha256`, `first_name_sha256`, `last_name_sha256`, `country`, `city`, `region` and `postal_code`. |
254
252
  | `scriptSrc` | `https://bzrcdn.openai.com/sdk/oaiq.min.js` | SDK URL override. A blank value falls back to the default. |
@@ -337,8 +335,8 @@ permission before each of your own event calls. The reload does not delete
337
335
  cookies the vendor already set; see
338
336
  [clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
339
337
 
340
- The helper sets `vendor` to its script ID, so once you declare that vendor a
341
- visitor can turn it off inside an allowed category. See
338
+ The helper lists its vendor by name in the preference dialog, so a visitor can
339
+ turn it off inside an allowed category. See
342
340
  [vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
343
341
  [consent verification guide](../guides/verify-consent.md) covers navigation,
344
342
  expiry and hosting checks.
@@ -2,6 +2,10 @@
2
2
  title: Integrations
3
3
  description: Find all c15t integrations for analytics, tag managers,
4
4
  advertising, email and SMS, chat and embedded content.
5
+ seoTitle: Cookie consent integrations for analytics and ads | c15t
6
+ seoDescription: Connect analytics, ad pixels, chat widgets and embeds to your
7
+ cookie banner. c15t has helpers for Google Tag Manager, Meta Pixel, PostHog,
8
+ Segment and Hotjar.
5
9
  group: integrations
6
10
  ---
7
11
 
@@ -12,12 +16,12 @@ register with your c15t provider. Importing a helper installs nothing on its
12
16
  own. Set up consent with your [framework quickstart](https://c15t.com/docs/frameworks) first,
13
17
  then follow the vendor guide.
14
18
 
15
- | Package manager | Command |
16
- | :-------------- | :------------------------------------- |
17
- | npm | `npm install @c15t/integrations@alpha` |
18
- | pnpm | `pnpm add @c15t/integrations@alpha` |
19
- | yarn | `yarn add @c15t/integrations@alpha` |
20
- | bun | `bun add @c15t/integrations@alpha` |
19
+ | Package manager | Command |
20
+ | :-------------- | :------------------------------- |
21
+ | npm | `npm install @c15t/integrations` |
22
+ | pnpm | `pnpm add @c15t/integrations` |
23
+ | yarn | `yarn add @c15t/integrations` |
24
+ | bun | `bun add @c15t/integrations` |
21
25
 
22
26
  `@c15t/integrations` is a separate package. Keep importing c15t itself from `c15t`,
23
27
  for example `c15t/react` or `c15t/next`.
@@ -40,41 +44,42 @@ kernel to control its DOM lifecycle. Embeds do not require `@c15t/integrations`.
40
44
 
41
45
  ## Tag managers
42
46
 
43
- | Integration | Helper | Category | Loading behavior |
44
- | --------------------------------------------- | ------------------ | ----------- | ------------------------------------------------- |
45
- | [Cloudflare Zaraz](./cloudflare-zaraz.md) | `cloudflareZaraz` | `necessary` | Always runs; syncs purposes, Zaraz runs the tools |
46
- | [Google Tag Manager](./google-tag-manager.md) | `googleTagManager` | `necessary` | Always loads; signals Google consent |
47
+ | Integration | Helper | Category | Loading behavior |
48
+ | --------------------------------------------- | ------------------ | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
49
+ | [Cloudflare Zaraz](./cloudflare-zaraz.md) | `cloudflareZaraz` | `necessary` | Always runs; syncs purposes, Zaraz runs the tools |
50
+ | [Google Tag Manager](./google-tag-manager.md) | `googleTagManager` | `necessary`; `measurement` or `marketing` when gated | Always loads and signals Google consent by default; `loadMode: 'after-consent'` waits for permission |
47
51
 
48
52
  ## Analytics
49
53
 
50
- | Integration | Helper | Category | Loading behavior |
51
- | --------------------------------------------------------- | ------------------------ | ----------------------------------------------- | ---------------------------------------------------------------------------- |
52
- | [Google Tag](./google-tag.md) | `gtag` | `measurement` or `marketing` | Always loads; signals Google consent |
53
- | [Ahrefs Analytics](./ahrefs-analytics.md) | `ahrefsAnalytics` | `measurement` | Waits for effective permission |
54
- | [Adobe Analytics](./adobe-analytics.md) | `adobeAnalytics` | `measurement` | Waits for effective permission |
55
- | [Amplitude](./amplitude.md) | `amplitude` | `measurement` | Waits for effective permission; opts the SDK out on revocation |
56
- | [Cloudflare Web Analytics](./cloudflare-web-analytics.md) | `cloudflareWebAnalytics` | `measurement` | Waits for effective permission |
57
- | [Clearbit](./clearbit.md) | `clearbit` | `marketing` | Waits for effective permission |
58
- | [Microsoft Clarity](./microsoft-clarity.md) | `clarity` | `measurement` | Gated initially; keeps the SDK and signals storage consent |
59
- | [Databuddy](./databuddy.md) | `databuddy` | `measurement` | Always loads; switches the SDK's disabled flag |
60
- | [Fathom Analytics](./fathom-analytics.md) | `fathomAnalytics` | `measurement` | Waits for effective permission |
61
- | [Heap](./heap.md) | `heap` | `measurement` | Waits for effective permission |
62
- | [Matomo Analytics](./matomo-analytics.md) | `matomoAnalytics` | `measurement` | Gated by default; optional consent mode |
63
- | [Mixpanel](./mixpanel-analytics.md) | `mixpanelAnalytics` | `measurement` | Always loads; calls opt-in and opt-out APIs |
64
- | [OneDollarStats](./one-dollar-stats.md) | `oneDollarStats` | `measurement` | Waits for effective permission |
65
- | [Hotjar](./hotjar.md) | `hotjar` | `measurement` | Waits for effective permission |
66
- | [Hightouch](./hightouch.md) | `hightouch` | `measurement` | Waits for effective permission |
67
- | [LogRocket](./logrocket.md) | `logRocket` | `measurement` | Waits for effective permission |
68
- | [Plausible Analytics](./plausible-analytics.md) | `plausibleAnalytics` | `measurement` | Waits for effective permission |
69
- | [PostHog](./posthog.md) | `posthog` | `measurement` | Configurable; defaults to always loading and calling opt-in and opt-out APIs |
70
- | [Promptwatch](./promptwatch.md) | `promptwatch` | `measurement` | Waits for effective permission |
71
- | [Pirsch](./pirsch.md) | `pirsch` | `measurement` | Waits for effective permission |
72
- | [RudderStack](./rudderstack.md) | `rudderstack` | `measurement` | Gated by default; optional destination consent mode |
73
- | [Segment](./segment.md) | `segment` | `measurement` | Waits for effective permission |
74
- | [Sentry](./sentry.md) | `sentry` | `necessary`; Replay and user data `measurement` | Configurable; defaults to always loading and loads Replay after permission |
75
- | [Rybbit Analytics](./rybbit-analytics.md) | `rybbitAnalytics` | `measurement` | Waits for effective permission |
76
- | [Umami Analytics](./umami-analytics.md) | `umamiAnalytics` | `measurement` | Waits for effective permission |
77
- | [Vercel Analytics](./vercel-analytics.md) | `vercelAnalytics` | `measurement` | Waits for effective permission |
54
+ | Integration | Helper | Category | Loading behavior |
55
+ | --------------------------------------------------------- | ------------------------ | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
56
+ | [Google Tag](./google-tag.md) | `gtag` | `measurement` or `marketing` | Always loads and signals Google consent by default; `loadMode: 'after-consent'` waits for permission |
57
+ | [Ahrefs Analytics](./ahrefs-analytics.md) | `ahrefsAnalytics` | `measurement` | Waits for effective permission |
58
+ | [Adobe Analytics](./adobe-analytics.md) | `adobeAnalytics` | `measurement` | Waits for effective permission |
59
+ | [Amplitude](./amplitude.md) | `amplitude` | `measurement` | Waits for effective permission; opts the SDK out on revocation |
60
+ | [Cloudflare Web Analytics](./cloudflare-web-analytics.md) | `cloudflareWebAnalytics` | `measurement` | Waits for effective permission |
61
+ | [Clearbit](./clearbit.md) | `clearbit` | `marketing` | Waits for effective permission |
62
+ | [Microsoft Clarity](./microsoft-clarity.md) | `clarity` | `measurement` | Gated initially; keeps the SDK and signals storage consent |
63
+ | [Databuddy](./databuddy.md) | `databuddy` | `measurement` | Always loads; switches the SDK's disabled flag |
64
+ | [Fathom Analytics](./fathom-analytics.md) | `fathomAnalytics` | `measurement` | Waits for effective permission |
65
+ | [Heap](./heap.md) | `heap` | `measurement` | Waits for effective permission |
66
+ | [Matomo Analytics](./matomo-analytics.md) | `matomoAnalytics` | `measurement` | Gated by default; optional consent mode |
67
+ | [Mixpanel](./mixpanel-analytics.md) | `mixpanelAnalytics` | `measurement` | Always loads; calls opt-in and opt-out APIs |
68
+ | [OneDollarStats](./one-dollar-stats.md) | `oneDollarStats` | `measurement` | Waits for effective permission |
69
+ | [Hotjar](./hotjar.md) | `hotjar` | `measurement` | Waits for effective permission |
70
+ | [Hightouch](./hightouch.md) | `hightouch` | `measurement` | Waits for effective permission |
71
+ | [LogRocket](./logrocket.md) | `logRocket` | `measurement` | Waits for effective permission |
72
+ | [Plausible Analytics](./plausible-analytics.md) | `plausibleAnalytics` | `measurement` | Waits for effective permission |
73
+ | [PostHog](./posthog.md) | `posthog` | `measurement` | Configurable; defaults to always loading and calling opt-in and opt-out APIs |
74
+ | [Promptwatch](./promptwatch.md) | `promptwatch` | `measurement` | Waits for effective permission |
75
+ | [Pirsch](./pirsch.md) | `pirsch` | `measurement` | Waits for effective permission |
76
+ | [RudderStack](./rudderstack.md) | `rudderstack` | `measurement` | Gated by default; optional destination consent mode |
77
+ | [Segment](./segment.md) | `segment` | `measurement` | Waits for effective permission |
78
+ | [Sentry](./sentry.md) | `sentry` | `necessary`; Replay and user data `measurement` | Configurable; defaults to always loading and loads Replay after permission |
79
+ | [Rybbit Analytics](./rybbit-analytics.md) | `rybbitAnalytics` | `measurement` | Waits for effective permission |
80
+ | [Umami Analytics](./umami-analytics.md) | `umamiAnalytics` | `measurement` | Waits for effective permission |
81
+ | [Vercel Analytics](./vercel-analytics.md) | `vercelAnalytics` | `measurement` | Waits for effective permission |
82
+ | [Vercel Speed Insights](./vercel-speed-insights.md) | `vercelSpeedInsights` | `measurement` | Waits for effective permission; drops reports after revocation |
78
83
 
79
84
  ## Chat and support
80
85
 
@@ -111,16 +116,28 @@ manager entry before adding its helper. c15t cannot gate a copy it did not
111
116
  load. Tag managers and data pipelines such as Segment can load further
112
117
  destinations, which need consent settings of their own.
113
118
 
119
+ Framework packages are loaders too. To move their vendors to c15t, see
120
+ [migrate from `@next/third-parties`](https://c15t.com/docs/frameworks/next/scripts#migrate-from-nextthird-parties)
121
+ for Next.js, and
122
+ [migrate from `@nuxt/scripts`](https://c15t.com/docs/frameworks/nuxt/scripts#migrate-from-nuxtscripts)
123
+ or [migrate from `nuxt-gtag`](https://c15t.com/docs/frameworks/nuxt/scripts#migrate-from-nuxt-gtag)
124
+ for Nuxt.
125
+
114
126
  When a visitor turns off a category they had allowed, c15t reloads the page so
115
127
  that code which already ran stops. Each vendor guide lists what its helper does
116
128
  on revocation and how to check it.
117
129
 
118
130
  ## Vendor switches and cookie cleanup
119
131
 
120
- Every helper sets a `vendor` slug, so once you declare that vendor a visitor
121
- can allow its category and still switch the vendor off. Gating also leaves
122
- behind the cookies a vendor already wrote; `clearOnRevocation` deletes them
123
- when their category is denied. Each framework documents both in its Scripts
132
+ Every helper sets a `vendor` slug and the vendor's name and privacy policy, so
133
+ the preference dialog lists the vendor with its own switch. A visitor can allow
134
+ a category and still switch one vendor off. c15t then does not load that
135
+ vendor's script. Helpers that load on every page, such as Google Tag Manager,
136
+ Microsoft UET and Mixpanel, still load and send the vendor a denied signal
137
+ instead. The dialog lists `necessary` helpers without a switch. Declare
138
+ a vendor with the same slug to replace its name and links, for example when you
139
+ self-host Matomo or PostHog. Gating also leaves behind the cookies a vendor
140
+ already wrote; `clearOnRevocation` deletes them when their category is denied. Each framework documents both in its Scripts
124
141
  and embeds group:
125
142
 
126
143
  | Framework | Vendor consent | Clear on revocation |