Setup
Google Ads and Stripe: match ad clicks to Stripe payments
You can see which Google Ads clicks led to Stripe payments by keeping auto-tagging on, adding UTM parameters to your tracking template, and connecting Stripe so payments are matched to the visitor's session. This shows revenue that reached Stripe, next to what Google Ads reports.
One thing up front, because many people searching for this expect it: Thexly does not upload conversions to Google Ads. It shows the matched Stripe revenue in Thexly. Google's own conversion tracking keeps running as it does today.
Why bother, if Google already reports conversions? Because the two can disagree. One r/PPC poster put it this way: "when I compare ga4 and google ads revenue to stripe (which is the actual source of truth), the gap is big enough that it also makes me question attribution itself, not just ROAS." (r/PPC, January 2026)
What you need
Google Ads access to edit account, campaign or ad group settings.
A Stripe account with permission to create a restricted key (Thexly Stripe guide).
The Thexly tracking script on your site (docs).
What we checked, and how
On 16 October 2026 we read Google's auto-tagging and ValueTrack help pages and checked which parameters work in Performance Max. Google's table lists {campaignid} as "Fully supported" in Performance Max and {gclid} as "Limited support", which it explains as only applying "to some channels or ad formats within the campaign" (Google Ads help). That's why this page puts the campaign in your tracking template as well as relying on auto-tagging.
Step 1: tag the ad clicks in Google Ads
Keep auto-tagging on. Google says "Auto-tagging is now on by default for new accounts." When it's on, Google adds a parameter called GCLID to the URL people click through, like www.example.com/?gclid=123xyz (Google Ads help).
Add a tracking template. Google suggests putting tracking parameters in a tracking template. A template at account, campaign or ad group level must include {lpurl}, which inserts your final URL; without it, Google says your landing page URL will break (Google Ads help).
An illustrative campaign-level template, with your campaign's name typed in:
{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign=spring-launch
Why a name and not {campaignid}? Google's {campaignid} returns "The campaign ID", a number. Thexly shows utm_campaign exactly as it arrives, so you'd see something like 12345 with no campaign name next to it. Typing the name into a campaign-level template keeps your reports readable.
Thexly reads the UTM tags and Google's gclid from the page URL when the visitor lands, and labels gclid clicks as Google Ads. There's no Google account to connect.
One setting to check: if your Thexly script has data-exclude-search turned on, it drops all UTM tags and click IDs such as gclid, so Thexly can't tie those visits to your campaigns. Leave it off on any page your ads link to.
Step 2: connect Stripe
From the Thexly Stripe guide:
1. In Stripe, go to Developers → API keys and click Create restricted key.
2. Name it something you'll recognise, like "thexly-readonly".
3. Set exactly two permissions and leave everything else at None: Checkout Sessions: Read and Webhooks: Write.
4. Create the key and copy it straight away. It starts with rk_live_ (or rk_test_ in test mode).
5. Paste it into Thexly under Settings → Payments → Stripe.
The only thing Thexly writes to Stripe is its own webhook registration.
Step 3: pass the session at checkout
Stripe Payment Links placed as links on your page: nothing to do. The script adds the visitor's session to the link before they click it.
Buttons or checkouts opened with JavaScript: the session isn't added for you. Call window.thexly.getSessionId() on the page and add it to the Payment Link as client_reference_id before you send the visitor to Stripe.
Checkout Sessions you create on your server: pass the session as client_reference_id or in metadata.thexly_session_id.
Standalone Payment Intents you create on your server: pass the session in metadata.thexly_session_id. That's the only field Thexly reads on a Payment Intent.
If you use metadata, keep within Stripe's limits: 50 key-value pairs, keys up to 40 characters, values up to 500 characters. Metadata doesn't copy to related objects on its own, so set it on the object you create (Stripe docs).
Subscriptions and renewals
When Thexly receives a renewal payment, it matches it to the session in the invoice or subscription's metadata.thexly_session_id, or failing that through an earlier payment by the same customer, the subscription's history, or thexly.identify() if you call it after login.
Check it works
1. Open your landing page with the template's parameters filled in by hand, for example ?utm_source=google&utm_medium=cpc&utm_campaign=spring-launch.
2. Check your Thexly dashboard for the visit. It should show within a few seconds (docs).
3. Make a test purchase, or wait for the first real one, and confirm it shows the campaign.
4. After the campaign runs, put Thexly's matched revenue next to Google Ads' reported conversion value for the same dates.
What Thexly does and doesn't do
Thexly matches each Stripe payment to the visit that led to it and credits one channel, either the first one that brought the visitor in or the one that closed the sale. You pick per website (docs).
It doesn't upload conversions to Google Ads and doesn't change your ad or bidding settings. It doesn't pull spend from Google Ads, so you bring spend from your account when you compare.
The platform vs payment gap calculator shows how far Google's reported revenue sits from your payments. More: Google Ads reporting and PPC reporting. There's a 14-day trial, no card needed.
FAQ