In this guide
- With Stripe Checkout or Payment Links, the visitor leaves your site to pay. Track on the success page (fast) and the webhook
checkout.session.completed(reliable). - Stripe amounts are in the smallest currency unit. Divide by 100, except for zero-decimal currencies.
- Use the session ID or order ID as the transaction ID to avoid duplicates.
Selling through Stripe is simple. Tracking it is trickier than on a shop platform, because the payment happens on a Stripe page, the visitor may never return to yours and a webhook can arrive at any time. This page explains the pattern that works: a quick browser event for feedback, and a server event from the webhook as the source of truth, with a shared ID so platforms count it once. See event deduplication and Conversions APIs explained.
The two signals
| Signal | Strength | Weakness |
|---|---|---|
| Success page | Fast, has browser cookies and click IDs | The visitor may close the tab or never return |
Webhook checkout.session.completed | Reliable, fires on every completed payment | No browser: needs identifiers saved earlier |
Raw events in. Clean events out.
Open Tracked collects each event on your own domain, removes the noise and sends what is left to Meta, Google Ads, Stripe.
Carry identifiers through Stripe
When you create a Checkout Session, pass what you will need later in metadata or client_reference_id: the GA4 client ID, fbp, fbc, the click IDs and a hashed e-mail if you have it. Stripe returns them in the webhook, so the server event can be matched to the ad click even though the browser is not involved.
const session = await stripe.checkout.sessions.create({
mode: "payment",
line_items: items,
success_url: "https://yourstore.com/thanks?sid={CHECKOUT_SESSION_ID}",
client_reference_id: orderId,
metadata: { ga_client_id, fbp, fbc, gclid }
});Send the purchase
On the success page
Push a purchase event to the data layer with the order ID as transaction_id and event_id.
On the webhook
Your server receives checkout.session.completed, reads the metadata and amount, and posts a purchase event to your tagging server with the same ID.
The server container sends it on
To GA4, Meta and Google Ads with the same transaction ID.
Platforms deduplicate
The browser and server copies of the same order count once.
3 things to remember
Scroll and the points stack up.
With Stripe Checkout or Payment Links, the visitor leaves your site to pay. Track on the success page (fast) and the webhook check

Stripe amounts are in the smallest currency unit. Divide by 100, except for zero-decimal currencies.

Use the session ID or order ID as the transaction ID to avoid duplicates.

Money details
- Stripe amounts are integers in the smallest unit. $59.90 is
5990. Divide by 100. - Zero-decimal currencies such as JPY do not divide. Check Stripe's list.
- Taxes and shipping: decide whether
valueincludes them, and use one rule on every platform. - Refunds: send a refund event with the same transaction ID, using GA4's
refundevent.
Common problems
invoice.paid for recurring payments and decide what to report.Where Open Tracked helps
The tagging subdomain receives the webhook-driven event and the browser event, and the power-ups help with matching: Cookie Keeper keeps fbp and other cookies alive, the Data Store remembers hashed e-mail, and the Enricher adds it to later events. Request Delay (Business plan) can hold the webhook event a minute or two so the browser copy arrives first.
Brands that grow on cleaner data
Stores and agencies use Open Tracked to see which ads earn the sale.
Frequently asked questions
How do I track Stripe purchases?
Push a purchase on the success page and send a server event from the checkout.session.completed webhook, with the same transaction ID.
How do I pass click IDs through Stripe?
Put them in the Checkout Session metadata and read them back in the webhook.
Why is my revenue wrong?
Stripe amounts are in the smallest currency unit, so divide by 100 except for zero-decimal currencies.
How do I avoid duplicates?
Use the same transaction ID for the browser and server events.
How do I track refunds?
Send a refund event with the same transaction ID.
Do I need spreadsheets to read my results?
No. Once tracking is live, the Open Tracked analytics shows spend, revenue, ROAS and profit, and you can ask Ari, the built-in AI assistant, questions about your own numbers in plain words. Ari's allowance depends on your analytics plan.
Is Open Tracked different from Open Track or Open Space Track?
No. Open Tracked is the official name of our server-side tracking platform, and the website is opentracked.io. Many people search for it as Open Track, OpenTrack or Open Space Track. All of them lead to the same product: server-side Google Tag Manager hosting, first-party analytics and a CRM pipeline.

Fix your tracking at the source
Open Tracked hosts your server-side Tag Manager, keeps first-party cookies alive and shows what each ad is really worth.
The Open Tracked team
We build Open Tracked: server-side tracking hosting, analytics and the tools around them, for stores that spend on ads. Questions about this guide, or an idea for the next one?
Comments
Loading comments...













