Skip to content
trackrift

Documentation

SDK

React

TrackerProvider, useTracker, TrackEvent, and testing patterns.

AI brief: TrackerProvider calls tracker.init sync on first render (StrictMode-safe). useTracker() returns track, identify, setConsent, getEventId, reset. TrackEvent on mount or click. disabled prop for Storybook.

The React layer is a thin wrapper over the core singleton. TrackerProvider must wrap any component that calls useTracker() or renders TrackEvent.

App.tsx
'use client';
import { TrackerProvider, useTracker, TrackEvent } from '@trackrift/sdk/react';

export function App({ children }: { children: React.ReactNode }) {
  return (
    <TrackerProvider endpoint="https://api.trackrift.com" publicId="YOUR_PUBLIC_ID">
      {children}
    </TrackerProvider>
  );
}

function BuyButton() {
  const { track, getEventId } = useTracker();
  return (
    <button
      onClick={() => {
        const id = track('add_to_cart', { value: 49, currency: 'EUR' });
        console.log('event_id for pixel:', id);
      }}
    >
      Add to cart
    </button>
  );
}

<TrackEvent name="view_content" payload={{ content_ids: ['hero'] }} />

TrackerProvider props

PropRequiredNotes
endpointyesCollector base URL
publicIdyesWorkspace public id from dashboard
consentModenointernal (default) or required for CMP
defaultConsentnoInitial deny flags when required mode
disablednoSkip init — Storybook / tests
debugnoConsole logging

useTracker() return value

PropertyTypeDescription
track(name, payload?) => stringReturns event_id
identify(IdentityPayload) => voidIdentify user
setConsent(ConsentState) => voidUpdate consent + flush queue
getEventId(name) => string | undefinedLast id for event name
reset() => voidLogout / clear session
link(url) => stringCross-domain URL helper
TrackEvent-click.tsx
<TrackEvent
  name="cta_click"
  trigger="click"
  payload={{ properties: { cta: 'start_trial' } }}
>
  <button>Start trial</button>
</TrackEvent>

StrictMode

TrackerProvider initializes synchronously on first render and dedupes duplicate page_view within 1500ms when React StrictMode double-mounts in development.

Testing

Pass disabled={true} to TrackerProvider in Jest/RTL tests, or mock @trackrift/sdk before imports. Avoid asserting on network — spy on tracker.track instead.