Can I add UTM parameters to a Stripe Payment Link, and where do they show up?
23 September 2026 · by Nordva, who make Nordva Launch
The short answer
Yes. A Stripe Payment Link accepts utm_source, utm_medium, utm_campaign, utm_term and utm_content in its URL, and Stripe adds them to your redirect URL after payment, if the link redirects. They don't connect the payment to the visit that brought the person. For that, pass an id of your own in client_reference_id and read it from the checkout.session.completed event.
What a Payment Link accepts
Stripe’s page on tracking a payment link lists five UTM codes you can add to the link’s query string: utm_source, utm_medium, utm_campaign, utm_term and utm_content. Values may use letters, numbers, dashes and underscores, up to 150 characters. Invalid values are dropped and the link still works.
Two other parameters matter here:
client_reference_id: a string of your choice, up to 200 characters of letters, numbers, dashes and underscores. It’s attached to the Checkout Session and sent in thecheckout.session.completedwebhook after payment (same page).prefilled_email: fills in the email field. The customer can still change it (Stripe: customize Payment Links).
Where the UTM tags go
Stripe’s docs describe one place: your redirect URL. Set the link’s confirmation behaviour to redirect, and when the customer completes a payment, “the UTM codes are automatically added to your redirect URL” (Stripe: after a payment link payment). You can also put {CHECKOUT_SESSION_ID} in that URL to get the session’s id on your success page.
So the tags come back to your site, on the thank-you page, if your analytics runs there. With the default confirmation page, which stays on Stripe, there’s no redirect for them to ride on.
Why that isn’t attribution yet
A tagged Payment Link tells you which link someone clicked right before paying. It doesn’t tell you where they found you. Someone who read your Reddit post on Monday, came back through Google on Thursday and clicked “Buy” on your pricing page arrives at Stripe with whatever tags your pricing page button carries, usually none.
Metadata on the Payment Link itself doesn’t help either: it’s set once per link and copied to every Checkout Session the link creates (Stripe: create a payment link), so every buyer gets the same value.
How to tie a payment to the first visit
- Store the source on the first page. When a visitor lands, save the UTM tags and the referring site in a first-party cookie or local storage, with a random id for the visitor.
- Add the id to the Buy link. In your page’s script, append
?client_reference_id=<visitor id>to the Payment Link URL before the person clicks. Never put an email, password or key there; Stripe warns that these links can end up in unexpected places. - Read it after payment. Listen for
checkout.session.completed, takeclient_reference_idfrom the session, and look up the source you stored for that id. - Keep it on the customer. Copy the id into the Stripe customer’s or subscription’s
metadata, which takes up to 50 keys (Stripe: metadata). Then later payments from the same customer still trace back.
If your server can’t receive webhooks, the minimum is step 1 plus the UTM tags on the redirect URL: you’ll see the last click’s tags, not the first visit’s.
With Nordva Launch
Launch’s analytics script already does step 1: it records each visit’s referring site and UTM tags, and nordva.visitor()?.id gives the visitor id in the browser (null until the visit may carry ids). Launch traces a payer through nordva_visitor_id in the Stripe customer’s or subscription’s metadata, so in step 4 store it under that key; Checkout Session metadata isn’t read. Stripe is read with a restricted key, GET requests only, on every plan. Revenue by referring site works on every plan; by UTM source and campaign on Builder. Start free, no card.
When Launch is the wrong tool
If you sell from one link that you only share in one place, you already know where every buyer came from; skip the tagging and count the payments.
- Stripe Payment Link UTM tracking
- How to track which campaign led to a Stripe payment
- Stripe Payment Link client_reference_id