React packageExamples
Examples
Common analytics patterns with @supapulse/react hooks, from button clicks to passing the session ID to checkout.
Provider and a tracked button
import { SupapulseProvider, useEvent } from '@supapulse/react';
const config = { apiToken: import.meta.env.VITE_SUPAPULSE_TOKEN };
export function App() {
return (
<SupapulseProvider config={config}>
<Hero />
</SupapulseProvider>
);
}
function Hero() {
const trackEvent = useEvent();
return (
<a href="/signup" onClick={() => trackEvent('cta_click', { location: 'hero' })}>
Start free trial
</a>
);
}A small custom hook
import { useSupapulse } from '@supapulse/react';
import { useCallback } from 'react';
/** Like useEvent, with the event name prefixed. */
export function useTrack() {
const supapulse = useSupapulse();
return useCallback(
(name: string, data?: Record<string, unknown>) => {
supapulse.event(`app_${name}`, data);
},
[supapulse],
);
}Form submissions
function NewsletterForm() {
const track = useTrack();
return (
<form
onSubmit={(event) => {
track('newsletter_signup', { form: 'footer' });
// submit…
}}
>
<input type="email" name="email" aria-label="Email" />
<button>Subscribe</button>
</form>
);
}Don't put the email address in the event.
Checkout with the session ID
import { useSupapulse } from '@supapulse/react';
function UpgradeButton({ priceId }: { priceId: string }) {
const supapulse = useSupapulse();
async function upgrade() {
const response = await fetch('/api/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
priceId,
fingerprint: await supapulse.getVisitorFingerprint(),
sessionId: supapulse.getSessionId(),
}),
});
window.location.href = (await response.json()).url;
}
return <button onClick={upgrade}>Upgrade</button>;
}The server side is in the Stripe guide.
Tracking only when a condition holds
function FeatureTour({ isFirstVisit }: { isFirstVisit: boolean }) {
const supapulse = useSupapulse();
useEffect(() => {
if (supapulse && isFirstVisit) {
supapulse.event('tour_started');
}
}, [supapulse, isFirstVisit]);
return null;
}