Send the user's persona on both the server-side subscription.created event and the client-side checkout.completed/dataLayer purchase event, for ICP analysis. Hold the processing screen ~5s before redirecting so PostHog and the ad pixels (Google/Meta via GTM) reliably flush. Sharpen the annual-upgrade banner copy (lead with '2 months free') and give its check icon a white tile.
61 lines
1.8 KiB
TypeScript
61 lines
1.8 KiB
TypeScript
import { captureEvent } from '@/posthog';
|
|
|
|
const push = (data: Record<string, unknown>) => {
|
|
window.dataLayer = window.dataLayer || [];
|
|
window.dataLayer.push(data);
|
|
};
|
|
|
|
export const useTracking = () => ({
|
|
trackSignUp: (authProvider: string) => {
|
|
captureEvent('user.signed_up', {
|
|
auth_provider: authProvider,
|
|
});
|
|
|
|
push({
|
|
event: 'sign_up',
|
|
method: authProvider,
|
|
});
|
|
},
|
|
|
|
trackBeginCheckout: (plan: { name: string; interval: string }) => {
|
|
captureEvent('checkout.started', {
|
|
plan_name: plan.name,
|
|
interval: plan.interval,
|
|
});
|
|
|
|
push({
|
|
event: 'begin_checkout',
|
|
plan_name: plan.name,
|
|
plan_interval: plan.interval,
|
|
});
|
|
},
|
|
|
|
trackPurchase: (
|
|
plan: { name: string; interval: string },
|
|
conversion?: { value: number; currency: string; transaction_id: string } | null,
|
|
persona?: string | null,
|
|
) => {
|
|
captureEvent('checkout.completed', {
|
|
plan_name: plan.name,
|
|
interval: plan.interval,
|
|
...(persona ? { persona } : {}),
|
|
...(conversion ? {
|
|
conversion_value: conversion.value,
|
|
conversion_currency: conversion.currency,
|
|
conversion_transaction_id: conversion.transaction_id,
|
|
} : {}),
|
|
});
|
|
|
|
push({
|
|
event: 'purchase',
|
|
plan_name: plan.name,
|
|
plan_interval: plan.interval,
|
|
...(persona ? { persona } : {}),
|
|
...(conversion ? {
|
|
conversion_value: conversion.value,
|
|
conversion_currency: conversion.currency,
|
|
conversion_transaction_id: conversion.transaction_id,
|
|
} : {}),
|
|
});
|
|
},
|
|
});
|