@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.
- package/AGENTS.md +74 -48
- package/README.md +3 -3
- package/dist/e2e-test-utils.js +60 -24
- package/dist/engine/compile.js +45 -45
- package/dist/engine/runtime.js +119 -119
- package/dist/registry.js +186 -176
- package/dist/resolve.js +12 -12
- package/dist/vendors/_shared/attributes.js +5 -5
- package/dist/vendors/_shared/google-consent.js +10 -10
- package/dist/vendors/_shared/install-builders.js +9 -9
- package/dist/vendors/_shared/script-url.js +12 -12
- package/dist/vendors/ads-and-pixels/linkedin-insights.js +16 -16
- package/dist/vendors/ads-and-pixels/meta-pixel.js +82 -82
- package/dist/vendors/ads-and-pixels/microsoft-uet.js +57 -57
- package/dist/vendors/ads-and-pixels/openai-pixel.js +88 -0
- package/dist/vendors/ads-and-pixels/reddit-pixel.js +39 -39
- package/dist/vendors/ads-and-pixels/snapchat-pixel.js +25 -25
- package/dist/vendors/ads-and-pixels/tiktok-pixel.js +31 -31
- package/dist/vendors/ads-and-pixels/x-pixel.js +17 -17
- package/dist/vendors/analytics/adobe-analytics.js +17 -17
- package/dist/vendors/analytics/ahrefs-analytics.js +8 -8
- package/dist/vendors/analytics/amplitude.js +39 -39
- package/dist/vendors/analytics/clearbit.js +11 -11
- package/dist/vendors/analytics/cloudflare-web-analytics.js +13 -13
- package/dist/vendors/analytics/databuddy.js +45 -45
- package/dist/vendors/analytics/fathom-analytics.js +15 -15
- package/dist/vendors/analytics/google-tag.js +23 -23
- package/dist/vendors/analytics/heap.js +37 -37
- package/dist/vendors/analytics/hightouch.js +30 -30
- package/dist/vendors/analytics/hotjar.js +14 -14
- package/dist/vendors/analytics/logrocket.js +24 -24
- package/dist/vendors/analytics/matomo-analytics.js +51 -51
- package/dist/vendors/analytics/microsoft-clarity.js +31 -31
- package/dist/vendors/analytics/mixpanel-analytics.js +31 -31
- package/dist/vendors/analytics/pirsch.js +27 -27
- package/dist/vendors/analytics/plausible-analytics.js +24 -24
- package/dist/vendors/analytics/posthog.js +84 -79
- package/dist/vendors/analytics/promptwatch.js +8 -8
- package/dist/vendors/analytics/rudderstack.js +50 -50
- package/dist/vendors/analytics/rybbit-analytics.js +30 -30
- package/dist/vendors/analytics/segment.js +16 -16
- package/dist/vendors/analytics/umami-analytics.js +16 -16
- package/dist/vendors/analytics/vercel-analytics.js +22 -22
- package/dist/vendors/functional/crisp.js +49 -51
- package/dist/vendors/functional/intercom.js +18 -18
- package/dist/vendors/tag-managers/google-tag-manager.js +20 -20
- package/dist-types/__tests__/helpers.d.ts +10 -10
- package/dist-types/engine/compile.d.ts +2 -2
- package/dist-types/engine/runtime.d.ts +3 -3
- package/dist-types/registry.d.ts +182 -173
- package/dist-types/resolve.d.ts +2 -2
- package/dist-types/types.d.ts +2 -2
- package/dist-types/vendors/_shared/attributes.d.ts +2 -2
- package/dist-types/vendors/_shared/google-consent.d.ts +2 -2
- package/dist-types/vendors/_shared/install-builders.d.ts +1 -1
- package/dist-types/vendors/_shared/script-url.d.ts +6 -6
- package/dist-types/vendors/ads-and-pixels/linkedin-insights.d.ts +14 -14
- package/dist-types/vendors/ads-and-pixels/meta-pixel.d.ts +27 -27
- package/dist-types/vendors/ads-and-pixels/microsoft-uet.d.ts +40 -40
- package/dist-types/vendors/ads-and-pixels/openai-pixel.d.ts +211 -0
- package/dist-types/vendors/ads-and-pixels/reddit-pixel.d.ts +28 -29
- package/dist-types/vendors/ads-and-pixels/snapchat-pixel.d.ts +23 -23
- package/dist-types/vendors/ads-and-pixels/tiktok-pixel.d.ts +22 -22
- package/dist-types/vendors/ads-and-pixels/x-pixel.d.ts +15 -15
- package/dist-types/vendors/analytics/adobe-analytics.d.ts +3 -3
- package/dist-types/vendors/analytics/ahrefs-analytics.d.ts +5 -5
- package/dist-types/vendors/analytics/amplitude.d.ts +24 -24
- package/dist-types/vendors/analytics/clearbit.d.ts +5 -5
- package/dist-types/vendors/analytics/cloudflare-web-analytics.d.ts +6 -6
- package/dist-types/vendors/analytics/databuddy.d.ts +34 -31
- package/dist-types/vendors/analytics/fathom-analytics.d.ts +8 -8
- package/dist-types/vendors/analytics/google-tag.d.ts +17 -17
- package/dist-types/vendors/analytics/heap.d.ts +17 -17
- package/dist-types/vendors/analytics/hightouch.d.ts +15 -15
- package/dist-types/vendors/analytics/hotjar.d.ts +9 -9
- package/dist-types/vendors/analytics/logrocket.d.ts +11 -11
- package/dist-types/vendors/analytics/matomo-analytics.d.ts +3 -3
- package/dist-types/vendors/analytics/microsoft-clarity.d.ts +12 -13
- package/dist-types/vendors/analytics/mixpanel-analytics.d.ts +20 -20
- package/dist-types/vendors/analytics/pirsch.d.ts +10 -10
- package/dist-types/vendors/analytics/plausible-analytics.d.ts +13 -13
- package/dist-types/vendors/analytics/posthog.d.ts +35 -32
- package/dist-types/vendors/analytics/promptwatch.d.ts +5 -5
- package/dist-types/vendors/analytics/rudderstack.d.ts +16 -16
- package/dist-types/vendors/analytics/rybbit-analytics.d.ts +15 -15
- package/dist-types/vendors/analytics/segment.d.ts +11 -11
- package/dist-types/vendors/analytics/umami-analytics.d.ts +9 -9
- package/dist-types/vendors/analytics/vercel-analytics.d.ts +13 -13
- package/dist-types/vendors/functional/crisp.d.ts +9 -9
- package/dist-types/vendors/functional/intercom.d.ts +12 -12
- package/dist-types/vendors/tag-managers/google-tag-manager.d.ts +16 -16
- package/docs/README.md +74 -48
- package/docs/assets/v3/brand-bar.png +0 -0
- package/docs/assets/v3/brand-card.png +0 -0
- package/docs/assets/v3/choice-wall.png +0 -0
- package/docs/assets/v3/mobile-card.png +0 -0
- package/docs/assets/v3/preferences.png +0 -0
- package/docs/customization/overview.md +45 -0
- package/docs/customization/recipes.md +79 -0
- package/docs/customization/slots.md +55 -0
- package/docs/customization/tokens.md +76 -0
- package/docs/customization/translations.md +49 -0
- package/docs/frameworks/javascript/script-loader.md +30 -339
- package/docs/frameworks/next/script-loader.md +134 -467
- package/docs/frameworks/react/script-loader.md +35 -535
- package/docs/guides/consent-state.md +60 -0
- package/docs/guides/data-fetching.md +163 -0
- package/docs/guides/deployment-modes.md +63 -0
- package/docs/guides/troubleshooting.md +68 -0
- package/docs/guides/verify-consent.md +62 -0
- package/docs/integrations/adobe-analytics.md +239 -105
- package/docs/integrations/ahrefs-analytics.md +238 -104
- package/docs/integrations/amplitude.md +219 -157
- package/docs/integrations/building-integrations.md +32 -224
- package/docs/integrations/clearbit.md +247 -86
- package/docs/integrations/cloudflare-web-analytics.md +250 -84
- package/docs/integrations/crisp.md +251 -97
- package/docs/integrations/databuddy.md +259 -153
- package/docs/integrations/fathom-analytics.md +239 -96
- package/docs/integrations/google-maps.md +328 -207
- package/docs/integrations/google-tag-manager.md +248 -96
- package/docs/integrations/google-tag.md +261 -90
- package/docs/integrations/heap.md +222 -149
- package/docs/integrations/hightouch.md +225 -131
- package/docs/integrations/hotjar.md +239 -90
- package/docs/integrations/intercom.md +239 -98
- package/docs/integrations/linkedin-insights.md +243 -113
- package/docs/integrations/logrocket.md +241 -123
- package/docs/integrations/matomo-analytics.md +256 -111
- package/docs/integrations/meta-pixel.md +197 -324
- package/docs/integrations/microsoft-clarity.md +233 -114
- package/docs/integrations/microsoft-uet.md +245 -110
- package/docs/integrations/mixpanel-analytics.md +252 -87
- package/docs/integrations/openai-pixel.md +441 -0
- package/docs/integrations/overview.md +95 -133
- package/docs/integrations/pirsch.md +249 -96
- package/docs/integrations/plausible-analytics.md +241 -100
- package/docs/integrations/posthog.md +353 -214
- package/docs/integrations/promptwatch.md +251 -81
- package/docs/integrations/reddit-pixel.md +226 -173
- package/docs/integrations/rudderstack.md +244 -187
- package/docs/integrations/rybbit-analytics.md +244 -91
- package/docs/integrations/segment.md +238 -92
- package/docs/integrations/snapchat-pixel.md +240 -110
- package/docs/integrations/tiktok-pixel.md +249 -81
- package/docs/integrations/umami-analytics.md +242 -95
- package/docs/integrations/vercel-analytics.md +242 -90
- package/docs/integrations/x-pixel.md +238 -104
- package/docs/integrations/youtube.md +354 -142
- package/docs/upgrade-v3.md +334 -0
- package/package.json +85 -78
- package/readme.json +2 -2
- package/dist/e2e-test-utils.cjs +0 -166
- package/dist/engine/compile.cjs +0 -130
- package/dist/engine/runtime.cjs +0 -475
- package/dist/registry.cjs +0 -423
- package/dist/resolve.cjs +0 -71
- package/dist/types.cjs +0 -69
- package/dist/vendors/_shared/attributes.cjs +0 -55
- package/dist/vendors/_shared/google-consent.cjs +0 -69
- package/dist/vendors/_shared/install-builders.cjs +0 -59
- package/dist/vendors/_shared/script-url.cjs +0 -78
- package/dist/vendors/ads-and-pixels/linkedin-insights.cjs +0 -89
- package/dist/vendors/ads-and-pixels/meta-pixel.cjs +0 -206
- package/dist/vendors/ads-and-pixels/microsoft-uet.cjs +0 -151
- package/dist/vendors/ads-and-pixels/reddit-pixel.cjs +0 -151
- package/dist/vendors/ads-and-pixels/snapchat-pixel.cjs +0 -131
- package/dist/vendors/ads-and-pixels/tiktok-pixel.cjs +0 -130
- package/dist/vendors/ads-and-pixels/x-pixel.cjs +0 -92
- package/dist/vendors/analytics/adobe-analytics.cjs +0 -90
- package/dist/vendors/analytics/ahrefs-analytics.cjs +0 -68
- package/dist/vendors/analytics/amplitude.cjs +0 -193
- package/dist/vendors/analytics/clearbit.cjs +0 -69
- package/dist/vendors/analytics/cloudflare-web-analytics.cjs +0 -73
- package/dist/vendors/analytics/databuddy.cjs +0 -144
- package/dist/vendors/analytics/fathom-analytics.cjs +0 -76
- package/dist/vendors/analytics/google-tag.cjs +0 -107
- package/dist/vendors/analytics/heap.cjs +0 -181
- package/dist/vendors/analytics/hightouch.cjs +0 -153
- package/dist/vendors/analytics/hotjar.cjs +0 -85
- package/dist/vendors/analytics/logrocket.cjs +0 -99
- package/dist/vendors/analytics/matomo-analytics.cjs +0 -232
- package/dist/vendors/analytics/microsoft-clarity.cjs +0 -138
- package/dist/vendors/analytics/mixpanel-analytics.cjs +0 -134
- package/dist/vendors/analytics/pirsch.cjs +0 -108
- package/dist/vendors/analytics/plausible-analytics.cjs +0 -122
- package/dist/vendors/analytics/posthog.cjs +0 -236
- package/dist/vendors/analytics/promptwatch.cjs +0 -70
- package/dist/vendors/analytics/rudderstack.cjs +0 -227
- package/dist/vendors/analytics/rybbit-analytics.cjs +0 -104
- package/dist/vendors/analytics/segment.cjs +0 -97
- package/dist/vendors/analytics/umami-analytics.cjs +0 -80
- package/dist/vendors/analytics/vercel-analytics.cjs +0 -94
- package/dist/vendors/functional/crisp.cjs +0 -143
- package/dist/vendors/functional/intercom.cjs +0 -89
- package/dist/vendors/tag-managers/google-tag-manager.cjs +0 -100
- package/docs/shared/react/guides/script-loader.md +0 -311
|
@@ -1,412 +1,285 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Meta Pixel
|
|
3
|
-
description:
|
|
4
|
-
|
|
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
|
-
##
|
|
8
|
+
## Register the pixel
|
|
11
9
|
|
|
12
|
-
|
|
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
|
-
```
|
|
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
|
-
|
|
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
|
-
|
|
43
|
-
'use client';
|
|
27
|
+
## Register the scripts
|
|
44
28
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
+
Import the configuration into the client boundary from your router guide:
|
|
71
40
|
|
|
72
41
|
```ts
|
|
73
|
-
import {
|
|
74
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
50
|
+
```tsx
|
|
51
|
+
<ConsentRoot state={state} config={consentConfig} scripts={scripts}>
|
|
52
|
+
{children}
|
|
53
|
+
</ConsentRoot>
|
|
54
|
+
```
|
|
93
55
|
|
|
94
|
-
|
|
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
|
-
|
|
60
|
+
**TanStack Start**
|
|
97
61
|
|
|
98
|
-
|
|
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
|
-
```
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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
|
-
|
|
109
|
-
metaPixel({
|
|
110
|
-
pixelId: '123456789012345',
|
|
111
|
-
trackPageView: false,
|
|
112
|
-
});
|
|
113
|
-
```
|
|
87
|
+
**React**
|
|
114
88
|
|
|
115
|
-
|
|
89
|
+
Import the scripts into your existing provider component:
|
|
116
90
|
|
|
117
91
|
```ts
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
96
|
+
Keep the existing options and add `scripts`:
|
|
127
97
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
98
|
+
```tsx
|
|
99
|
+
<ConsentProvider options={{ ...consentOptions, scripts }}>
|
|
100
|
+
{children}
|
|
101
|
+
</ConsentProvider>
|
|
102
|
+
```
|
|
132
103
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
108
|
+
**Nuxt**
|
|
138
109
|
|
|
139
|
-
|
|
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
|
-
|
|
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
|
-
|
|
144
|
-
|
|
120
|
+
const nuxtApp = useNuxtApp();
|
|
121
|
+
const kernel = useConsentKernel();
|
|
122
|
+
let loader: ReturnType<typeof createScriptLoader> | undefined;
|
|
145
123
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
currency: 'USD',
|
|
124
|
+
const removeMountedHook = nuxtApp.hook('app:mounted', () => {
|
|
125
|
+
loader = createScriptLoader({ kernel, scripts });
|
|
149
126
|
});
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
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
|
-
|
|
176
|
-
metaPixelEvent(
|
|
177
|
-
'Purchase',
|
|
178
|
-
{ value: 149.97, currency: 'USD' },
|
|
179
|
-
{ eventID: 'browser-event-123' }
|
|
180
|
-
);
|
|
181
|
-
```
|
|
146
|
+
**Vue**
|
|
182
147
|
|
|
183
|
-
|
|
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
|
-
|
|
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
|
-
|
|
188
|
-
|
|
159
|
+
const kernel = useConsentKernel();
|
|
160
|
+
let loader: ReturnType<typeof createScriptLoader> | undefined;
|
|
189
161
|
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
'browser-event-456'
|
|
202
|
-
);
|
|
168
|
+
<template>
|
|
169
|
+
<ConsentRoot />
|
|
170
|
+
<main>Your application</main>
|
|
171
|
+
</template>
|
|
203
172
|
```
|
|
204
173
|
|
|
205
|
-
|
|
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
|
-
|
|
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
|
-
|
|
228
|
-
|
|
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
|
-
|
|
231
|
-
}
|
|
185
|
+
```js title="astro.config.mjs"
|
|
186
|
+
import { fileURLToPath } from 'node:url';
|
|
232
187
|
```
|
|
233
188
|
|
|
234
|
-
|
|
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
|
-
```
|
|
239
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
+
```ts title="src/c15t.client.ts"
|
|
199
|
+
import type { C15tClientOptionsExtension } from '@c15t/astro';
|
|
200
|
+
import { scripts } from './consent-scripts';
|
|
282
201
|
|
|
283
|
-
|
|
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
|
-
|
|
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
|
-
|
|
297
|
-
metaPixel({
|
|
298
|
-
pixelId: '123456789012345',
|
|
299
|
-
dataProcessingOptions: {
|
|
300
|
-
options: [],
|
|
301
|
-
},
|
|
302
|
-
});
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## Catalog and collaborative ads
|
|
210
|
+
**Svelte**
|
|
306
211
|
|
|
307
|
-
|
|
212
|
+
Import the scripts in the component that owns your existing provider and
|
|
213
|
+
pass them as a top-level prop:
|
|
308
214
|
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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
|
-
|
|
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
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
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
|
-
|
|
233
|
+
**SvelteKit**
|
|
332
234
|
|
|
333
|
-
|
|
334
|
-
|
|
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
|
-
|
|
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
|
-
|
|
243
|
+
let { children, data } = $props();
|
|
244
|
+
const mode = hosted({ url: data.backendURL });
|
|
245
|
+
</script>
|
|
344
246
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
-
|
|
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
|
-
|
|
260
|
+
Attach the loader to your existing kernel before calling
|
|
261
|
+
`kernel.commands.init()`:
|
|
395
262
|
|
|
396
|
-
|
|
263
|
+
```ts
|
|
264
|
+
import { createScriptLoader } from 'c15t/modules/script-loader';
|
|
265
|
+
import { scripts } from './consent-scripts';
|
|
397
266
|
|
|
398
|
-
|
|
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
|
-
|
|
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
|
-
|
|
275
|
+
## Keep event calls behind permission
|
|
406
276
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
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
|
-
|
|
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).
|