Integrations
Integrations
Choose an integration
Each vendor helper in @c15t/integrations returns a script configuration that you
register with your c15t provider. Importing a helper installs nothing on its
own. Set up consent with your framework quickstart first,
then follow the vendor guide.
@c15t/integrations is a separate package. Keep importing c15t itself from c15t,
for example c15t/react or c15t/next.
The integrations are grouped by what each tool does. The Category column names the consent category each helper uses. The Loading behavior column shows when each helper requests the vendor. Most wait for the category to be allowed. A few load on every page and pass the permission to the vendor's own consent API, so the browser contacts the vendor before a choice.
Web analytics
| Integration | Helper | Category | Loading behavior |
|---|---|---|---|
| Plausible Analytics | plausibleAnalytics | measurement | Waits for effective permission |
| Fathom Analytics | fathomAnalytics | measurement | Waits for effective permission |
| Umami Analytics | umamiAnalytics | measurement | Waits for effective permission |
| Vercel Analytics | vercelAnalytics | measurement | Waits for effective permission |
| Google Tag | gtag | measurement or marketing | Always loads and signals Google consent by default; loadMode: 'after-consent' waits for permission |
| Cloudflare Web Analytics | cloudflareWebAnalytics | measurement | Waits for effective permission |
| Matomo Analytics | matomoAnalytics | measurement | Gated by default; optional consent mode |
| Adobe Analytics | adobeAnalytics | measurement | Waits for effective permission |
| Ahrefs Analytics | ahrefsAnalytics | measurement | Waits for effective permission |
| Databuddy | databuddy | measurement | Gated by default; disables the SDK on revocation |
| Pirsch | pirsch | measurement | Waits for effective permission |
| Rybbit Analytics | rybbitAnalytics | measurement | Waits for effective permission |
| OneDollarStats | oneDollarStats | measurement | Waits for effective permission |
| Promptwatch | promptwatch | measurement | Waits for effective permission |
| Statable | statableAnalytics | measurement | Waits for effective permission |
Product analytics
| Integration | Helper | Category | Loading behavior |
|---|---|---|---|
| PostHog | posthog | measurement | Configurable; defaults to always loading and calling opt-in and opt-out APIs |
| Mixpanel | mixpanelAnalytics | measurement | Always loads; calls opt-in and opt-out APIs |
| Amplitude | amplitude | measurement | Waits for effective permission; opts the SDK out on revocation |
| Heap | heap | measurement | Waits for effective permission |
| Gainsight PX | gainsightPx | measurement | Waits for effective permission |
| Pendo | pendo | measurement | Waits for effective permission; stops and resumes event sending |
Replay and monitoring
| Integration | Helper | Category | Loading behavior |
|---|---|---|---|
| Microsoft Clarity | clarity | measurement | Gated initially; keeps the SDK and signals storage consent |
| Hotjar | hotjar | measurement | Waits for effective permission |
| LogRocket | logRocket | measurement | Waits for effective permission |
| Sentry | sentry | necessary; Replay and user data measurement | Configurable; defaults to always loading and loads Replay after permission |
| Vercel Speed Insights | vercelSpeedInsights | measurement | Waits for effective permission; drops reports after revocation |
| FullStory | fullStory | measurement | Waits for effective permission |
| Lucky Orange | luckyOrange | measurement | Waits for effective permission |
Experimentation and personalization
| Integration | Helper | Category | Loading behavior |
|---|---|---|---|
| Adobe Target | adobeTarget | experience | Waits for effective permission |
| Appcues | appcues | experience | Waits for effective permission |
| Dynamic Yield | dynamicYield | experience | Waits for effective permission |
| Optimizely Web Experimentation | optimizelyWeb | experience | Waits for effective permission |
| Wisepops | wisepops | marketing | Waits for effective permission |
Ads and growth
| Integration | Helper | Category | Loading behavior |
|---|---|---|---|
| Meta Pixel | metaPixel | marketing | Gated initially; keeps the SDK and signals consent |
| TikTok Pixel | tiktokPixel | marketing | Gated initially; keeps the SDK and signals consent |
| Klaviyo | klaviyo | marketing and measurement | Waits for both; optional forms-only mode needs marketing |
| Clearbit | clearbit | marketing | Waits for effective permission |
| LinkedIn Insight Tag | linkedinInsights | marketing | Waits for effective permission |
| Microsoft UET | microsoftUet | marketing | Always loads; signals ad storage consent |
| Pinterest Tag | pinterestTag | marketing | Gated initially; keeps the tag and signals consent |
| Reddit Pixel | redditPixel | marketing | Gated initially; keeps the pixel and toggles first-party cookies |
| Snapchat Pixel | snapchatPixel | marketing | Waits for effective permission |
| X Pixel | xPixel | marketing | Waits for effective permission |
| OpenAI Pixel | openaiPixel | marketing | Gated initially; keeps the SDK and signals consent |
| ActiveCampaign | activeCampaignTracking | marketing | Waits for effective permission |
| Attentive | attentiveTag | marketing | Waits for effective permission |
| Customer.io | customerIo | marketing | Waits for effective permission |
| Insider | insiderTag | marketing | Waits for effective permission |
| Marketo Munchkin | marketoMunchkin | marketing | Waits for effective permission |
| Salesforce Account Engagement | pardotTracking | marketing | Waits for effective permission |
| Oracle Eloqua | eloquaTracking | marketing | Waits for effective permission |
| HubSpot | hubspot | marketing | Waits for effective permission |
| RB2B | rb2b | marketing | Waits for effective permission |
| Clay | clay | marketing | Waits for effective permission |
| Default | defaultComPixel or defaultComFormsSdk | Pixel: measurement; SDK: functionality; both configurable | Pixel waits for permission by default; opt-in loadMode: 'always' loads before consent. Standalone SDK always waits for permission. Use one helper per document. |
| Amazon Ads | amazonAdsTag | marketing | Gated initially; keeps the tag and signals consent when ACS is enabled |
| AdRoll | adrollPixel | marketing | Waits for effective permission |
| LiveIntent | liveIntentTag | marketing | Waits for effective permission |
| The Trade Desk | theTradeDeskPixel | marketing | Waits for effective permission |
| Vector | vector | marketing | Waits for effective permission |
Data and tags
| Integration | Helper | Category | Loading behavior |
|---|---|---|---|
| Segment | segment | measurement | Waits for effective permission |
| RudderStack | rudderstack | measurement | Gated by default; optional destination consent mode |
| Hightouch | hightouch | measurement | Waits for effective permission |
| Google Tag Manager | googleTagManager | necessary; measurement or marketing when gated | Always loads and signals Google consent by default; loadMode: 'after-consent' waits for permission |
| Cloudflare Zaraz | cloudflareZaraz | necessary | Always runs; syncs purposes, Zaraz runs the tools |
| Shopify | createShopifyCustomerPrivacy | measurement, marketing, functionality | Loads nothing; sends each choice to Shopify's Customer Privacy API |
Chat and embeds
| Integration | Helper | Category | Loading behavior |
|---|---|---|---|
| Intercom | intercom | functionality | Waits for effective permission |
| Crisp | crisp | functionality | Waits for effective permission |
| Front Chat | frontChat | functionality | Waits for effective permission |
| YouTube | None, consent-gated iframe | Chosen by your app | Iframe mounts only while the chosen permission is allowed |
| Google Maps | None, consent-gated iframe | Chosen by your app | Iframe mounts only while the chosen permission is allowed |
| Ada | ada | functionality | Waits for effective permission |
| Gorgias Chat | gorgiasChat | functionality | Waits for effective permission |
| Zendesk Messaging | zendeskWidget | functionality | Waits for effective permission |
The YouTube and Google Maps guides include examples for every supported framework.
Embeds do not require @c15t/integrations.
Read the integration catalog
For programmatic discovery, import builtInScriptIntegrations and
BUILT_IN_INTEGRATION_KINDS from @c15t/integrations/registry. Each built-in
entry has an integrationKind, typed as IntegrationKind, for the groups
above. BUILT_IN_INTEGRATION_KINDS supplies their labels and display order.
The existing integrationCategory, IntegrationCategory and
BUILT_IN_INTEGRATION_CATEGORIES keep their v3 values, so existing category
filters still work. consentCategory identifies the default consent category
or condition for each helper.
Load each vendor once
Remove the vendor's own snippet, tracking image, framework plugin or tag manager entry before adding its helper. c15t cannot gate a copy it did not load. Tag managers and data pipelines such as Segment can load further destinations, which need consent settings of their own.
Framework packages are loaders too. To move their vendors to c15t, see
migrate from @next/third-parties
for Next.js, and
migrate from @nuxt/scripts
or migrate from nuxt-gtag
for Nuxt.
When a visitor turns off a category they had allowed, c15t reloads the page so that code which already ran stops. Each vendor guide lists what its helper does on revocation and how to check it.
Vendor switches and cookie cleanup
Every helper sets a vendor slug and the vendor's name and privacy policy.
Vendor switches are optional: the preference dialog shows only categories until
you declare a vendor. Once you do, it lists each helper's vendor with its own
switch, and a visitor can allow a category and still switch one vendor off. c15t then does not load that
vendor's script. Helpers that load on every page, such as Google Tag Manager,
Microsoft UET and Mixpanel, still load and send the vendor a denied signal
instead. The dialog lists necessary helpers without a switch. Declare
a vendor with the same slug to replace its name and links, for example when you
self-host Matomo or PostHog. Gating also leaves behind the cookies a vendor
already wrote; clearOnRevocation deletes them when their category is denied. Each framework documents both in its Scripts
and embeds group:
| Framework | Vendor consent | Clear on revocation |
|---|---|---|
| Next.js | Vendor consent | Clear on revocation |
| TanStack Start | Vendor consent | Clear on revocation |
| React | Vendor consent | Clear on revocation |
| Nuxt | Vendor consent | Clear on revocation |
| Vue | Vendor consent | Clear on revocation |
| Astro | Vendor consent | Clear on revocation |
| Svelte | Vendor consent | Clear on revocation |
| SvelteKit | Vendor consent | Clear on revocation |
| HTML | Vendor consent | Clear on revocation |
| JavaScript | Vendor consent | Clear on revocation |
Send events only to allowed integrations
The event dispatcher sends one named event to every registered integration that has an event API and is allowed right now. It drops events while measurement is denied, and one vendor's error does not stop delivery to the others. Each framework gives you the provider's dispatcher, so you don't pass the scripts or the consent snapshot yourself:
| Framework | Get the dispatcher |
|---|---|
| React, Next.js, TanStack Start | useEventDispatcher() from c15t/react, c15t/next or c15t/tanstack-start |
| Vue, Nuxt | useEventDispatcher() from c15t/vue/vue-plugin, auto-imported in Nuxt |
| Svelte, SvelteKit | getEventDispatcher() from c15t/svelte, called inside ConsentProvider |
| Astro | getEventDispatcher() from c15t/astro/client |
| JavaScript | getEventDispatcher(runtime) from @c15t/browser |
The dispatcher sends to the scripts registered on the provider. Pass
scripts to add more. It reads consent when an event goes out, so an event
sent right after a visitor withdraws consent is dropped. Every dispatcher for
the same provider shares one pageview history, so a component that remounts
or a consent change does not resend or lose a pageview.
track supports Google Tag Manager, Google Tag, PostHog, Mixpanel, Segment,
Hightouch, Heap, Amplitude, LogRocket, Adobe Analytics, Databuddy, Plausible,
Fathom, Pirsch, Microsoft Clarity, Hotjar, Vercel Analytics, OneDollarStats,
Umami, Rybbit, RudderStack and Matomo. pageview sends single-page-app page
views only to the integrations named in pageviews: PostHog, Segment or
Hightouch. Call it from your router's navigation hook. The first call records
the path without sending, and repeated paths or hash-only changes are skipped.
Each framework's scripts page shows where to call it.
Without a provider, createEventDispatcher from @c15t/integrations/events
takes scripts and a getSnapshot function that returns the live consent
snapshot. Create it once and keep it: a new dispatcher starts a new pageview
history.
Add a vendor without a helper
Use custom integrations for a vendor without a helper, or an SDK your app already loads. Test every integration with the consent verification guide.