Skip to main content

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.

npm install @c15t/integrations

@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

IntegrationHelperCategoryLoading behavior
Plausible AnalyticsplausibleAnalyticsmeasurementWaits for effective permission
Fathom AnalyticsfathomAnalyticsmeasurementWaits for effective permission
Umami AnalyticsumamiAnalyticsmeasurementWaits for effective permission
Vercel AnalyticsvercelAnalyticsmeasurementWaits for effective permission
Google Taggtagmeasurement or marketingAlways loads and signals Google consent by default; loadMode: 'after-consent' waits for permission
Cloudflare Web AnalyticscloudflareWebAnalyticsmeasurementWaits for effective permission
Matomo AnalyticsmatomoAnalyticsmeasurementGated by default; optional consent mode
Adobe AnalyticsadobeAnalyticsmeasurementWaits for effective permission
Ahrefs AnalyticsahrefsAnalyticsmeasurementWaits for effective permission
DatabuddydatabuddymeasurementGated by default; disables the SDK on revocation
PirschpirschmeasurementWaits for effective permission
Rybbit AnalyticsrybbitAnalyticsmeasurementWaits for effective permission
OneDollarStatsoneDollarStatsmeasurementWaits for effective permission
PromptwatchpromptwatchmeasurementWaits for effective permission
StatablestatableAnalyticsmeasurementWaits for effective permission

Product analytics

IntegrationHelperCategoryLoading behavior
PostHogposthogmeasurementConfigurable; defaults to always loading and calling opt-in and opt-out APIs
MixpanelmixpanelAnalyticsmeasurementAlways loads; calls opt-in and opt-out APIs
AmplitudeamplitudemeasurementWaits for effective permission; opts the SDK out on revocation
HeapheapmeasurementWaits for effective permission
Gainsight PXgainsightPxmeasurementWaits for effective permission
PendopendomeasurementWaits for effective permission; stops and resumes event sending

Replay and monitoring

IntegrationHelperCategoryLoading behavior
Microsoft ClarityclaritymeasurementGated initially; keeps the SDK and signals storage consent
HotjarhotjarmeasurementWaits for effective permission
LogRocketlogRocketmeasurementWaits for effective permission
Sentrysentrynecessary; Replay and user data measurementConfigurable; defaults to always loading and loads Replay after permission
Vercel Speed InsightsvercelSpeedInsightsmeasurementWaits for effective permission; drops reports after revocation
FullStoryfullStorymeasurementWaits for effective permission
Lucky OrangeluckyOrangemeasurementWaits for effective permission

Experimentation and personalization

IntegrationHelperCategoryLoading behavior
Adobe TargetadobeTargetexperienceWaits for effective permission
AppcuesappcuesexperienceWaits for effective permission
Dynamic YielddynamicYieldexperienceWaits for effective permission
Optimizely Web ExperimentationoptimizelyWebexperienceWaits for effective permission
WisepopswisepopsmarketingWaits for effective permission

Ads and growth

IntegrationHelperCategoryLoading behavior
Meta PixelmetaPixelmarketingGated initially; keeps the SDK and signals consent
TikTok PixeltiktokPixelmarketingGated initially; keeps the SDK and signals consent
Klaviyoklaviyomarketing and measurementWaits for both; optional forms-only mode needs marketing
ClearbitclearbitmarketingWaits for effective permission
LinkedIn Insight TaglinkedinInsightsmarketingWaits for effective permission
Microsoft UETmicrosoftUetmarketingAlways loads; signals ad storage consent
Pinterest TagpinterestTagmarketingGated initially; keeps the tag and signals consent
Reddit PixelredditPixelmarketingGated initially; keeps the pixel and toggles first-party cookies
Snapchat PixelsnapchatPixelmarketingWaits for effective permission
X PixelxPixelmarketingWaits for effective permission
OpenAI PixelopenaiPixelmarketingGated initially; keeps the SDK and signals consent
ActiveCampaignactiveCampaignTrackingmarketingWaits for effective permission
AttentiveattentiveTagmarketingWaits for effective permission
Customer.iocustomerIomarketingWaits for effective permission
InsiderinsiderTagmarketingWaits for effective permission
Marketo MunchkinmarketoMunchkinmarketingWaits for effective permission
Salesforce Account EngagementpardotTrackingmarketingWaits for effective permission
Oracle EloquaeloquaTrackingmarketingWaits for effective permission
HubSpothubspotmarketingWaits for effective permission
RB2Brb2bmarketingWaits for effective permission
ClayclaymarketingWaits for effective permission
DefaultdefaultComPixel or defaultComFormsSdkPixel: measurement; SDK: functionality; both configurablePixel waits for permission by default; opt-in loadMode: 'always' loads before consent. Standalone SDK always waits for permission. Use one helper per document.
Amazon AdsamazonAdsTagmarketingGated initially; keeps the tag and signals consent when ACS is enabled
AdRolladrollPixelmarketingWaits for effective permission
LiveIntentliveIntentTagmarketingWaits for effective permission
The Trade DesktheTradeDeskPixelmarketingWaits for effective permission
VectorvectormarketingWaits for effective permission

Data and tags

IntegrationHelperCategoryLoading behavior
SegmentsegmentmeasurementWaits for effective permission
RudderStackrudderstackmeasurementGated by default; optional destination consent mode
HightouchhightouchmeasurementWaits for effective permission
Google Tag ManagergoogleTagManagernecessary; measurement or marketing when gatedAlways loads and signals Google consent by default; loadMode: 'after-consent' waits for permission
Cloudflare ZarazcloudflareZaraznecessaryAlways runs; syncs purposes, Zaraz runs the tools
ShopifycreateShopifyCustomerPrivacymeasurement, marketing, functionalityLoads nothing; sends each choice to Shopify's Customer Privacy API

Chat and embeds

IntegrationHelperCategoryLoading behavior
IntercomintercomfunctionalityWaits for effective permission
CrispcrispfunctionalityWaits for effective permission
Front ChatfrontChatfunctionalityWaits for effective permission
YouTubeNone, consent-gated iframeChosen by your appIframe mounts only while the chosen permission is allowed
Google MapsNone, consent-gated iframeChosen by your appIframe mounts only while the chosen permission is allowed
AdaadafunctionalityWaits for effective permission
Gorgias ChatgorgiasChatfunctionalityWaits for effective permission
Zendesk MessagingzendeskWidgetfunctionalityWaits 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.

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:

FrameworkVendor consentClear on revocation
Next.jsVendor consentClear on revocation
TanStack StartVendor consentClear on revocation
ReactVendor consentClear on revocation
NuxtVendor consentClear on revocation
VueVendor consentClear on revocation
AstroVendor consentClear on revocation
SvelteVendor consentClear on revocation
SvelteKitVendor consentClear on revocation
HTMLVendor consentClear on revocation
JavaScriptVendor consentClear 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:

FrameworkGet the dispatcher
React, Next.js, TanStack StartuseEventDispatcher() from c15t/react, c15t/next or c15t/tanstack-start
Vue, NuxtuseEventDispatcher() from c15t/vue/vue-plugin, auto-imported in Nuxt
Svelte, SvelteKitgetEventDispatcher() from c15t/svelte, called inside ConsentProvider
AstrogetEventDispatcher() from c15t/astro/client
JavaScriptgetEventDispatcher(runtime) from @c15t/browser
import { useEventDispatcher } from 'c15t/react';
import { useEffect } from 'react';

export const DocsSearch = ({ path }: { path: string }) => {
	const events = useEventDispatcher({ pageviews: ['posthog'] });
	useEffect(() => {
		events.pageview(path);
	}, [events, path]);
	return (
		<button onClick={() => events.track('docs_search', { resultCount: 4 })}>
			Search
		</button>
	);
};

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.