Skip to main content
20% off 3 months · code LAUNCH20 · until 31 October

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.

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 the checkout.session.completed webhook 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

  1. 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.
  2. 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.
  3. Read it after payment. Listen for checkout.session.completed, take client_reference_id from the session, and look up the source you stored for that id.
  4. 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.

Also asked as
  • Stripe Payment Link UTM tracking
  • How to track which campaign led to a Stripe payment
  • Stripe Payment Link client_reference_id
Read next
Start free Free plan, no time limit · No card