trypost/resources/js/composables/useTracking.ts
Paulo Castellano bde8d4801e feat(billing): attach persona to conversion tracking and polish annual banner
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.
2026-06-22 12:32:03 -03:00

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,
} : {}),
});
},
});