Where your traffic really comes from
The Campaigns page in your dashboard sidebar answers one question: which campaigns, sources, and mediums are actually driving traffic — and how much of it sticks around. It breaks out your UTM-tagged link clicks and geo page views by campaign, source, medium, term, and content, and shows a separate view of every session on your site and where it came from.
It's a companion to the Analytics page: Analytics gives you the top-line country, device, and referrer picture; Campaigns is where you go for the full source/medium/campaign cross-tab with clicks and page views side by side.
Every row on the Campaigns page comes from one of three places:
A click on a GeoSwap short link counts once it carries at least one UTM parameter (utm_source, utm_medium, utm_campaign, utm_term, or utm_content). GeoSwap reads the UTMs off the final destination URL: the link's own custom URL parameters win over anything the visitor's incoming link already had, so what you tagged the link with is what shows up here.
Page loads where the GeoSwap script evaluated your geo rules (“Geo page views”) count too, as long as the page URL carried UTM parameters when the script ran. This needs the GeoSwap script installed on the page. Repeat page views in the same browser session skip evaluation, so this undercounts total page views. For every page view, see Page views on the Analytics page.
Every visit to a site running the GeoSwap script is its own row in the Site sessions view — tagged or not. A session's source is its own utm_source if it has one; otherwise it's the referring site (say, google.com or facebook.com, with www stripped); otherwise it's (direct) (no referrer, or the visitor just came from another page on your own site after being idle for 30+ minutes).
People and bots are both counted (and both billed against your plan usage) — a Traffic filter lets you split them apart or look at just one.
UTM values are trimmed, lowercased, and capped at 200 characters before they're stored for reporting. That means utm_source=Facebook and utm_source=facebook land in the same row — you'll never see your traffic split across two near-identical values just because of how a link was typed. The five UTM parameter names themselves are also matched case-insensitively (UTM_Source is read the same as utm_source). This normalization only affects reporting: the actual URLs GeoSwap forwards, and the raw parameters it stores per event, keep their original case.
The controls at the top of the page decide what you're looking at. Every choice lives in the URL, so a filtered view is shareable with a teammate or bookmarkable.
“Links + pages” (the default) combines tagged link clicks and geo page views. “Link clicks” and “Geo page views” isolate one or the other. “Site sessions” is its own view — it's not summed into the other three, since a session already contains the page views inside it.
Pick which UTM dimension becomes the table's rows: Campaign, Source, Medium, Term, or Content. On the Site sessions view, rows default to Source (most sessions carry no utm_campaign).
A second dimension — any of the five UTM fields, plus Country or Device — becomes the table's heat-shaded columns, so you can cross campaign × country, source × device, and so on.
“People + bots” (default), “People only”, or “Bots only”. Bots are counted and billed either way; this only changes what the report shows you.
A chip for each of Campaign, Source, Medium, Term, Content, Country, and Device opens a searchable multi-select of that dimension's actual values in your current range (loaded on demand, so opening a filter doesn't slow down the page). Click any value in a row, column header, or chip cell to add it as a filter directly.
7d / 30d / 90d presets or a custom range, in UTC days, limited to your plan's analytics history.
The main table is a cross-tab: your chosen row dimension down the left, your chosen breakdown dimension across the top (its top 6 values, plus an “Other” column for the rest), and up to 50 row values ranked by total traffic. Any UTM dimension you're not using for rows or columns still shows up as a chip column, with its top 3 values per row and a count of how many more there are.
Each cell shows the metrics for whatever you're counting, stacked. Link clicks and geo page views are never added together into one number — you always see both.
On the Site sessions view only: the share of sessions in that row that GeoSwap's page tracking saw stay and interact, rather than bounce. Comes from the same page tracking that powers Analytics' engagement metrics, and is part of the Campaigns report itself (available wherever Campaigns is, so Pro and Business).
Also Site sessions only: average time spent on the site per session. This one column needs the Business plan — Free and Pro see a locked header and a dash instead of a number.
A separate tile (not part of the table) shows how many additional link clicks or geo page views had no UTM tags at all, for context. It's hidden while any filter chip is active, since “untagged” only means something over the whole picture. There's no untagged concept for site sessions — every session has a source.
Two ranked side tables, independent of your Rows/Breakdown choice, showing the same link clicks / geo page views / site sessions split by country and by device. Click a value to filter the whole page to it.
Click Export CSV to download every distinct campaign / source / medium / term / content combination in your current date range, kind, traffic, and filter selection — up to 10,000 rows, ranked by total traffic, regardless of what you've chosen for Rows and Breakdown on screen. Available to admin and owner roles.
Each row has link clicks, geo page views, and site sessions (plus their bot-only counts), engaged sessions and engaged rate, and average time on site. Average time is left blank unless your plan includes engagement metrics (Business).
The Campaigns report itself is a Pro and Business feature. On Free, the page shows a locked preview — a rounded estimate of how many campaigns and how much traffic you had (no CSV export, no filters, no table) — with a button to upgrade.
Campaign numbers are kept as daily totals, so on Pro and Business the report goes back as far as your plan's analytics history (90 days on Pro, 365 on Business), the same as every other report.
Want to see which campaigns are working?
Upgrade to Pro to unlock the full Campaigns report, or Business for engaged sessions' average time on site too. See pricing →
Since GeoSwap groups UTM values case-insensitively, you don't have to worry about a stray capital letter splitting your data. But a little consistency up front still makes the Campaigns page much easier to read:
Lowercase, underscore-separated values read best: spring_sale, not Spring Sale or spring-sale one week and springsale the next. They'll all group correctly, but a consistent style means your Rows table doesn't turn into a wall of near-duplicates you have to mentally merge.
Source is the platform (newsletter, google, twitter, facebook). Medium is the channel (email, cpc, social, referral). Campaign is the specific push (spring_sale, product_launch). utm_term and utm_content are optional — use them for paid search keywords and for telling apart two links or ads that point to the same place.
On any Geo Link (and on Geo Redirects and Geo Routes too), check “Add custom URL parameters” in the link's options and use the URL Parameters builder to set utm_source, utm_medium, utm_campaign, utm_term, and utm_content. These are appended to the destination URL on every click and are exactly what the Campaigns page reads — no need to hand-build a query string.
If a link also has “Pass query string” turned on, any custom URL parameter you've set (including your UTMs) replaces the same key coming from the visitor's own URL rather than adding a duplicate. GeoSwap shows a warning under the option when this applies, listing exactly which keys will be overridden.
Tag your newsletter links with utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale and your paid social links with utm_source=facebook&utm_medium=cpc&utm_campaign=spring_sale. Set Rows to Source and Broken down by to Medium: you'll see newsletter and facebook as two rows, each with their link clicks and geo page views, so you can compare which channel is actually driving traffic for the same campaign.
Switch to Site sessions, set Rows to Campaign and Broken down by to Country, then click your campaign's row to add it as a filter. The cross-tab now shows that one campaign's sessions per country, and the Countries table below it ranks them — on Pro and Business you can also read each cell's engaged rate directly in the table.
With no filters active, the “Untagged (no UTMs)” tile tells you how many link clicks or geo page views in your range had no campaign tags at all. If that number is large relative to your tagged totals, it's a sign some of your marketing links or shared pages still need UTMs added.
GeoSwap and GA measure different things by design. GeoSwap's link clicks and geo page views come from GeoSwap's own short links and script, not GA's page-load tracking; site sessions end after 30 minutes idle (GA's default session timeout is also 30 minutes, but the two systems compute it independently with different visitor identification). Different bot handling, ad blockers (they can block GA's script; GeoSwap short-link clicks are counted at the redirect, so blockers don't affect them, though some blockers can also block the GeoSwap script on your site), and different UTM normalization (GeoSwap lowercases; GA typically doesn't) all add up to numbers that are directionally similar but rarely identical.
Yes, by default. “People + bots” is the default Traffic setting, and bot traffic is counted and billed the same as human traffic. Switch Traffic to “People only” to see human numbers, or “Bots only” to see just crawlers and automated clients.
It's the bucket for that dimension being blank on an otherwise-tagged visit — for example, a click with utm_source and utm_campaign set but no utm_medium shows up as (none) under Medium.
It's a session with no UTM tags and no outside referrer: either the visitor typed your URL directly, opened it from a bookmark or an app, or their session restarted after being idle for 30+ minutes on a page within your own site.
Check that the link or page actually carried the UTM parameter when it was clicked or loaded — a typo in the parameter name (utm_campaing instead of utm_campaign) won't be picked up. Also check your date range and filters: a campaign that ran outside the selected range, or that's excluded by an active filter chip, won't appear. For a Geo Link, remember the link's own custom URL parameters win over anything in the incoming URL, so double-check what's actually set on the link itself.
Not yet from the Campaigns page's own controls — today it filters by UTM values, country, device, and traffic type. For a single link's UTM performance, open that link's own analytics from the Geo Links list.
Set up a custom domain for your geo links.