How to track links in newsletters and tie each one to revenue
Track links in newsletters in 6 steps: a tagged short link per placement, scanner clicks filtered out, and the visitor ID carried through to the Stripe payment.
Muzahid Maruf, FounderUpdated
On this page
Explore with AI
Opens this article inside the chosen assistant with a ready-made prompt.
To track links in newsletters, give every link its own tagged short link on a domain you own, count clicks on your own server, and carry the visitor ID through signup to the Stripe payment.
An email tool's report ends at the click: Mailchimp logs a click when a request passes through its servers, and it says bot activity such as Apple's Mail Privacy Protection can falsely inflate open and click metrics.
The 6 steps below end with each issue ranked by MRR per 100 clicks.
Key takeaways
- Put the issue in utm_campaign and the slot in utm_content, and set utm_medium to email so Google Analytics 4 files the visit under its Email channel.
- Mailchimp says bot activity such as Apple's Mail Privacy Protection can falsely inflate open and click metrics, so flag scanner clicks in your own log too.
- Safari deletes JavaScript-created cookies after 7 days without a visit, so the signup email or an ID on the Stripe payment does the lasting join.
- Stripe Checkout metadata does not copy itself between objects, so a subscription needs subscription_data.metadata to carry the ID.
- Rank issues by MRR per 100 clicks once trials end: in the invented example the link roundup has 39.0% of the clicks and 6.3% of the MRR.
What your email tool records, and where it stops
Mailchimp counts an open when a transparent image downloads and a click when the redirect around a link is requested. Apple announced Mail Privacy Protection with iOS 15 on June 7, 2021.
The announcement says it stops senders from using invisible pixels to collect information and helps users prevent senders from knowing when they open an email.
Opens say little about anyone on Apple Mail, and clicks include security scanners that arrive before the reader.
| System | What it records | Where it stops |
|---|---|---|
| Email tool | Opens (image downloaded) and clicks (redirect requested): 2,150 clicks | The click. A Stripe charge is outside its report |
| Google Analytics 4 | Sessions by source and medium, read from UTM tags: 1,512 sessions | Untagged visits with no referrer, which it files as Direct |
| Short link on your domain | Each click with time, country, device, referrer and link: 2,150 requests, 310 flagged as bots | Payment, until the click is joined to billing |
| Stripe | Charges, customers and subscriptions: 12 new subscriptions | The source, unless an ID rides on the payment |
One invented issue (the product update in Step 6), as each system sees it.
How to track links in newsletters, step by step
The examples follow one weekly issue sent every Tuesday, with a hero button, 2 body links and a PS line, all pointing at example.com/pricing, which sells a $79 monthly plan with a 14-day trial. Every number in them is invented.
Step 1: Tag every link before the send
Google's page on custom campaign URLs says to always use utm_source, utm_medium and utm_campaign, and warns that values are case-sensitive, so Newsletter and newsletter are separate values in Google Analytics 4 reports.
Set the medium to email, because the default channel group files a session under Email when the source or medium matches email, e-mail, e_mail or e mail.
Put the issue in utm_campaign and the slot in utm_content, and keep every value lowercase, as Google recommends. The free UTM builder writes the strings.
| Placement | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Hero button | newsletter | 2026-10-06-weekly | hero | |
| First body link | newsletter | 2026-10-06-weekly | body-1 | |
| Second body link | newsletter | 2026-10-06-weekly | body-2 | |
| PS line | newsletter | 2026-10-06-weekly | ps |
One issue, four placements, one destination.
Write the tags in one place
Mailchimp's Google Analytics integration can append 4 UTM tags (source, medium, campaign and term) to a campaign's links. TrackRev's redirect applies only the tags saved on the link and drops the query string of the short link itself, so appended tags are lost. Save the tags on the link and turn automatic tagging off.
Step 2: Put each placement behind its own short link
Create one short link per placement per issue on a domain you own, such as go.yourbrand.com, which TrackRev's custom tracking domains set up with 1 CNAME record. A shared shortener domain carries every other sender's reputation.
Both the email tool's redirect and your short link log the click, and only yours can carry a visitor ID onward.
Bulk import takes a CSV of up to 500 rows, so an issue's placements go in as one file. The Newsletter channel stamps utm_source=newsletter and utm_medium=email on the destination unless the destination already has its own tags.
Before the real send, click all 4 links from a phone and a laptop and read the final URL.
url,name,channel,utm_campaign,utm_term,utm_content,tags
https://example.com/pricing,Oct 6 hero button,newsletter,2026-10-06-weekly,,hero,newsletter
https://example.com/pricing,Oct 6 body link 1,newsletter,2026-10-06-weekly,,body-1,newsletter
https://example.com/pricing,Oct 6 body link 2,newsletter,2026-10-06-weekly,,body-2,newsletter
https://example.com/pricing,Oct 6 PS line,newsletter,2026-10-06-weekly,,ps,newsletterStep 3: Keep scanner and prefetch clicks out of the count
Mailchimp's page on bot activity defines it as non-human interaction with a campaign, usually from automated security services.
Its examples are anti-spam filters at email providers, Mail Privacy Protection and link preview generators, and it says these tools often click links or open emails before your contacts do.
Mailchimp has filtering on by default, and its filtered history starts on July 10, 2024 for Mail Privacy Protection opens and on August 10, 2025 for email clicks.
Your own click log needs the same filter. TrackRev's redirect flags a request as a bot when its user agent is on the isbot 5 list, is empty, or arrives with a prefetch header, and it still redirects the request.
The link's page and the attribution reports leave flagged clicks out, and the clicks API hides them unless you pass bots=include.
A scanner that presents a normal browser user agent passes that test, and its signature is timing. In this invented log an issue goes out at 09:00:00 with 4 links.
| Time (UTC) | Link | User agent | Counted |
|---|---|---|---|
| 09:00:01 | hero | Mozilla/5.0 (Windows NT 10.0) Chrome/130 | No |
| 09:00:01 | body-1 | Mozilla/5.0 (Windows NT 10.0) Chrome/130 | No |
| 09:00:02 | body-2 | Mozilla/5.0 (Windows NT 10.0) Chrome/130 | No |
| 09:00:02 | ps | Mozilla/5.0 (Windows NT 10.0) Chrome/130 | No |
| 09:07:44 | hero | Mozilla/5.0 (iPhone; CPU iPhone OS 17_5) Safari | Yes |
| 09:21:15 | body-1 | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15 | Yes |
| 10:02:38 | hero | Mozilla/5.0 (Windows NT 10.0) Firefox/131.0 | Yes |
| 11:15:09 | ps | Mozilla/5.0 (Linux; Android 14) Chrome/130 Mobile | Yes |
Counting every row reports 8 clicks for 4 readers.
The first 4 rows touch every link within 2 seconds of the send, which readers rarely manage, so a gateway or a prefetch most likely made them. Drop them before dividing anything by clicks.
The bot filtering guide covers more cases.
Step 4: Hand the visitor ID from the click to your site
At the redirect, TrackRev sets a vid cookie for a new visitor, valid for 1 year, and adds a _vid parameter to the destination URL.
The pixel, 1 script tag on your site, reads _vid on the first pageview and stores it in a first-party cookie.
Click capture needs no script on the page, and whether the pixel needs a consent prompt depends on your jurisdiction.
WebKit says Intelligent Tracking Prevention deletes all cookies created in JavaScript and other script-writable storage after 7 days of no user interaction with the site.
A subscriber who clicks on a Tuesday and pays 3 weeks later may have no ID left in Safari, so the signup email does the lasting work in Step 5.
Step 5: Tie the visitor to the Stripe payment
TrackRev's Stripe sync looks for the visitor in 3 places, in order: metadata.vid on the charge, client_reference_id on the Stripe Checkout Session, then the customer's email, which the pixel binds to the visitor when your signup code passes the same address to window.trk.identify.
It reads Stripe with a read-only restricted key every hour, with an optional webhook for updates within seconds, and renewals keep crediting the original click.
If you build checkout yourself, put the ID where Stripe keeps it. A Stripe Payment Link can carry client_reference_id as a URL parameter, up to 200 characters, and Stripe returns it in the checkout.session.completed event.
Payment Links also take the 5 UTM tags, up to 150 characters each, and hand them to the redirect URL when the link redirects after payment, which helps when an issue links straight to one.
Stripe metadata holds 50 key-value pairs, with keys up to 40 characters and values up to 500, and it copies to other objects only in a short list of cases.
| Checkout type | Where the ID goes | What Stripe copies for you |
|---|---|---|
| Payment Link | client_reference_id in the URL, up to 200 characters | Returns it in checkout.session.completed |
| Checkout Session in subscription mode | client_reference_id or metadata on the session | Nothing reaches the subscription, so add subscription_data.metadata |
| Your own PaymentIntent | metadata on the PaymentIntent, up to 50 pairs | One snapshot to the Charge when the PaymentIntent creates it |
Where the visitor ID goes, per Stripe's documentation.
curl https://api.stripe.com/v1/checkout/sessions \ -u "sk_test_...:" \ -d mode=subscription \ -d "line_items[0][price]=price_123" \ -d "line_items[0][quantity]=1" \ -d "client_reference_id=9f2c71aa" \ -d "subscription_data[metadata][vid]=9f2c71aa" \ --data-urlencode "success_url=https://example.com/welcome"The pixel adds the visitor ID to buy.stripe.com links, buy buttons and pricing tables as client_reference_id.
Two gaps remain: a signup email that differs from the payment email can slip past the join, and a phone click followed by a laptop purchase matches only when both use one address.
The Payment Links attribution post has the setup.
Step 6: Rank issues by revenue per 100 clicks
Divide MRR by counted clicks and multiply by 100 to compare issues of different sizes: the win-back earns $474 ÷ 430 clicks × 100 = $110.23. Wait until every trial from the issue has ended.
Stripe notes that bank debits and vouchers can take 2 to 14 days to confirm, so with a 14-day trial the earliest fair read is 28 days after the click.
| Issue | Counted clicks | Signups | Paid | MRR | MRR per 100 clicks |
|---|---|---|---|---|---|
| Win-back | 430 | 21 | 6 | $474 | $110.23 |
| Onboarding tips #3 | 690 | 38 | 9 | $711 | $103.04 |
| Product update | 1,840 | 61 | 12 | $948 | $51.52 |
| Monthly changelog | 1,120 | 25 | 3 | $237 | $21.16 |
| Link roundup | 2,610 | 44 | 2 | $158 | $6.05 |
Invented numbers for 5 issues on a $79 monthly plan, ranked by MRR per 100 clicks. The link roundup has the most clicks and the lowest return.
The roundup brings 39.0% of the 6,690 counted clicks and 6.3% of the $2,528 MRR. The win-back brings 6.4% of the clicks and 18.8% of the MRR.
With no cancellations, the product update's 12 customers are worth $11,376 over 12 months and the roundup's 2 customers $1,896.
Six paying customers from 430 clicks is a small sample, so test the lead with the next win-back before you rewrite the schedule.
Read the same table under first-touch too, since a reader who clicks a newsletter and pays after a search visit gives search the credit under last-touch.
The attribution models comparison covers when each model fits, and TrackRev's paid plans read last-touch, first-touch and linear.
What newsletter link tracking can't show you
A short link is the same for every recipient, so a click identifies the placement and gives no subscriber identity.
A forwarded issue carries the same link, and the friend who clicks it is a new visitor credited to the same issue.
Someone who reads Tuesday's issue and types your address on Thursday arrives as Direct in Google Analytics 4.
A "how did you hear about us" field on the signup form catches some of those visits, and the post on self-reported versus tracked attribution covers weighing the two sources.
Open rate stays out of every calculation above, since Apple Mail Privacy Protection keeps senders from seeing real opens.
What TrackRev does here, and when you don't need it
TrackRev is SaaS affiliate software with link tracking built in.
It logs each newsletter click on its own server, adds the link's saved UTM tags, and joins clicks to payments from Stripe, Paddle Billing, Polar, Lemon Squeezy, Creem and Dodo Payments.
The Free plan covers link tracking with 50 links and 1,000 tracked events a month, and it hides revenue figures.
Revenue per link starts on Indie at $29 a month for 1 workspace and 1 tracked domain, and Growth is $299 a year for up to 10 workspaces and 10 tracked domains (pricing). TrackRev does not send or segment email.
The Links and Analytics page lists what a link records.
If you only need to know whether a newsletter sends sessions, UTM tags and Google Analytics 4 are free and enough.
A newsletter that sells nothing has no charge to join: an editorial digest, or one paid for by sponsors, needs only clicks per placement, which any shortener with bot filtering supplies.
Found this useful? Share it.
Frequently asked questions
- Yes. Swap each raw URL in the issue for a tracked short link and keep sending from your current tool.
- Security gateways and some mail providers fetch every link in a message within seconds of delivery. To confirm it, send the issue to a seed inbox at a company that runs a gateway and read the click log before you open the email. Any click already logged came from a scanner.
- At least the trial length plus the longest confirmation time among the payment methods you accept. With a 14-day trial and bank debits that confirm in up to 14 days, that is 28 days after the click.
- No. Click capture at the redirect needs no script. Revenue attribution needs the pixel, which stores the visitor ID and binds it to an email address.
- Google Analytics 4 reports the sessions and conversions it is sent. Payments processed in Stripe reach it only if you send purchase events from your site or server, so by default a newsletter's report ends at the session.
- Click tracking does: the Free plan allows 50 links and 1,000 tracked events a month. Revenue figures stay hidden until you move to a paid plan, which starts at $29 a month.

Written by
Founder, TrackRev.io & Contant.io
Muzahid Maruf founded TrackRev.io, SaaS affiliate software with no limit on tracked revenue, and Contant.io. He writes about affiliate programs.
Writes about Marketing attribution · Link tracking · Revenue analytics · SaaS growth
Stop guessing where your revenue comes from.
Set up TrackRev in about five minutes. The free plan covers 1,000 events a month, no card needed.
Start free