Open Tracked/Integrations/Stripe purchase tracking guide

Stripe purchase tracking guide

Stripe handles the payment, so the browser may never see the final result. Use the success page for speed and a webhook for certainty.

4 min read · Updated October 26, 2026

Stripe CheckoutWWebhook or success pageServer container to ads and GA4
In this guide
Key takeaways
  • 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

SignalStrengthWeakness
Success pageFast, has browser cookies and click IDsThe visitor may close the tab or never return
Webhook checkout.session.completedReliable, fires on every completed paymentNo browser: needs identifiers saved earlier
Data in, clean out

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

1

On the success page

Push a purchase event to the data layer with the order ID as transaction_id and event_id.

2

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.

3

The server container sends it on

To GA4, Meta and Google Ads with the same transaction ID.

4

Platforms deduplicate

The browser and server copies of the same order count once.

The short version

3 things to remember

Scroll and the points stack up.

01

With Stripe Checkout or Payment Links, the visitor leaves your site to pay. Track on the success page (fast) and the webhook check

02

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

03

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 value includes them, and use one rule on every platform.
  • Refunds: send a refund event with the same transaction ID, using GA4's refund event.

Common problems

SymptomRevenue is 100 times too high
Likely causeCents were not converted.
FixDivide by 100 for normal currencies.
SymptomPurchases are counted twice
Likely causeSuccess page and webhook use different IDs.
FixUse the order ID or session ID in both.
SymptomNo attribution for webhook events
Likely causeThe click IDs were not carried through.
FixPass them in metadata and read them back.
SymptomSubscriptions are not tracked
Likely causeOnly the first payment is sent.
FixHandle 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.

0 of 6 done
Trusted

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.

Open Tracked
Written by

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?

Write to us Read the docs

Was this article helpful?

Comments

Loading comments...

Turn better tracking into better marketing performance

Start free