How do I track revenue from ChatGPT traffic? (2026)
Capture the visitor's source on the first page view (utm_source=chatgpt.com or a referrer like perplexity.ai or claude.ai), store it, and pass it into your Stripe checkout metadata. Then group payments by that source to see revenue per AI assistant.

Track revenue from ChatGPT traffic by capturing the visitor's source on the first page view (the utm_source=chatgpt.com tag or a referrer like chatgpt.com, perplexity.ai or claude.ai) and carrying that value through signup into your payment record. Your analytics tool can count AI visits on its own, but it can only tie them to money if the source survives until checkout.
Most founders stop at the first half. They see "chatgpt.com" in a referral report and guess at the rest. The steps below close the gap with tools you already have.
How does ChatGPT traffic show up in the first place?
A click from an AI assistant reaches your site as a normal human visit. It is not a crawler like GPTBot. What identifies it is one of two signals, or both:
- A UTM tag. OpenAI's publisher FAQ says ChatGPT automatically adds
utm_source=chatgpt.comto referral URLs. It does not add autm_medium. - A referrer. The browser may pass the assistant's domain in the HTTP referrer header.
Each assistant behaves differently, and the app versions behave worse than the web versions. Here is what public tests have reported:
| Assistant | Referrer domain | UTM tag | Known gaps |
|---|---|---|---|
| ChatGPT | chatgpt.com (older: chat.openai.com) |
utm_source=chatgpt.com |
Mobile apps often pass no referrer |
| Perplexity | perplexity.ai / www.perplexity.ai |
None reported | Desktop app sent no referrer in Ahrefs' test |
| Claude | claude.ai |
None reported | Apps can lose the referrer on handoff to the browser |
| Gemini | gemini.google.com |
Not consistent | Mobile app often arrives as Direct |
Ahrefs tested this by hand in 2025 and found Claude passed a referrer on every link it tried, Perplexity's website did too, and inline links in a paid ChatGPT account carried a noreferrer attribute. SearchPilot's reference table reports that ChatGPT's and Claude's mobile apps pass almost no referrer. These are point-in-time tests, so check your own data rather than treating them as fixed rules.
Why doesn't my analytics tool show AI revenue already?
Two reasons. The source gets lost, and the money lives somewhere else.
GA4 now has an "AI Assistant" default channel. Google's documentation describes it as covering sources like ChatGPT, Gemini, DeepSeek, Copilot and Grok, and it sets the medium to ai-assistant when the referrer matches its list. Claude and Perplexity are not named in that list, so those visits can still land in Referral. A ChatGPT visit that carries only the UTM tag and no medium can end up somewhere else again. SearchPilot notes such visits can show as Unassigned. We covered the GA4 side in more detail in our post on GA4's AI traffic channel.
The second reason matters more for a SaaS founder. Your revenue is in Stripe, Paddle or Lemon Squeezy, not in your analytics tool. A visitor who reads your pricing page from a ChatGPT link today and pays a week later is two unconnected records unless you join them yourself.
How do I capture the AI source on the first visit?
Store it once, on landing, and never overwrite it with a weaker value. A short script that runs on every page can do this:
- Read
utm_sourcefrom the URL. If it is present, use it. - If not, read
document.referrerand keep only the hostname. - Match the hostname against your AI list:
chatgpt.com,chat.openai.com,perplexity.ai,www.perplexity.ai,claude.ai,gemini.google.com,copilot.microsoft.com. - Save the result, with the landing page and date, in a first-party cookie or local storage. Only write it if nothing is stored yet.
That last rule is first-touch attribution. It means the AI assistant that introduced the visitor keeps the credit even if they come back later by typing your URL. If you prefer last-touch, overwrite on every visit with a known source, but pick one rule and keep it.
If you use GA4 as well, build a custom channel group with a regex on Source that names these domains, and place it above Referral. Google's help page on custom channel groups walks through exactly this setup for AI assistants.
How do I pass the AI source into Stripe?
Send the stored value with the signup and the checkout. Stripe gives you two places to put it.
- Checkout Sessions. When your server creates a Checkout Session, add the source to
metadata, for example{"first_touch": "chatgpt.com"}. Stripe's API reference describesmetadataas key-value pairs you can attach to an object. For subscriptions, put the same value in the subscription's metadata too, because later invoice events do not carry the Checkout Session fields. - Payment Links. Stripe's docs say you can append
utm_source,utm_mediumand the other UTM codes to a payment link URL, and that they are passed to your redirect URL after payment. You can also addclient_reference_id, which Stripe returns in thecheckout.session.completedwebhook.
Also save the source on the user row in your own database at signup. Then a trial that converts weeks later still has its origin attached, whatever happens to cookies.
How do I turn that into revenue by AI assistant?
Once each payment carries a source, the report is a group-by:
- Total revenue and number of paying customers per first-touch source.
- Visits per source from your analytics, so you can see revenue per visit.
- The landing pages that AI visitors entered on, which tells you which pages assistants cite.
Run it monthly at first. AI referral volume on a young site is small, so a single customer can swing the numbers. Read it as a direction, not a precise rate.
What about AI visits that arrive as Direct?
You will not recover all of them, and you should say so in any report you share. When an app strips the referrer and the link has no tag, the visit looks like someone typed your URL.
Two cheap habits reduce the blind spot:
- Ask. Add an optional "How did you hear about us?" field at signup with ChatGPT, Claude and Perplexity as choices. Self-reported answers catch app traffic that analytics misses.
- Watch Direct on deep pages. People rarely type a long blog URL by hand. A rise in Direct visits landing on a specific article, at the same time AI referrals to it grow, is a hint, not proof.
What is Clerion?
Clerion is a website intelligence tool for AI founders. It shows which AI assistants (ChatGPT, Claude, Gemini, Perplexity) send traffic to your site, breaks revenue down by traffic source, sends a daily AI briefing, and works inside Claude through a connector. It is built to do the capture-and-join work above without you maintaining the scripts and regex yourself.
If you want to see this for your own site, add the Clerion script tag and check which AI assistants are sending you visitors and revenue.
14-day trial, no card to sign up. A card is only asked if you start a paid plan trial from the upgrade modal.
Frequently asked questions
Does ChatGPT add UTM parameters to links?
Yes. OpenAI's publisher FAQ says ChatGPT automatically adds utm_source=chatgpt.com to referral URLs. It does not add utm_medium, so some analytics tools file these visits as Unassigned unless you add a rule for them.
What referrer domains do Claude and Perplexity use?
Claude visits from the web usually arrive with claude.ai as the referrer, and Perplexity with perplexity.ai or www.perplexity.ai. Visits from their apps can arrive with no referrer and look like Direct traffic.
Does GA4 show revenue from AI assistants?
GA4 has an AI Assistant channel that covers sources like ChatGPT, Gemini, DeepSeek, Copilot and Grok. It can only show revenue you also send to GA4 as purchase events. If your revenue lives in Stripe, you need to pass the source into Stripe yourself.
Should I use first-touch or last-touch attribution for AI traffic?
First-touch credits the assistant that introduced the visitor, which suits AI discovery because buyers often return later by typing your URL. Last-touch credits the final visit. Either works if you pick one and apply it consistently.
Can I recover AI visits that show up as Direct?
Not fully. When an app strips the referrer and the link has no UTM tag, there is nothing to read. An optional 'How did you hear about us?' question at signup catches some of it.
Sources
- Publishers and Developers - FAQ (OpenAI Help Center)
- Default channel group (Google Analytics Help)
- Custom channel groups (Google Analytics Help)
- AI Assistants Are Breaking Web Analytics and Hurting Their Future (Ahrefs)
- How does AI traffic show up in analytics? (SearchPilot)
- Track a payment link (Stripe Documentation)
- The Checkout Session object (Stripe API Reference)
- Google Analytics Adds AI Assistant As Default Channel Group (Search Engine Journal)