@c15t/scripts 2.2.0 → 3.0.0-alpha.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 (197) hide show
  1. package/AGENTS.md +74 -48
  2. package/README.md +3 -3
  3. package/dist/e2e-test-utils.js +60 -24
  4. package/dist/engine/compile.js +45 -45
  5. package/dist/engine/runtime.js +119 -119
  6. package/dist/registry.js +186 -176
  7. package/dist/resolve.js +12 -12
  8. package/dist/vendors/_shared/attributes.js +5 -5
  9. package/dist/vendors/_shared/google-consent.js +10 -10
  10. package/dist/vendors/_shared/install-builders.js +9 -9
  11. package/dist/vendors/_shared/script-url.js +12 -12
  12. package/dist/vendors/ads-and-pixels/linkedin-insights.js +16 -16
  13. package/dist/vendors/ads-and-pixels/meta-pixel.js +82 -82
  14. package/dist/vendors/ads-and-pixels/microsoft-uet.js +57 -57
  15. package/dist/vendors/ads-and-pixels/openai-pixel.js +88 -0
  16. package/dist/vendors/ads-and-pixels/reddit-pixel.js +39 -39
  17. package/dist/vendors/ads-and-pixels/snapchat-pixel.js +25 -25
  18. package/dist/vendors/ads-and-pixels/tiktok-pixel.js +31 -31
  19. package/dist/vendors/ads-and-pixels/x-pixel.js +17 -17
  20. package/dist/vendors/analytics/adobe-analytics.js +17 -17
  21. package/dist/vendors/analytics/ahrefs-analytics.js +8 -8
  22. package/dist/vendors/analytics/amplitude.js +39 -39
  23. package/dist/vendors/analytics/clearbit.js +11 -11
  24. package/dist/vendors/analytics/cloudflare-web-analytics.js +13 -13
  25. package/dist/vendors/analytics/databuddy.js +45 -45
  26. package/dist/vendors/analytics/fathom-analytics.js +15 -15
  27. package/dist/vendors/analytics/google-tag.js +23 -23
  28. package/dist/vendors/analytics/heap.js +37 -37
  29. package/dist/vendors/analytics/hightouch.js +30 -30
  30. package/dist/vendors/analytics/hotjar.js +14 -14
  31. package/dist/vendors/analytics/logrocket.js +24 -24
  32. package/dist/vendors/analytics/matomo-analytics.js +51 -51
  33. package/dist/vendors/analytics/microsoft-clarity.js +31 -31
  34. package/dist/vendors/analytics/mixpanel-analytics.js +31 -31
  35. package/dist/vendors/analytics/pirsch.js +27 -27
  36. package/dist/vendors/analytics/plausible-analytics.js +24 -24
  37. package/dist/vendors/analytics/posthog.js +84 -79
  38. package/dist/vendors/analytics/promptwatch.js +8 -8
  39. package/dist/vendors/analytics/rudderstack.js +50 -50
  40. package/dist/vendors/analytics/rybbit-analytics.js +30 -30
  41. package/dist/vendors/analytics/segment.js +16 -16
  42. package/dist/vendors/analytics/umami-analytics.js +16 -16
  43. package/dist/vendors/analytics/vercel-analytics.js +22 -22
  44. package/dist/vendors/functional/crisp.js +49 -51
  45. package/dist/vendors/functional/intercom.js +18 -18
  46. package/dist/vendors/tag-managers/google-tag-manager.js +20 -20
  47. package/dist-types/__tests__/helpers.d.ts +10 -10
  48. package/dist-types/engine/compile.d.ts +2 -2
  49. package/dist-types/engine/runtime.d.ts +3 -3
  50. package/dist-types/registry.d.ts +182 -173
  51. package/dist-types/resolve.d.ts +2 -2
  52. package/dist-types/types.d.ts +2 -2
  53. package/dist-types/vendors/_shared/attributes.d.ts +2 -2
  54. package/dist-types/vendors/_shared/google-consent.d.ts +2 -2
  55. package/dist-types/vendors/_shared/install-builders.d.ts +1 -1
  56. package/dist-types/vendors/_shared/script-url.d.ts +6 -6
  57. package/dist-types/vendors/ads-and-pixels/linkedin-insights.d.ts +14 -14
  58. package/dist-types/vendors/ads-and-pixels/meta-pixel.d.ts +27 -27
  59. package/dist-types/vendors/ads-and-pixels/microsoft-uet.d.ts +40 -40
  60. package/dist-types/vendors/ads-and-pixels/openai-pixel.d.ts +211 -0
  61. package/dist-types/vendors/ads-and-pixels/reddit-pixel.d.ts +28 -29
  62. package/dist-types/vendors/ads-and-pixels/snapchat-pixel.d.ts +23 -23
  63. package/dist-types/vendors/ads-and-pixels/tiktok-pixel.d.ts +22 -22
  64. package/dist-types/vendors/ads-and-pixels/x-pixel.d.ts +15 -15
  65. package/dist-types/vendors/analytics/adobe-analytics.d.ts +3 -3
  66. package/dist-types/vendors/analytics/ahrefs-analytics.d.ts +5 -5
  67. package/dist-types/vendors/analytics/amplitude.d.ts +24 -24
  68. package/dist-types/vendors/analytics/clearbit.d.ts +5 -5
  69. package/dist-types/vendors/analytics/cloudflare-web-analytics.d.ts +6 -6
  70. package/dist-types/vendors/analytics/databuddy.d.ts +34 -31
  71. package/dist-types/vendors/analytics/fathom-analytics.d.ts +8 -8
  72. package/dist-types/vendors/analytics/google-tag.d.ts +17 -17
  73. package/dist-types/vendors/analytics/heap.d.ts +17 -17
  74. package/dist-types/vendors/analytics/hightouch.d.ts +15 -15
  75. package/dist-types/vendors/analytics/hotjar.d.ts +9 -9
  76. package/dist-types/vendors/analytics/logrocket.d.ts +11 -11
  77. package/dist-types/vendors/analytics/matomo-analytics.d.ts +3 -3
  78. package/dist-types/vendors/analytics/microsoft-clarity.d.ts +12 -13
  79. package/dist-types/vendors/analytics/mixpanel-analytics.d.ts +20 -20
  80. package/dist-types/vendors/analytics/pirsch.d.ts +10 -10
  81. package/dist-types/vendors/analytics/plausible-analytics.d.ts +13 -13
  82. package/dist-types/vendors/analytics/posthog.d.ts +35 -32
  83. package/dist-types/vendors/analytics/promptwatch.d.ts +5 -5
  84. package/dist-types/vendors/analytics/rudderstack.d.ts +16 -16
  85. package/dist-types/vendors/analytics/rybbit-analytics.d.ts +15 -15
  86. package/dist-types/vendors/analytics/segment.d.ts +11 -11
  87. package/dist-types/vendors/analytics/umami-analytics.d.ts +9 -9
  88. package/dist-types/vendors/analytics/vercel-analytics.d.ts +13 -13
  89. package/dist-types/vendors/functional/crisp.d.ts +9 -9
  90. package/dist-types/vendors/functional/intercom.d.ts +12 -12
  91. package/dist-types/vendors/tag-managers/google-tag-manager.d.ts +16 -16
  92. package/docs/README.md +74 -48
  93. package/docs/assets/v3/brand-bar.png +0 -0
  94. package/docs/assets/v3/brand-card.png +0 -0
  95. package/docs/assets/v3/choice-wall.png +0 -0
  96. package/docs/assets/v3/mobile-card.png +0 -0
  97. package/docs/assets/v3/preferences.png +0 -0
  98. package/docs/customization/overview.md +45 -0
  99. package/docs/customization/recipes.md +79 -0
  100. package/docs/customization/slots.md +55 -0
  101. package/docs/customization/tokens.md +76 -0
  102. package/docs/customization/translations.md +49 -0
  103. package/docs/frameworks/javascript/script-loader.md +30 -339
  104. package/docs/frameworks/next/script-loader.md +134 -467
  105. package/docs/frameworks/react/script-loader.md +35 -535
  106. package/docs/guides/consent-state.md +60 -0
  107. package/docs/guides/data-fetching.md +163 -0
  108. package/docs/guides/deployment-modes.md +63 -0
  109. package/docs/guides/troubleshooting.md +68 -0
  110. package/docs/guides/verify-consent.md +62 -0
  111. package/docs/integrations/adobe-analytics.md +239 -105
  112. package/docs/integrations/ahrefs-analytics.md +238 -104
  113. package/docs/integrations/amplitude.md +219 -157
  114. package/docs/integrations/building-integrations.md +32 -224
  115. package/docs/integrations/clearbit.md +247 -86
  116. package/docs/integrations/cloudflare-web-analytics.md +250 -84
  117. package/docs/integrations/crisp.md +251 -97
  118. package/docs/integrations/databuddy.md +259 -153
  119. package/docs/integrations/fathom-analytics.md +239 -96
  120. package/docs/integrations/google-maps.md +328 -207
  121. package/docs/integrations/google-tag-manager.md +248 -96
  122. package/docs/integrations/google-tag.md +261 -90
  123. package/docs/integrations/heap.md +222 -149
  124. package/docs/integrations/hightouch.md +225 -131
  125. package/docs/integrations/hotjar.md +239 -90
  126. package/docs/integrations/intercom.md +239 -98
  127. package/docs/integrations/linkedin-insights.md +243 -113
  128. package/docs/integrations/logrocket.md +241 -123
  129. package/docs/integrations/matomo-analytics.md +256 -111
  130. package/docs/integrations/meta-pixel.md +197 -324
  131. package/docs/integrations/microsoft-clarity.md +233 -114
  132. package/docs/integrations/microsoft-uet.md +245 -110
  133. package/docs/integrations/mixpanel-analytics.md +252 -87
  134. package/docs/integrations/openai-pixel.md +441 -0
  135. package/docs/integrations/overview.md +95 -133
  136. package/docs/integrations/pirsch.md +249 -96
  137. package/docs/integrations/plausible-analytics.md +241 -100
  138. package/docs/integrations/posthog.md +353 -214
  139. package/docs/integrations/promptwatch.md +251 -81
  140. package/docs/integrations/reddit-pixel.md +226 -173
  141. package/docs/integrations/rudderstack.md +244 -187
  142. package/docs/integrations/rybbit-analytics.md +244 -91
  143. package/docs/integrations/segment.md +238 -92
  144. package/docs/integrations/snapchat-pixel.md +240 -110
  145. package/docs/integrations/tiktok-pixel.md +249 -81
  146. package/docs/integrations/umami-analytics.md +242 -95
  147. package/docs/integrations/vercel-analytics.md +242 -90
  148. package/docs/integrations/x-pixel.md +238 -104
  149. package/docs/integrations/youtube.md +354 -142
  150. package/docs/upgrade-v3.md +334 -0
  151. package/package.json +85 -78
  152. package/readme.json +2 -2
  153. package/dist/e2e-test-utils.cjs +0 -166
  154. package/dist/engine/compile.cjs +0 -130
  155. package/dist/engine/runtime.cjs +0 -475
  156. package/dist/registry.cjs +0 -423
  157. package/dist/resolve.cjs +0 -71
  158. package/dist/types.cjs +0 -69
  159. package/dist/vendors/_shared/attributes.cjs +0 -55
  160. package/dist/vendors/_shared/google-consent.cjs +0 -69
  161. package/dist/vendors/_shared/install-builders.cjs +0 -59
  162. package/dist/vendors/_shared/script-url.cjs +0 -78
  163. package/dist/vendors/ads-and-pixels/linkedin-insights.cjs +0 -89
  164. package/dist/vendors/ads-and-pixels/meta-pixel.cjs +0 -206
  165. package/dist/vendors/ads-and-pixels/microsoft-uet.cjs +0 -151
  166. package/dist/vendors/ads-and-pixels/reddit-pixel.cjs +0 -151
  167. package/dist/vendors/ads-and-pixels/snapchat-pixel.cjs +0 -131
  168. package/dist/vendors/ads-and-pixels/tiktok-pixel.cjs +0 -130
  169. package/dist/vendors/ads-and-pixels/x-pixel.cjs +0 -92
  170. package/dist/vendors/analytics/adobe-analytics.cjs +0 -90
  171. package/dist/vendors/analytics/ahrefs-analytics.cjs +0 -68
  172. package/dist/vendors/analytics/amplitude.cjs +0 -193
  173. package/dist/vendors/analytics/clearbit.cjs +0 -69
  174. package/dist/vendors/analytics/cloudflare-web-analytics.cjs +0 -73
  175. package/dist/vendors/analytics/databuddy.cjs +0 -144
  176. package/dist/vendors/analytics/fathom-analytics.cjs +0 -76
  177. package/dist/vendors/analytics/google-tag.cjs +0 -107
  178. package/dist/vendors/analytics/heap.cjs +0 -181
  179. package/dist/vendors/analytics/hightouch.cjs +0 -153
  180. package/dist/vendors/analytics/hotjar.cjs +0 -85
  181. package/dist/vendors/analytics/logrocket.cjs +0 -99
  182. package/dist/vendors/analytics/matomo-analytics.cjs +0 -232
  183. package/dist/vendors/analytics/microsoft-clarity.cjs +0 -138
  184. package/dist/vendors/analytics/mixpanel-analytics.cjs +0 -134
  185. package/dist/vendors/analytics/pirsch.cjs +0 -108
  186. package/dist/vendors/analytics/plausible-analytics.cjs +0 -122
  187. package/dist/vendors/analytics/posthog.cjs +0 -236
  188. package/dist/vendors/analytics/promptwatch.cjs +0 -70
  189. package/dist/vendors/analytics/rudderstack.cjs +0 -227
  190. package/dist/vendors/analytics/rybbit-analytics.cjs +0 -104
  191. package/dist/vendors/analytics/segment.cjs +0 -97
  192. package/dist/vendors/analytics/umami-analytics.cjs +0 -80
  193. package/dist/vendors/analytics/vercel-analytics.cjs +0 -94
  194. package/dist/vendors/functional/crisp.cjs +0 -143
  195. package/dist/vendors/functional/intercom.cjs +0 -89
  196. package/dist/vendors/tag-managers/google-tag-manager.cjs +0 -100
  197. package/docs/shared/react/guides/script-loader.md +0 -311
@@ -1,412 +1,285 @@
1
1
  ---
2
2
  title: Meta Pixel
3
- description: Track conversions and build audiences for Facebook and Instagram
4
- advertising campaigns.
5
- icon: meta
3
+ description: Register the Meta Pixel under marketing permission and verify event
4
+ calls after revocation.
6
5
  group: integrations
7
6
  ---
8
- Meta Pixel (formerly Facebook Pixel) is Meta's conversion tracking and audience targeting tool for Facebook and Instagram advertising. It tracks user actions, measures ad effectiveness, builds custom audiences, and optimizes ad delivery.
9
7
 
10
- ## Integrate with c15t
8
+ ## Register the pixel
11
9
 
12
- **React**
10
+ | Package manager | Command |
11
+ | :-------------- | :-------------------------- |
12
+ | npm | `npm install @c15t/scripts` |
13
+ | pnpm | `pnpm add @c15t/scripts` |
14
+ | yarn | `yarn add @c15t/scripts` |
15
+ | bun | `bun add @c15t/scripts` |
13
16
 
14
- ```tsx
15
- import { type ReactNode } from 'react';
16
- import { ConsentManagerProvider } from '@c15t/react';
17
+ ```ts title="src/consent-scripts.ts"
17
18
  import { metaPixel } from '@c15t/scripts/meta-pixel';
18
19
 
19
- const scripts = [
20
- metaPixel({
21
- pixelId: '123456789012345',
22
- }),
23
- ];
24
-
25
- export function ConsentProvider({ children }: { children: ReactNode }) {
26
- return (
27
- <ConsentManagerProvider
28
- options={{
29
- mode: 'hosted',
30
- backendURL: 'https://your-instance.c15t.dev',
31
- scripts,
32
- }}
33
- >
34
- {children}
35
- </ConsentManagerProvider>
36
- );
37
- }
20
+ export const scripts = [metaPixel({ pixelId: '123456789012345' })];
38
21
  ```
39
22
 
40
- **Next.js**
23
+ Replace the pixel ID and pass `scripts` to your existing provider or core script
24
+ loader. The helper uses the `marketing` category. Remove the original pixel
25
+ snippet, including a separately installed tracking image or tag-manager entry.
41
26
 
42
- ```tsx
43
- 'use client';
27
+ ## Register the scripts
44
28
 
45
- import { type ReactNode } from 'react';
46
- import { ConsentManagerProvider } from '@c15t/nextjs';
47
- import { metaPixel } from '@c15t/scripts/meta-pixel';
29
+ Complete your [framework quickstart](https://c15t.com/docs/frameworks) first. Keep its Inth
30
+ endpoint, policy, styles and consent UI. Remove the vendor's original script,
31
+ SDK initializer or tag-manager entry so c15t owns loading once.
48
32
 
49
- const scripts = [
50
- metaPixel({
51
- pixelId: '123456789012345',
52
- }),
53
- ];
33
+ The `scripts` export in `src/consent-scripts.ts` is a configuration, not an
34
+ initializer. Add it to your existing consent owner using the registration point
35
+ below. These are partial edits to that owner, not additional providers.
54
36
 
55
- export function ConsentProvider({ children }: { children: ReactNode }) {
56
- return (
57
- <ConsentManagerProvider
58
- options={{
59
- mode: 'hosted',
60
- backendURL: '/api/c15t',
61
- scripts,
62
- }}
63
- >
64
- {children}
65
- </ConsentManagerProvider>
66
- );
67
- }
68
- ```
37
+ **Next.js**
69
38
 
70
- **JavaScript**
39
+ Import the configuration into the client boundary from your router guide:
71
40
 
72
41
  ```ts
73
- import { getOrCreateConsentRuntime } from 'c15t';
74
- import { metaPixel } from '@c15t/scripts/meta-pixel';
75
-
76
- getOrCreateConsentRuntime({
77
- mode: 'hosted',
78
- backendURL: 'https://your-instance.c15t.dev',
79
- scripts: [
80
- metaPixel({
81
- pixelId: '123456789012345',
82
- }),
83
- ],
84
- });
42
+ import { ConsentRoot } from 'c15t/next';
43
+ import { scripts } from './consent-scripts';
85
44
  ```
86
45
 
87
- ## How c15t loads it
46
+ Keep the server-resolved `state` and shared `consentConfig` from your
47
+ router guide. Its manifest, init and save URLs stay in effect. Add
48
+ `scripts` as a top-level prop on the existing root:
88
49
 
89
- * **Category:** `marketing` (Ads & Pixels)
90
- * **Loads when:** marketing consent is granted
91
- * **Default install:** c15t queues `fbq('consent', 'grant')`, `fbq('init', pixelId)`, `fbq('track', 'PageView')`, then loads Meta's `fbevents.js`
92
- * **On revocation:** [persists](/docs/frameworks/react/script-loader#persist-after-revocation) — c15t calls `fbq('consent', 'revoke')` so Meta stops tracking without removing the script
50
+ ```tsx
51
+ <ConsentRoot state={state} config={consentConfig} scripts={scripts}>
52
+ {children}
53
+ </ConsentRoot>
54
+ ```
93
55
 
94
- Meta recommends installing the base pixel on every page you want to measure. c15t injects scripts into the document head by default, which matches Meta's recommendation to load the pixel early.
56
+ For a Pages Router or static-export setup using `ConsentProvider`, add
57
+ `scripts` to its existing `options` instead. Keep the router-specific setup
58
+ from [Next.js script loading](../frameworks/next/script-loader.md).
95
59
 
96
- ## Configure the integration
60
+ **TanStack Start**
97
61
 
98
- Use the default setup when you want Meta's standard `PageView` event to fire as soon as the pixel loads after marketing consent.
62
+ In your existing root route component, import the scripts alongside
63
+ `ConsentRoot`. Keep the server loader from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart).
99
64
 
100
- ```ts
101
- metaPixel({
102
- pixelId: '123456789012345',
103
- });
65
+ ```tsx
66
+ import { Outlet } from '@tanstack/react-router';
67
+ import { ConsentRoot } from 'c15t/tanstack-start';
68
+ import { scripts } from '../consent-scripts';
69
+
70
+ function Root() {
71
+ const state = Route.useLoaderData();
72
+ return (
73
+ <ConsentRoot state={state} backendURL={backendURL} initRoute={false} scripts={scripts}>
74
+ <Outlet />
75
+ {/* Keep your consent banner, dialog and preferences link here. */}
76
+ </ConsentRoot>
77
+ );
78
+ }
104
79
  ```
105
80
 
106
- For single-page applications, disable the automatic `PageView` and track route changes yourself.
81
+ This edits the existing route. `Route` and `backendURL` come from its setup;
82
+ keep the document shell and head components if they are part of your root.
83
+ `initRoute={false}` keeps the quickstart's direct-backend initialization.
84
+ If your app mounts a consent server route, retain its existing `initRoute`
85
+ instead. Do not return script callbacks from a server function or route loader.
107
86
 
108
- ```ts
109
- metaPixel({
110
- pixelId: '123456789012345',
111
- trackPageView: false,
112
- });
113
- ```
87
+ **React**
114
88
 
115
- You can pass optional init data as the third argument to `fbq('init', ...)`.
89
+ Import the scripts into your existing provider component:
116
90
 
117
91
  ```ts
118
- metaPixel({
119
- pixelId: '123456789012345',
120
- initOptions: {
121
- external_id: 'customer-123',
122
- },
123
- });
92
+ import { ConsentProvider } from 'c15t/react';
93
+ import { scripts } from './consent-scripts';
124
94
  ```
125
95
 
126
- ## Tracking events in your app
96
+ Keep the existing options and add `scripts`:
127
97
 
128
- c15t gates the Meta Pixel script from loading until `marketing` consent is
129
- granted. After consent is granted the script stays in the DOM, and c15t calls
130
- `fbq('consent', 'revoke')` if consent is later revoked so Meta stops tracking
131
- without removing the script.
98
+ ```tsx
99
+ <ConsentProvider options={{ ...consentOptions, scripts }}>
100
+ {children}
101
+ </ConsentProvider>
102
+ ```
132
103
 
133
- This means `window.fbq` and the `metaPixelEvent` helpers are only defined after
134
- the user has granted marketing consent at least once. Before that, unguarded
135
- calls throw.
104
+ Here `consentOptions` is your existing configuration, including
105
+ `mode: hosted({ url: backendURL })`. Keep the banner, dialog and preferences
106
+ link inside the provider. See [React script loading](../frameworks/react/script-loader.md).
136
107
 
137
- ### Standard events
108
+ **Nuxt**
138
109
 
139
- Use `metaPixelEvent` to track Meta standard events. It is a typed wrapper around `fbq('track', ...)`.
110
+ Attach one loader from the root `app.vue`, after the Nuxt module has
111
+ started its browser runtime. This keeps vendor callbacks in application code rather
112
+ than serialized `nuxt.config.ts` runtime configuration.
140
113
 
141
- Meta documents standard event tracking in its [conversion tracking guide](https://developers.facebook.com/docs/meta-pixel/implementation/conversion-tracking) and [Marketing API pixel examples](https://developers.facebook.com/docs/meta-pixel/implementation/marketing-api).
114
+ ```vue title="app/app.vue"
115
+ <script setup lang="ts">
116
+ import { onUnmounted } from 'vue';
117
+ import { createScriptLoader } from 'c15t/modules/script-loader';
118
+ import { scripts } from '../src/consent-scripts';
142
119
 
143
- ```ts
144
- import { metaPixelEvent } from '@c15t/scripts/meta-pixel';
120
+ const nuxtApp = useNuxtApp();
121
+ const kernel = useConsentKernel();
122
+ let loader: ReturnType<typeof createScriptLoader> | undefined;
145
123
 
146
- metaPixelEvent('Lead', {
147
- value: 40,
148
- currency: 'USD',
124
+ const removeMountedHook = nuxtApp.hook('app:mounted', () => {
125
+ loader = createScriptLoader({ kernel, scripts });
149
126
  });
150
-
151
- metaPixelEvent('AddToCart', {
152
- content_ids: ['SKU-123'],
153
- content_type: 'product',
154
- value: 49.99,
155
- currency: 'USD',
127
+ onUnmounted(() => {
128
+ removeMountedHook();
129
+ loader?.dispose();
156
130
  });
131
+ </script>
157
132
 
158
- metaPixelEvent(
159
- 'Purchase',
160
- {
161
- contents: [
162
- { id: 'SKU-123', quantity: 2 },
163
- { id: 'SKU-456', quantity: 1 },
164
- ],
165
- content_type: 'product',
166
- value: 149.97,
167
- currency: 'USD',
168
- },
169
- 'browser-event-123'
170
- );
133
+ <template>
134
+ <ConsentRoot />
135
+ <NuxtPage />
136
+ </template>
171
137
  ```
172
138
 
173
- The optional third argument can be an event ID string or an options object. c15t forwards string IDs as `{ eventID: '...' }`, which is the browser-side format used for Conversions API deduplication.
139
+ Merge the setup code into your root and retain its footer and preferences
140
+ link. `useConsentKernel` is auto-imported by the c15t Nuxt module. Adjust the
141
+ relative script import if your `app.vue` is at the project root. This loader
142
+ waits until the module has applied browser persistence and privacy signals,
143
+ then reads the current snapshot and observes future changes. Do not also register these scripts
144
+ in another loader. See the [Nuxt quickstart](https://c15t.com/docs/frameworks/nuxt/quickstart).
174
145
 
175
- ```ts
176
- metaPixelEvent(
177
- 'Purchase',
178
- { value: 149.97, currency: 'USD' },
179
- { eventID: 'browser-event-123' }
180
- );
181
- ```
146
+ **Vue**
182
147
 
183
- ### Custom events
148
+ Use the kernel already provided by the Vue plugin. Merge this setup into
149
+ `App.vue`, whose lifetime covers the application:
184
150
 
185
- Use `metaPixelCustomEvent` when Meta's standard events do not fit the action you are measuring. Meta custom event names must be strings and cannot exceed 50 characters.
151
+ ```vue title="src/App.vue"
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';
157
+ import { scripts } from './consent-scripts';
186
158
 
187
- ```ts
188
- import { metaPixelCustomEvent } from '@c15t/scripts/meta-pixel';
159
+ const kernel = useConsentKernel();
160
+ let loader: ReturnType<typeof createScriptLoader> | undefined;
189
161
 
190
- metaPixelCustomEvent('ShareDiscount', {
191
- promotion: 'share_discount_10%',
162
+ onMounted(() => {
163
+ loader = createScriptLoader({ kernel, scripts });
192
164
  });
193
- ```
194
-
195
- Custom events can also use an event ID for Conversions API deduplication.
165
+ onUnmounted(() => loader?.dispose());
166
+ </script>
196
167
 
197
- ```ts
198
- metaPixelCustomEvent(
199
- 'ShareDiscount',
200
- { promotion: 'share_discount_10%' },
201
- 'browser-event-456'
202
- );
168
+ <template>
169
+ <ConsentRoot />
170
+ <main>Your application</main>
171
+ </template>
203
172
  ```
204
173
 
205
- ### Guard event calls with consent
174
+ Keep your existing page content and preferences link. The plugin still owns
175
+ the kernel and persistence; this component owns only the vendor loader.
176
+ Do not register the same scripts in plugin configuration as well. See the
177
+ [Vue quickstart](https://c15t.com/docs/frameworks/vue/quickstart).
206
178
 
207
- The example below intentionally uses `useConsentManager().has('marketing')` as
208
- a defensive policy so your app avoids calling `metaPixelEvent` whenever consent
209
- is currently revoked, even though Meta also suppresses tracking after initial
210
- load.
211
-
212
- ```tsx
213
- import { useConsentManager } from '@c15t/react';
214
- import { metaPixelEvent } from '@c15t/scripts/meta-pixel';
215
-
216
- function useTrackPurchase() {
217
- const { has } = useConsentManager();
218
-
219
- // Defensive pattern: only call metaPixelEvent while marketing consent is granted.
220
- return () => {
221
- if (has('marketing')) {
222
- metaPixelEvent('Purchase', { value: 10.0, currency: 'USD' });
223
- }
224
- };
225
- }
179
+ **Astro**
226
180
 
227
- function PurchaseButton() {
228
- const trackPurchase = useTrackPurchase();
181
+ Point the existing Astro integration at a client module. Keep its `mode`,
182
+ `ui` and framework integration from the [Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart).
183
+ Import `fileURLToPath` in your Astro configuration:
229
184
 
230
- return <button onClick={trackPurchase}>Complete purchase</button>;
231
- }
185
+ ```js title="astro.config.mjs"
186
+ import { fileURLToPath } from 'node:url';
232
187
  ```
233
188
 
234
- ### SPA route changes
235
-
236
- Meta's [SPA guidance](https://developers.facebook.com/docs/facebook-pixel/implementation/tag_spa) recommends tracking meaningful URL changes from your router. Disable the install-time `PageView`, then emit page views after navigation while marketing consent is granted.
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:
237
191
 
238
- ```tsx
239
- import { useConsentManager } from '@c15t/react';
240
- import { metaPixelEvent } from '@c15t/scripts/meta-pixel';
241
- import { useEffect } from 'react';
242
- import { useLocation } from 'react-router-dom';
243
-
244
- function MetaRouteTracking() {
245
- const { has } = useConsentManager();
246
- const location = useLocation();
247
-
248
- useEffect(() => {
249
- if (has('marketing')) {
250
- metaPixelEvent('PageView');
251
- }
252
- }, [has, location.pathname, location.search]);
253
-
254
- return null;
255
- }
192
+ ```js
193
+ clientEntrypoint: fileURLToPath(new URL('./src/c15t.client.ts', import.meta.url)),
256
194
  ```
257
195
 
258
- ## Consent and privacy
259
-
260
- Meta's GDPR guidance documents `fbq('consent', 'revoke')` and `fbq('consent', 'grant')`. c15t handles those calls for you after the script has loaded once:
261
-
262
- * Before marketing consent, c15t does not load Meta Pixel.
263
- * When marketing consent is granted, c15t loads Meta Pixel and calls `fbq('consent', 'grant')`.
264
- * When marketing consent is revoked later, c15t keeps the script in place and calls `fbq('consent', 'revoke')`.
265
-
266
- For US state privacy rules, Meta supports [Data Processing Options](https://developers.facebook.com/docs/meta-pixel/implementation/data-processing-options). Pass `dataProcessingOptions` to queue `fbq('dataProcessingOptions', ...)` before `fbq('init', ...)`.
267
-
268
- Let Meta geolocate Limited Data Use:
269
-
270
- ```ts
271
- metaPixel({
272
- pixelId: '123456789012345',
273
- dataProcessingOptions: {
274
- options: ['LDU'],
275
- country: 0,
276
- state: 0,
277
- },
278
- });
279
- ```
196
+ Export the scripts from that module:
280
197
 
281
- Enable Limited Data Use for California:
198
+ ```ts title="src/c15t.client.ts"
199
+ import type { C15tClientOptionsExtension } from '@c15t/astro';
200
+ import { scripts } from './consent-scripts';
282
201
 
283
- ```ts
284
- metaPixel({
285
- pixelId: '123456789012345',
286
- dataProcessingOptions: {
287
- options: ['LDU'],
288
- country: 1,
289
- state: 1000,
290
- },
291
- });
202
+ export default { scripts } satisfies C15tClientOptionsExtension;
292
203
  ```
293
204
 
294
- Explicitly disable Limited Data Use:
205
+ The integration passes this extension to its shared browser runtime. Vendor
206
+ helpers contain callbacks, so do not put them in the serialized `scripts`
207
+ option in `astro.config.mjs`. Keep one runtime across consent islands and
208
+ `ClientRouter` navigation.
295
209
 
296
- ```ts
297
- metaPixel({
298
- pixelId: '123456789012345',
299
- dataProcessingOptions: {
300
- options: [],
301
- },
302
- });
303
- ```
304
-
305
- ## Catalog and collaborative ads
210
+ **Svelte**
306
211
 
307
- For Advantage+ catalog ads, Meta requires `ViewContent`, `AddToCart`, and `Purchase` events to include either `content_ids` or `contents`. IDs must match your product catalog. See Meta's [Advantage+ catalog ads guide](https://developers.facebook.com/docs/meta-pixel/get-started/advantage-catalog-ads).
212
+ Import the scripts in the component that owns your existing provider and
213
+ pass them as a top-level prop:
308
214
 
309
- ```ts
310
- metaPixelEvent('ViewContent', {
311
- content_ids: ['SKU-123'],
312
- content_type: 'product',
313
- value: 49.99,
314
- currency: 'USD',
315
- });
316
- ```
215
+ ```svelte title="src/App.svelte"
216
+ <script lang="ts">
217
+ import { ConsentManagerProvider, hosted } from '@c15t/svelte';
218
+ import { scripts } from './consent-scripts';
317
219
 
318
- For collaborative ads, Meta requires `content_type: 'product'`; `AddToCart` and `Purchase` also require `contents`, `currency`, and `value`. See Meta's [collaborative ads pixel guide](https://developers.facebook.com/docs/meta-pixel/implementation/pixel-for-collaborative-ads).
220
+ const backendURL = import.meta.env.VITE_C15T_BACKEND_URL;
221
+ if (!backendURL) throw new Error('Set VITE_C15T_BACKEND_URL');
222
+ const mode = hosted({ url: backendURL });
223
+ </script>
319
224
 
320
- ```ts
321
- metaPixelEvent('AddToCart', {
322
- contents: [{ id: 'SKU-123', quantity: 2 }],
323
- content_type: 'product',
324
- value: 99.98,
325
- currency: 'USD',
326
- });
225
+ <ConsentManagerProvider {mode} {scripts}>
226
+ <!-- Keep your application, consent UI and preferences link here. -->
227
+ </ConsentManagerProvider>
327
228
  ```
328
229
 
329
- ## Movies
230
+ Retain the styles and consent UI from the [Svelte quickstart](https://c15t.com/docs/frameworks/svelte/quickstart).
231
+ The provider owns the loader and disposes it on unmount.
330
232
 
331
- Meta's [movies pixel guide](https://developers.facebook.com/docs/meta-pixel/implementation/pixel-for-movies) uses the standard events `ViewContent`, `InitiateCheckout`, `Purchase`, and `PageView` with movie-specific parameters such as `movieref`.
233
+ **SvelteKit**
332
234
 
333
- ```ts
334
- metaPixelEvent('InitiateCheckout', {
335
- content_ids: ['movie-1|theater-1|2026-05-11T19:30:00-07:00'],
336
- movieref: 'fb_movies',
337
- num_items: 2,
338
- });
339
- ```
235
+ Add the scripts to the existing root layout provider. Keep the server load
236
+ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.com/docs/frameworks/sveltekit/quickstart).
340
237
 
341
- ## Multiple pixels
238
+ ```svelte title="src/routes/+layout.svelte"
239
+ <script lang="ts">
240
+ import { ConsentManagerProvider, hosted } from '@c15t/svelte';
241
+ import { scripts } from '../consent-scripts';
342
242
 
343
- Meta's [multiple pixel guidance](https://developers.facebook.com/docs/facebook-pixel/implementation/accurate_event_tracking) warns that `fbq('track', ...)` and `fbq('trackCustom', ...)` fire for every initialized pixel ID. If another integration or tag manager initializes more than one pixel, use the single-pixel helpers to prevent overfiring.
243
+ let { children, data } = $props();
244
+ const mode = hosted({ url: data.backendURL });
245
+ </script>
344
246
 
345
- ```ts
346
- import {
347
- metaPixelSingleCustomEvent,
348
- metaPixelSingleEvent,
349
- } from '@c15t/scripts/meta-pixel';
350
-
351
- metaPixelSingleEvent('PIXEL-A', 'Purchase', {
352
- value: 149.97,
353
- currency: 'USD',
354
- });
355
-
356
- metaPixelSingleCustomEvent('PIXEL-B', 'Step4', {
357
- funnel: 'checkout',
358
- });
247
+ <ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
248
+ {@render children()}
249
+ <!-- Keep your consent UI and preferences link here. -->
250
+ </ConsentManagerProvider>
359
251
  ```
360
252
 
361
- ## Custom audiences and sharing
362
-
363
- Meta custom audiences are configured in Events Manager after standard events, custom events, or custom conversions are being received. The c15t integration sends the browser events; audience rules are managed in Meta. See Meta's [custom audiences guide](https://developers.facebook.com/docs/facebook-pixel/implementation/custom-audiences).
364
-
365
- Pixel sharing between businesses or agencies is also managed through Meta Business Manager or the Business Management APIs, not through the browser script. See Meta's [pixel sharing guide](https://developers.facebook.com/docs/marketing-api/business-asset-management/guides/business-pixel-sharing).
253
+ Import vendor helpers in the layout component, not in `+layout.server.ts`.
254
+ For static hosting, keep your browser-only `mode` setup and omit request
255
+ prefetch; the `scripts` prop stays the same. If you pass an externally owned
256
+ `runtime` to the provider, register scripts when creating that runtime instead.
366
257
 
367
- ## Types
368
-
369
- ### MetaPixelOptions
370
-
371
- |Property|Value|
372
- |:--|:--|
373
- |Type Name|\`MetaPixelOptions\`|
374
- |Source Path|\`./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts\`|
375
-
376
- \*ExtractedTypeTable: Could not extract "MetaPixelOptions" from "./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
377
-
378
- ### MetaPixelDataProcessingOptions
379
-
380
- |Property|Value|
381
- |:--|:--|
382
- |Type Name|\`MetaPixelDataProcessingOptions\`|
383
- |Source Path|\`./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts\`|
384
-
385
- \*ExtractedTypeTable: Could not extract "MetaPixelDataProcessingOptions" from "./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
386
-
387
- ### MetaPixelEventOptions
388
-
389
- |Property|Value|
390
- |:--|:--|
391
- |Type Name|\`MetaPixelEventOptions\`|
392
- |Source Path|\`./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts\`|
258
+ **JavaScript**
393
259
 
394
- \*ExtractedTypeTable: Could not extract "MetaPixelEventOptions" from "./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
260
+ Attach the loader to your existing kernel before calling
261
+ `kernel.commands.init()`:
395
262
 
396
- ### Script
263
+ ```ts
264
+ import { createScriptLoader } from 'c15t/modules/script-loader';
265
+ import { scripts } from './consent-scripts';
397
266
 
398
- |Property|Value|
399
- |:--|:--|
400
- |Type Name|\`Script\`|
401
- |Source Path|\`./packages/core/src/libs/script-loader/types.ts\`|
267
+ const loader = createScriptLoader({ kernel, scripts });
268
+ ```
402
269
 
403
- \*ExtractedTypeTable: Could not extract "Script" from "./packages/core/src/libs/script-loader/types.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
270
+ Call `loader.dispose()` when that application instance is destroyed.
271
+ `kernel` is the hosted kernel from your quickstart. A provider-owned kernel
272
+ already has a loader; do not attach a second one. See
273
+ [JavaScript script loading](../frameworks/javascript/script-loader.md).
404
274
 
405
- ### StandardEventParams
275
+ ## Keep event calls behind permission
406
276
 
407
- |Property|Value|
408
- |:--|:--|
409
- |Type Name|\`StandardEventParams\`|
410
- |Source Path|\`./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts\`|
277
+ Initialization and later application events are separate responsibilities. If
278
+ application code calls `fbq` directly, check effective marketing permission
279
+ before each optional event and ensure the API is available. Do not assume a
280
+ function still present on `window` means the visitor still permits tracking.
411
281
 
412
- \*ExtractedTypeTable: Could not extract "StandardEventParams" from "./packages/scripts/src/vendors/ads-and-pixels/meta-pixel.ts" using base path "/home/runner/work/c15t/c15t". Verify the path/name and that the file is included by your tsconfig.\*
282
+ For an opt-in policy, verify no pixel script or collection request occurs before
283
+ permission or after rejection. Grant permission, send a test event, revoke and
284
+ confirm future application events stop. Check navigation for duplicate page
285
+ views. See [verification](../guides/verify-consent.md).