@c15t/scripts 3.0.0-alpha.2 → 3.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +129 -63
- package/README.md +8 -29
- package/SKILL.md +33 -0
- package/dist/adobe-analytics.js +2 -0
- package/dist/ahrefs-analytics.js +2 -0
- package/dist/amplitude.js +2 -0
- package/dist/clearbit.js +2 -0
- package/dist/cloudflare-web-analytics.js +2 -0
- package/dist/cloudflare-zaraz.js +2 -0
- package/dist/crisp.js +2 -0
- package/dist/databuddy.js +2 -0
- package/dist/e2e-test-utils.js +2 -139
- package/dist/engine/compile.js +2 -89
- package/dist/engine/runtime.js +2 -448
- package/dist/events.js +2 -218
- package/dist/fathom-analytics.js +2 -0
- package/dist/front-chat.js +2 -0
- package/dist/google-tag-manager.js +2 -0
- package/dist/google-tag.js +2 -0
- package/dist/heap.js +2 -0
- package/dist/hightouch.js +2 -0
- package/dist/hotjar.js +2 -0
- package/dist/intercom.js +2 -0
- package/dist/klaviyo.js +2 -0
- package/dist/linkedin-insights.js +2 -0
- package/dist/logrocket.js +2 -0
- package/dist/matomo-analytics.js +2 -0
- package/dist/meta-pixel.js +2 -0
- package/dist/microsoft-clarity.js +2 -0
- package/dist/microsoft-uet.js +2 -0
- package/dist/mixpanel-analytics.js +2 -0
- package/dist/one-dollar-stats.js +2 -0
- package/dist/openai-pixel.js +2 -0
- package/dist/pinterest-tag.js +2 -0
- package/dist/pirsch.js +2 -0
- package/dist/plausible-analytics.js +2 -0
- package/dist/posthog.js +2 -0
- package/dist/promptwatch.js +2 -0
- package/dist/reddit-pixel.js +2 -0
- package/dist/registry.js +2 -422
- package/dist/resolve.js +2 -33
- package/dist/rudderstack.js +2 -0
- package/dist/rybbit-analytics.js +2 -0
- package/dist/segment.js +2 -0
- package/dist/snapchat-pixel.js +2 -0
- package/dist/tiktok-pixel.js +2 -0
- package/dist/types.js +2 -16
- package/dist/umami-analytics.js +2 -0
- package/dist/vendors/_shared/attributes.js +2 -14
- package/dist/vendors/_shared/google-consent.js +2 -27
- package/dist/vendors/_shared/install-builders.js +2 -21
- package/dist/vendors/_shared/required-id.js +2 -0
- package/dist/vendors/_shared/script-url.js +2 -28
- package/dist/vendors/ads-and-pixels/linkedin-insights.js +2 -48
- package/dist/vendors/ads-and-pixels/meta-pixel.js +2 -153
- package/dist/vendors/ads-and-pixels/microsoft-uet.js +2 -110
- package/dist/vendors/ads-and-pixels/openai-pixel.js +2 -88
- package/dist/vendors/ads-and-pixels/pinterest-tag.js +2 -123
- package/dist/vendors/ads-and-pixels/reddit-pixel.js +2 -107
- package/dist/vendors/ads-and-pixels/snapchat-pixel.js +2 -87
- package/dist/vendors/ads-and-pixels/tiktok-pixel.js +2 -89
- package/dist/vendors/ads-and-pixels/x-pixel.js +2 -48
- package/dist/vendors/analytics/adobe-analytics.js +2 -49
- package/dist/vendors/analytics/ahrefs-analytics.js +2 -27
- package/dist/vendors/analytics/amplitude.js +2 -134
- package/dist/vendors/analytics/clearbit.js +2 -28
- package/dist/vendors/analytics/cloudflare-web-analytics.js +2 -32
- package/dist/vendors/analytics/databuddy.js +2 -103
- package/dist/vendors/analytics/fathom-analytics.js +2 -35
- package/dist/vendors/analytics/google-tag.js +2 -78
- package/dist/vendors/analytics/heap.js +2 -134
- package/dist/vendors/analytics/hightouch.js +2 -109
- package/dist/vendors/analytics/hotjar.js +2 -44
- package/dist/vendors/analytics/logrocket.js +2 -58
- package/dist/vendors/analytics/matomo-analytics.js +2 -191
- package/dist/vendors/analytics/microsoft-clarity.js +2 -100
- package/dist/vendors/analytics/mixpanel-analytics.js +2 -93
- package/dist/vendors/analytics/one-dollar-stats.js +2 -30
- package/dist/vendors/analytics/pirsch.js +2 -67
- package/dist/vendors/analytics/plausible-analytics.js +2 -81
- package/dist/vendors/analytics/posthog.js +2 -200
- package/dist/vendors/analytics/promptwatch.js +2 -29
- package/dist/vendors/analytics/rudderstack.js +2 -183
- package/dist/vendors/analytics/rybbit-analytics.js +2 -63
- package/dist/vendors/analytics/segment.js +2 -65
- package/dist/vendors/analytics/umami-analytics.js +2 -39
- package/dist/vendors/analytics/vercel-analytics.js +2 -53
- package/dist/vendors/email-and-sms/klaviyo.js +2 -0
- package/dist/vendors/functional/crisp.js +2 -100
- package/dist/vendors/functional/front-chat.js +2 -64
- package/dist/vendors/functional/intercom.js +2 -45
- package/dist/vendors/tag-managers/cloudflare-zaraz.js +2 -98
- package/dist/vendors/tag-managers/google-tag-manager.js +2 -73
- package/dist/vercel-analytics.js +2 -0
- package/dist/x-pixel.js +2 -0
- package/dist-types/adobe-analytics.d.ts +2 -0
- package/dist-types/ahrefs-analytics.d.ts +2 -0
- package/dist-types/amplitude.d.ts +2 -0
- package/dist-types/clearbit.d.ts +2 -0
- package/dist-types/cloudflare-web-analytics.d.ts +2 -0
- package/dist-types/cloudflare-zaraz.d.ts +2 -0
- package/dist-types/crisp.d.ts +2 -0
- package/dist-types/databuddy.d.ts +2 -0
- package/dist-types/e2e-test-utils.d.ts +2 -0
- package/dist-types/engine/compile.d.ts +2 -3
- package/dist-types/engine/runtime.d.ts +2 -3
- package/dist-types/events.d.ts +2 -46
- package/dist-types/fathom-analytics.d.ts +2 -0
- package/dist-types/front-chat.d.ts +2 -0
- package/dist-types/google-tag-manager.d.ts +2 -0
- package/dist-types/google-tag.d.ts +2 -0
- package/dist-types/heap.d.ts +2 -0
- package/dist-types/hightouch.d.ts +2 -0
- package/dist-types/hotjar.d.ts +2 -0
- package/dist-types/intercom.d.ts +2 -0
- package/dist-types/klaviyo.d.ts +2 -0
- package/dist-types/linkedin-insights.d.ts +2 -0
- package/dist-types/logrocket.d.ts +2 -0
- package/dist-types/matomo-analytics.d.ts +2 -0
- package/dist-types/meta-pixel.d.ts +2 -0
- package/dist-types/microsoft-clarity.d.ts +2 -0
- package/dist-types/microsoft-uet.d.ts +2 -0
- package/dist-types/mixpanel-analytics.d.ts +2 -0
- package/dist-types/one-dollar-stats.d.ts +2 -0
- package/dist-types/openai-pixel.d.ts +2 -0
- package/dist-types/pinterest-tag.d.ts +2 -0
- package/dist-types/pirsch.d.ts +2 -0
- package/dist-types/plausible-analytics.d.ts +2 -0
- package/dist-types/posthog.d.ts +2 -0
- package/dist-types/promptwatch.d.ts +2 -0
- package/dist-types/reddit-pixel.d.ts +2 -0
- package/dist-types/registry.d.ts +2 -485
- package/dist-types/resolve.d.ts +2 -9
- package/dist-types/rudderstack.d.ts +2 -0
- package/dist-types/rybbit-analytics.d.ts +2 -0
- package/dist-types/segment.d.ts +2 -0
- package/dist-types/snapchat-pixel.d.ts +2 -0
- package/dist-types/tiktok-pixel.d.ts +2 -0
- package/dist-types/types.d.ts +2 -314
- package/dist-types/umami-analytics.d.ts +2 -0
- package/dist-types/vendors/_shared/attributes.d.ts +2 -35
- package/dist-types/vendors/_shared/google-consent.d.ts +2 -47
- package/dist-types/vendors/_shared/install-builders.d.ts +2 -30
- package/dist-types/vendors/_shared/required-id.d.ts +2 -0
- package/dist-types/vendors/_shared/script-url.d.ts +2 -75
- package/dist-types/vendors/ads-and-pixels/linkedin-insights.d.ts +2 -92
- package/dist-types/vendors/ads-and-pixels/meta-pixel.d.ts +2 -289
- package/dist-types/vendors/ads-and-pixels/microsoft-uet.d.ts +2 -105
- package/dist-types/vendors/ads-and-pixels/openai-pixel.d.ts +2 -211
- package/dist-types/vendors/ads-and-pixels/pinterest-tag.d.ts +2 -295
- package/dist-types/vendors/ads-and-pixels/reddit-pixel.d.ts +2 -210
- package/dist-types/vendors/ads-and-pixels/snapchat-pixel.d.ts +2 -171
- package/dist-types/vendors/ads-and-pixels/tiktok-pixel.d.ts +2 -106
- package/dist-types/vendors/ads-and-pixels/x-pixel.d.ts +2 -183
- package/dist-types/vendors/analytics/adobe-analytics.d.ts +2 -75
- package/dist-types/vendors/analytics/ahrefs-analytics.d.ts +2 -62
- package/dist-types/vendors/analytics/amplitude.d.ts +2 -234
- package/dist-types/vendors/analytics/clearbit.d.ts +2 -60
- package/dist-types/vendors/analytics/cloudflare-web-analytics.d.ts +2 -67
- package/dist-types/vendors/analytics/databuddy.d.ts +2 -147
- package/dist-types/vendors/analytics/fathom-analytics.d.ts +2 -90
- package/dist-types/vendors/analytics/google-tag.d.ts +2 -95
- package/dist-types/vendors/analytics/heap.d.ts +2 -316
- package/dist-types/vendors/analytics/hightouch.d.ts +2 -285
- package/dist-types/vendors/analytics/hotjar.d.ts +2 -73
- package/dist-types/vendors/analytics/logrocket.d.ts +2 -101
- package/dist-types/vendors/analytics/matomo-analytics.d.ts +2 -41
- package/dist-types/vendors/analytics/microsoft-clarity.d.ts +2 -97
- package/dist-types/vendors/analytics/mixpanel-analytics.d.ts +2 -113
- package/dist-types/vendors/analytics/one-dollar-stats.d.ts +2 -39
- package/dist-types/vendors/analytics/pirsch.d.ts +2 -96
- package/dist-types/vendors/analytics/plausible-analytics.d.ts +2 -122
- package/dist-types/vendors/analytics/posthog.d.ts +2 -175
- package/dist-types/vendors/analytics/promptwatch.d.ts +2 -36
- package/dist-types/vendors/analytics/rudderstack.d.ts +2 -330
- package/dist-types/vendors/analytics/rybbit-analytics.d.ts +2 -82
- package/dist-types/vendors/analytics/segment.d.ts +2 -164
- package/dist-types/vendors/analytics/umami-analytics.d.ts +2 -93
- package/dist-types/vendors/analytics/vercel-analytics.d.ts +2 -66
- package/dist-types/vendors/email-and-sms/klaviyo.d.ts +2 -0
- package/dist-types/vendors/functional/crisp.d.ts +2 -78
- package/dist-types/vendors/functional/front-chat.d.ts +2 -62
- package/dist-types/vendors/functional/intercom.d.ts +2 -135
- package/dist-types/vendors/tag-managers/cloudflare-zaraz.d.ts +2 -39
- package/dist-types/vendors/tag-managers/google-tag-manager.d.ts +2 -96
- package/dist-types/vercel-analytics.d.ts +2 -0
- package/dist-types/x-pixel.d.ts +2 -0
- package/docs/README.md +129 -63
- package/docs/assets/v3/bottom-bar.png +0 -0
- package/docs/assets/v3/brand-card.png +0 -0
- package/docs/assets/v3/brand-preferences.png +0 -0
- package/docs/assets/v3/choice-wall.png +0 -0
- package/docs/assets/v3/headless-bar-html.png +0 -0
- package/docs/assets/v3/headless-bar-mobile.png +0 -0
- package/docs/assets/v3/headless-bar.png +0 -0
- package/docs/assets/v3/slim-bar.png +0 -0
- package/docs/concepts/choose-your-setup.md +87 -0
- package/docs/concepts/consent-categories.md +84 -0
- package/docs/{guides → concepts}/consent-state.md +71 -101
- package/docs/{guides → concepts}/data-fetching.md +31 -27
- package/docs/concepts/how-consent-works.md +123 -0
- package/docs/concepts/policies.md +71 -0
- package/docs/customization/class-names.md +202 -0
- package/docs/customization/dark-mode.md +157 -0
- package/docs/customization/motion.md +119 -0
- package/docs/customization/overview.md +67 -34
- package/docs/customization/recipes.md +839 -49
- package/docs/customization/slots.md +216 -35
- package/docs/customization/stylesheets.md +147 -0
- package/docs/customization/tailwind.md +842 -0
- package/docs/customization/tokens.md +163 -96
- package/docs/customization/translations.md +61 -3
- package/docs/frameworks/astro/embeds.md +160 -0
- package/docs/frameworks/astro/network-blocker.md +86 -0
- package/docs/frameworks/astro/scripts.md +146 -0
- package/docs/frameworks/html/embeds.md +142 -0
- package/docs/frameworks/html/network-blocker.md +105 -0
- package/docs/frameworks/html/scripts.md +164 -0
- package/docs/frameworks/javascript/scripts.md +119 -0
- package/docs/frameworks/next/embeds.md +90 -0
- package/docs/frameworks/next/network-blocker.md +153 -0
- package/docs/frameworks/next/scripts.md +196 -0
- package/docs/frameworks/nuxt/embeds.md +81 -0
- package/docs/frameworks/nuxt/network-blocker.md +97 -0
- package/docs/frameworks/nuxt/scripts.md +89 -0
- package/docs/frameworks/react/embeds.md +89 -0
- package/docs/frameworks/react/network-blocker.md +140 -0
- package/docs/frameworks/react/scripts.md +115 -0
- package/docs/frameworks/svelte/embeds.md +96 -0
- package/docs/frameworks/svelte/network-blocker.md +141 -0
- package/docs/frameworks/svelte/scripts.md +137 -0
- package/docs/frameworks/sveltekit/embeds.md +103 -0
- package/docs/frameworks/sveltekit/network-blocker.md +149 -0
- package/docs/frameworks/sveltekit/scripts.md +141 -0
- package/docs/frameworks/tanstack-start/embeds.md +96 -0
- package/docs/frameworks/tanstack-start/network-blocker.md +145 -0
- package/docs/frameworks/tanstack-start/scripts.md +103 -0
- package/docs/frameworks/vue/embeds.md +84 -0
- package/docs/frameworks/vue/network-blocker.md +99 -0
- package/docs/frameworks/vue/scripts.md +93 -0
- package/docs/guides/banner-experiments.md +654 -0
- package/docs/guides/troubleshooting.md +120 -47
- package/docs/guides/verify-consent.md +81 -49
- package/docs/integrations/adobe-analytics.md +167 -159
- package/docs/integrations/ahrefs-analytics.md +152 -154
- package/docs/integrations/amplitude.md +162 -156
- package/docs/integrations/building-integrations.md +136 -37
- package/docs/integrations/clearbit.md +154 -154
- package/docs/integrations/cloudflare-web-analytics.md +156 -156
- package/docs/integrations/cloudflare-zaraz.md +209 -261
- package/docs/integrations/crisp.md +164 -158
- package/docs/integrations/databuddy.md +157 -173
- package/docs/integrations/fathom-analytics.md +158 -156
- package/docs/integrations/front-chat.md +167 -167
- package/docs/integrations/google-maps.md +118 -83
- package/docs/integrations/google-tag-manager.md +178 -163
- package/docs/integrations/google-tag.md +163 -160
- package/docs/integrations/heap.md +163 -155
- package/docs/integrations/hightouch.md +161 -157
- package/docs/integrations/hotjar.md +159 -155
- package/docs/integrations/intercom.md +183 -153
- package/docs/integrations/klaviyo.md +486 -0
- package/docs/integrations/linkedin-insights.md +174 -150
- package/docs/integrations/logrocket.md +160 -156
- package/docs/integrations/matomo-analytics.md +188 -178
- package/docs/integrations/meta-pixel.md +188 -150
- package/docs/integrations/microsoft-clarity.md +163 -155
- package/docs/integrations/microsoft-uet.md +148 -154
- package/docs/integrations/mixpanel-analytics.md +155 -160
- package/docs/integrations/one-dollar-stats.md +166 -165
- package/docs/integrations/openai-pixel.md +204 -301
- package/docs/integrations/overview.md +137 -80
- package/docs/integrations/pinterest-tag.md +191 -183
- package/docs/integrations/pirsch.md +169 -159
- package/docs/integrations/plausible-analytics.md +172 -158
- package/docs/integrations/posthog.md +226 -241
- package/docs/integrations/promptwatch.md +154 -154
- package/docs/integrations/reddit-pixel.md +185 -157
- package/docs/integrations/rudderstack.md +201 -186
- package/docs/integrations/rybbit-analytics.md +171 -160
- package/docs/integrations/segment.md +182 -154
- package/docs/integrations/snapchat-pixel.md +186 -156
- package/docs/integrations/tiktok-pixel.md +171 -150
- package/docs/integrations/umami-analytics.md +163 -158
- package/docs/integrations/vercel-analytics.md +166 -157
- package/docs/integrations/x-pixel.md +176 -150
- package/docs/integrations/youtube.md +121 -86
- package/docs/upgrade-v3.md +475 -467
- package/package.json +10 -257
- package/dist-types/__tests__/helpers.d.ts +0 -141
- package/docs/assets/v3/brand-bar.png +0 -0
- package/docs/assets/v3/mobile-card.png +0 -0
- package/docs/assets/v3/preferences.png +0 -0
- package/docs/frameworks/javascript/script-loader.md +0 -100
- package/docs/frameworks/next/script-loader.md +0 -216
- package/docs/frameworks/react/script-loader.md +0 -69
- package/docs/guides/deployment-modes.md +0 -75
- package/docs/guides/shared-consent-controls.md +0 -158
- package/docs/integrations/clear-on-revocation.md +0 -167
- package/docs/integrations/granular-consent.md +0 -210
|
@@ -1,45 +1,44 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Matomo Analytics
|
|
3
|
-
description:
|
|
4
|
-
|
|
3
|
+
description: Load Matomo after measurement consent with the c15t matomoAnalytics
|
|
4
|
+
helper, or use Matomo's own consent mode, and check each mode in DevTools.
|
|
5
|
+
icon: matomo
|
|
5
6
|
group: integrations
|
|
6
7
|
---
|
|
7
8
|
|
|
8
|
-
## Configure Matomo
|
|
9
|
+
## Configure Matomo Analytics
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
Copy the site ID and your Matomo URL from the Matomo tracking code. For Matomo
|
|
12
|
+
Cloud, pass `cloudId`, for example `'your-site.matomo.cloud'`, instead of
|
|
13
|
+
`matomoUrl`.
|
|
12
14
|
|
|
13
|
-
| Package manager | Command
|
|
14
|
-
| :-------------- |
|
|
15
|
-
| npm | `npm install @c15t/
|
|
16
|
-
| pnpm | `pnpm add @c15t/
|
|
17
|
-
| yarn | `yarn add @c15t/
|
|
18
|
-
| bun | `bun add @c15t/
|
|
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
21
|
|
|
20
22
|
```ts title="src/consent-scripts.ts"
|
|
21
|
-
import { matomoAnalytics } from '@c15t/
|
|
23
|
+
import { matomoAnalytics } from '@c15t/integrations/matomo-analytics';
|
|
22
24
|
|
|
23
25
|
export const scripts = [
|
|
24
|
-
|
|
25
|
-
siteId: 1,
|
|
26
|
-
matomoUrl: 'https://analytics.example.com',
|
|
27
|
-
}),
|
|
26
|
+
matomoAnalytics({ matomoUrl: 'https://analytics.example.com', siteId: 1 }),
|
|
28
27
|
];
|
|
29
28
|
```
|
|
30
29
|
|
|
31
|
-
Replace the base URL and site ID. For Matomo Cloud, use
|
|
32
|
-
`cloudId: 'your-site.matomo.cloud'` instead of `matomoUrl`.
|
|
33
|
-
|
|
34
30
|
## Register the scripts
|
|
35
31
|
|
|
36
32
|
Complete your [framework quickstart](https://c15t.com/docs/frameworks) first. Keep its Inth
|
|
37
33
|
endpoint, policy, styles and consent UI. Remove the vendor's original script,
|
|
38
|
-
SDK initializer or tag-manager entry so
|
|
34
|
+
SDK initializer or tag-manager entry, so the vendor loads only through c15t.
|
|
39
35
|
|
|
40
|
-
The
|
|
41
|
-
|
|
42
|
-
|
|
36
|
+
The vendor pages put the helper in `src/consent-scripts.ts`. If your framework
|
|
37
|
+
quickstart already created a scripts file, such as `lib/scripts.ts` in the
|
|
38
|
+
Next.js guide, add the helper to that array instead of creating a second file.
|
|
39
|
+
The `scripts` export is a configuration, not an initializer. Add it to the c15t provider you already have, at the registration
|
|
40
|
+
point for your framework below. These are edits to that provider, not a second
|
|
41
|
+
provider.
|
|
43
42
|
|
|
44
43
|
**Next.js**
|
|
45
44
|
|
|
@@ -60,158 +59,106 @@ router guide. Its manifest, init and save URLs stay in effect. Add
|
|
|
60
59
|
</ConsentRoot>
|
|
61
60
|
```
|
|
62
61
|
|
|
63
|
-
|
|
64
|
-
`
|
|
65
|
-
|
|
62
|
+
App Router, Pages Router and static export all use this `ConsentRoot` in
|
|
63
|
+
the `'use client'` wrapper `components/consent.tsx`. Keep `scripts` there,
|
|
64
|
+
because a Server Component cannot pass script callbacks to it. See
|
|
65
|
+
[Next.js scripts and embeds](../frameworks/next/scripts.md).
|
|
66
66
|
|
|
67
67
|
**TanStack Start**
|
|
68
68
|
|
|
69
|
-
|
|
70
|
-
`ConsentRoot
|
|
69
|
+
Import the configuration into your root route and pass it to the existing
|
|
70
|
+
`ConsentRoot` as a top-level prop. Keep the loader, `backendURL` and
|
|
71
|
+
`initRoute` from the [TanStack Start quickstart](https://c15t.com/docs/frameworks/tanstack-start/quickstart):
|
|
71
72
|
|
|
72
|
-
```tsx
|
|
73
|
-
import { Outlet } from '@tanstack/react-router';
|
|
74
|
-
import { ConsentRoot } from 'c15t/tanstack-start';
|
|
73
|
+
```tsx title="src/routes/__root.tsx"
|
|
75
74
|
import { scripts } from '../consent-scripts';
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
</ConsentRoot>
|
|
84
|
-
);
|
|
85
|
-
}
|
|
76
|
+
<ConsentRoot
|
|
77
|
+
state={consent}
|
|
78
|
+
backendURL={backendURL}
|
|
79
|
+
initRoute={false}
|
|
80
|
+
scripts={scripts}
|
|
81
|
+
>
|
|
86
82
|
```
|
|
87
83
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
instead. Do not return script callbacks from a server function or route loader.
|
|
84
|
+
Import vendor helpers in the root route module, not in a server function.
|
|
85
|
+
A server function's return value must be serializable, and script
|
|
86
|
+
configurations carry callbacks. See
|
|
87
|
+
[TanStack Start scripts](../frameworks/tanstack-start/scripts.md).
|
|
93
88
|
|
|
94
89
|
**React**
|
|
95
90
|
|
|
96
|
-
|
|
91
|
+
Add the configuration to the existing `ConsentProvider` options, next to
|
|
92
|
+
`mode`:
|
|
97
93
|
|
|
98
|
-
```
|
|
99
|
-
import { ConsentProvider } from 'c15t/react';
|
|
94
|
+
```tsx title="src/consent.tsx"
|
|
100
95
|
import { scripts } from './consent-scripts';
|
|
101
|
-
```
|
|
102
96
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
```tsx
|
|
106
|
-
<ConsentProvider options={{ ...consentOptions, scripts }}>
|
|
107
|
-
{children}
|
|
108
|
-
</ConsentProvider>
|
|
97
|
+
<ConsentProvider options={{ mode, scripts }}>
|
|
109
98
|
```
|
|
110
99
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
link inside the provider. See
|
|
100
|
+
`mode` is the `hosted({ url: 'https://your-project.inth.app' })` value
|
|
101
|
+
from the [React quickstart](https://c15t.com/docs/frameworks/react/quickstart). Keep the banner,
|
|
102
|
+
dialog and preferences link inside the provider. See
|
|
103
|
+
[React scripts and embeds](../frameworks/react/scripts.md).
|
|
114
104
|
|
|
115
105
|
**Nuxt**
|
|
116
106
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
than serialized `nuxt.config.ts` runtime configuration.
|
|
107
|
+
Register the scripts under the `c15t` key in `app/app.config.ts`. Adjust the
|
|
108
|
+
relative import to where you created `consent-scripts.ts`:
|
|
120
109
|
|
|
121
|
-
```
|
|
122
|
-
<script setup lang="ts">
|
|
123
|
-
import { onUnmounted } from 'vue';
|
|
124
|
-
import { createScriptLoader } from 'c15t/modules/script-loader';
|
|
110
|
+
```ts title="app/app.config.ts"
|
|
125
111
|
import { scripts } from '../src/consent-scripts';
|
|
126
112
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
let loader: ReturnType<typeof createScriptLoader> | undefined;
|
|
130
|
-
|
|
131
|
-
const removeMountedHook = nuxtApp.hook('app:mounted', () => {
|
|
132
|
-
loader = createScriptLoader({ kernel, scripts });
|
|
113
|
+
export default defineAppConfig({
|
|
114
|
+
c15t: { scripts },
|
|
133
115
|
});
|
|
134
|
-
onUnmounted(() => {
|
|
135
|
-
removeMountedHook();
|
|
136
|
-
loader?.dispose();
|
|
137
|
-
});
|
|
138
|
-
</script>
|
|
139
|
-
|
|
140
|
-
<template>
|
|
141
|
-
<ConsentRoot />
|
|
142
|
-
<NuxtPage />
|
|
143
|
-
</template>
|
|
144
116
|
```
|
|
145
117
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
118
|
+
The Nuxt module merges this over its options in `nuxt.config.ts` and starts
|
|
119
|
+
one script loader in the browser after hydration, once it has applied the
|
|
120
|
+
visitor's stored choice and privacy signals. Keep `scripts` out of
|
|
121
|
+
`nuxt.config.ts`, which reaches the browser as JSON and drops the vendor
|
|
122
|
+
callbacks. Write the vendor IDs into `consent-scripts.ts`. See
|
|
123
|
+
[Nuxt scripts and embeds](../frameworks/nuxt/scripts.md).
|
|
152
124
|
|
|
153
125
|
**Vue**
|
|
154
126
|
|
|
155
|
-
|
|
156
|
-
`App.vue`, whose lifetime covers the application:
|
|
127
|
+
Pass the scripts to the existing `c15tVue` plugin call in `src/main.ts`:
|
|
157
128
|
|
|
158
|
-
```
|
|
159
|
-
<script setup lang="ts">
|
|
160
|
-
import { onMounted, onUnmounted } from 'vue';
|
|
161
|
-
import { createScriptLoader } from 'c15t/modules/script-loader';
|
|
162
|
-
import { useConsentKernel } from 'c15t/vue/vue-plugin';
|
|
163
|
-
import ConsentRoot from 'c15t/vue/consent-root';
|
|
129
|
+
```ts title="src/main.ts"
|
|
164
130
|
import { scripts } from './consent-scripts';
|
|
165
131
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
onMounted(() => {
|
|
170
|
-
loader = createScriptLoader({ kernel, scripts });
|
|
132
|
+
app.use(c15tVue, {
|
|
133
|
+
backendURL: 'https://your-project.inth.app',
|
|
134
|
+
scripts,
|
|
171
135
|
});
|
|
172
|
-
onUnmounted(() => loader?.dispose());
|
|
173
|
-
</script>
|
|
174
|
-
|
|
175
|
-
<template>
|
|
176
|
-
<ConsentRoot />
|
|
177
|
-
<main>Your application</main>
|
|
178
|
-
</template>
|
|
179
136
|
```
|
|
180
137
|
|
|
181
|
-
Keep your existing
|
|
182
|
-
the
|
|
183
|
-
Do not
|
|
184
|
-
[Vue
|
|
138
|
+
Keep your existing backend URL and other options. The plugin starts one
|
|
139
|
+
script loader when the app mounts, after it has applied the visitor's stored
|
|
140
|
+
choice. Do not also call `createScriptLoader` from a component. See
|
|
141
|
+
[Vue scripts and embeds](../frameworks/vue/scripts.md).
|
|
185
142
|
|
|
186
143
|
**Astro**
|
|
187
144
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
import { fileURLToPath } from 'node:url';
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
Add this option to the existing `c15t({ ... })` call. Resolve the path from
|
|
197
|
-
the configuration file because Astro injects the import into a virtual module:
|
|
198
|
-
|
|
199
|
-
```js
|
|
200
|
-
clientEntrypoint: fileURLToPath(new URL('./src/c15t.client.ts', import.meta.url)),
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
Export the scripts from that module:
|
|
145
|
+
Add the scripts to the client entrypoint from the
|
|
146
|
+
[Astro quickstart](https://c15t.com/docs/frameworks/astro/quickstart), the module that the
|
|
147
|
+
integration's `clientEntrypoint` option names. Keep `mode`, `ui` and the
|
|
148
|
+
framework integration in `astro.config.mjs` as they are. If the module
|
|
149
|
+
already exports scripts, combine the two arrays.
|
|
204
150
|
|
|
205
|
-
```ts title="src/
|
|
151
|
+
```ts title="src/consent-client.ts"
|
|
206
152
|
import type { C15tClientOptionsExtension } from 'c15t/astro';
|
|
207
153
|
import { scripts } from './consent-scripts';
|
|
208
154
|
|
|
209
155
|
export default { scripts } satisfies C15tClientOptionsExtension;
|
|
210
156
|
```
|
|
211
157
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
158
|
+
Vendor helpers contain callbacks, and the integration options in
|
|
159
|
+
`astro.config.mjs` are serialized into the page, so do not put helpers in
|
|
160
|
+
the integration's `scripts` option. The integration passes the client
|
|
161
|
+
entrypoint to the one runtime every page shares, including across
|
|
215
162
|
`ClientRouter` navigation.
|
|
216
163
|
|
|
217
164
|
**Svelte**
|
|
@@ -224,9 +171,7 @@ pass them as a top-level prop:
|
|
|
224
171
|
import { ConsentManagerProvider, hosted } from '@c15t/svelte';
|
|
225
172
|
import { scripts } from './consent-scripts';
|
|
226
173
|
|
|
227
|
-
const
|
|
228
|
-
if (!backendURL) throw new Error('Set VITE_C15T_BACKEND_URL');
|
|
229
|
-
const mode = hosted({ url: backendURL });
|
|
174
|
+
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
230
175
|
</script>
|
|
231
176
|
|
|
232
177
|
<ConsentManagerProvider {mode} {scripts}>
|
|
@@ -248,7 +193,7 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
|
|
|
248
193
|
import { scripts } from '../consent-scripts';
|
|
249
194
|
|
|
250
195
|
let { children, data } = $props();
|
|
251
|
-
const mode = hosted({ url:
|
|
196
|
+
const mode = hosted({ url: 'https://your-project.inth.app' });
|
|
252
197
|
</script>
|
|
253
198
|
|
|
254
199
|
<ConsentManagerProvider {mode} {scripts} prefetch={data.prefetch}>
|
|
@@ -257,60 +202,125 @@ and its serializable prefetch data from the [SvelteKit quickstart](https://c15t.
|
|
|
257
202
|
</ConsentManagerProvider>
|
|
258
203
|
```
|
|
259
204
|
|
|
260
|
-
Import vendor helpers in the layout component, not in `+layout.server.ts
|
|
261
|
-
|
|
262
|
-
|
|
205
|
+
Import vendor helpers in the layout component, not in `+layout.server.ts`:
|
|
206
|
+
a server load cannot send functions to the browser. Prerendered, static and
|
|
207
|
+
SPA-mode pages use the same `scripts` prop. If you pass an externally owned
|
|
263
208
|
`runtime` to the provider, register scripts when creating that runtime instead.
|
|
264
209
|
|
|
210
|
+
**HTML**
|
|
211
|
+
|
|
212
|
+
The helpers in `@c15t/integrations` are ES modules that need a bundler. On a
|
|
213
|
+
page that loads the c15t script tag, paste the vendor's own snippet instead
|
|
214
|
+
and keep it inert until its category is allowed:
|
|
215
|
+
|
|
216
|
+
```html
|
|
217
|
+
<script type="text/plain" data-c15t-category="measurement">
|
|
218
|
+
// The vendor's snippet, unchanged
|
|
219
|
+
</script>
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
Use the category this guide names for the vendor. c15t runs the snippet
|
|
223
|
+
once that category is allowed, and reloads the page when the visitor
|
|
224
|
+
withdraws it. Helper options on this page, such as `loadMode`, do not apply
|
|
225
|
+
to a pasted snippet. See [HTML scripts](../frameworks/html/scripts.md).
|
|
226
|
+
|
|
265
227
|
**JavaScript**
|
|
266
228
|
|
|
267
|
-
|
|
268
|
-
|
|
229
|
+
Pass the scripts to `init()` from `@c15t/browser`, next to your backend
|
|
230
|
+
URL:
|
|
269
231
|
|
|
270
232
|
```ts
|
|
271
|
-
import {
|
|
233
|
+
import { init } from '@c15t/browser';
|
|
272
234
|
import { scripts } from './consent-scripts';
|
|
273
235
|
|
|
274
|
-
const
|
|
236
|
+
const consent = init({
|
|
237
|
+
backendURL: 'https://your-project.inth.app',
|
|
238
|
+
scripts,
|
|
239
|
+
});
|
|
275
240
|
```
|
|
276
241
|
|
|
277
|
-
|
|
278
|
-
`
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
## Choose the loading mode
|
|
242
|
+
Keep the backend URL from your quickstart. With
|
|
243
|
+
`createConsentRuntime` from `c15t/runtime`, pass `scripts` to it instead.
|
|
244
|
+
A kernel you create yourself needs a loader from
|
|
245
|
+
`c15t/modules/script-loader`. Attach one loader per kernel. See
|
|
246
|
+
[JavaScript scripts](../frameworks/javascript/scripts.md).
|
|
283
247
|
|
|
284
|
-
|
|
285
|
-
| ---------------- | --------------------------------------- | ------------------------------------------------------------------------ |
|
|
286
|
-
| Omitted | Waits for measurement permission | Removes the script on revocation; no Matomo consent callback |
|
|
287
|
-
| `'required'` | Loads immediately with `requireConsent` | Signals `setConsentGiven` and `forgetConsentGiven`; keeps the SDK loaded |
|
|
288
|
-
| `'given'` | Loads immediately with an initial grant | Signals later changes; keeps the SDK loaded |
|
|
248
|
+
## Options
|
|
289
249
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
250
|
+
| Option | Default | Behavior |
|
|
251
|
+
| -------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
252
|
+
| `matomoUrl` | None | Self-hosted Matomo base URL. The helper loads `<matomoUrl>/matomo.js` and sends hits to `<matomoUrl>/matomo.php`. |
|
|
253
|
+
| `cloudId` | None | Matomo Cloud ID, used when `matomoUrl` is not set. A value ending in `.matomo.cloud` becomes `https://<cloudId>`. Any other value becomes `https://cdn.matomo.cloud/<cloudId>`. |
|
|
254
|
+
| `trackerUrl` | `matomo.php` on the Matomo origin | Tracker endpoint override. |
|
|
255
|
+
| `scriptUrl` | `matomo.js` on the Matomo origin | Loader URL override. Without `matomoUrl` or `cloudId`, set both `trackerUrl` and `scriptUrl`, or the helper throws. |
|
|
256
|
+
| `siteId` | `1` | Site ID queued with `setSiteId`. |
|
|
257
|
+
| `trackPageView` | `true` | Queues `trackPageView`. The table below shows when. |
|
|
258
|
+
| `enableLinkTracking` | `false` | Queues `enableLinkTracking`. |
|
|
259
|
+
| `disableCookies` | `false` | Queues `disableCookies`. It does not change when Matomo loads. |
|
|
260
|
+
| `defaultConsent` | None | `'required'` or `'given'` switches to Matomo consent mode. |
|
|
261
|
+
|
|
262
|
+
## Loading and revocation
|
|
263
|
+
|
|
264
|
+
`matomoAnalytics` uses the `measurement` category. `defaultConsent` picks the
|
|
265
|
+
mode:
|
|
266
|
+
|
|
267
|
+
| `defaultConsent` | Loads | When measurement is allowed | On revocation |
|
|
268
|
+
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | -------------------------------------------------- |
|
|
269
|
+
| Omitted | After measurement is allowed, with `trackPageView` queued | Loads `matomo.js` | Removes the script element and calls no Matomo API |
|
|
270
|
+
| `'required'` | On every page, with `requireConsent` queued | Queues `setConsentGiven` and `trackPageView` | Keeps the script and queues `forgetConsentGiven` |
|
|
271
|
+
| `'given'` | On every page. With measurement allowed as it loads, `setConsentGiven` and `trackPageView` are queued; otherwise `requireConsent` | Queues `setConsentGiven` and `trackPageView` | Keeps the script and queues `forgetConsentGiven` |
|
|
272
|
+
|
|
273
|
+
In both consent modes Matomo holds tracking until `setConsentGiven`, and the
|
|
274
|
+
helper only queues that call for a visitor who has measurement consent. The
|
|
275
|
+
two modes differ for a visitor who already allowed measurement when the page
|
|
276
|
+
loads: `'given'` skips the up-front `requireConsent`. The helper queues
|
|
277
|
+
another `trackPageView` only when measurement changes from denied to allowed,
|
|
278
|
+
so a change to another category, such as allowing marketing, sends no extra
|
|
279
|
+
page view. Matomo separates
|
|
293
280
|
[tracking consent from cookie consent](https://developer.matomo.org/guides/tracking-consent).
|
|
294
281
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
282
|
+
## Verify Matomo Analytics
|
|
283
|
+
|
|
284
|
+
Without `defaultConsent`, allowing measurement loads `matomo.js`, and a
|
|
285
|
+
`matomo.php` request carries the page view.
|
|
286
|
+
|
|
287
|
+
Test in a private window with an opt-in policy. Open DevTools Network, disable
|
|
288
|
+
the cache and filter by the vendor's domain:
|
|
289
|
+
|
|
290
|
+
1. Load the page. No request goes to the vendor before you choose.
|
|
291
|
+
2. Click Reject, then reload. There is still no vendor request.
|
|
292
|
+
3. Open Privacy settings and allow the helper's category. The vendor script
|
|
293
|
+
loads without a page reload.
|
|
294
|
+
4. Turn the category off again and save. c15t reloads the page, and the new
|
|
295
|
+
page makes no vendor request.
|
|
296
|
+
|
|
297
|
+
c15t reloads on revocation because removing a script element does not stop
|
|
298
|
+
code that already ran. The vendor's listeners, timers and queued events stay
|
|
299
|
+
alive until the page unloads. If you set `reloadOnConsentRevoked: false`, stop
|
|
300
|
+
the vendor yourself. Register a callback-only script whose `onConsentChange`
|
|
301
|
+
calls the vendor's opt-out API, as shown in
|
|
302
|
+
[custom integrations](./building-integrations.md), and check the
|
|
303
|
+
permission before each of your own event calls. The reload does not delete
|
|
304
|
+
cookies the vendor already set; see
|
|
305
|
+
[clear on revocation for your framework](./overview.md#vendor-switches-and-cookie-cleanup).
|
|
306
|
+
|
|
307
|
+
The helper sets `vendor` to its script ID, so once you declare that vendor a
|
|
308
|
+
visitor can turn it off inside an allowed category. See
|
|
309
|
+
[vendor consent for your framework](./overview.md#vendor-switches-and-cookie-cleanup). The
|
|
310
|
+
[consent verification guide](../guides/verify-consent.md) covers navigation,
|
|
311
|
+
expiry and hosting checks.
|
|
312
|
+
|
|
313
|
+
With `defaultConsent: 'required'`, Matomo loads before the choice, so test it
|
|
314
|
+
separately in a private window with an opt-in policy:
|
|
315
|
+
|
|
316
|
+
1. Load the page. `matomo.js` loads, and no `matomo.php` request follows.
|
|
317
|
+
2. Open Privacy settings and allow measurement. Without a reload, a
|
|
318
|
+
`matomo.php` request carries the page view.
|
|
319
|
+
3. Turn measurement off and save. c15t reloads the page, and the new page
|
|
320
|
+
loads `matomo.js` without a `matomo.php` request.
|
|
321
|
+
|
|
322
|
+
`'given'` behaves the same in this test. Under an opt-out policy, or after the
|
|
323
|
+
visitor has allowed measurement, both modes send a `matomo.php` page view as
|
|
324
|
+
the page loads. See the
|
|
325
|
+
[consent verification guide](../guides/verify-consent.md) for navigation and
|
|
326
|
+
hosting checks.
|