UTM tracking
UTM parameters are the standard way to tell your analytics tool — Google Analytics, Plausible, Fathom, anything that reads URL query strings — where a click came from. ReachBell appends them to every click URL when you configure them on a campaign.
The five UTM parameters
| Parameter | What it means | Typical value |
|---|---|---|
utm_source | The platform that sent the click. | reachbell |
utm_medium | The channel category. | push, email, sms, whatsapp |
utm_campaign | A name unique to the campaign. | spring-sale-2026 |
utm_content | The variant or creative. Optional. | hero-image-v2 |
utm_term | A keyword or segment. Optional. | premium-cohort |
Combined, they let you answer "of our 2,140 sale-page visits yesterday, how many came from our push, vs email, vs Google?"
Auto-append
When you set a utm object on a campaign, ReachBell appends those params to:
content.clickUrl— the URL opened when the user clicks the notification body.- Every
actions[*].url— URLs opened when the user clicks a notification action button. - Every link in a transactional or campaign email rendered through the ReachBell template engine.
Existing query strings are preserved. UTM params already present on a URL are not overwritten by ReachBell — your hand-crafted UTM wins, the campaign-level UTM is a default.
Where to set them
In the dashboard's campaign builder, Step 5: UTM Parameters has a form for the five fields. The standard pattern auto-fills:
utm_source→reachbellutm_medium→ the channel (push,email, etc., depending on what campaign type you picked)utm_campaign→ a slugified version of the campaign name
You can override any of them per campaign. There's also an org-wide default in Settings → Tracking — set utm_source=reachbell there once and every campaign inherits it.
Programmatically, set the utm block in the campaign body:
{
"utm": {
"source": "reachbell",
"medium": "push",
"campaign": "spring-sale-2026",
"content": "hero-image-v2"
}
}
Conventions
Pick a convention and stick to it. The most common one across ReachBell customers:
| Parameter | Convention |
|---|---|
utm_source | Always reachbell. Don't vary by channel — that's what utm_medium is for. |
utm_medium | The channel: push, email, whatsapp, sms. Lowercase. |
utm_campaign | Slug of your campaign name — spring-sale-2026, not Spring Sale 2026. Lowercase, hyphenated. |
utm_content | The A/B variant or creative identifier. Skip if you're not testing. |
utm_term | Segment or audience identifier. Mostly skip — too fine-grained for most reports. |
Mixing conventions ("Push" vs "push" vs "PUSH") fragments your reports. Lowercase everything.
Pick a UTM convention before your first big campaign, not on campaign number twelve. Renaming campaign names retroactively in GA is impossible.
Inspecting clicks
Google Analytics
In GA4: Acquisition → Traffic acquisition → group by Session source / medium. Your push clicks show up as reachbell / push. To dig into a specific campaign, add Session campaign as a secondary dimension.
In universal Analytics (still around in older properties): Acquisition → Campaigns → All Campaigns.
Plausible
The Top Sources panel on the dashboard shows reachbell once your first push lands. Click it to drill into mediums, then campaigns. Plausible reads the params natively — no extra setup.
Fathom
Same flow — the Top Referrers panel. Fathom requires you to enable the "Show UTM" toggle in site settings before the params surface.
Cross-page UTM preservation
A common mistake: you append ?utm_source=reachbell&utm_medium=push to a URL, the user lands on your homepage, then clicks an internal link — the UTM is gone from the second pageview.
Don't override the user's utm_* on cross-page client-side redirects. If your homepage's "Go to dashboard" button strips the query string, you'll see all your reachbell traffic as a direct / none second pageview, which makes your funnel reports useless.
The safe pattern:
- Server-side redirects: preserve the query string with
307 Temporary Redirectand the same URL minus the path. - Client-side navigation: read the UTM from
document.location.searchon page load, stash it insessionStorage, and let your analytics tool persist it across pageviews (every major tool does this if the params are present on first paint).
The UTM Performance report
The dashboard's Reports → UTM Performance page breaks down clicks by source, medium, and campaign, scoped to whichever date range you pick. It reads from the same click events your analytics tool sees — so the numbers line up exactly.
Useful filters:
- Channel breakdown: how does push compare to email for the same
utm_campaign? - Top campaigns: which
utm_campaignvalues drove the most attributed sessions last month? - CTR vs conversion: pair this report with your own analytics' conversion data to see which campaigns drive not just clicks but signups.
Best practices
Always set UTM on production sends. A campaign without UTM is a campaign you can't measure. The few seconds it takes to fill the form pays for itself the first time you have to explain a traffic spike.
Don't put PII in utm_term. UTM params end up in browser history, server logs, and third-party analytics. utm_term=user_42 is fine; utm_term=ada@example.com is a leak.
Use utm_content for A/B variants. If you A/B test a campaign with two variants, set utm_content to the variant ID on each. Your analytics tool then shows you exact conversion per variant — independent of ReachBell's own CTR numbers.
If a campaign's UTM Performance numbers diverge wildly from your analytics tool, the usual cause is a homepage that strips query strings. Re-test by visiting your own push link in an incognito window.
A worked example
Say your campaign's click URL is:
https://example.com/sale?ref=banner
And you configure the campaign's utm block as:
{
"source": "reachbell",
"medium": "push",
"campaign": "spring-sale-2026",
"content": "hero-v2"
}
The notification that lands on the user's device opens this final URL:
https://example.com/sale?ref=banner&utm_source=reachbell&utm_medium=push&utm_campaign=spring-sale-2026&utm_content=hero-v2
Note the original ref=banner is preserved. In Google Analytics, this click shows up under reachbell / push traffic with the campaign spring-sale-2026 and content hero-v2. If you ran the same campaign over email, you'd swap utm_medium=email and you'd see the two channels broken out cleanly in your acquisition report.
What's next?
- Pair UTM with an A/B test and read variant-level conversion in GA.
- Set the
utmblock programmatically via the Campaigns API. - Refine targeting with a saved segment so each
utm_campaigncorresponds to a real audience.