How to Track Stripe Payments as Meta Ads Conversions
Meta optimizes for the events it can see, usually signups. Here is how to send Stripe payments to Meta through the Conversions API and decide if renewals count.
Table of contents
- Why Meta can't see your Stripe payments
- What you need before you start
- How to track a Stripe payment as a Meta Ads conversion
- Step 1: Install the SourceLoop tracking script
- Step 2: Connect Stripe with a webhook
- Step 3: Pass SourceLoop IDs into your checkout
- Step 4: Connect Meta Ads to SourceLoop
- Step 5: Get your Pixel ID and a System User token
- Step 6: Map the Stripe payment to a Meta event
- Step 7: Choose what counts as a conversion
- Step 8: Test with a test event code
- What to do once events are flowing
Meta optimizes your campaign for whatever event it can see. For most SaaS accounts that's a signup or a lead, not a payment.
The fix is to send the Stripe payment to Meta yourself, tied to the ad click. This guide covers the setup, plus a question most guides skip: should renewals go to Meta too?
Why Meta can't see your Stripe payments
The Meta Pixel runs in the visitor's browser. Stripe moves the payment out of it, in three ways:
- Checkout happens on a Stripe-hosted page, so the visitor leaves your site before they pay.
- Safari, iOS privacy settings and ad blockers already drop a good share of Pixel events.
- Renewals have no page view at all. Stripe bills the card and nobody opens a browser.
So the payment has to travel server to server. Stripe sends a webhook, SourceLoop adds the Meta click data it saved earlier, and the Conversions API (CAPI) delivers the event to Meta.
The payment gives Meta the value. The click data tells Meta which ad deserves the credit.
What you need before you start
- A Meta ad account, and a Pixel (or Dataset) in Events Manager.
- Admin access to your Meta Business, so you can create a System User token.
- A SourceLoop workspace with the tracking script installed, and the Admin or Owner role.
- Developer or owner access to your Stripe Dashboard, to add a webhook endpoint.
How to track a Stripe payment as a Meta Ads conversion
Eight steps. The first three get Stripe data into SourceLoop with the Meta click data attached. The rest connect Meta and decide what gets sent.
Step 1: Install the SourceLoop tracking script
In SourceLoop, open Setup, then Tracking code, and copy the snippet. Paste it into the head of every page, starting with the ones that lead into checkout. It saves the fbclid from the ad click and the Meta browser cookies, so they're there when the payment arrives.

Want to confirm it's firing? Run through the verify tracking guide. If fbclid is new to you, click IDs explained shows where it comes from.
Step 2: Connect Stripe with a webhook
Go to Setup, then Payment, and click the Stripe card. The drawer that opens shows your webhook URL.

Copy the URL. In Stripe, open Developers, then Webhooks, click Add endpoint and paste it in. Select these events:
charge.succeededcharge.refundedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.paid
Save the endpoint, reveal its signing secret (it starts with whsec_) and paste it into the SourceLoop drawer. The status shows pending until Stripe sends its first verified event, then it turns active.

Already sending Stripe events to Zapier or your own app? Keep those endpoints. Stripe delivers each event to every endpoint on its own. Stripe's webhook documentation has the details.
Step 3: Pass SourceLoop IDs into your checkout
The webhook tells SourceLoop a payment happened. It doesn't say who paid. So hand Stripe the visitor's IDs when you create the checkout. The tracker gives you a helper for that:
const meta = window.sourceloop.checkoutMetadata();
// { sourceloop_anonymous_id: '...', sourceloop_id: '...' }Send that object to your server with the price ID, then set it as metadata on the Checkout Session. For subscriptions, set it on subscription_data too:
const session = await stripe.checkout.sessions.create({
mode: 'subscription',
line_items: [{ price: priceId, quantity: 1 }],
success_url: 'https://your.site/thanks',
cancel_url: 'https://your.site/pricing',
metadata: meta,
subscription_data: { metadata: meta },
});Add the subscription_data part even if you only plan to send first payments. Stripe copies it onto each invoice, so you can add renewals later without touching code. Stripe's metadata guide explains how the copying works.
On Payment Links or Payment Intents? The Stripe lead source guide has a snippet for each.
Step 4: Connect Meta Ads to SourceLoop
Open Setup, then Ad Platforms, and connect your Meta ad account from the Meta Ads card. Once it's connected, the card shows the ad account name. The connect Meta Ads guide covers the permissions.
Step 5: Get your Pixel ID and a System User token
SourceLoop needs two things from Meta: the Pixel ID and a token that lets it write events.
- Open Events Manager in Meta Business Suite and pick the Pixel (or Dataset) tied to your ad account.
- Copy the Pixel ID, the 15 to 16 digit number at the top of the Overview tab.
- Open Business Settings, then Users, then System Users, and add one named something like SourceLoop CAPI.
- Assign it your ad account and your Pixel, both with Manage permission.
- Click Generate New Token, tick
ads_managementand set the expiry to Never if it's offered. - Copy the token right away. Meta only shows it once.

Why a System User? A personal token expires after 60 days, and your sync quietly stops when it does. A System User token doesn't expire.
Step 6: Map the Stripe payment to a Meta event
Go to Setup, then Ad Platforms, then Meta Ads. Paste the Pixel ID and token into the CAPI configuration and save. SourceLoop checks the token, and the status turns Active if it's valid.
Then scroll to Conversion sync and click Add conversion mapping. The fields below are the ones that matter for Stripe. The Meta Conversions API help article lists the rest.
| Field | What to pick for Stripe |
|---|---|
| Trigger event type | Realized revenue updated. It fires when Stripe confirms the money. |
| Trigger event name filter | Blank matches every Stripe payment event. Enter one event name to narrow it (Step 7). |
| Attribution model | Last touch or first touch. |
| Meta event name | Subscribe, Purchase, or a custom name. |
| Include value | On, with the value source set to sales_value, the amount Stripe collected. |
| Dedup window | 1440 minutes by default. Meta's own window is 7 days, and SourceLoop uses whichever is shorter. |
Subscribe or Purchase?
- Subscribe fits a new recurring plan.
- Purchase fits one-off sales, and it's the safer pick if your campaigns already optimize for Purchase. You won't have to rebuild anything.
What SourceLoop sends with each payment
- The event name, time and the landing page URL.
- The Meta click cookie (fbc) and browser cookie (fbp), when they exist.
- Hashed email, phone and name, plus the visitor's IP address and user agent.
- Value and currency, and a stable event_id.
More signals mean better matching. Meta can match on the click cookie alone, but email and phone give it a second way to find the person.
Step 7: Choose what counts as a conversion
Should Meta hear about a customer once, or every time they pay? The trigger event name filter decides, and you can add more than one mapping.
| Setup | What Meta receives | Good for |
|---|---|---|
| First payment only | One event per new customer | Most subscription businesses |
| Every payment | First payment and every renewal | Short billing cycles, or when you want all revenue in Events Manager |
| Two mappings | First payment as Subscribe or Purchase, renewals under a custom name | Optimizing on new customers while still seeing renewal revenue |
Renewals work differently on Meta than they do on Google, and the reason is time.
- Meta's default click attribution window is 7 days.
- A renewal 30 days later still reaches Meta, but the ad usually gets no credit for it.
- Meta also rejects events with a timestamp older than 7 days, so there's no sending them late. The Conversions API docs spell that out.
We'd start with the first payment only. If you want renewal revenue visible in Events Manager, add a second mapping that sends renewals under a custom name like SubscriptionRenewal, and keep your campaigns optimizing on the first payment.
Watch for double counting
If your thank-you page also fires a browser Pixel Purchase, Meta can count the same payment twice. It merges a browser event and a server event only when the event name and event_id both match. Meta's server event reference covers the rule. Two ways out:
- Remove the browser Purchase event for this checkout and let CAPI handle it.
- Or pass the same event_id from your Pixel call.
Step 8: Test with a test event code
- In Events Manager, open the Test events tab and copy the test code.
- Paste it into the CAPI configuration in SourceLoop and save.
- Open your checkout in an incognito window, add
?utm_source=test&utm_medium=verify&utm_campaign=stripe-checkto the URL and pay. Stripe test mode works too. - Watch the Test events tab. The event should show up within seconds. Check the name, value, currency and Match Quality.
- Remove the test code from SourceLoop so events go to production.

Check Contacts Hub too. The test customer should be there with a revenue event attached. A test payment proves the plumbing works. Real credit shows up when someone who clicked a Meta ad pays.
What to do once events are flowing
Point a sales campaign at the event you mapped, Subscribe or Purchase. Then give it time. Meta's learning phase wants roughly 50 optimization events per ad set in a week, so a low volume account may need a few weeks before the numbers settle.

Use that dashboard as your cross-check. Ads Manager will report fewer paying customers than Stripe, because Meta only counts people it can tie to an ad. The gap is normal.
It comes from the same payment tracking data, and server-side conversion tracking covers how the push to ad platforms works.
Frequently asked questions
-
Do I still need the Meta Pixel if I send Stripe payments through CAPI?
Keep it for page views and other browsing events. For the payment itself, either let CAPI be the only source or make sure the Pixel and CAPI share the same event_id, so Meta counts it once.
-
Should I map Stripe payments to Subscribe or Purchase?
Use Subscribe for a new recurring plan and Purchase for one-off sales. If your campaigns already optimize for Purchase, mapping subscriptions to Purchase saves you from rebuilding them.
-
Will Meta credit my ads for subscription renewals?
Rarely. Renewals reach Meta if you send them, but Meta's default click window is 7 days, and most renewals land well after that. That's why most teams send the first payment only.
-
What if the customer never clicked a Meta ad?
SourceLoop sends the signals it has for that payment. Meta can only credit an ad when it can match the person to an ad interaction, so customers from search, email or direct traffic won't show up as Meta results.
-
Why use a System User token instead of my own?
Personal tokens expire after 60 days and tie the sync to one person's account. A System User token doesn't expire and belongs to the business.
-
How long until a payment shows up in Events Manager?
SourceLoop sends matching conversions on a 2 minute cycle, so allow a few minutes. With a test event code, it appears in the Test events tab within seconds.
-
Does this work with Stripe Payment Links?
Yes, with less detail. A Payment Link can only carry a
client_reference_id, so SourceLoop falls back to matching on the customer's email when the full IDs are missing. Checkout Sessions give better results. -
Can I send the same Stripe payment to Meta and Google Ads?
Yes. Add a mapping in each ad platform's drawer. The Google side is covered in our guide to tracking Stripe payments as Google Ads conversions.