

Track Stripe Purchase in Your Facebook Ads
Stripe shows the sales. Facebook Ads Manager does not. If that sounds familiar, nothing is broken. It is how Stripe checkout works, and it has a fix.
LIVE
Your Ad
checkout.stripe.com
Pay $49.00
Ads Manager
Purchase
$49.00
Help Facebook Attribute Stripe Purchases to Your Ads
If you sell through Stripe and advertise on Facebook, you have probably seen this: Stripe shows the sales, but Facebook Ads Manager does not. Revenue is coming in and your campaigns look like they are barely working.
Nothing is broken. The problem is structural. Stripe checkout happens on Stripe's domain, not yours, and the moment a customer leaves your site the link between the ad they clicked and the purchase they made is lost.
This page explains exactly why that happens, how to tell it is happening to you, and how to fix it so Facebook receives your Stripe purchases with the ad click still attached.
PixelFlow listens for events in Stripe and forwards them server-side to your Meta pixel, with customer data attached for better attribution.
Server-side via Meta's Conversions API, bypasses iOS and ad-blocker drop-off.
Each event includes hashed email, name, value & currency where Stripe has it.
Optional redirect step adds fbc, IP, and location for higher match rates.
Send the following events with proper attribution
Trial sign-ups for a subscription
Payment method setup
First subscription payment & one-off purchases
Subscription renewals

Setup is as simple as
Connect Stripe
Setup a redirect after purchase
Once you've done that PixelFlow adds your fbclid back to the event, enriches it with further information like browserID etc. and sends it to Facebook so it can correctly attribute your subscriptions, trials, purchases etc. to the exact ad campaign they came from.
You can also filter by value and productID if you only want specific products to trigger events (for example, ignore upsells etc.)
Without PixelFlow
With the PixelFlow Stripe integration
Purchases never appear against a campaign in Ads Manager
Every Stripe purchase is matched back to the ad that drove it
Facebook reports far fewer purchases than Stripe
Purchase counts in Ads Manager line up with Stripe
Revenue in Ads Manager is missing or much lower than real revenue
Real payment values and currency are sent with every event
Purchase events have a low Event Match Quality score
Hashed email, IP and click ID raise Event Match Quality
Events Manager keeps asking for more customer information
Complete customer data is sent automatically
Using other setups, it will trigger every Stripe purchase event
Only trigger events based on value or productID filters

Why Stripe Purchases Aren't Being Attributed
When someone clicks your ad, Facebook tags the URL with a click ID. Your site stores it. That ID is the thread tying one person to one ad.
Then they click Buy and land on Stripe's domain. Cookies do not travel between domains, so the click ID stays behind on your site. And you cannot add a pixel to Stripe's checkout page, because it is Stripe's page, not yours.
Sending the purchase to Facebook by webhook (Zapier, a custom script) gets the sale there, and Stripe knows the customer's email so Facebook can usually work out who bought. But the event arrives with no click ID, so Facebook cannot work out which ad made them buy.
That is the gap. Matching tells Facebook who. The click ID tells Facebook which campaign earned the sale. Without it your revenue floats free of the campaigns that produced it.
How PixelFlow fixes it
PixelFlow captures the session on your site. Before the customer ever reaches Stripe, PixelFlow has already stored their fbc (the ad click), fbp, IP address and user agent from their visit to your website.
The customer checks out on Stripe. Nothing needs to happen here, and nothing can. This is the gap that breaks conventional tracking.
Stripe reports the payment to PixelFlow. A webhook delivers the completed purchase: the amount, the currency, and the customer's details.
PixelFlow reunites the two. It matches that payment back to the browser session it came from and sends a single Purchase event through the Facebook Conversions API carrying both parts: the real transaction data from Stripe, and the original ad click from your site.
The result is the point of the whole exercise. The purchase arrives at Facebook with the ad click attached, not as an anonymous sale.
Frequently asked questions
What is a good Event Match Quality score?
Higher is better, and the scale runs up to 10. Page views naturally score lower because they carry little identifying data. For lead, contact, and purchase events, you want to be sending an email at minimum, which typically pushes those events into the higher band. If a conversion event is scoring low, the usual cause is that it is firing on a page load instead of capturing the form or checkout data at the moment of action. Note that new events can take one to two days to show updated scores in Meta Events Manager.
What is the fbclid and do I need to do anything with it?
The fbclid is the Facebook Click ID, a unique tag Meta appends to your URL when someone clicks an ad. You do not need to manage it manually. A tracking tool captures it automatically, stores it as the fbc value, and includes it when it sends conversions to Meta. Your only job is to avoid losing it, which mainly means keeping conversions on your own domain rather than sending visitors to a third-party page that the click ID cannot follow them to.
Why does Meta say I am not sending enough data even though I am getting conversions?
This almost always means your conversions are arriving without enough identifying signals, most often without the Facebook Click ID or without an email. It is common when bookings or purchases happen on an external page (like a standalone scheduler) that the click ID cannot reach, or when an event fires on a page load after the customer's details are no longer available. Capturing the action itself, and keeping it on your own domain, fixes it.
If I am not running ads, is it pointless to track conversions?
No, and this is one of the most valuable things to understand. Conversions from your organic traffic are sent to your Meta dataset and used to train Meta's system on who your customers are. When you later launch an ad, Meta already knows your ideal customer profile and can target from strength instead of starting cold. Matching data also fades over time, so continuous tracking keeps your dataset fresh.
Why does my traffic source show the wrong channel?
That is last-click attribution. Your tracking remembers the last source a visitor came from, and it can persist in their cookies for a window of time (7 days for UTM parameters in PixelFlow). So a visitor who clicked an Instagram link earlier can still show "Instagram" when they return via another channel. Testing in an incognito window with no history will show the true current source.
Do I need to remove my existing Facebook Pixel?
Yes, if your tracking tool already loads the Pixel for you. Running a separate standalone Pixel on top of it creates genuine duplicate events that deduplication cannot merge, because they come from two different setups. Remove any native Pixel from your platform's marketing settings and any Pixel code pasted into your site, and let the tool be the only thing loading it.

Fix Your Meta Tracking Today
Accurate reporting and attribution for your Facebook Ads.
Compatible with


