# Tracking parameters

Which URL parameters ProductLense reads (UTM tags, ad click ids), how they set channel and source, and how to tag links so revenue lands on the right campaign.

ProductLense reads attribution from the landing URL and the referrer. Tag the links you control with UTM parameters and every visitor, signup and payment that follows is credited to that source and campaign.

## Parameters ProductLense reads

| Parameter | Stored as | Notes |
|---|---|---|
| `utm_source` | Source | Lower-cased. Where the visitor came from: `newsletter`, `producthunt`, `google`. |
| `utm_medium` | Medium | Lower-cased. Decides the channel for `cpc`, `ppc`, `paid`, `paidsocial`, `display` (paid) and `email` (email). |
| `utm_campaign` | Campaign | Case kept. The value you add ad spend against for [profit per channel](/docs/profit/profit-per-channel). |
| `utm_term` | Term | Case kept. Usually the paid keyword. |
| `utm_content` | Content | Case kept. Tells two links in the same campaign apart. |
| `ref`, `via`, `source` | Source | Used only when there is no `utm_source`; if several are present, `ref` wins, then `via`, then `source`. Lower-cased, trimmed and capped at 64 characters; a full URL is reduced to its domain (`?ref=https://www.indiehackers.com/post/x` becomes `indiehackers.com`). Launch sites and link-sharing tools add these for you. |
| `gclid`, `fbclid`, `msclkid` | Paid channel | Only their presence is used: the visit is classified `paid`. The value itself is not stored. |

Everything else in the query string, such as `?token=` or `?email=`, is removed by the script before the event leaves the browser, so private values never reach ProductLense. The fragment (`#...`) is removed too.

> [!NOTE]
> `?ref=producthunt`, `?via=newsletter` and `?source=twitter` credit their source exactly like `utm_source` would. Add `utm_medium` and `utm_campaign` when you also want the medium and campaign recorded.

## How the channel is picked

Every visit gets one channel. The first rule that matches wins: a click id or a paid `utm_medium` makes it `paid`, `utm_medium=email` makes it `email`, then the referrer decides between `ai_assistant`, `social`, `organic_search` and `referral`. When there is no referrer, the source decides by the same lists, so `?ref=producthunt` or `?utm_source=chatgpt.com` still lands in `social` or `ai_assistant`. A visit with no referrer and no source or UTM tags is `direct`. The full table, with every referrer domain, is in [How ProductLense counts](/docs/get-started/how-productlense-counts#channels).

## Tag a link

```text
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=october-launch
```

- Keep values lower case and use hyphens: `october-launch`, not `October Launch`. Source and medium are lower-cased for you; campaign is not, so `Launch` and `launch` would be two campaigns.
- Use the same campaign name in your ad platform and in ProductLense's [ad spend](/docs/profit/ad-spend), so spend and revenue meet on one row.
- Do not tag links between your own pages. The tag would be recorded on those pageviews and muddy your source and campaign reports.

## First touch keeps the tag

The tags on a visitor's first pageview are kept for the life of the site as that visitor's first touch, and every later payment from that person is credited to them. A visitor who first arrives from your newsletter and pays a week later after a Google search counts as `newsletter` revenue, as long as the two visits are linked through [identify](/docs/track/identify-users). See [How payments are attributed](/docs/revenue/attribution).

## Where to see them

The dashboard breaks traffic, revenue and profit down by channel, referrer, source, medium and campaign. Click any row to filter the whole dashboard to it; see [Date ranges, comparisons and filters](/docs/dashboard/date-ranges-and-filters).
