Campaigns
The Campaigns tab answers one question: how is this campaign doing, counting everything it touched — the clicks on your short links and the sessions on your site.
Find it under Analytics → Campaigns.
The Two Surfaces
This is the thing to understand before reading any number on the page.
A campaign leaves traces in two different places, and they are not the same trace:
| Surface | Where it comes from | What it counts |
|---|---|---|
| Clicks | Short links carrying UTM parameters | Someone clicked your LinkForty link |
| Sessions | The web pixel on your site | Someone browsed your site with those UTMs on the URL |
Older campaign reporting showed only the first. That misses an entire ordinary case: a campaign whose UTMs are appended to the landing page URL and never touch a short link at all. Those campaigns had zero rows — not low numbers, no presence whatsoever.
The Campaigns tab joins both, so a campaign appears if either surface saw it. A row with clicks and no sessions means the pixel never saw those visitors. A row with sessions and no clicks means the campaign ran entirely through direct links.
- "How many people did my link reach?" → Clicks
- "How many people actually landed on my site?" → Sessions
They are different populations, not two measurements of one. A click that never becomes a session is a drop-off worth investigating.
Grouping
Switch between Campaign, Source, and Medium with the toggle. This changes which UTM parameter the rows are grouped by — utm_campaign, utm_source, or utm_medium.
utm_term and utm_content are not grouping options here. They reach your destination URL but are not recorded on the click row.
Reading the Table
| Column | Meaning |
|---|---|
| Clicks | Short-link clicks carrying this UTM value, bots excluded |
| Installs | App installs attributed to those clicks |
| Sessions | Distinct site sessions the pixel recorded with this UTM value |
| Conversions | Site events matching your workspace's conversion goals |
| Conv. rate | See below — the denominator changes |
| Revenue | Combined in-app and site revenue, per currency |
The Installs column is hidden when no campaign in range has any. A web-only workspace would otherwise be reading a permanently empty column.
Conversion rate has two possible denominators. It uses conversions over sessions when the campaign has sessions, and installs over clicks when it does not. When there is nothing to divide by, it shows an em dash rather than 0% — "nothing to measure" is not the same as a measured zero.
Revenue is reported per currency, never summed across them. A campaign earning ¥40,000 and $300 shows both; adding them would be meaningless.
Click any row to filter the view to that value. Clicking again, or the clear control, returns to the full list.
Where Campaign Values Come From
A click row records a UTM from either of two places:
- The short URL itself —
https://go.example.com/sale?utm_campaign=spring - The link's own UTM settings — configured on the link or its template
Values on the URL win per key. A link configured with utm_source=newsletter whose URL carries ?utm_source=partner records partner, because the value a sharer put on the URL is more specific than the link's stored configuration.
Each key resolves independently, so a link that configures only utm_source still records a utm_campaign that arrives on the URL.
Empty and whitespace-only UTMs are treated as absent on both surfaces. They are excluded before the two surfaces are joined, so the table never shows a blank-labelled row.
What Is Excluded
Some traffic is deliberately absent, and its absence is not a bug:
- Bot clicks. Classified at ingestion and excluded from every campaign figure.
- SDK-created shared links. Links your app users generate through the SDK are not campaign traffic; see Shared Links for their own reporting.
- Untagged traffic. A link with no UTMs anywhere cannot be grouped and does not appear.
The table shows the top 100 values, ordered by combined revenue, then sessions, then clicks.
Time Range
The range selector applies to both surfaces at once. How far back you can look depends on your plan's analytics retention — see the plan comparison for the current windows.
Nothing Showing Up?
Campaigns appear once your links carry UTM parameters, or once the site pixel records visits with UTMs on the URL. If the table is empty:
- Confirm the links you are running actually carry UTMs — see UTM Parameters.
- If you expect sessions but see none, check that the web pixel is installed and that its allowed-domains setting includes the site.
- If you expect clicks but see none, check that the traffic is not being classified as bot traffic, and that the time range covers when the campaign ran.
- A
403on this tab means your role lacks the analytics permissions it requires. Both install and event analytics permissions are needed.
API
The same data is available at GET /api/analytics/campaigns, which accepts an API key as well as a session:
| Parameter | Values | Default |
|---|---|---|
days | 1–365 | 30 |
groupBy | campaign, source, medium | campaign |
value | filter to one UTM value | — |
projectId | scope to one project | — |
The response carries revenue, webRevenue, and totalRevenue for backwards compatibility, but they add amounts across currencies as though they shared a unit. Use revenueByCurrency, webRevenueByCurrency, and totalRevenueByCurrency instead.
Related
- UTM Parameters — tagging links so they appear here
- UTM Library — keeping values consistent across a team
- Web Analytics — the session surface in detail
- Dashboard — workspace-level overview