Today, pixel install
Stripe Checkout's success URL is the perfect mounting point. Add the clickt pixel to
that page (or to the page Stripe redirects to after success) and the conversion event
fires automatically, we read client_reference_id, customer_email, and the amount
from the URL parameters Stripe forwards.
Install snippet
<script async
src="https://pixel.clickt.link/p.js"
data-workspace="YOUR_WORKSPACE_PUBLIC_ID"></script>
That's it. The pixel watches form submits, reads the click_id from localStorage, captures the conversion when the Stripe success URL loads.
Optional: pass the click_id through Stripe
If you can wire one line into your Stripe Checkout integration, every sale is matched
exactly. In your stripe.checkout.sessions.create call:
await stripe.checkout.sessions.create({
// ...your existing config
client_reference_id: clickId, // read from `window.clickt('getClickId')`
});
We'll then see client_reference_id on every Stripe Checkout completion and skip
the email-match fallback entirely.
Phase 2, server webhook
We're shipping a direct Stripe webhook integration in phase 2. When that lands:
- Refunds flow into per-video net revenue automatically (today, the pixel never sees a refund a week later, it's a known gap, accepted at MVP).
- Subscription renewals and expansions roll into per-video LTV.
- Plan changes (upgrade / downgrade) show up correctly in cohort analysis.
- Customers who close the tab between Stripe and your success URL still get attributed.
The webhook layer doesn't replace the pixel, they run side by side. The pixel gives you real-time numbers; the webhook gives you accuracy that doesn't depend on the buyer's browser staying open.
What you'll see in the dashboard
For every video that drove a Stripe sale:
- Sales count
- Gross revenue, net revenue (phase 2)
- Average order value
- Conversion rate from click → checkout → paid
- Time-to-purchase distribution
If you sell subscriptions, the LTV-per-video number lights up once phase-2 ships.