# TrackRev — Complete Content Library
> TrackRev is three standalone products on one shared data model: Affiliate Program, Links & Analytics and Revenue Attribution.
> Built by Muzahid Maruf, Founder of TrackRev.io & Contant.io.
> This file contains the full text of all 107 TrackRev blog articles
> for AI indexing. Canonical site: https://www.trackrev.io
---
## What to Include in an Affiliate Agreement (Template Outline)
URL: https://www.trackrev.io/blog/affiliate-agreement-what-to-include
Published: 2026-10-03
Author: Muzahid Maruf
An affiliate agreement should fix commission, cookie window, hold and payout terms, banned methods, FTC disclosure, termination, IP and data. Template outline.
An affiliate agreement is the contract between a company and a partner who promotes it for a commission. It should settle 8 things in writing: how commission is calculated, the cookie window that decides which click earns credit, when and how you pay, which promotion methods are banned, how the partner discloses the relationship, who owns the brand assets, how either side ends the deal, and how personal data is handled.
> **Key takeaways:**
>
> - Write commission on the net amount collected, excluding sales tax, refunds and chargebacks: 20% of a $49 plan is $9.80 a month, or $117.60 over 12 months.
> - A 30-day hold covers refunds, but card networks typically allow disputes for 120 days, so reverse commission after payout too.
> - Google Ads does not restrict trademarks as keywords when it reviews a complaint, and 16 CFR 255.1(d) makes advertisers answer for missing disclosures, so brand bidding and disclosure belong in the contract.
> - Decide before launch whether recurring commission survives a partner leaving in good standing, and who controls which personal data under GDPR Articles 26 and 28.
> **Not legal advice:** Contract, tax and advertising rules differ by country and US state. Have a lawyer in your jurisdiction review the final text before partners accept it, and an accountant check the tax parts.
### Affiliate agreement vs. affiliate program terms and conditions
Programs call the same document an affiliate agreement, affiliate program terms and conditions, partner terms or program rules. In a self-serve SaaS program the usual setup is one master text that every partner accepts with a checkbox at signup, plus a short addendum for a partner who negotiates a higher rate. Amazon's [Associates Program Operating Agreement](https://affiliate-program.amazon.com/help/operating/agreement), updated October 15, 2025, shows the model at scale: every associate accepts it without change, and it pulls in the program policies by reference.
### The clauses an affiliate agreement needs
Commission and cookie figures are medians from [TrackRev's benchmark tables](https://www.trackrev.io/data/affiliate-program-benchmarks), compiled from public Impact, PartnerStack and Awin research. The other settings are my own starting points.
| Clause | Starting setting |
| --- | --- |
| Relationship | Non-exclusive, no control over methods |
| Commission | 20% of net payments for 12 months |
| Cookie window | 60 days, last click wins |
| Payment and hold | Monthly, $50 minimum, 30-day hold |
| Clawback | Deduct from the next payout, repay within 30 days |
| Tax forms | Form W-9 or Form W-8BEN before the first payment |
| Banned methods | Brand bidding, spam, fake reviews |
| FTC disclosure | Next to every link, per 16 CFR 255.5 |
| Brand and IP | Revocable license, 7 days to remove |
| Data protection | Roles named under GDPR Articles 26 and 28 |
| Termination | 14 days' notice, immediate for breach |
| Changes | 30 days' written notice, later sales only |
| Liability | Capped at 12 months of commission |
*Starting settings for a self-serve SaaS program.*
#### Relationship and exclusivity
Say the partner is an independent contractor with no authority to make offers for you, as Section 12 of Amazon's agreement does, and free to promote competitors. The [Internal Revenue Service](https://www.irs.gov/businesses/small-businesses-self-employed/independent-contractor-self-employed-or-employee) weighs behavioral control, financial control and the type of relationship, and a written contract is one factor, so leave out terms that direct how a partner works.
#### Commission: rate, base and duration
Apply the rate to the net amount collected, excluding sales tax, VAT, refunds and chargebacks. The benchmark medians are 20% for 12 months in B2B SaaS, 15% for 6 months in B2C SaaS, 30% in information products and 8% in eCommerce ([commission benchmarks by category](https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026)). A trial earns nothing until the first paid charge, a plan change moves commission with the price, and only new customers count.
| Plan price | Customer pays with 8% tax | Commission base | Monthly commission at 20% | Over 12 months |
| --- | --- | --- | --- | --- |
| $19 | $20.52 | $19 | $3.80 | $45.60 |
| $29 | $31.32 | $29 | $5.80 | $69.60 |
| $49 | $52.92 | $49 | $9.80 | $117.60 |
| $99 | $106.92 | $99 | $19.80 | $237.60 |
| $199 | $214.92 | $199 | $39.80 | $477.60 |
| $499 | $538.92 | $499 | $99.80 | $1,197.60 |
*Commission is 20% of the plan price, never of the tax-inclusive total.*
#### Cookie window and attribution
Name the number of days, the tiebreak when two partners touch one customer (last click wins), and the record that decides disputes: your tracking data.
| Cookie window | Share of programs | Typical program |
| --- | --- | --- |
| 30 days or shorter | 28% | eCommerce, low-ticket B2C SaaS |
| 60 days | 41% | The SaaS standard |
| 90 days | 24% | B2B SaaS with trials, information products |
| 180 days or longer | 7% | High-ticket programs, lifetime cookies |
*Median window: 60 days. TrackRev benchmark tables, Q2 2026.*
Treat the window as a ceiling. WebKit's [Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) deletes script-set cookies after 7 days without user interaction with the site and caps those on decorated-link landing pages at 24 hours, so a 90-day promise can shrink to 7 days in Safari (the [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers what survives). Give [coupon codes](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) their own sentence on whether a code credits its owner without a click.
#### Payment terms, holds and clawbacks
Four numbers go in this clause: payout frequency, minimum payout, hold and method. Match the hold to your refund window and say where it starts. Counted from the close of a monthly period, a 30-day hold makes a January charge wait 30 to 58 days.
| Charge date | Period closes | Payable from | Days waited | Dispute days left |
| --- | --- | --- | --- | --- |
| Jan 3 | Jan 31 | Mar 2 | 58 | 62 |
| Jan 10 | Jan 31 | Mar 2 | 51 | 69 |
| Jan 17 | Jan 31 | Mar 2 | 44 | 76 |
| Jan 24 | Jan 31 | Mar 2 | 37 | 83 |
| Jan 31 | Jan 31 | Mar 2 | 30 | 90 |
*Monthly payout period, 30-day hold counted from the close of the period, non-leap year. The last column assumes payout on the payable date and a 120-day card dispute window.*
A hold covers refunds, but chargebacks arrive later. [Stripe's dispute documentation](https://docs.stripe.com/disputes/how-disputes-work) says cards typically allow disputes for 120 days after payment (local payment methods such as Klarna and PayPal, up to 180). You usually get 7 to 21 days to answer the issuer, the issuer takes 60 to 75 days to decide, and the whole process can run 2 to 3 months. So reverse commission on a refunded or disputed charge even after payout and take it from the next payment ([refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers the mechanics). Banks can bundle disputes: Stripe's example is three $50 charges disputed as one $150 dispute.
| Disputed $49 renewals | Amount disputed | Commission reversed at 20% |
| --- | --- | --- |
| 1 | $49 | $9.80 |
| 2 | $98 | $19.60 |
| 3 | $147 | $29.40 |
| 4 | $196 | $39.20 |
| 5 | $245 | $49.00 |
| 6 | $294 | $58.80 |
*Commission to take back after a bundled dispute.*
#### Tax forms and payee responsibility
Make payment conditional on a valid tax form and correct payout details, and state that the partner is responsible for their own taxes ([how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) compares payout methods).
| Document | What the IRS says it does |
| --- | --- |
| [Form W-9](https://www.irs.gov/forms-pubs/about-form-w-9), from a US payee | Gives you the taxpayer identification number for an information return |
| [Form W-8BEN](https://www.irs.gov/forms-pubs/about-form-w-8-ben), from a foreign individual | Goes to the payer when an amount is subject to withholding |
| [Form 1099-NEC](https://www.irs.gov/instructions/i1099mec), box 1a, filed by January 31 | Reports nonemployee compensation of $2,000 or more, commissions for services included |
*The $2,000 threshold applies to tax years beginning after 2025. Whether a partner's commissions are reportable, and whether withholding applies to a foreign partner, is a question for your accountant.*
#### Banned promotion methods
Google Ads' [trademark policy](https://support.google.com/adspolicy/answer/6118) says that when it reviews a trademark owner's complaint it will not restrict trademarks used as keywords, though it does restrict ads that use a trademark in a confusing or misleading way. So the contract has to stop bidding on your name. Someone who typed your name was already looking for you, and a partner who bids on it collects commission on a sale you were getting anyway.
- Bidding on your name, product names, misspellings, or your name plus login, pricing or coupon; ads, pages, domains or social handles made to look like yours.
- Unsolicited email. The Federal Trade Commission's [CAN-SPAM guide](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business) says both the promoted company and the sender may be held responsible, with penalties up to $53,088 per violating email.
- Fake or purchased reviews, and bought followers or views. [16 CFR Part 465](https://www.ftc.gov/news-events/news/press-releases/2024/08/federal-trade-commission-announces-final-rule-banning-fake-reviews-testimonials), announced August 14, 2024, lets the FTC seek civil penalties against knowing violators.
- Cookie stuffing, forced clicks, incentivized clicks, and buying through your own link.
- Unpublished claims about results, prices or discounts, and recruiting sub-affiliates without written approval.
Amazon goes further in Section 2: after a violation it may stop all commission income otherwise payable, related or not. I would forfeit only the sales a breach touched and end the agreement at once for a serious or repeated one ([self-referral fraud](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) and [attribution fraud](https://www.trackrev.io/blog/affiliate-attribution-fraud-prevention) cover detection).
#### FTC disclosure
The Federal Trade Commission's Endorsement Guides, 16 CFR Part 255, revised in 2023, drive this clause. [Section 255.5](https://www.law.cornell.edu/cfr/text/16/255.5) requires a clear and conspicuous disclosure of a connection that could affect the endorsement's weight and that the audience would not expect, and lists monetary payment as one. The FTC's [Endorsement Guides Q&A](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) suggests the wording "I get commissions for purchases made through links in this post", wants it near the recommendation, and for video wants it in the video and in the description.
| Label beside the link | FTC view |
| --- | --- |
| Paid link | Adequate when right next to the link |
| Affiliate link | Consumers may not understand it |
| Commissionable link | Probably not clear |
| Buy now button | Not adequate |
*From the FTC's Endorsement Guides: What People Are Asking.*
Amazon fixes the associate's disclosure sentence in its Section 5 and treats any violation as a material breach, which makes audits easy. [Section 255.1(d)](https://www.law.cornell.edu/cfr/text/16/255.1) tells advertisers to guide endorsers, monitor their compliance and act on non-compliance, and the FTC says monitoring should run a few months past the end of a contract. So the clause needs the wording and placement, a right to demand edits or takedowns within 7 days, and a monitoring routine you run (the [FTC and GDPR compliance post](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers audits). Other countries have their own rules, so require compliance with the law where the audience lives and keep the FTC wording as your minimum.
#### Brand license, confidentiality and customer ownership
Grant a limited, non-exclusive, revocable license to your name and approved assets, ban altered logos and wording that implies you endorse the partner, set a 7-day takedown, and let partners keep their own content. Customers belong to you: Section 3 of Amazon's agreement says so outright, and the confidentiality clause in its Section 12 runs for the term plus 5 years.
#### Data protection
Usually you control the click and purchase data on your own domain, and the partner controls what they collect from their own audience. [Article 28](https://gdpr-info.eu/art-28-gdpr/) of the General Data Protection Regulation requires a contract when a processor handles personal data for a controller, and [Article 26](https://gdpr-info.eu/art-26-gdpr/) requires joint controllers to settle their responsibilities in an arrangement. [Article 83(4)](https://gdpr-info.eu/art-83-gdpr/) puts both in the tier of fines up to 10 million euros or 2% of worldwide annual turnover, whichever is higher. A partner who only sends visitors processes nothing for you, so the clause can stay short: no personal data in link parameters, no partner tracking code on your pages, no sharing of customer data ([first-party tracking](https://www.trackrev.io/blog/affiliate-tracking-without-third-party-cookies) keeps it on your side).
#### Termination and unpaid commission
Amazon's Section 6 lets either side leave on 7 calendar days' notice, ends the agreement at once for fraud or a breach not cured within 7 days, may hold accrued commission afterward to account for cancellations or returns, and lists Sections 3, 4, 5, 6, 7, 8, 10 and 11 as surviving termination. A self-serve SaaS program can afford 14 days, long enough to swap links out of live content.
| How it ends | Notice | Unpaid commission | Recurring commission | Links and assets down |
| --- | --- | --- | --- | --- |
| Either side, good standing | 14 days | Paid after the hold, less reversals | Runs to month 12 | Within 7 days |
| Breach of a banned method | Immediate | Forfeited on affected sales | Stops | Within 7 days |
| Fraud | Immediate | All unpaid commission forfeited | Stops | Within 7 days |
*Starting settings. Whether recurring commission survives the end is your call.*
I would let recurring commission run out its 12-month term for a partner who leaves in good standing, since those customers were won under the terms they signed up to. Clawbacks, confidentiality, the brand clause and takedowns should survive termination, because the FTC expects monitoring to outlast the contract.
#### Changes, liability and governing law
Amazon's Section 13 makes most changes effective no less than 2 business days after notice, and Section 8 caps its own liability at commission paid or payable in the previous 12 months. I would copy the cap, give partners 30 days for changes, and apply changes only to later sales. Add an indemnity for claims from the partner's content and name one governing law and forum: Schedule 2 of Amazon's agreement picks binding arbitration under the Federal Arbitration Act and Washington law.
### Affiliate agreement template outline
Sample values in brackets match the settings above. Change them to fit your refund policy and margins.
Template outline, with sample values in brackets
```
AFFILIATE AGREEMENT
Between [Company] ("we") and [Partner] ("you")
Version [1.0], dated [date]. It applies from the day you accept it.
1. Your role
You are an independent partner, not our employee, agent or franchisee.
You choose when, where and how you promote us. You may promote other
products. Neither of us can bind the other.
2. Commission
We pay [20]% of the net amount each customer you refer pays us, for [12]
months from their first paid charge. "Net" excludes sales tax, VAT,
refunds and chargebacks. Only new customers earn commission. A trial
earns nothing until the first paid charge. If a customer changes plan,
commission follows the new price from the next charge.
3. Which customers are yours
A customer counts as yours if they click your link and sign up within
[60] days, and yours was the last partner link they clicked. Our tracking
records decide. Buying through your own link, or through the link of a
business you own, earns nothing.
4. Payment
Commission becomes payable [30] days after the payout period it was
earned in closes. We pay [monthly] once you are owed at least $[50], by
[PayPal or Wise], in [USD]. Before the first payment you must give us a
valid tax form ([W-9 or W-8BEN]) and correct payout details. You are
responsible for your own taxes.
5. Refunds and chargebacks
If a customer's charge is refunded or disputed, we reverse the commission
on it. If we already paid that commission, we deduct it from your next
payout. If there is no next payout, you will repay it within [30] days of
our request.
6. What you must not do
No bidding on our name, product names, their misspellings, or our name
plus words such as "login" or "pricing". No ads or pages that look like
they come from us. No domains or social handles containing our name. No
unsolicited email. No fake or purchased reviews, and no incentivized clicks. No
claims about results, prices or discounts we have not published. No
recruiting other partners without our written approval. Commission on any
sale caught up in a breach is forfeited.
7. Disclosure
Wherever you promote us, say plainly and next to each link that you earn
a commission, for example: "I earn a commission if you buy through this
link." In a video, say it aloud and repeat it in the description. Follow
the advertising and consumer laws where your audience lives. If we ask
you to fix or remove content, you will do it within [7] days.
8. Our brand
We give you a limited, non-exclusive, revocable license to use our name
and the assets at [URL] to promote us. Do not alter our logo or suggest
that we endorse you. You keep ownership of your own content.
9. Customers, confidentiality and data
Customers belong to us, and you have no right to their data or future
purchases. Keep non-public information we share with you, such as
pre-release features and private pricing, confidential. Each of us
handles personal data under the law that applies to it. Do not put
personal data in link parameters, and do not add your own tracking code
to our pages.
10. Ending the agreement
Either of us may end this on [14] days' written notice, or at once if the
other breaches it. When it ends you remove our links and brand assets
within [7] days. We pay commission already earned, after the hold and
less reversals. [We keep paying on customers you referred until their
[12] months end, unless we ended the agreement for breach.] Sections 5, 7,
8 and 9 continue after it ends.
11. Changes
We may change this agreement by emailing you [30] days before the change
applies. Changes apply to sales after that date. If you disagree, end the
agreement before then.
12. Liability and disputes
[Liability cap.] [Governing law.] [Where disputes are heard.]
13. Acceptance
You accept this agreement by [ticking the box / signing]. We record the
date and the version you accepted.
```
### What TrackRev enforces and what stays in the contract
In TrackRev's [Affiliate Program](https://www.trackrev.io/solutions/affiliate-program), each program sets its own commission rate and recurring rule, cookie window (default 60 days, 1 to 3,650 allowed), hold (0 to 180 days after a payout period closes, default 0) and payout schedule (weekly, every 2 weeks, monthly, quarterly or manual). A refunded or disputed charge reverses its commission, partners upload a W-9 or W-8 form in the partner portal, and you pay from one PayPal or Wise CSV export, then mark each payout paid.
Because the hold defaults to 0, a 30-day hold in your agreement needs a matching setting on the program. TrackRev does not draft agreements, collect signatures or store contract text, so host the agreement on your own site and keep the acceptance log in a signing tool or form.
Affiliate programs run on the paid plans from Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)); the free plan covers link tracking only, with 50 links and 1,000 tracked events a month. [How to create an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) covers the steps around the agreement.
### Frequently asked questions
**Does an affiliate have to sign the agreement, or is a checkbox enough?**
Many self-serve programs use a checkbox that links to the full text and save signatures for negotiated deals. Log which version each partner accepted, and put the link beside the checkbox, because a footer link is easy to miss.
**Can I change the commission rate or cookie window after partners join?**
Only as far as the agreement allows. With 30 days' written notice, a changes clause lets you move from 25% to 20% on later sales without touching commission already earned.
**Should an affiliate agreement make partners exclusive?**
Rarely. Partners expect a higher rate or a fixed fee for exclusivity, so a non-exclusive clause is cheaper.
**Do I need a data processing agreement with affiliates?**
Only when a partner processes personal data on your instructions, such as collecting leads straight into your CRM, which Article 28 covers. A partner who only sends visitors to your link processes nothing for you.
**Do referral programs for customers need the same agreement?**
A shorter version works: the reward, eligibility, payment timing and what ends it. The disclosure duty still applies, because section 255.5 counts payment, free or discounted products and the chance of winning a prize as material connections.
**Should partners be allowed to recruit sub-affiliates?**
Default to no. You answer for each sub-affiliate's missing disclosures and banned tactics under 16 CFR 255.1(d), without having vetted them. A deliberate multi-tier program should pass every rule down.
---
## What is affiliate fraud, and how do you catch it?
URL: https://www.trackrev.io/blog/affiliate-attribution-fraud-prevention
Published: 2026-05-22
Author: Muzahid Maruf
Affiliate fraud is commission paid for a sale the partner did not earn. See 7 patterns, what it costs on a $10,000 bill and the signals that expose it.
Affiliate fraud is a partner collecting commission for a sale they did not earn: their own purchase, or a visitor whose browser carried the partner's cookie without a click. You catch it by comparing each partner with their buyers, timing the gap between click and sale, and holding commission until refunds and disputes arrive, which can take 120 days.
The best-documented case is eBay's. From May 2006 to June 2007, eBay paid one affiliate company about $5.2 million in commissions, and the parties stipulated that $200,000 to $400,000 of it came from cookie stuffing, which is 3.8% to 7.7%. The company's co-owner was sentenced to 15 months in prison ([U.S. Attorney's Office, Northern District of California](https://www.justice.gov/usao-ndca/pr/laguna-niguel-man-receives-fifteen-month-prison-term-defrauding-ebay)).
> **Key takeaways:**
>
> - In the 2006 to 2007 eBay case, $200,000 to $400,000 of $5.2 million in commissions was fraudulent, or 3.8% to 7.7%. I found no audited loss rate for SaaS programs, so measure yours.
> - Compare each partner with their buyers, time the gap between click and purchase, and count clicks per IP. Trackdesk defaults to 30 seconds and 4 clicks in 24 hours.
> - Hold commission past your refund window. Card disputes can arrive 120 days after a payment, and each costs $15.00 on Stripe.
> - TrackRev filters bot clicks, blocks self-referral on referral campaigns, reverses refunded commission and offers a 0 to 180 day hold. It does not alert on click-to-purchase timing.
### Who the affiliate fraudsters are, and why it pays
Rewardful's help center, in an article dated February 17, 2022, sorts self-referrals into legitimate agency resales, accidental use of one's own link and fraud by someone who joins only to discount their own plan ([Dealing with self-referrals](https://help.rewardful.com/en/articles/5989704-dealing-with-self-referrals)). On a $100 a month plan with a 30% commission, a partner who refers themselves earns $30 a renewal, so 12 renewals return $360 of the $1,200 they pay. See the [self-referral guide](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud).
Deliberate fraud comes from operators who build cookie-setting code, extensions, scripts and batches of accounts. Peter Snyder and Chris Kanich, who studied 2014 web logs, note that each extra redirected visitor costs such an operator almost nothing.
### Common patterns of affiliate program fraud and the signal behind each
| Pattern | What happens | Signal and reference point |
| --- | --- | --- |
| Self-referral | Partner buys on their own link: a 30% commission turns a $100 plan into a $70 one | A matching email, IP address or device. [FirstPromoter](https://help.firstpromoter.com/en/articles/13772161-fraud-protection-settings-in-firstpromoter) flags a matching email or IP, and [PartnerStack](https://docs.partnerstack.com/docs/fraud-monitoring) compares device fingerprints |
| Cookie stuffing | A page sets the partner's cookie with no click, as 2 free apps did for eBay in 2006 | A sale under 30 seconds after the click, which [Trackdesk](https://help.trackdesk.com/en/articles/8347946-fraud-prevention) flags by default, or a click from a page the partner does not own |
| Checkout hijacking | An extension swaps in the partner's referral at checkout (alleged in July 2026) | Credit lands on a click seconds before the sale |
| Fake signups and bot clicks | Scripts fill in forms or loop through links, aimed at per-lead payouts | Trackdesk flags the 4th click from one IP within 86,400 seconds (24 hours), and clicks from cloud hosts such as AWS, Google Cloud and Azure |
| Paid ads on your brand | Partner bids on your name in Google Ads or Meta Ads | FirstPromoter flags referrals that come from paid ads, and its documentation lists 11 platforms, including Google, Meta, TikTok and LinkedIn |
| Refund and chargeback abuse | Commission is paid, then the sale is refunded or disputed, often within 120 days | A refund share above your program average. No vendor page cited here gives a threshold |
| Duplicate partner accounts | One person registers several partners | Trackdesk has 2 registration rules: duplicate IP and duplicate billing details |
### Cookie stuffing in practice: eBay in 2006, a shopping app in 2026
#### The eBay case
Brian Dunning was indicted on 5 counts of wire fraud on June 24, 2010 and pleaded guilty on April 15, 2013 to a superseding charge. He and his brother formed Kessler's Flying Circus in about April 2005, and the company took part in eBay's affiliate program. He wrote 2 free applications, ProfileMaps.info and WhoLinked.com, that site owners installed, and the code gave visitors to those sites a cookie with the company's ID although they had not clicked an eBay ad. He was sentenced on August 4, 2014 to 15 months in prison and 3 years of supervised release after an investigation by the Federal Bureau of Investigation.
#### What a 2014 study measured
Snyder and Kanich, of the University of Illinois at Chicago, analyzed 2.3 billion HTTP requests from a large East Coast university: 895,722,435 in January 2014 and 1,440,677,533 in February. Across 166 programs, Amazon accounted for over 98% of affiliate conversion events, and the authors found no sale where a stuffer displaced an honest partner's credit inside a 24-hour window. For Amazon, a conversion event is an add-to-cart page visit, which overcounts purchases. Treat the counts as a 2014 illustration ([No Please, After You: Detecting Fraud in Affiliate Marketing Networks](https://econinfosec.org/archive/weis2015/papers/WEIS_2015_snyder.pdf)).
| Amazon's program in the sample | Count | Share |
| --- | --- | --- |
| Publishers seen | 3,664 | 100% |
| Publishers that behaved honestly | 2,268 | 61.9% |
| Publishers that behaved like cookie stuffers | 1,396 | 38.1% |
| Conversion events credited to an affiliate | 955 | 100% |
| Of those, credited to honest publishers | 781 | 81.8% |
| Of those, credited to stuffers | 174 | 18.2% |
#### The same trick through a browser extension
On July 10, 2026, TechCrunch reported, citing a Bloomberg investigation, that Phia, a shopping app founded in 2025, was accused of overwriting other affiliates' referral codes with its own at checkout. Impact.com suspended Phia, and a spokesperson said the necessary changes had been made ([TechCrunch](https://techcrunch.com/2026/07/10/phia-accused-of-cookie-stuffing-taking-affiliate-credit-on-purchases-it-didnt-earn/)). When the last click wins, a click just before checkout can claim a journey another channel started.
### The cost of affiliate marketing fraud
I could not verify an audited loss rate for SaaS affiliate programs, so measure your own. The 2 data points above differ: the eBay figure is a share of commission dollars, and the Amazon figure is a share of credited conversion events. On a $10,000 monthly commission bill they look like this.
| Data point | Share | Lost each month | Lost each year |
| --- | --- | --- | --- |
| eBay, low stipulation ($200,000 of $5.2 million) | 3.8% | $380 | $4,560 |
| eBay, high stipulation ($400,000 of $5.2 million) | 7.7% | $770 | $9,240 |
| Amazon sample (174 of 955 conversion events) | 18.2% | $1,820 | $21,840 |
*An illustration on a $10,000 commission bill. Shares are rounded, and the Amazon share counts conversion events in 2014 traffic.*
A single bad sale costs more than its commission. On a $149 a month plan at 20%, the commission is $29.80. If it was paid and the cardholder then wins a dispute, you lose the $149, the $15.00 dispute fee on [Stripe's pricing page](https://stripe.com/pricing) and the $29.80: $193.80. Contesting and losing adds a $15.00 countered fee, for $208.80. Stripe says [card networks typically allow disputes within 120 days](https://docs.stripe.com/disputes/how-disputes-work), and a bank can take up to 3 months to decide one.
### Affiliate fraud monitoring in practice
Trackdesk lists 13 rules, 6 for clicks, 5 for conversions and 2 for affiliates, and only 2 take custom settings. PartnerStack lists no numeric triggers: if you take no action on a flag, it holds the partner's rewards and removes the partner 30 days later. A 4-click rule flags an office that shares one address, so a flag should start a review before anyone loses an account. Run these checks before approval, on a partner's first sale, weekly and before every payout, and filter bot clicks first ([bot traffic filtering for links](https://www.trackrev.io/blog/bot-traffic-filtering-for-links)).
### Settings that limit the damage
Set the hold to your refund guarantee plus a margin and net later reversals against the next payout ([refund clawback guide](https://www.trackrev.io/blog/affiliate-refund-clawback-handling)). TrackRev's hold runs 0 to 180 days from the end of the payout period and defaults to 0, so a new program pays as soon as a period closes until you change it. Its cookie window pre-fills 60 days and accepts 1 to 3,650. A 7-day window leaves a stuffed cookie 7 days to claim a sale instead of 60, though it drops honest partners whose readers take longer.
One credit rule, last click, first click or shared, applies to every program in a workspace, and first click or shared credit shrinks what a late click earns. FirstPromoter's paid-ad rule has 4 settings per promoter. TrackRev can hold each application for review. Name the banned behaviors and the penalty in your partner terms.
### What TrackRev covers and what it leaves to you
TrackRev filters bot clicks at the redirect: known-crawler and empty user agents and prefetch requests such as Apple Mail's are stored with an is_bot flag and left out of link, attribution and partner reports. On referral campaigns, a signup that matches the inviter's browser, device fingerprint or IP on a different device is written as revoked, with the reason shown. A refund reverses the matching commission, and the commissions API accepts a void or fraud status before payout.
TrackRev does not score click to purchase time or clicks per IP for each partner, and cash commissions have no automatic partner-versus-buyer comparison, so those checks are yours. If screening is the priority, Trackdesk publishes 13 fraud rules and PartnerStack's fraud monitoring documentation cites Sift. The affiliate program is on every paid plan: Starter at $39 a month tracks up to $10,000 of commission a month, and Growth at $99 a month tracks $100,000 ([pricing](https://www.trackrev.io/pricing)). The free plan has 50 links and 1,000 tracked events a month and no affiliate program. See the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program).
### Frequently asked questions
**What is the difference between affiliate fraud and click fraud?**
Click fraud inflates what you pay for traffic, through bots on ads that charge per click. Affiliate fraud inflates what you pay for results. A bot cannot buy a subscription, so per-sale programs lose money to cookies, self-purchases and refunds.
**Is cookie stuffing illegal?**
It can be. Federal prosecutors in the Northern District of California charged the eBay scheme as wire fraud, and the defendant received 15 months in 2014. Program terms commonly ban it too, so ask a lawyer what you can withhold.
**How do I estimate what affiliate fraud costs my program?**
Divide the commission you voided, reversed or recovered over the last 12 months by the commission you paid, then add $15.00 for each Stripe dispute. It is a floor, since it counts only fraud you caught.
**How long should a commission hold be?**
Longer than your refund guarantee: a 30-day guarantee calls for a hold past 30 days, so a refund becomes a void and not a clawback. Net later disputes against the next payout instead of holding everything for 4 months.
**Are coupon sites and browser extensions affiliate fraud?**
Not by default. A coupon site that shows a code is an ordinary channel. The trouble starts when a tool takes credit it did not earn, as the 2026 Phia reports allege, so decide in your terms what you pay for.
**What should I do when I find a partner committing fraud?**
Hold the unpaid commission, keep the click and sale records, and ask the partner to explain, because an accidental self-referral looks like a deliberate one. If a card dispute is open, Stripe says you usually have 7 to 21 days to respond.
---
## Affiliate commission rates in 2026: what programs pay by industry
URL: https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026
Published: 2026-05-09
Author: Muzahid Maruf
Affiliate commission rates run from 1% on retail to 30% on software and courses. 2026 rates by industry, recurring terms, cookie windows and network fees.
Affiliate commission rates run from 1% on groceries sold through Amazon Associates to 60% lifetime recurring at systeme.io, and the middle of the market follows product margin. In TrackRev's benchmark dataset the median is 8% for e-commerce, 15% for consumer software, 20% for business software and 30% for information products. Physical retail pays little because the seller keeps little per sale, while software and courses add little cost for each extra customer. The payment term and the click window also set what a customer costs.
> **Key takeaways:**
>
> - Rates follow product margin. TrackRev's benchmark dataset shows medians of 8% for e-commerce, 15% for consumer software, 20% for business software and 30% for information products.
> - Amazon Associates pays a fixed 0% to 10% depending on category, with 4% on anything unlisted, so $400 spent on luxury beauty pays five times what $400 spent on a television does.
> - Software programs publish a term as well as a percentage: Kit pays 50% through the first year, Rewardful 25% through the first year, Thinkific 30% for life and systeme.io 60% for life.
> - On a $39 plan kept for a year, 30% of the first payment costs $11.70 and 50% across all 12 months costs $234, so the payment term moves your cost more than the percentage does.
> - Fees stack on the commission. Awin's Access plan takes $49 monthly plus 3.5% of each transaction, which turns a 6% commission into a 9.5% cost before card processing.
> - CJ Affiliate sets no network-wide rate or cookie length. Each advertiser picks its own, so read the terms of the program before you join.
### Affiliate commission rates by industry
These medians come from [TrackRev's affiliate program benchmark dataset](https://www.trackrev.io/data/affiliate-program-benchmarks), which takes the cross-source median of public reports from Impact, PartnerStack and Awin. It summarizes other organizations' research and does not measure TrackRev customers. Programs that pay a flat dollar amount are left out of the rate medians.
| Industry segment | Median commission | Most common payout structure | Programs sampled |
| --- | --- | --- | --- |
| Information products and coaching | 30% | Lifetime recurring | 412 |
| Courses and education | 25% | One-time at sale | 287 |
| B2B SaaS | 20% | Recurring for 12 months | 564 |
| B2C SaaS | 15% | Recurring for 6 months | 318 |
| Marketplaces and fintech | 10% | Tiered by volume | 129 |
| E-commerce and physical goods | 8% | One-time at sale | 130 |
*Source: TrackRev affiliate program benchmark dataset, Q2 2026, a synthesis of public research from Impact, PartnerStack and Awin.*
A 15% offer is average for consumer software and well below market for information products, where the median is 30% and lifetime recurring is the most common structure. Marketplaces and fintech sit at 10%, most often tiered by volume.
Among the best-performing software vendors the range is tighter. [PartnerStack's analysis of its 25 highest-performing vendors in 2023](https://partnerstack.com/resources/research-lab/charts/high-performing-vendors-tend-to-offer-20-25-for-commissions) found that the offers paying out the most total commission were 20%, 25% and 30%, in that order, with an average of 23.53%. ERP software paid 30% to 35% on average.
### Retail rates: what Amazon Associates pays
Amazon publishes a fixed rate card, and it shows how widely retail rates vary by category. Its [Standard Commission Income Statement](https://affiliate-program.amazon.com/help/node/topic/GRXPHT8U84RAYDXZ) assigns one rate to each product category.
| Rate | Categories |
| --- | --- |
| 10% | Luxury Beauty, Luxury Stores Beauty, Amazon Explore |
| 5% | Digital Music, Physical Music, Handmade, Digital Videos |
| 4.5% | Physical Books, Kitchen, Automotive |
| 4% | Apparel, Watches, Jewelry, Luggage, Shoes, Echo and Kindle devices, and every category not listed |
| 3% | Toys, Furniture, Home, Home Improvement, Lawn and Garden, Pets, Headphones, Beauty, Musical Instruments, Outdoors, Tools, Sports, Baby |
| 2.5% | PC, PC Components, DVD and Blu-Ray |
| 2% | Televisions, Digital Video Games |
| 1% | Amazon Fresh, Grocery, Health and Personal Care, Physical Video Games and Consoles |
| 0% | Gift Cards, Wireless Service Plans, Alcoholic Beverages, Vehicles, Pet Prescription Medications, restaurant food, Amazon Appstore |
*Source: Amazon Associates, October 2026. Category names are shortened.*
A $400 television at 2% pays $8. The same $400 order in luxury beauty at 10% pays $40. Amazon also pays flat bounties for some actions, including $3.00 for a Prime free trial and $20.00 for an Audible Standard free trial.
### What software programs pay
Software programs publish a percentage and a payment term, and many add a click-credit window. Six of them state most of those terms on their own pages.
| Program | Commission | How long it pays | Window and minimum payout |
| --- | --- | --- | --- |
| Kit | 50% of what the customer pays, plus 10%, 15% or 20% at Bronze, Silver or Gold status | 12 months at 50%, then the status share for as long as the customer stays | No window given |
| Thinkific | 30% of recurring revenue, or $150 monthly on Plus plans | Lifetime of the customer | 90 days, $25 minimum |
| systeme.io | 60% of each subscription payment | Lifetime of the customer | Lifetime attribution, $30 minimum |
| Rewardful (its own affiliate program) | 25% | First 12 months | 60 days, $50 minimum |
| Kinsta | $50 to $500 one-time bonus plus 10% | Lifetime monthly | 60 days, last-touch |
| Shopify | Up to $150 per qualified referral, varying by referral location | One payment when the referral starts a full-price plan | 30 days, or up to 400 for free-trial signups; $10 minimum |
*Terms from each program's own page ([Kit](https://www.kit.com/affiliate), [Thinkific](https://www.thinkific.com/affiliate/), [systeme.io](https://systeme.io/affiliate-program), [Rewardful](https://www.rewardful.com/affiliates), [Kinsta](https://kinsta.com/affiliate/), [Shopify](https://www.shopify.com/affiliates)), October 2026. systeme.io dates its own terms April 2026.*
Rewardful pays 25% for a year, while systeme.io pays 60% for as long as the customer stays. A percentage cannot rank those two offers, since the term decides how many payments it applies to. On the $17-a-month Startup plan, 60% comes to $10.20 every month the customer remains.
#### What one customer costs under each structure
Take a $39-a-month plan and a customer who stays 12 months, which is $468 of revenue. Each structure below applies to that same customer.
| Structure | Paid to the affiliate in year one | Share of the $468 |
| --- | --- | --- |
| 30% of the first payment only | $11.70 | 2.5% |
| Flat $50 bounty | $50.00 | 10.7% |
| 10% recurring for life | $46.80 | 10% |
| 20% recurring for 12 months | $93.60 | 20% |
| 25% for 12 months (Rewardful's own terms) | $117.00 | 25% |
| 50% for 12 months (Kit's first-year rate) | $234.00 | 50% |
*Hypothetical $39 plan, customer retained for all 12 months, no refunds.*
A lifetime rate looks cheap in year one and costs more as customers stay. If the same customer lasts 36 months, which is $1,404 of revenue, a 10% lifetime share pays $140.40 while a 20% share limited to 12 months still pays $93.60. Recurring terms also depend on tracking each renewal back to the first click, which is covered in [affiliate tracking for recurring subscriptions](https://www.trackrev.io/blog/affiliate-tracking-subscriptions-recurring).
Kit shows one way to pay for proven results without raising the base rate. A customer paying $1,200 in the first year earns the affiliate $600. Partners who refer 10, 50 or 100 paying customers a year then collect 10%, 15% or 20% on that customer's later payments, which adds $120 to $240 a year on the $1,200 plan.
### Payout minimums and schedules
A minimum payout sets when a new partner first sees money, and the rate decides how long that takes.
| Program | Minimum payout | Schedule |
| --- | --- | --- |
| Shopify | $10 | Credited each month on the 22nd, covering the prior month's referrals |
| Thinkific | $25 | Verified at month end, then paid out on the 13th |
| systeme.io | $30 | Processed each month on the 10th |
| Rewardful | $50 | Usually paid out on the 1st |
*From each program's affiliate page, October 2026.*
Rewardful's affiliate page prices a referral on its $99 Growth plan at $24.75 per month. After two months that is $49.50, just under the $50 minimum, so the first payout needs a third month of commission. On systeme.io's $17 Startup plan a referral earns $10.20 per month and clears the $30 minimum in the third month. A $10 minimum, as at Shopify, is cleared far sooner than a $50 one.
### Affiliate fees on top of the commission
Commission is the visible cost. Networks and software add their own. [Awin's US pricing page](https://www.awin.com/us/pricing) lists an Access plan at $49 monthly plus a 3.5% tracking fee on each transaction, and an Accelerate plan from $99 monthly plus 2.5%. Access includes a three-month minimum term. The advertiser still sets the partner commission, which makes the tracking fee a second charge on every sale.
| Option | Monthly price | Cut of each sale | Plan limit |
| --- | --- | --- | --- |
| Awin Access | $49 | 3.5% of each transaction | None listed |
| Awin Accelerate | From $99 | 2.5% of each transaction | None listed |
| Rewardful Starter | $49 | 0% transaction fee | $7,500 of affiliate-attributed revenue each month |
| FirstPromoter Starter | $49 | None listed | $5,000 of affiliate revenue each month |
| PartnerStack | Not published | Not published | Plan and price confirmed in a demo |
*Prices from each vendor's pricing page, October 2026 ([Rewardful](https://www.rewardful.com/pricing), [FirstPromoter](https://firstpromoter.com/pricing), [PartnerStack](https://partnerstack.com/pricing)).*
> **Worked example: what a $100 sale costs:** Awin's own example is a $100 sale at a 6% commission: the partner gets $6 and Awin gets $3.50 on the Access plan. [Stripe's standard rate](https://stripe.com/pricing) for domestic cards, 2.9% plus 30 cents, takes another $3.20. That is $12.70 out of $100, leaving $87.30 before the cost of the product.
Flat subscriptions scale differently. At $7,500 of monthly affiliate sales, Rewardful Starter's $49 is 0.65% of revenue. Awin Access costs $49 plus 3.5% of $7,500, which is $262.50, so $311.50 or 4.15%. Awin's plans also include its directory of 1M+ partners, so its fee covers access to recruits as well as tracking.
### CJ Affiliate commission rates and cookie duration
CJ Affiliate publishes no network-wide commission rate and no default cookie length. [CJ's own overview of the network](https://www.cj.com/what-is-affiliate-marketing) says advertisers and publishers determine the offer details, so rate, payment event and click-credit window are set advertiser by advertiser. Any single figure quoted for CJ rates has to be an average across advertisers. Awin works the same way, since its pricing page tells each advertiser to set its own partner commission.
Before joining a CJ advertiser, read three terms, because two advertisers in one category can differ on each: the rate, the click-credit window and whether returns reverse the commission.
### Cookie windows across programs
The dataset's median window is 60 days. Of the programs measured, 41% use 60 days, 28% use 30 or fewer, 24% use 90 and 7% use 180 or more. Rewardful and Kinsta use 60 days, Thinkific uses 90 and systeme.io tags a referral to the affiliate permanently. Shopify tracks referrals for 30 days from the click, then follows a referral that starts a free trial for up to 400 days while it waits for the store to move to a paid plan. Click-to-paid timing for SaaS buyers is analyzed in [SaaS affiliate benchmarks for 2026](https://www.trackrev.io/blog/saas-affiliate-program-benchmarks-2026).
A configured window can be shorter than it looks. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Safari's Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without the visitor interacting with the site. A 60-day window written by a browser script can therefore end after a week for Safari visitors who do not return. The mechanics are in [the Safari ITP breakdown](https://www.trackrev.io/blog/safari-itp-attribution-saas).
### Setting your own rate
Start from gross profit per month, then decide how much of it the term hands over. Suppose serving one customer on a $39 plan costs you $7.80 per month, which leaves $31.20.
- A 20% commission for 12 months pays out $93.60 of the $374.40 gross profit that customer produces over the year, so you keep $280.80.
- A 40% commission for 12 months pays $187.20 and leaves the same $187.20 with you.
- Any rate above your gross margin, 80% in this example, loses money on every payment.
Pick the term from your own churn. In [TrackRev's channel dataset](https://www.trackrev.io/data/saas-attribution-benchmarks), affiliate-referred customers reach a median first churn at 9.6 months, with 12-month lifetime value at 1.4 times the workspace average. A 12-month term will therefore not pay in full on every referral, while a product with low churn makes lifetime recurring expensive. Hold commission until your refund window closes and reverse it when a charge is refunded, as described in [affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling). Payout methods, minimums and tax forms are in [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates).
### Setting these terms in TrackRev
Each TrackRev program sets its commission as a percentage or a flat amount, pays it once, for a set number of months or for the customer's lifetime, and has its own cookie window (60 days by default), payout threshold and hold period (0 to 180 days, default 0). The credit rule, last click, first click or shared, applies across the workspace. A refunded or disputed charge takes its commission back out automatically. Programs run on paid plans from Starter at $39 monthly, which tracks up to $10,000 of partner commission each month. Details are on the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) and in [pricing](https://www.trackrev.io/pricing).
TrackRev has no partner marketplace, so partners come from your invites, application form or outreach. If you want a ready pool of partners to recruit from, Awin's directory and the PartnerStack marketplace are built for that.
### Frequently asked questions
**What are typical affiliate marketing commission rates?**
There is no useful single average, because the rates sit in different ranges by category. A subscription product is competitive at 20% to 30% for a year, a course at 25% or more, and a physical product at anything above 10%. Check the term before the percentage: 20% on the first payment only is a small offer next to 20% for a year.
**What are CJ Affiliate's commission rates and cookie duration?**
CJ sets neither for the network as a whole. Terms belong to each advertiser, so open the program terms of every advertiser you are weighing and compare them side by side instead of hunting for a default.
**Should I pay recurring or one-time commission?**
Recurring suits a subscription, because the affiliate earns while you do. One-time suits annual-only or single-payment products and caps what each referral can cost. Fixed-term recurring, such as 12 months, sits between the two and is the structure most programs in the dataset use for B2B software.
**What fees do affiliate networks charge?**
Ask each vendor for two numbers, the platform price and any cut of each sale, then add card processing and payout costs to see what a sale really costs you. Quote-only vendors such as PartnerStack give neither until a demo.
**How long should an affiliate cookie last?**
Match it to how long buyers take to pay. A self-serve product with a short trial can work at 30 to 60 days, while a longer trial or a purchasing approval justifies 90. Test tracking in Safari, since script-written cookies can expire after 7 days there.
**Can I pay affiliates a flat fee instead of a percentage?**
Yes. A flat bounty is easier to budget and suits a product with a single price. It pays the same on a small plan as on a large one, so affiliates tend to prefer a percentage once plan prices vary.
**How long should I hold commission before paying it?**
Hold it at least until your refund window closes, so a refunded sale never has to be clawed back from money already sent. TrackRev lets each program set the hold anywhere from 0 to 180 days. A longer hold protects you, and a shorter one gets partners paid sooner.
**Can I run an affiliate program on TrackRev's free plan?**
No. Free is link tracking only, with 50 links and 1,000 tracked events a month. Running a program and seeing revenue figures requires a paid plan, from Starter at $39 a month.
---
## Affiliate marketing statistics for 2026, each with its source
URL: https://www.trackrev.io/blog/affiliate-marketing-statistics
Published: 2026-10-01
Author: Muzahid Maruf
Affiliate marketing statistics for 2026: US and UK spend, global market estimates, network size, returns, commission terms, cookie limits and FTC rules.
Affiliate marketing statistics are best documented in three places: US spend of $13.62 billion in 2024 (Performance Marketing Association, PMA), UK spend of £1.8 billion in 2025 (Affiliate & Partner Marketing Association, APMA), and a commercial estimate of $18.5 billion for the global market in 2024. They disagree on scale because they count different things, so every figure below comes with its source, its year and its scope.
> **Key takeaways:**
>
> - US brands spent $13.62 billion on affiliate marketing in 2024, up 49.8% from $9.1 billion in 2021, according to the Performance Marketing Association.
> - UK brands spent £1.8 billion in 2025, which the APMA says generated £20.7 billion in revenue. A commercial estimate of the global market, $18.5 billion for 2024, leaves only $4.9 billion once the US figure is subtracted, so market-size figures are not interchangeable.
> - I found no worldwide count of affiliates from any trade body or network. Awin alone lists 1 million publishers and 30,000 advertisers, and one publisher can sit in several networks.
> - Published SaaS terms run from HubSpot's 30% recurring commission, capped at one year with a 180-day cookie, to Webflow's 50% of a first subscription with a 90-day cookie.
> - Safari deletes script-written cookies after 7 days without a visit, and Safari is 30.42% of US browser use, so a long cookie window on paper is shorter in practice.
> - FTC guidance says affiliate-link reviews need a clear disclosure, and the maximum civil penalty for a knowing violation of an FTC rule is $53,088.
### Affiliate marketing statistics on market size and spend
The PMA released its Industry Study 2025 on June 18, 2025. It reports US spending up 49.8% in three years, a compound annual growth rate of 14.42% that it calls twice the pace of the broader e-commerce market. The text of the release gives 2024 spend as $13.62 billion, and its headline rounds the same figure to $13.63 billion. The PMA also estimates that spend produced $113 billion in sales, 9.4% of all US e-commerce, and 15% to 20% of sales at companies that use the channel.
| Measure | Figure | Year | Source |
| --- | --- | --- | --- |
| US affiliate marketing spend | $13.62 billion | 2024 | [Performance Marketing Association](https://thepma.org/pma-study-affiliate-marketing-industry-grows-49-8-to-13-63-b-outpacing-e-commerce-growth-by-2x/) |
| US spend in the previous study | $9.1 billion | 2021 | [PMA baseline](https://thepma.org/pma-study-affiliate-marketing-industry-grows-49-8-to-13-63-b-outpacing-e-commerce-growth-by-2x/) |
| US e-commerce sales tied to the channel | $113 billion (9.4% of the total) | 2024 | [PMA estimate](https://thepma.org/pma-study-affiliate-marketing-industry-grows-49-8-to-13-63-b-outpacing-e-commerce-growth-by-2x/) |
| UK affiliate and partner marketing spend | £1.8 billion | 2025 | [APMA State of the Affiliate Nation](https://martechseries.com/sales-marketing/programmatic-buying/affiliate-and-partner-marketing-spend-grows-to-1-8-billion-in-2025/) |
| UK revenue generated by that spend | £20.7 billion | 2025 | [APMA report](https://martechseries.com/sales-marketing/programmatic-buying/affiliate-and-partner-marketing-spend-grows-to-1-8-billion-in-2025/) |
| Global affiliate market, commercial estimate | $18.5 billion | 2024 | [Cognitive Market Research](https://www.cognitivemarketresearch.com/affiliate-market-report) |
| Global projection from the same firm | $35.4 billion | 2033 | [Cognitive Market Research forecast](https://www.cognitivemarketresearch.com/affiliate-market-report) |
*Spend and market-size figures as each publisher reports them. The scopes differ, so the rows do not add up.*
The APMA pooled data from 11 affiliate networks for its report, published on May 6, 2026. The full report is for APMA members, so these figures come from the release as carried by MarTech Series. UK spend rose 7.3% to £1.8 billion and generated £20.7 billion in revenue, also up 7.3%. The APMA modelled part of the total and calls its estimates conservative.
#### Why the market-size figures disagree
Subtract the PMA's US figure from the global estimate and about $4.9 billion is left for every other country, a pool that also has to cover a UK market the APMA puts at £1.8 billion for 2025. The two sources probably do not share a definition, so read the global number as a rough order of magnitude. Cognitive Market Research's own page quotes both 8.5% and 8.00% as the annual growth rate.
Older forecasts deserve the same suspicion. A [Rakuten Advertising post](https://business.rakuten.com/blog/insights/affiliate-marketing-is-here-to-stay/) from October 2022 cites Statista at $8.2 billion for 2022 and, earlier in the same text, the PMA at $9.1 billion for 2021, which read together would mean spend fell. For US trends, use the PMA's measured series.
### How many affiliate marketers are there?
I could not find a worldwide count of affiliates from any trade body or network. What exists are counts inside individual networks, and one publisher can belong to several, so the numbers overlap and cannot be added together.
| Network | What it counts | Figure | As of |
| --- | --- | --- | --- |
| [Awin](https://www.awin.com/us/about-us) | Publishers and advertisers | 1 million publishers, 30,000 advertisers | October 2026 |
| [PartnerStack](https://partnerstack.com/articles/state-of-partnerships-gtm-2026-report-press-release) | Active partners in its B2B software network | Over 123,000 | September 2025 |
| [impact.com](https://impact.com/press-releases/impact-2025-momentum-release/) | Active partnerships | Nearly 350,000 | 2025 |
*Figures from each network's own page or press release.*
Awin's 1 million is the largest of these figures. impact.com counts partnerships, which is a different unit from people, and PartnerStack's figure covers B2B software only. Money is easier to pin down than headcount: impact.com said in January 2026 that it powered close to $120 billion in partner-referred sales and over $5 billion in partner payouts during its fiscal year.
### Adoption and sentiment among brands and publishers
The most-quoted adoption figure is 81% of advertisers and 84% of publishers using an affiliate program. It comes from a Forrester Consulting study commissioned by Rakuten Advertising, as cited in the [Rakuten post](https://business.rakuten.com/blog/insights/affiliate-marketing-is-here-to-stay/) dated October 1, 2022. The post gives no date for the study, so read the numbers as a rough signal of adoption.
A newer survey is narrower. [PartnerStack and Wynter](https://partnerstack.com/articles/state-of-partnerships-gtm-2026-report-press-release) asked 100 senior leaders at B2B SaaS companies in the $50M+ bracket and published the results on September 29, 2025. Of those, 69% planned to raise partnership investment in the coming year, 30% ranked partnerships a top strategic priority for 2026, and 74% said partners are essential to customer satisfaction, expansion and retention. PartnerStack sells partner-program software, which makes this a vendor survey of a small sample.
The PMA's publisher survey covers the supply side. Of the publishers it asked, 54% were confident or very confident in the future of their affiliate business, 69% were concerned that Google actions, including algorithm changes and AI Overviews, are reducing site traffic and affiliate revenue, and 52% said they will try new forms of promotion.
On measurement, [Influencer Marketing Hub's 2026 benchmark report](https://influencermarketinghub.com/influencer-marketing-benchmark-report/), a survey of 600+ marketers published on May 4, 2026, found promo and discount codes were the most common way to measure influencer campaigns at 45.9% of those answering, ahead of affiliate links at 26.0% and native shop features at 25.0%. How codes and links fit together is covered in [coupon code tracking for affiliate programs](https://www.trackrev.io/blog/coupon-code-affiliate-tracking).
### Returns and sector mix
Return on ad spend (ROAS) divides tracked sales by spend, so it shows what the channel was credited with and says nothing about how many of those sales would have happened anyway.
| Measure | Return | Source |
| --- | --- | --- |
| Average ROAS across seven networks and platforms | 12:1 | [Rakuten Advertising](https://business.rakuten.com/blog/insights/affiliate-marketing-is-here-to-stay/), citing Awin, CJ, LinkConnector, Partnerize, Ascend by Partnerize, Rakuten Advertising and ShareASale |
| US travel | $19 per $1 | [PMA Industry Study 2025](https://thepma.org/pma-study-affiliate-marketing-industry-grows-49-8-to-13-63-b-outpacing-e-commerce-growth-by-2x/) |
| US retail | $11 per $1 | PMA, retail vertical |
| US department stores | $21 per $1 | PMA, retail breakdown |
| UK, all sectors | 15X | [APMA, 2025 data](https://martechseries.com/sales-marketing/programmatic-buying/affiliate-and-partner-marketing-spend-grows-to-1-8-billion-in-2025/) |
| UK travel and retail | 19X | APMA, sector split |
| UK voucher partners | 24X | APMA, publisher type |
*Returns as reported by each network group or trade association.*
Sector mix shifted between the PMA's two studies. Retail still takes the largest share of US spend, and the PMA says content creators and bloggers gained a larger share of investment.
| Sector | Previous PMA study | PMA study 2025 |
| --- | --- | --- |
| Retail | 76% | 63% |
| Financial services | 12% | 15% |
| Travel | 5% | 9% |
| Telecommunications | 3% | 7% |
*Share of US affiliate spend by sector.*
UK retail takes 47% of spend in the APMA data. The report counted 357 million transactions through affiliate links in 2025, or 41,000 an hour, and found that across Cyber Weekend £1 in every £7 spent tracked through an affiliate link, up from £1 in every £8 in 2024. In UK telecoms, affiliates delivered 1 million new customers a month, and finance affiliate spend ran at £10 million a month, up 9%.
The ratios do not reconcile with the totals. The APMA's £20.7 billion in revenue over £1.8 billion in spend is 11.5, against its stated 15X, and the PMA's $113 billion over $13.62 billion is about 8.3, below the travel and retail returns it reports. The press releases do not say how each ratio was built, so quote each one as published and do not mix them.
### Published commission rates and tracking windows
As of October 2026, Amazon Associates pays [fixed rates by product category](https://affiliate-program.amazon.com/help/node/topic/GRXPHT8U84RAYDXZ): 10% on luxury beauty, 5% on digital music and handmade goods, 4.5% on physical books, kitchen and automotive, 3% on toys, furniture, home and beauty, 1% on grocery and health and personal care, and 0% on gift cards. Everything outside the schedule's named categories pays 4%.
Software programs publish bigger numbers, and each states its own window for crediting a sale.
| Program | What it pays | Tracking window |
| --- | --- | --- |
| [HubSpot](https://www.hubspot.com/partners/affiliates) | 30% monthly recurring commission for up to one year | 180-day cookie |
| [Webflow](https://webflow.com/affiliates) | 50% of a new customer's first subscription for up to 12 months | 90-day cookie, first-touch attribution |
| [Notion](https://www.notion.com/affiliates) | Up to $50 per activated sign-up plus 20% of year-one revenue (closed to new affiliates when checked) | Upgrade within 180 days of the click, last-click |
| [Shopify](https://www.shopify.com/affiliates) | Up to $150 per qualified referral, credited to your balance monthly on the 22nd | 30 days from the click, up to 400 days from free trial to paid plan |
*Terms from each program's own page, October 2026.*
HubSpot and Webflow pay a share of revenue for a year. Shopify pays a bounty per referral, and Notion pays a bounty plus a year-one share. For medians across many SaaS programs, see the compiled [SaaS affiliate benchmarks](https://www.trackrev.io/blog/saas-affiliate-program-benchmarks-2026) and [commission benchmarks by category](https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026).
### Cookie and browser facts behind the conversion counts
A tracking window only counts if the cookie survives. WebKit's [Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) (ITP) deletes cookies created in JavaScript, and other script-writable storage, after 7 days of no user interaction with the site. When it detects click IDs added to link URLs and read by script, it caps JavaScript-written cookies on the landing page at 24 hours. It also caps cookies set in HTTP responses by CNAME-cloaked or IP-cloaked third-party requests at 7 days.
StatCounter's [September 2026 data](https://gs.statcounter.com/browser-market-share) puts Safari at 18.27% of worldwide browser use, 24.71% on mobile and 30.42% in the United States, against 66.36% for Chrome worldwide. Google's [October 17, 2025 update](https://privacysandbox.google.com/blog/update-on-plans-for-privacy-sandbox-technologies) restates that Chrome keeps its current approach to third-party cookie choice and retires the Attribution Reporting API along with several other Privacy Sandbox technologies.
> **Worked example: a Safari visit on day 10:** A program advertises a 90-day window, and the affiliate link sets its cookie with JavaScript. A Safari visitor clicks on day 0, does not visit again, and buys on day 10. WebKit deleted the cookie after 7 days without interaction, so the sale arrives with no affiliate attached. A cookie set by the site's own server in an HTTP response escapes that 7-day deletion, except in the CNAME-cloaking cases WebKit lists. The [Safari ITP and SaaS attribution](https://www.trackrev.io/blog/safari-itp-attribution-saas) post covers the fix.
### FTC and IRS rules that affect affiliate programs
The FTC's [Endorsement Guides](https://www.ecfr.gov/current/title-16/chapter-I/subchapter-B/part-255) (16 CFR Part 255, revised in 2023) work through a coffee blogger whose reviews carry affiliate links to retailers. Because knowing about the compensation could change how much weight readers give the reviews, the Guides say they should disclose it clearly and conspicuously. The agency's [FAQ on the Guides](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) adds that "affiliate link" alone may not tell readers anything, a "buy now" button is not a disclosure, and the closer the disclosure sits to the recommendation, the better.
A separate [FTC rule on consumer reviews and testimonials](https://www.federalregister.gov/documents/2024/08/22/2024-18519/trade-regulation-rule-on-the-use-of-consumer-reviews-and-testimonials) took effect on October 21, 2024. It bans fake and AI-generated reviews, undisclosed reviews by company insiders and the purchase of fake social media followers or views, and it lets the agency seek civil penalties from knowing violators. The [maximum civil penalty](https://www.ecfr.gov/current/title-16/section-1.98) under section 5(m)(1)(A) of the FTC Act is $53,088 per violation, and a [September 15, 2026 notice](https://www.federalregister.gov/documents/2026/09/15/2026-18853/civil-penalty-inflation-adjustments) says its amounts stay at 2025 levels through 2026. A program that pays commission on reviews should police what its affiliates publish; [affiliate compliance under FTC and GDPR rules](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers the wider set.
On tax, the IRS [instructions for Forms 1099-MISC and 1099-NEC](https://www.irs.gov/instructions/i1099mec) set the Form 1099-NEC filing threshold at $2,000 for tax years beginning after 2025, with inflation adjustments possible from 2027. Collect tax forms before the first payout; [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers methods and forms.
### Using these statistics for a SaaS affiliate program
Most of the spend figures above come from retail, travel and finance, and the PMA puts retail alone at 63% of US spend. A subscription product cares about a different number: what a referred customer pays over many months, net of refunds. Industry returns say little about that. Your commission per paying customer and your refund rate decide whether the channel pays.
TrackRev's Affiliate Program product handles the SaaS case. Paid plans sync revenue from Stripe, Polar, Lemon Squeezy and Paddle, calculate recurring commission for every month a customer renews, and take a commission back when a charge is refunded or disputed. The same data model carries link tracking and channel attribution, so the affiliate slice sits next to every other source of revenue. The free plan has 50 links and 1,000 tracked events a month with revenue figures hidden, and paid plans start at $39 a month (see [pricing](https://www.trackrev.io/pricing) and the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program)). TrackRev has no partner marketplace. If you need to recruit from a large pool of publishers, a network such as Awin or impact.com does that and TrackRev does not.
### Frequently asked questions
**How big is the affiliate marketing industry?**
It depends on the scope, because no single measure covers everything. The PMA counts US spend, the APMA counts UK spend reported by networks, and commercial research firms publish global estimates with looser definitions. Quote the one that matches the market you are describing, and name its year.
**Which affiliate marketing statistics are most reliable?**
Prefer trade associations that publish a scope and a year: the PMA for the US and the APMA for the UK. Network press releases are reliable for that network's own totals. Commercial market-size estimates are order-of-magnitude guides, and vendor surveys describe the attitudes of the vendor's own audience.
**Is affiliate marketing still growing?**
Yes, in both countries that publish a series. US spend grew 14.42% a year from 2021 to 2024 and UK spend grew 7.3% in 2025. An individual publisher can still lose out if search traffic falls, which is what 69% of the PMA's publisher respondents said worried them.
**How many affiliate marketers are there?**
There is no industry-wide count. The closest figures are network-level, led by Awin's 1 million publishers, and adding networks together would count shared publishers twice.
**What percentage of companies run an affiliate program?**
The figure quoted most often is 81% of advertisers, from a Forrester Consulting study commissioned by Rakuten Advertising. The Rakuten page that cites it gives no date for the study. A newer, narrower survey found 69% of B2B software leaders planning to increase partnership investment. Use either as a rough signal.
**What commission do affiliate programs pay?**
Rates follow the product. Amazon Associates pays 1% to 10% by category and 4% on categories outside its schedule. Software programs run higher: HubSpot pays 30% recurring for one year at most, and Shopify advertises up to $150 per qualified referral.
**Do affiliates have to disclose their links?**
In the US, yes. The FTC's Endorsement Guides say a reviewer who earns commission through affiliate links should disclose it clearly and conspicuously. The FTC's FAQ adds that the disclosure belongs near the recommendation, and on a video it belongs in the video and in the description next to the links.
**Does Safari delete affiliate cookies?**
Only some of them. Cookies written by JavaScript are deleted after 7 days without a visit, and capped at 24 hours when Safari detects click IDs in link URLs. Cookies your own server sets in an HTTP response are not capped, apart from the CNAME-cloaking cases WebKit describes.
---
## Affiliate program compliance: FTC disclosure and GDPR consent for partner tracking
URL: https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr
Published: 2026-07-05
Author: Muzahid Maruf
Affiliate program compliance in October 2026: the FTC's disclosure rules for partners, ePrivacy and GDPR consent for tracking links, and a quarterly audit.
Affiliate program compliance comes down to two duties. Under the Federal Trade Commission's Endorsement Guides ([16 CFR 255.1(d)](https://www.law.cornell.edu/cfr/text/16/255.1)), partners disclose their commission beside each link and you guide, monitor and correct them. Under Article 5(3) of the ePrivacy Directive (2002/58/EC), a tracking link that carries an identifier usually needs the visitor's consent before tracking starts, and the General Data Protection Regulation (GDPR) governs the data you keep. Both duties fall on the company paying the commission, even when a partner or a vendor does the work.
> **Key takeaways:**
>
> - 16 CFR 255.1(d) makes you answer for a partner's missing disclosure. The Endorsement Guides carry no penalty alone, but civil penalties of up to $53,088 per violation apply once a rule, an order or a Notice of Penalty Offenses is in play.
> - The FTC wants the disclosure beside each link and inside each video. It calls "Paid link" adequate and doubts "affiliate link" alone.
> - The European Data Protection Board reads Article 5(3) of the ePrivacy Directive to cover tracking links, with affiliate marketing as its example, so EU visitors usually need a recorded yes first. A cookie on your own domain gets no exemption.
> - GDPR fines reach €20 million or 4% of turnover for consent failures and €10 million or 2% for missing processor contracts.
> - A logged quarterly audit is your proof of monitoring. Checking 10 of 60 partners, 3 pieces each, is 30 items and about 2.5 hours.
> **Not legal advice:** Have a lawyer who handles advertising and data protection review your terms and consent setup before launch.
### What affiliate program compliance covers
| Rule | Who it protects | What it asks of you | Ceiling |
| --- | --- | --- | --- |
| FTC Endorsement Guides, 16 CFR Part 255 | US audiences | Partners disclose their commission; you guide, monitor and act | None from the Guides alone; $53,088 per violation under a rule, order or Notice of Penalty Offenses |
| [CAN-SPAM Act](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business) | Email recipients | Ad label, postal address, opt-out within 10 business days; the sender and the promoted company can both be liable | $53,088 per email |
| ePrivacy Directive, Article 5(3) | EU visitors | Consent before storing or reading information on a device, unless strictly necessary | Set by each member state |
| GDPR Articles 6, 7 and 28 | EU visitors | A lawful basis, valid consent where you rely on it, a contract with each processor | €20 million or 4% of turnover for Articles 6 and 7; €10 million or 2% for Article 28 |
| California Consumer Privacy Act | Californians | Honor opt-out signals such as Global Privacy Control, if the law covers you | Enforced by the California attorney general |
*The FTC left its penalty amounts unchanged for 2026. GDPR ceilings use whichever figure is higher.*
### FTC disclosure rules for affiliate links
[16 CFR 255.5](https://www.law.cornell.edu/cfr/text/16/255.5) requires a clear and conspicuous disclosure of any connection to a seller that could change how much weight people give a recommendation and that the audience would not expect. Payment, free or discounted products, early access and prizes count, and example 11 covers a blogger whose affiliate links earn a share of each sale.
The [Endorsement Guides Q&A](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) supplies the wording. A sentence like "I get commissions for purchases made through links in this post" works, and so does "Paid link" beside the link. "Affiliate link" alone may not be understood, "commissionable link" is probably unclear, and a "buy now" button is inadequate.
#### Wording and placement by format
| Format | What the FTC says works | What it says falls short |
| --- | --- | --- |
| Blog post | A statement beside the link | One note far from the link |
| Social post | Ad:, #ad or Advertisement at the start | Comments, a bio, a hashtag pile, or terms like sp, spon and collab |
| Video | Spoken and on screen, at the start of the endorsement | Description only, or hidden behind ads |
| Live stream | Repeated periodically, plus the description | One mention at the start |
| Platform tool | Added to your own wording | Used alone |
*Sources: the Q&A above and Disclosures 101 for Social Media Influencers.*
YouTube's [paid promotion button](https://support.google.com/youtube/answer/154235) adds a label at the start of a video, yet YouTube says creators and partners stay responsible for the law. Partners abroad count too: the FTC's [Disclosures 101](https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers) says US law reaches overseas posts that foreseeably affect US consumers, and YouTube names the Advertising Standards Authority in the United Kingdom, the DGCCRF in France and the Medienanstalten in Germany.
#### What you answer for
16 CFR 255.1(d) holds an advertiser liable for misleading endorsements and for failing to disclose unexpected material connections with endorsers, and lists 3 duties: guide endorsers, monitor them, and act to remedy non-compliance. Good faith is no safe harbor, though it should lower the odds of enforcement. The Q&A says to keep monitoring for a reasonable time after a contract ends, such as a few months. It offers no one-size-fits-all standard for how much to check and suggests pre-approving posts when regular monitoring is too much.
The Guides lack the force of law, but departures can bring enforcement under Section 5 of the FTC Act. Civil penalties come when a rule or order is violated, or when a company that received a Notice of Penalty Offenses repeats the practices it describes. The Federal Trade Commission sent that notice about endorsements to [more than 700 companies](https://www.ftc.gov/news-events/news/press-releases/2021/10/ftc-puts-hundreds-businesses-notice-about-fake-reviews-other-misleading-endorsements) on October 13, 2021, when the ceiling was $43,792 per violation. The ceiling is now $53,088 under Sections 5(l), 5(m)(1)(A) and 5(m)(1)(B), set by a [January 17, 2025 Federal Register adjustment](https://www.federalregister.gov/documents/2025/01/17/2025-01361/adjustments-to-civil-penalty-amounts) and left unchanged for 2026 by a [September 15, 2026 notice](https://www.federalregister.gov/documents/2026/09/15/2026-18853/civil-penalty-inflation-adjustments).
### Affiliate tracking compliance: ePrivacy, GDPR and US state law
#### Why a tracking link can need consent
[Article 5(3)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:02002L0058-20091219) allows storing information on a device, or gaining access to information already stored there, only with the user's consent, apart from what is strictly necessary for a service the user requested. In [Planet49](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:62017CJ0673) (case C-673/17, October 1, 2019), the Court of Justice of the European Union held that the rule applies whether or not the data is personal, that a pre-ticked checkbox is not consent, and that users must be told how long cookies last and whether third parties can access them.
The European Data Protection Board's [Guidelines 2/2023](https://www.edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-22023-technical-scope-art-53-eprivacy-directive_en), version 2.0, reach past cookies. Paragraphs 49 to 51 treat a tracking link, where an identifier is appended to the web address, like a tracking pixel, and use affiliate marketing as the example. Delivering the link counts as storage, at least through the browser cache, and collecting the identifier counts as gaining access, so Article 5(3) applies. Paragraph 56 adds that exemptions are assessed case by case.
Article 5(3) turns on what sits on the device, whatever domain set it. I'd treat commission attribution as outside the strictly necessary exemption, since the visitor never asked for it, so a first-party cookie gets no pass.
#### What valid consent looks like
GDPR Article 4(11) defines consent as a clear affirmative act, and recital 32 says silence, pre-ticked boxes and inactivity are not consent. The European Data Protection Board's [Guidelines 05/2020](https://www.edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-052020-consent-under-regulation-2016679_en), version 1.1, add that scrolling or swiping never counts (paragraph 86) and that a cookie wall hiding content until visitors accept is not freely given (paragraphs 39 to 41). [Article 7](https://gdpr-info.eu/art-7-gdpr/) requires you to show that consent was given (7(1)) and makes withdrawal as easy as giving it (7(3)). In practice you need a banner that offers marketing cookies as a separate choice and lets visitors decline as easily as accept, tracking that loads only after a yes, and a consent log you can produce.
A visitor who declines can't be credited by a cookie. A buyer who types a partner's code at checkout puts nothing on their device, so [coupon code tracking](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) keeps working. [Tracking without third-party cookies](https://www.trackrev.io/blog/affiliate-tracking-without-third-party-cookies) and [first-party link tracking](https://www.trackrev.io/blog/link-tracking-without-cookies-first-party) cover what else survives.
#### Roles, contracts and fines under the GDPR
Article 4(1) names an online identifier as something that can make data personal, and recital 30 lists cookie identifiers. You are the controller of the tracking on your site, and a vendor that processes it for you is a processor, which Article 28 requires you to bind by contract. A partner who only sends traffic processes nothing for you; one who collects leads into your CRM does. Where you and a partner jointly set the purposes and means, Article 26 makes you joint controllers.
[Article 83](https://eur-lex.europa.eu/eli/reg/2016/679/oj) caps fines for breaching the consent conditions in Articles 5 to 7 at €20 million or 4% of worldwide annual turnover, whichever is higher, and for processor duties in Articles 25 to 39 at €10 million or 2%. At €600 million in turnover the higher tier reaches €24 million, and below €500 million the €20 million figure is higher. Breaches of Article 5(3) are fined under each member state's law. Transfers outside the EU sit in the €20 million tier, so ask a US vendor whether the EU-US Data Privacy Framework or Standard Contractual Clauses cover your visitors' data.
#### California opt-out signals
The CCPA applies to for-profit businesses with over $25 million in annual revenue, businesses that buy, sell or share the personal information of 100,000 or more California residents or households, and those that earn 50% of revenue from selling it. The attorney general's [CCPA page](https://oag.ca.gov/privacy/ccpa) says covered businesses must honor Global Privacy Control as an opt-out of sale or sharing. Whether partner tracking counts as sharing is a question for counsel.
### The dates behind today's rules
| Date | Event | What changed |
| --- | --- | --- |
| Nov 25, 2009 | Directive 2009/136/EC | Amends ePrivacy Directive 2002/58/EC so Article 5(3) requires consent for storing or reading device data |
| May 25, 2018 | GDPR applies | Articles 7, 28 and 83 take effect across the EU |
| Oct 1, 2019 | Planet49, Court of Justice | Pre-ticked boxes are not consent; ePrivacy consent covers non-personal data too |
| May 4, 2020 | European Data Protection Board adopts Guidelines 05/2020 | Scrolling is not consent; cookie walls are not freely given |
| Oct 13, 2021 | FTC Notices of Penalty Offenses on endorsements | Over 700 companies put on notice; ceiling $43,792 per violation |
| Oct 2024 | Guidelines 2/2023, version 2.0 | Tracking links fall under Article 5(3), with affiliate marketing as the example |
| Jan 17, 2025 | FTC inflation adjustment | Ceiling rises to $53,088 per violation |
| Sep 3, 2025 | [Latombe v Commission](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:62023TJ0553), General Court | EU-US Data Privacy Framework challenge dismissed |
| Nov 19, 2025 | Digital Omnibus proposal, [COM(2025) 837](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:52025PC0837) | Would move device-access consent into GDPR Article 88a; I found no confirmation it has been adopted |
| Sep 15, 2026 | FTC notice | Penalty amounts stay at 2025 levels for 2026 |
*Sources: EUR-Lex, the EDPB, the FTC and the Federal Register.*
### What TrackRev handles and what stays with you
TrackRev's click redirect records each click on the server, appends a visitor ID as a `_vid` parameter and, for a browser with none, sets a 1-year `vid` cookie. None of that waits for consent, and partner referral links use the same redirect, so show it to your lawyer with the Board's paragraphs above if you serve EU visitors. I can't tell you it is exempt.
With `data-requires-consent="true"` on its script tag, the pixel holds its cookie and events until your consent tool calls `window.trk.grantConsent()`. TrackRev shows no banner, so you need a consent management platform.
The privacy policy names you as controller and TrackRev as processor and puts workspace data in the US on AWS us-east-1, and the security page offers a data processing agreement on request, so read the agreement's transfer terms before you rely on it for EU traffic.
In TrackRev's [Affiliate Program](https://www.trackrev.io/solutions/affiliate-program), each program can review applicants: the apply form asks "Where will you promote?" and you approve or reject before the link works. TrackRev does not scan partner content for disclosures or store your partner terms. Affiliate programs need a paid plan, from Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)), and the free plan covers link tracking only.
### Partner terms that carry these rules
Your lawyer drafts the wording. [How to create an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) cover commission and payouts.
| Clause | Starting setting |
| --- | --- |
| Disclosure | Beside every link and inside every video, under the audience's local law |
| Takedown | Fix flagged content within 7 days |
| Email | No unsolicited commercial email; CAN-SPAM label, address and opt-out on each message |
| Data | No personal data in link parameters, no partner scripts on your pages |
| Breach | Commission on affected sales is forfeited ([refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers reversals) |
| Exit | Links down within 7 days; content monitored for 3 months after |
*Starting points for a lawyer to adapt.*
### A quarterly audit of partner content
The FTC sets no schedule, so set your own. The figures below are my own starting values for a program with 60 active partners.
| Step | What you do | Example with 60 partners |
| --- | --- | --- |
| Sample | Top earners plus a few at random | 10 partners, about 17% of the 60 |
| Collect | Each partner's 3 highest-traffic posts, videos or newsletters | 30 items |
| Check | A plain disclosure beside the link or inside the video, screenshotted | 5 minutes each, 150 minutes in all |
| Act | A fix within 7 days; removal after a repeat | Re-check each fix after 14 days |
| Record | Address, date, screenshot, result and action | Keep it for the contract plus 3 months |
*Keep the log with each partner's accepted terms version, your onboarding guidance, consent platform records and signed processor agreements.*
### Frequently asked questions
**Does my site-wide cookie banner cover partner tracking?**
Yes, if it offers marketing cookies as a separate choice and partner tracking waits for a yes. Tracking first with an opt-out later fails Article 4(11) and recital 32.
**Is a cookie on my own domain exempt from consent?**
No. Article 5(3) covers anything stored on or read from the device, and the strictly necessary exemption covers a service the visitor requested. The Board says each case turns on its facts (Guidelines 2/2023, paragraph 56).
**Who is liable if a partner doesn't disclose?**
Possibly both. 16 CFR 255.1(d) makes the advertiser liable for an undisclosed material connection. The Q&A says the FTC's focus is usually the advertiser, though it may also pursue an endorser who ignores warnings. Logged guidance and checks show good faith.
**Do I need a data processing agreement with my affiliate software?**
Yes, when it handles personal data for you. Article 28(3) requires a contract that sets out what the processor may do, and Article 28(2) requires your authorization before it engages a sub-processor.
**Do customer referral programs need disclosure too?**
Yes, when customers are rewarded for recommending you in public. 16 CFR 255.5 counts payment, discounts and prizes as connections, so the referrer's post needs a short note about the reward.
**Do these rules apply to partners outside the US?**
US law reaches overseas posts that foreseeably affect US consumers (Disclosures 101), and the UK, France and Germany apply their own regulators' rules.
---
## How to handle an affiliate refund clawback
URL: https://www.trackrev.io/blog/affiliate-refund-clawback-handling
Published: 2026-07-11
Author: Muzahid Maruf
Void a commission that is unpaid, net a paid one against the next payout. Covers a 21-day hold, partial refunds, $15 Stripe disputes and replayed webhooks.
An affiliate refund clawback takes back a commission when the sale behind it is refunded. A $100 sale at 30% earns the partner $30. If the $30 is unpaid, void it and the partner never sees it. If you already paid it, record a negative balance and deduct it from the partner's following payout instead of asking for cash back. A hold at least as long as your 14-day or 30-day refund window keeps most refunds in the first case, and because [card networks typically allow disputes for 120 days](https://docs.stripe.com/disputes/how-disputes-work), you still need a plan for the rest.
> **Key takeaways:**
>
> - Void a commission that is unpaid. Once it is paid, net it against the next payout: a partner who earned $600 and owes $180 receives $420.
> - Set the hold to your refund guarantee plus 7 days, and expect card disputes to arrive up to 120 days after the payment anyway.
> - An uncontested $49 dispute costs $64 with the $15.00 fee, or $78.70 if a 30% commission stays paid, so reverse when the dispute opens.
### What an affiliate refund clawback does at each stage of a commission
Take that $100 sale with a 14-day money-back guarantee, a 21-day hold and a monthly payout on day 30.
| Day | Where the $30 sits | What a refund or dispute does |
| --- | --- | --- |
| 0 to 14 | Pending, while the customer can still ask for a refund | Void the $30, because nothing was paid |
| 15 to 20 | Pending, in the 7 extra days of the 21-day hold | Void it, which covers refunds approved late |
| 21 to 29 | Payable, waiting for the day 30 batch | Pull the $30 from the batch before you export it |
| 30 | Paid in the monthly batch | Record -$30 and net it against the next payout |
| 31 to 120 | Paid, with the 120-day dispute window still open | Same netting, usually triggered by a dispute |
| After 120 | Paid, past the usual dispute window | Usually only a refund you grant reverses it |
*A recommended policy, not an industry standard.*
### Which billing events should trigger a reversal
| Processor | Refund events | What to check before reversing |
| --- | --- | --- |
| [Stripe](https://docs.stripe.com/refunds) | `charge.refunded`, `refund.created` | `refund.created` fires when the refund is created, and the customer sees the credit about 5 to 10 business days later. A refund the bank rejects sends `refund.failed`, and the money can take up to 30 days to return to your balance |
| [Paddle Billing](https://developer.paddle.com/webhooks/adjustments/adjustment-updated) | `adjustment.created`, `adjustment.updated` | Live refunds start as `pending_approval` unless [Paddle approves them automatically](https://developer.paddle.com/build/transactions/create-transaction-adjustments), which needs a verified account, a refund of 400 USD or less, and a payment method other than bank transfer |
| [Lemon Squeezy](https://docs.lemonsqueezy.com/help/webhooks/event-types) | `order_refunded`, `subscription_payment_refunded` | The second carries the subscription invoice, so it maps to one renewal's commission |
| [Polar](https://polar.sh/docs/api-reference/webhooks/refund.created) | `refund.created`, `refund.updated` | `refund.created` fires regardless of status, so wait for the refund to go through |
*Event names from each vendor's webhook documentation, checked October 2026.*
### Partial refunds and several refunds on one charge
Stripe allows several refunds against one charge, up to the original amount, and each one fires its own event. On the $100 charge above, the partner's $30 reverses in proportion.
| Refund | Returned to customer | Reversal at 30% | Reversed so far | Commission left |
| --- | --- | --- | --- | --- |
| First partial refund | $40 | $12 | $12 | $18 |
| Second partial refund | $60 | $18 | $30 | $0 |
Tie each reversal to the refund ID, because a charge-level check drops the second refund as a duplicate. Reverse the amount you credited, since rates change between a sale and its refund. On a recurring Stripe Billing subscription, a refund on invoice 3 leaves invoices 1 and 2 alone. Upgrades and proration credits are in [affiliate commissions on Stripe refunds, upgrades and downgrades](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades), and renewals in [affiliate tracking for recurring subscriptions](https://www.trackrev.io/blog/affiliate-tracking-subscriptions-recurring).
### Choosing the hold period and the reversal window
The hold keeps a commission unpayable, and the reversal window is how long a refund or dispute can still reach it. I would set the hold to the refund guarantee plus 7 days, to cover refunds that are approved late.
| Refund guarantee | Hold |
| --- | --- |
| 7 days | 14 days |
| 14 days | 21 days |
| 30 days | 37 days |
| 60 days | 67 days |
| 90 days | 97 days |
| Program | Wait before a commission can be paid |
| --- | --- |
| [Fathom](https://usefathom.com/affiliates) | 30 days, then a $200 minimum by Wise or $20 as account credit |
| [HubSpot](https://www.hubspot.com/partners/affiliates/resource-center/frequently-asked-questions), monthly plan | 30 days plus the rest of that month, paid within 2 months |
| HubSpot, annual plan | 60 days plus the rest of that month, paid within 3 months |
| [Rewardful Help Center](https://help.rewardful.com/en/articles/14148863-campaign-settings-overview) | Set per campaign, and Rewardful recommends matching your refund policy |
| TrackRev | 0 to 180 days per program, default 0 |
A hold of the full 120 days would make partners wait 4 months for a first payout. The hold handles refunds, and the negative-balance rule handles disputes and the pro-rata refund an annual customer can get 6 months in.
### Recovering a commission you already paid
Record the reversal as a negative ledger entry, deducted from the following payout with a line item naming the refunded sale. Test the minimum after the offset, so a partner who earned $60 and owes $30 rolls over under a $50 minimum.
| Partner | Earned this month | Owed from refunds | Net | Paid at a $50 minimum | Carried forward |
| --- | --- | --- | --- | --- | --- |
| Healthy partner | $600 | $180 | $420 | $420 | $0 |
| Small partner | $60 | $30 | $30 | $0 | $30 |
| Partner who stopped | $40 | $180 | -$140 | $0 | -$140 |
- Ask for money back only from a partner you are terminating or whose own fraud caused the refund. Chasing $40 abroad costs more than $40.
- Set a carry-forward limit such as 90 days, then write the balance off, as with the partner above sitting at -$140.
- Put partners with a refund rate well above average on a rolling reserve, such as 10% of each payout until the 120-day dispute window closes.
Put the rules in the partner terms before the first sale, or the clawback becomes a dispute you start yourself. [How to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers payouts and tax forms.
### Reversing commissions on chargebacks and disputes
You cannot refund a charge outside the dispute process while a dispute is open, and the cardholder's bank decides the outcome.
| Step | Typical time or cost |
| --- | --- |
| Cardholder files the dispute | Within 120 days of the payment, longer in some cases |
| You respond to the issuer | 7 to 21 days, depending on the network |
| Issuer reviews your evidence | 60 to 75 days |
| Whole lifecycle | 2 to 3 months |
| Early fraud warning from Visa or Mastercard | About 40% become fraud disputes when the charge is not refunded |
| Dispute countered fee | $15.00 when you respond manually, returned only if you win |
| Dispute received fee | [$15.00 in the US](https://stripe.com/pricing), debited with the disputed amount and not returned even when you win |
*From Stripe's dispute documentation and pricing page, October 2026.*
A $49 plan at 30% commission pays the partner $14.70.
| Outcome | What you lose | Total |
| --- | --- | --- |
| Not contested, commission left paid | $49 sale, $15.00 fee, $14.70 commission | $78.70 |
| Not contested, commission reversed | $49 sale, $15.00 fee | $64.00 |
| Won, commission restored | $15.00 fee | $15.00 |
Reverse on `charge.dispute.created`, restore the commission if `charge.dispute.closed` reports a win, and leave it reversed on a loss, which can arrive 2 to 3 months later. Paddle's `chargeback_warning`, `chargeback` and `chargeback_reverse` adjustments follow the same cycle. Several disputes behind one partner suggest [self-referral](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) or [attribution fraud](https://www.trackrev.io/blog/affiliate-attribution-fraud-prevention).
> **A refund and a dispute can hit the same charge:** If a customer disputes a charge while your refund is pending, Stripe fails the refund with `charge_for_pending_refund_disputed`. Cap total reversals per charge at the commission you credited, $30 on the first sale above, so the refund and the dispute never reverse one sale twice.
### Making reversals safe to replay
Stripe says an endpoint might [receive the same event more than once](https://docs.stripe.com/webhooks) and does not guarantee delivery order. A unique constraint on the refund ID stops the second insert, where a read-then-write check can pass twice. A refund that arrives before its charge is recorded should trigger an API fetch of the charge.
| Replay path | How long after the event |
| --- | --- |
| Automatic retries, live mode | Up to 3 days |
| Resend from the Stripe Dashboard | Up to 15 days |
| Resend with the Stripe CLI | Up to 30 days |
| Sandbox retries | 3 attempts over a few hours |
Postgres: one reversal per refund ID
```
create table commission_reversals (
id bigserial primary key,
commission_id bigint not null references commissions (id),
refund_id text not null, -- Stripe re_..., or the dispute ID
amount_cents integer not null check (amount_cents > 0),
created_at timestamptz not null default now(),
unique (refund_id)
);
-- A replayed event inserts nothing, so the handler can stop.
insert into commission_reversals (commission_id, refund_id, amount_cents)
values ($1, $2, $3)
on conflict (refund_id) do nothing
returning id;
```
#### Edit the original row or append a negative one
FirstPromoter's [refund endpoint](https://docs.firstpromoter.com/api-reference-v2/api-admin/tracking-api/refund) appends negative commissions, requires an event ID to avoid duplicates, and rejects one that already exists.
| Ledger design | After a $30 commission and a $12 refund | Paid, then refunded |
| --- | --- | --- |
| Edit the original row | One row, amount changed from $30 to $18 | Needs a separate balance |
| Append a negative row | Two rows, +$30 and -$12, balance $18 | The balance goes negative by itself |
### How TrackRev reverses commissions
TrackRev writes a commission against each order, and each renewal earns its own. When Stripe, Paddle, Polar or Lemon Squeezy reports a charge as refunded, TrackRev marks the order and every commission it produced as refunded, at each level of a Partner Accelerator chain.
| Situation | What TrackRev does |
| --- | --- |
| Stripe refund of any size | Reverses the sale's whole commission, with no proration for partial refunds |
| Commission already paid | Marked refunded, with no negative balance, so you deduct it by hand from a later payout |
| Dispute or chargeback | No Stripe dispute events are read, so reverse the commission by hand |
| Hold period | 0 to 180 days per program, default 0 |
| Plan needed | Starter at $39 a month, which tracks up to $10K of commission a month; Free covers link tracking only |
See [pricing](https://www.trackrev.io/pricing) and the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program).
### Frequently asked questions
**What is an affiliate clawback?**
A clawback recovers commission a partner earned on a sale that was later refunded, disputed or charged back, such as the $30 on a refunded $100 sale. Before payout it is a void. After payout it needs a rule in the partner terms.
**Can I take back commission I already paid?**
Only as far as your partner agreement allows. Put the netting rule and a carry-forward limit, such as 90 days, in writing before the first sale and have a lawyer check it.
**What if the refund fails after I reversed the commission?**
Stripe sends refund.failed, and the money can take up to 30 days to return to your balance. If you refund the customer another way, keep the reversal. If they never get their money back, restore the commission.
**Does a downgrade trigger a clawback?**
Only with a refund or credit. With pro-rata reversal, a $20 refund on a 30% program takes back $6, while a downgrade that returns no money just lowers later commissions.
**Should an early fraud warning reverse a commission?**
No, because it is not a chargeback yet. Hold a new partner's commission if the sale looks odd, and reverse when a dispute opens or you refund.
**Does TrackRev reverse commissions on refunds?**
Yes for refunds, on any paid plan from Starter at $39 a month. Disputes are reversed by hand. The Free plan covers link tracking only.
---
## Affiliate tracking explained: how a link click becomes a commission
URL: https://www.trackrev.io/blog/affiliate-tracking-how-it-works
Published: 2026-07-06
Author: Muzahid Maruf
Affiliate tracking connects a partner's link click to a paid sale. 6 handoffs, 4 methods and 10 checks show how links and cookies work and where each leaks.
Affiliate tracking records which partner's link a customer clicked and credits that partner when the customer pays. The merchant's server logs the click and sets a visitor ID cookie, and a Stripe webhook later matches the payment back to that visitor. 6 handoffs sit between click and commission, and a failure at any one, from an Apple Safari cookie rule to a missing Stripe Checkout field, files the sale under direct.
> **Key takeaways:**
>
> - 6 handoffs connect a click to a commission, and a failure at any one files the sale under direct.
> - Safari 12.1 capped script-written cookies at 7 days in 2019. Save the visitor ID at signup so no cookie has to survive until the first payment.
> - Stripe takes the ID in client_reference_id (200 characters) or metadata (500-character values). Without one of them the webhook has nothing to match.
### What an affiliate link means
An affiliate link is an ordinary web address with a partner ID attached, such as `?ref=jane`, `go.acme.com/jane` or the tagged link formats that [Amazon Associates' operating agreement](https://affiliate-program.amazon.com/help/operating/agreement) requires. The merchant's system must read the ID, store it and match it to a payment days or weeks later. The [Federal Trade Commission's Endorsement Guides Q&A](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) describes the partner's side: link to a retailer, earn a commission when a reader buys.
### How affiliate tracking works, from click to commission
| Step | What happens | What gets recorded |
| --- | --- | --- |
| 1 | A click on `go.acme.com/jane` reaches a redirect on the merchant's domain | Partner, from the slug |
| 2 | The server logs the click and marks bots so they earn no credit | Partner, timestamp, user agent, referrer, visitor ID |
| 3 | The server answers 302 with a Set-Cookie header, often with Max-Age=31536000 | Visitor ID in a cookie, often in the URL too |
| 4 | Signup saves the ID, and payment creation writes it onto the Stripe Checkout Session | User record; `client_reference_id` (200 characters) |
| 5 | Stripe sends `checkout.session.completed`, then `invoice.paid` per invoice | Charge amount and ID at the webhook endpoint |
| 6 | A matching job finds the click, applies the credit rule and the rate | Ledger row; a refund writes the reversal |
#### A referral that pays on day 41
Take a partner named Jane on a 30% recurring commission and a $49 monthly plan (illustrative numbers). A visitor clicks her link on a Tuesday, signs up 5 days later and makes the first payment 41 days after the click.
| Day | Event | What the match uses |
| --- | --- | --- |
| 0 | Click on go.acme.com/jane | Click row and visitor ID from the redirect |
| 5 | Signup with a new email | ID copied to the user record beside the email |
| 41 | First payment, $49 | ID on the Checkout Session; the click is 41 days old |
| 71 | Second payment, $49 | Renewal inherits the first payment's credit |
A 30-day cookie window would have closed 11 days before the first payment, and the sale would be filed as direct. With a 60-day window the first payment earns Jane $14.70 ($49 × 0.30), and a customer who stays 12 months earns her 12 × $14.70 = $176.40. Lose the ID at day 41 and all $176.40 goes with it.
### 4 ways to track a referral
| Method | Matched on | Typical gap |
| --- | --- | --- |
| Link and cookie | Visitor ID in a cookie | Safari deletes script-written copies after 7 days |
| [Coupon code](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) | Personal code on the discount | The customer has to type it, and a shared code credits 0 partners |
| [Postback](https://www.trackrev.io/blog/postback-url-vs-pixel-tracking-affiliate) | Click ID from a network | 1 call per sale to the network, plus development work to carry the ID to payment |
| Email match | Email saved at signup | Buyer pays with a different address |
### Which partner gets the credit
Say a visitor clicks 3 partners' links (A on day 1, B on day 10, C on day 20) and pays $49 on day 21. The credit rule decides who earns the 30% commission, and the [attribution models comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) has the trade-offs.
| Rule | Who is credited | Commission on $49 at 30% |
| --- | --- | --- |
| Last click | Partner C | $14.70 to C |
| First click | Partner A | $14.70 to A |
| Shared | A, B and C equally | $4.90 each |
### How to use an affiliate link as a partner
Use the link exactly as the partner dashboard issues it, since a shortener or an edited ID can drop it, and check in a private window that the landing address still carries the ID. Audio and print have nothing to click, so ask for a personal coupon code. Under the Federal Trade Commission's Endorsement Guides the commission should be disclosed close to the recommendation, and "affiliate link" alone may not be understood; see the [compliance guide](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr).
### Where affiliate tracking breaks
Browser rules are the first place to look. [Statcounter's September 2026 data](https://gs.statcounter.com/browser-market-share/mobile/united-states-of-america) puts Safari at 46.38% of US mobile browser use, 1.06 points behind Chrome's 47.44%.
| Rule | Version and announcement date | Effect on a partner cookie |
| --- | --- | --- |
| Script-cookie cap | Apple Safari 12.1 and iOS 12.2, Feb 21, 2019 (Intelligent Tracking Prevention 2.1) | Cookies created through document.cookie get a 7-day expiry cap |
| Link-decoration cap | iOS 12.3 and macOS 10.14.5, Apr 24, 2019 (ITP 2.2) | 1 day, when a classified tracker sent the visitor and the URL has a query string or fragment |
| Third-party block | Safari 13.1 and iOS 13.4, Mar 24, 2020 | Cookies for cross-site resources are blocked by default |
| Partitioning | Mozilla Firefox 86 (Strict mode), 90 (private windows), 103 (all users) | Cookies are keyed to the top-level site, so a network's cookie does not follow the visitor between merchants |
*Sources: WebKit's [ITP 2.1](https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/), [ITP 2.2](https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/) and [Safari 13.1](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) posts, and MDN's [State Partitioning](https://developer.mozilla.org/en-US/docs/Web/Privacy/Guides/State_Partitioning) page.*
[WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) now words the 7-day rule as deletion after 7 days without user interaction. A cookie your own server sets in a Set-Cookie header sits outside it, and the click row in your own database is untouched by browser rules. In [MDN's Set-Cookie reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie) Max-Age counts seconds, so the 31536000 below is 365 days.
A redirect response that records the visitor ID
```
HTTP/1.1 302 Found
Location: https://acme.com/pricing?_vid=3f6c9a52-81d4-4c0e-9a77-5b2f1de0a4c8
Set-Cookie: vid=3f6c9a52-81d4-4c0e-9a77-5b2f1de0a4c8; Max-Age=31536000; Domain=acme.com; Path=/; Secure; SameSite=Lax
```
#### Cookies that miss the checkout
A cookie set on `www.acme.com` with no Domain attribute is readable only on that host. `Domain=acme.com` shares it with `app.acme.com`, but a Stripe-hosted checkout usually sits on another registrable domain, so the ID must travel in the request. Stripe offers 3 places to put it.
| Field | Limit | Where it comes back |
| --- | --- | --- |
| [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create) `client_reference_id` | 200 characters | `checkout.session.completed` |
| [Metadata](https://docs.stripe.com/api/metadata) on a Stripe object | 50 keys, 40-character keys, 500-character values | Events for that object |
| [Payment Link](https://docs.stripe.com/payment-links/url-parameters) URL parameter | 200 characters of letters, digits, - and _ | The same event |
*A Payment Link silently drops an invalid value, so a UUID passes and an ID with a dot or an @ vanishes without an error.*
#### Windows shorter than the sales cycle
TrackRev's program setup proposes 60 days and accepts 1 to 3,650. Choose yours from data: pull the last 100 paying customers, compute the days from first partner click to first payment, and set the window just past the 90th percentile. If 90 of the 100 paid within 62 days, 75 days covers them with margin, while 365 days starts crediting clicks that played no part in the decision.
#### Webhooks and renewals
[Stripe's webhook documentation](https://docs.stripe.com/webhooks) sets the rules. [invoice.paid fires on every successful invoice](https://docs.stripe.com/billing/subscriptions/webhooks), so a handler that listens only for checkout.session.completed pays a partner once and misses each renewal, as the [subscription tracking guide](https://www.trackrev.io/blog/affiliate-tracking-subscriptions-recurring) explains.
| Rule | Value |
| --- | --- |
| Live-mode retries | Up to 3 days, with exponential backoff |
| Sandbox retries | 3 over a few hours |
| Manual resend | 15 days from the Stripe Dashboard, 30 days with the Stripe CLI |
| Ordering | Not guaranteed; dedupe on the event ID |
| Response | A 2xx before any slow work |
### 10 checks to run on your own tracking
| Check | Pass condition | If it fails |
| --- | --- | --- |
| 1. Fresh Safari window, your partner link | A visitor cookie is set; read its expiry in the Storage tab | A script-written cookie falls under the 7-day rule, so set it from the redirect and save the ID at signup |
| 2. Google Chrome with uBlock Origin on | The cookie is still set | A filter list matches your redirect or script host; serve it from your own domain |
| 3. Landing address after the redirect | The ID is still in the URL | A shortener or click wrapper dropped it; use a path slug |
| 4. `curl -I` on the link | 1 hop, a 302, before the landing page | Each extra hop is another place to lose the ID |
| 5. Stripe test card 4242 4242 4242 4242 | The Checkout Session shows the ID in `client_reference_id` or metadata | The field is missing, or a Payment Link dropped an invalid value |
| 6. Event deliveries for that payment | A 200 within seconds | The endpoint is failing; see the retry rules above |
| 7. Phone click, then laptop signup and payment with 1 email | The sale reaches the partner | A cookie belongs to 1 browser, so match on the signup email |
| 8. Refund the test payment | The commission reverses | Refunds are not reaching the ledger |
| 9. Last 30 days of partner-referred charges | Count those carrying a visitor ID | Organic signups carry none, so judge only the referred set |
| 10. Click counts from your 3 biggest partners | Close to your own log | More clicks on their side point upstream, at a blocked script or stripped parameter; equal clicks with missing sales point downstream, at the cookie, the payment field or the webhook |
### What TrackRev does for affiliate tracking
Each partner link is a server-side redirect on a TrackRev domain or a custom tracking domain with 1 CNAME record. It logs the click, flags bots, sets the `vid` cookie for 365 days and passes the ID to your page as `_vid`. A pixel on your site tags Stripe Payment Links, Buy Buttons and pricing tables. At payment it reads the ID from charge metadata, then the Checkout Session, then the customer's email if your site called `trk.identify(email)`. The pixel's cookie is written by JavaScript, so Safari's 7-day rule applies to it; the click log stays on the server.
One workspace-wide rule sets credit (last click, first click or shared). Each program sets its own cookie window and can hold commission for 0 to 180 days, with 0 the default. Personal coupon codes credit partners who can't use links, and refunded or disputed charges take their commission back out.
| Plan | Price | Affiliate program | Commission tracked a month |
| --- | --- | --- | --- |
| Free | $0 | Locked; link tracking only, with 50 links and 1,000 events a month | None |
| Starter | $39 a month | Unlocked, 1 workspace | Up to $10K |
| Growth | $99 a month | Unlocked, unlimited workspaces | Up to $100K |
| Scale | $199 a month | Unlocked, unlimited workspaces, priority support | Unlimited |
*From the [pricing page](https://www.trackrev.io/pricing). Annual billing pays for 9 months and gives 12.*
Skip TrackRev if an affiliate network's contract makes its pixel the record for disputes. It reads revenue from Stripe, Polar, Lemon Squeezy and Paddle. The 8-step build is in [affiliate tracking without third-party cookies](https://www.trackrev.io/blog/affiliate-tracking-without-third-party-cookies), and the [affiliate program](https://www.trackrev.io/solutions/affiliate-program) page covers links and payouts.
### Frequently asked questions
**What does an affiliate link look like?**
A normal URL plus a partner ID, such as acme.com/pricing?ref=jane. The visitor sees the same page, and only the merchant's click log shows the visit came from Jane.
**Does an affiliate link cost the buyer more?**
No. A $49 plan costs $49 through Jane's link, and her 30% commission of $14.70 comes from the merchant's revenue. Only a coupon changes the price.
**How long does an affiliate cookie last?**
As long as the program sets it, up to the browser's limits. TrackRev's setup form starts at 60 days and accepts up to 3,650, and Safari can delete a script-written copy after 7 days.
**Why does my dashboard show clicks but no sales?**
Open 1 test payment in Stripe, look for the visitor ID in client_reference_id or metadata, then check its webhook delivery for a 200.
**Do I need a developer to set up affiliate tracking?**
For link tracking, no: click capture needs no script. Revenue matching adds 1 pixel tag, and a Checkout Session from your own backend needs 1 line passing client_reference_id.
**What happens to a commission when the customer gets a refund?**
In TrackRev a refunded or disputed charge takes its commission back out, and a hold of 0 to 180 days per program keeps new commission pending until your refund window passes.
---
## Affiliate tracking for subscriptions: paying partners on every renewal
URL: https://www.trackrev.io/blog/affiliate-tracking-subscriptions-recurring
Published: 2026-07-11
Author: Muzahid Maruf
How to credit a partner on every renewal: where to store the referral, which of 4 commission terms to pick, and how a 14-day trial changes attribution.
Affiliate tracking for subscriptions means crediting a partner on the first paid invoice and paying that partner on later invoices for as long as your terms say. A $49 monthly plan produces 12 invoices a year, so a tool that credits only invoice 1 pays a 30% partner $14.70 of a possible $176.40. Stripe Billing creates each renewal on a schedule with no browser involved, so the partner has to be saved where a renewal can read it. Refunds and plan changes have their own guide to [Stripe affiliate commissions on refunds, upgrades and downgrades](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades).
> **Key takeaways:**
>
> - Checkout puts data on the subscription only through subscription_data.metadata, and each Stripe object holds 50 key-value pairs.
> - At 5% monthly churn, 30% of a $49 plan pays $14.70 on a first-payment term, $135.13 over 12 months and $294.00 for life.
> - Count the term in months: a $490 annual plan pays $147.00 once under a 12-month rule, and $147.00 every year under a payment count.
> - A 14-day trial after a 20-day click-to-signup gap puts the first charge on day 34, outside a 30-day attribution window.
> - TrackRev copies the first order's credit onto each renewal, writes one commission per paid charge, reverses each on its own and holds payouts for 0 to 180 days per program.
### How affiliate tracking for subscriptions follows each billing event
| Moment | Stripe event | Money moved on a $49 plan | What the commission system does |
| --- | --- | --- | --- |
| Trial starts | `customer.subscription.created`, status `trialing` | $0 | Nothing is owed |
| 3 days before the trial ends | `customer.subscription.trial_will_end` | $0 | Confirm the partner is saved on the subscription |
| First payment | `invoice.paid` | $49.00 | Create the first commission and save the partner against the subscription |
| Renewal paid | `invoice.paid` on the same subscription | $49.00 | Look up the partner and commission the invoice if the terms still apply |
| Renewal fails | `invoice.payment_failed` | $0 | Nothing is owed until a retry succeeds |
| Refund or dispute | `charge.refunded`, `charge.dispute.created` | -$49.00 | Reverse the commission on that one charge |
| Customer cancels | `customer.subscription.deleted` | $0 | Stop new commissions and keep paid ones |
| Customer returns | A new subscription with a new ID | $49.00 | Apply your resubscription rule |
*Event names and timing from Stripe's [subscription webhook guide](https://docs.stripe.com/billing/subscriptions/webhooks).*
Stripe's guide uses `invoice.paid` to extend access and says to confirm the subscription is `active` first, since a paid invoice does not always move it there. Live-mode webhook retries run for up to 3 days, and TrackRev's hourly charge read covers anything a delivery missed. FirstPromoter's Stripe documentation lists 7 tracked events, among them `invoice.payment_succeeded` for sales and `charge.dispute.created` for refunds.
Finding the subscription behind a refund depends on the API version. Before 2025-03-31.basil the Charge object has an invoice field, and from that version on you go from the PaymentIntent to its invoice payments. TrackRev requests 2025-02-24.acacia.
#### A referred customer across five invoices
A $49 monthly plan, a 30% commission, a program that pays on every renewal and a 14-day trial before invoice 1. Each invoice is its own commission row, so the refund on invoice 4 takes back $14.70 and leaves four commissions in place.
| Invoice | What happened | Amount kept | Commission at 30% |
| --- | --- | --- | --- |
| 1 | First payment after the trial | $49.00 | $14.70 |
| 2 | Renewal paid on time | $49.00 | $14.70 |
| 3 | Card declined, retry succeeded 3 days later | $49.00 | $14.70 |
| 4 | Paid, then refunded in full | $0.00 | $0.00 (reversed) |
| 5 | Renewal paid on time | $49.00 | $14.70 |
| Total | 5 invoices, 4 kept | $196.00 | $58.80 |
### Where the partner is stored so a renewal can find it
| Storage | How the partner gets there | Reaches renewals |
| --- | --- | --- |
| Subscription metadata | `subscription_data.metadata` on the Checkout Session | Yes, copied onto each invoice when Stripe creates it |
| Customer metadata | Your code or the affiliate tool writes a key such as `referral`, which Rewardful reads | Yes, for every subscription the customer holds |
| The tool's subscription record | The tool saves the first order and click against the subscription ID | Yes, copied to each later charge |
| Promotion code | The customer enters the partner's code at checkout | Only while the coupon stays on the invoice |
*Rewardful's [Stripe integration article](https://help.rewardful.com/en/articles/2213091-how-does-rewardful-use-my-stripe-account) describes the customer-metadata approach. Customer-level credit follows that person into a second product, so state your rule.*
#### Subscription metadata
Stripe's [metadata guide](https://docs.stripe.com/metadata) says metadata does not copy to related objects on its own, with a few exceptions such as a snapshot from subscription to each new invoice. Checkout reaches the subscription through `subscription_data.metadata`, while the Session's own `metadata` stays on the Session. Each object holds 50 key-value pairs, with 40-character keys and 500-character values.
Node: save the partner on the subscription at checkout
```
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_monthly_49", quantity: 1 }],
client_reference_id: visitorId, // your first-party visitor ID
subscription_data: {
trial_period_days: 14,
metadata: { partner_id: partnerId }, // lands on the subscription
},
success_url: "https://example.com/welcome",
});
```
Set it before the customer pays: later changes do not rewrite invoices Stripe has already created, so a partner added after invoice 1 is missing from invoice 1. [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) covers the other objects that carry a source.
#### Promotion codes
A code credits partners with no link to share, such as a podcast host. A tool that reads the code from each invoice, as TrackRev does, sees the partner only while Stripe's [coupon duration](https://docs.stripe.com/api/coupons/object) keeps it there. The [coupon code tracking guide](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) covers matching.
| Coupon duration | Invoices that show the code | Most a code-only partner earns, $49 plan at 30% |
| --- | --- | --- |
| `once` | The first charge | $14.70 |
| `repeating`, `duration_in_months` of 3 | The first 3 months | $44.10 |
| `forever` | Every charge | $14.70 a month |
*Churn ignored. A partner who also has a tracked link click is covered by the stored credit.*
### Choosing a commission model
Rewardful's [campaign settings article](https://help.rewardful.com/en/articles/14148863-campaign-settings-overview) (dated March 21, 2026) sets a maximum number of commissioned payments and a maximum period in months, and stops at the first limit reached: with 3 payments and 12 months, a fourth payment inside those 12 months earns nothing. FirstPromoter's [recurring commissions article](https://help.firstpromoter.com/en/articles/8971339-recurring-commissions-and-monetary-rewards) (dated July 16, 2026) offers customer lifetime, a time span in months or a count of charges, where 1 pays the first charge only, plus a second rate after the first charge such as 20% then 30%.
On a $49 monthly plan at 30%, a referred customer earns a partner anywhere from $14.70 to $490.00, depending on the term and the monthly churn rate.
| Term | 3% churn | 5% churn | 8% churn |
| --- | --- | --- | --- |
| First payment only | $14.70 | $14.70 | $14.70 |
| First 3 payments | $42.79 | $41.93 | $40.67 |
| First 12 months | $150.02 | $135.13 | $116.19 |
| Lifetime | $490.00 | $294.00 | $183.75 |
*Payout is $14.70 x (1 - (1 - c)^n) / c for n payments at monthly churn c, and $14.70 / c for lifetime. The churn rates are assumptions, so substitute your own.*
At 5% churn a lifetime term pays 2.2 times what 12 months does, a $158.87 gap per referral that arrives after the partner's work is done. The multiple is 3.3 at 3% churn and 1.6 at 8%, so the better your retention, the more a lifetime promise costs. I lean toward 12 months for a new program: it is easy to explain and extend, while taking back a lifetime promise is hard.
#### Count months, not invoices
An annual plan priced at 10 times the monthly one makes a payment count and a month count disagree.
| Plan | Commission per invoice at 30% | Rule: first 12 payments | Rule: first 12 months |
| --- | --- | --- | --- |
| $49 monthly | $14.70 | $176.40 over 1 year | $176.40 |
| $490 annual | $147.00 | $1,764.00 over 12 years | $147.00 |
*Before churn and refunds.*
An annual renewal lands exactly 12 months after invoice 1, so say in writing whether that renewal counts.
### Trials, failed payments and returning customers
#### Free trials and the attribution window
Stripe Checkout accepts `trial_period_days`, and the subscription stays `trialing` until the first payment moves it to `active`. FirstPromoter's [Stripe documentation](https://docs.firstpromoter.com/integrations/billing/stripe) says it skips invoices with an `amount_paid` of zero, so commissions start at the first real payment. TrackRev's attribution window is a workspace setting, 30 days by default, counted back from the first paid charge, so it has to cover your click-to-signup gap plus the trial.
| Day | What happens | Age of the click |
| --- | --- | --- |
| 0 | Visitor clicks the partner link | 0 days |
| 20 | Visitor signs up and starts a 14-day trial | 20 days |
| 30 | A 30-day window closes | 30 days |
| 34 | Trial ends and the first $49.00 charge succeeds | 34 days, 4 past the window |
#### Failed payments
A declined renewal leaves the subscription `past_due` while Stripe retries, 8 times within 2 weeks under the [Smart Retries](https://docs.stripe.com/billing/revenue-recovery/smart-retries) default that Stripe recommends, set in the Stripe Dashboard. If recovery fails, the subscription becomes `canceled`, `unpaid`, `past_due` or `paused`, per your settings. The first invoice has less room: after 23 hours unpaid, `incomplete` becomes `incomplete_expired` and the customer is never billed. The commission waits for a paid invoice, so a retry that succeeds creates it and an invoice that never pays creates none.
#### Cancel and resubscribe
Stripe treats `canceled` as terminal, so a customer who cancels in the Stripe Customer Portal and returns gets a new subscription ID and nothing saved on the old one comes along. Set a rule up front, such as 90 days of credit for the original partner. TrackRev treats the return as a new first charge.
### How TrackRev tracks renewals
| Case | What TrackRev does |
| --- | --- |
| First paid charge | Saved as an order tagged with the Stripe subscription ID and credited to a click inside the 30-day default window |
| Renewal | Copies the first order's link and channel, rescaled to the new charge, with no cookie lookup |
| Later click on another partner's link | Changes nothing, because renewals copy the first order's credit |
| First charge with no credit | Its renewals have no credit to copy |
| Returning customer | A new first charge, credited to any tracked click inside the window |
| First-sale-only program | $0 on every renewal |
| Recurring program | One commission row per paid charge, so a refund reverses only its own charge |
| Refund of any size | That charge's commission reverses in full |
| Hold period | 0 to 180 days per program, 0 by default |
| Paddle, Polar and Lemon Squeezy | The same renewal step, keyed on the provider's subscription ID |
Set the hold past your refund window; the [clawback guide](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers refunds that arrive after a payout. If you need proportional reversal on partial refunds, pick Rewardful, which recalculates from the refunded amount. Test any payment cap with a Stripe test clock before you promise it. The [affiliate tracking guide](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) covers who owned the first sale.
The affiliate program needs a paid plan: Starter is $39 a month for up to $10K of commission tracked monthly, Growth is $99 for $100K, and Free covers link tracking only. See the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program), the [pricing page](https://www.trackrev.io/pricing) and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates).
### Frequently asked questions
**Do affiliates earn commission on subscription renewals?**
Only if the program's terms say so. Common structures pay invoice 1 only, a fixed window of months, or the customer's whole lifetime. TrackRev programs pay the first sale or every paid renewal.
**What does Stripe send before a subscription renews?**
For subscriptions charged automatically, Stripe sends invoice.upcoming a few days before the renewal, with the number of days set in the Stripe Dashboard. Subscriptions that Stripe emails as invoices do not get it.
**How long should recurring affiliate commissions last?**
At 5% monthly churn a 12-month term pays about 46% of a lifetime term, so the choice is how much of a $158.87 gap per referral you keep as margin. Whatever you pick, write it in months.
**Should the partner be saved on the Stripe subscription or the customer?**
Pick the subscription when each one is a separate deal, and the customer when a returning buyer should stay with the first partner. Stripe copies neither automatically.
**How long should the attribution window be when the product has a trial?**
Longer than your longest click-to-signup gap plus the trial. A visitor who signs up 31 days after the click and starts a 14-day trial needs a window of at least 45 days.
**Can I run recurring affiliate tracking on TrackRev's free plan?**
No. Free covers 50 links and 1,000 tracked events a month, with the affiliate program locked and revenue figures hidden. Paid plans begin at Starter, $39 a month.
---
## Affiliate tracking without third-party cookies: 8 steps for Stripe SaaS
URL: https://www.trackrev.io/blog/affiliate-tracking-without-third-party-cookies
Published: 2026-05-21
Author: Muzahid Maruf
Google kept third-party cookies in Chrome while Safari, Firefox and Brave restrict them. Build first-party affiliate tracking in 8 steps with Stripe and email.
Affiliate tracking without third-party cookies keeps the proof of each sale on systems you control: a click log on your own domain, a visitor ID in a first-party cookie, and that ID on the Stripe payment. A server matches payment to click and credits the partner. Chrome, at 66.36% of worldwide usage, still allows third-party cookies, but Safari has blocked them since March 24, 2020 and Firefox has partitioned them since version 103.
> **Key takeaways:**
>
> - No Chrome removal date exists after Google's two 2025 announcements. Safari's block dates from 2020 and Firefox's partitioning from version 103, so those buyers are the ones a cookie-dependent tracker loses.
> - Statcounter's September 2026 data gives Safari 18.27% of worldwide browser usage and 46.38% of US mobile.
> - Four pieces do the work: a redirect that logs the click, a visitor ID, a payment reference and a server job that matches them.
> - Stripe takes the ID in client_reference_id (200 characters) or metadata (50 keys, 500-character values).
> - Save the visitor ID on the user row at signup and read it from there at checkout, so a Safari visitor whose script cookie was deleted after 7 days still resolves.
### Which browsers block third-party cookies in 2026
| Date | Browser (share) | What changed |
| --- | --- | --- |
| Feb 21, 2019 | Safari (18.27%) | [Intelligent Tracking Prevention 2.1](https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/) caps persistent cookies created through document.cookie at 7 days (Safari 12.1) |
| Mar 24, 2020 | Safari (18.27%) | [Safari 13.1 blocks cookies for every cross-site resource](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) by default |
| Firefox 103 | Firefox (2.8%) | [State partitioning is on by default for all users](https://developer.mozilla.org/en-US/docs/Web/Privacy/State_Partitioning), so Firefox stores a third-party cookie separately for each top-level site |
| Default setting | Brave (not reported) | Shields [block cross-site cookie tracking](https://brave.com/privacy-features/) |
| Apr 22, 2025 | Chrome (66.36%) | Google [will not roll out a standalone prompt](https://privacysandbox.google.com/blog/privacy-sandbox-next-steps) for third-party cookies; users choose in settings, and [Incognito windows block them](https://support.google.com/chrome/answer/95464) |
| Oct 17, 2025 | Chrome (66.36%) | Chrome [maintains its current approach](https://privacysandbox.google.com/blog/update-on-plans-for-privacy-sandbox-technologies) to cookie choice, and 10 Privacy Sandbox technologies are retired, including the Attribution Reporting API |
*Shares are [Statcounter's worldwide figures](https://gs.statcounter.com/browser-market-share) for all platforms, September 2026.*
No Chrome cutoff is coming, which leaves Safari as the largest of the blockers. [Statcounter's US mobile data](https://gs.statcounter.com/browser-market-share/mobile/united-states-of-america) for September 2026 puts Safari at 46.38%, 1.06 points behind Chrome's 47.44%, with Samsung Internet at 3.28% and Firefox at 1.29%. Worldwide across all platforms, Edge holds 6.04% and Samsung Internet 2.31%. Split paying customers by browser to find your own mix.
### Why third-party cookies fail affiliate tracking and what replaces them
A network-style link such as `network.example/click?aff=123` sets a cookie on network.example and redirects to your site. A pixel on your confirmation page then fires at network.example, which matches the sale only if the browser attaches that cookie. Safari 13.1 blocks that cookie by default. Firefox 103 looks only in the jar partitioned under your site, which is empty. Content blockers can drop the pixel request too.
[WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says ITP deletes script-created cookies after 7 days without user interaction and caps response cookies at 7 days for third-party CNAME or IP address cloaking. Nothing on that page limits a cookie your server sets on your own domain, so the redirect carries the identity. The [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) has the full rule table.
### Set up affiliate tracking without third-party cookies in 8 steps
#### 1. Put partner links on a domain you control
Give each partner a link such as `go.example.com/anna`, backed by a redirect you run. If the host CNAMEs to a vendor, read the cookie's expiry in Safari after a test click, because WebKit's Intelligent Tracking Prevention caps response cookies at 7 days when it detects CNAME cloaking.
#### 2. Log the click and mint a visitor ID
The redirect writes one click row and skips bots and link-preview fetchers. It answers 302 with `_vid` on the destination URL and the ID in a 365-day cookie.
A redirect route on your own domain
```
// GET go.example.com/:partner
export async function GET(req: Request, { params }: { params: { partner: string } }) {
const ua = req.headers.get("user-agent") ?? "";
const existing = /(?:^|; )vid=([^;]+)/.exec(req.headers.get("cookie") ?? "")?.[1];
const vid = existing ?? crypto.randomUUID();
// Partner, timestamp, user agent, referrer and visitor ID in one row
if (!isBot(ua)) {
await db.clicks.insert({
vid,
partner: params.partner,
userAgent: ua,
referrer: req.headers.get("referer"),
at: new Date(),
});
}
const dest = new URL("https://example.com/pricing");
dest.searchParams.set("_vid", vid);
return new Response(null, {
status: 302,
headers: {
Location: dest.toString(),
"Set-Cookie": "vid=" + vid + "; Max-Age=31536000; Path=/; Domain=example.com; Secure; SameSite=Lax",
},
});
}
```
#### 3. Keep the ID on your own site
If the redirect shares your registrable domain, step 2's cookie is already on your site. A redirect on another domain hands over only `_vid`, so read it on the landing page and write the cookie yourself; Safari deletes script-written cookies after 7 days without interaction. Check each hop to the signup form (http to https, a trailing slash, an `/en/` prefix) for a dropped query string.
Runs on every landing page when the redirect lives on another domain
```
const vid = new URLSearchParams(location.search).get("_vid");
if (vid && !/(?:^|; )vid=/.test(document.cookie)) {
document.cookie = "vid=" + vid + "; Max-Age=31536000; Path=/; Domain=example.com; Secure; SameSite=Lax";
}
```
#### 4. Bind the ID to an email at signup
Store the visitor ID on the user row beside the email, since a script-written cookie can disappear after 7 days. An email survives a deleted cookie, a new browser and a second device, and it sits on the Stripe customer too.
In the signup handler
```
const vid = req.cookies.get("vid")?.value ?? null;
await db.users.insert({ email, vid, createdAt: new Date() });
```
#### 5. Write the ID onto the payment
Read the ID from the user row when you create the Stripe Checkout Session in your backend. A visitor whose cookie vanished on day 9 then still pays on day 16 with the ID attached. A Payment Link, Buy Button or pricing table has no backend step, so the cookie value goes into its URL parameter or attribute and the email route covers the rest.
| Checkout path | Where the ID goes | Limit |
| --- | --- | --- |
| Checkout Session from your backend | client_reference_id | 200 characters |
| Subscription created by Checkout | subscription_data.metadata | 50 keys, keys to 40 characters, values to 500 |
| Payment Link | client_reference_id URL parameter | Alphanumeric, hyphen and _ characters, up to 200 |
| Buy Button or pricing table | client-reference-id attribute | Same characters, up to 200 |
| PaymentIntent you create yourself | metadata on the PaymentIntent | Same 50, 40 and 500 limits, copied once to the Charge |
*Limits from Stripe's Checkout Sessions, Payment Links, Buy Button and pricing table documentation.*
A UUID is 36 characters, inside every limit above. Stripe's [metadata documentation](https://docs.stripe.com/metadata) lists a few exceptions and otherwise says metadata does not copy between objects, so session metadata reaches the Subscription only through `subscription_data.metadata`. The [Payment Links page](https://docs.stripe.com/payment-links/url-parameters) covers the URL parameter, the [Buy Button](https://docs.stripe.com/payment-links/buy-button) and [pricing table](https://docs.stripe.com/payments/checkout/pricing-table) pages cover the attribute, and the [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post maps every field.
A Checkout Session that carries the visitor ID from the user row
```
const user = await db.users.find(currentUserId);
const checkout = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
customer_email: user.email,
client_reference_id: user.vid,
subscription_data: { metadata: { vid: user.vid } },
success_url: "https://example.com/welcome",
cancel_url: "https://example.com/pricing",
});
```
#### 6. Match payments to clicks on the server
Listen for `checkout.session.completed`, which carries the session's client_reference_id and metadata. Look up the click by visitor ID, then by the customer's email, within 45 days of the payment (a 14-day trial plus 30 days to decide, rounded up). Copy the credit onto each renewal. The credit rule matters when a visitor clicked 3 partners, say A on day 1, B on day 10 and C on day 20, then paid $79 on day 21:
| Rule | Credited | Commission at 20% |
| --- | --- | --- |
| Last click | Partner C, $79 | $15.80 to C |
| First click | Partner A, $79 | $15.80 to A |
| Shared | A, B and C, $26.33 each | $5.27 each |
The webhook handler, after you verify Stripe's signature
```
if (event.type === "checkout.session.completed") {
const s = event.data.object;
const vid = s.client_reference_id ?? s.metadata?.vid ?? null;
const click =
(vid && (await db.clicks.latestForVisitor(vid, { withinDays: 45 }))) ||
(await db.clicks.latestForEmail(s.customer_details?.email, { withinDays: 45 }));
if (click) {
await db.commissions.createOnce({ sessionId: s.id, partner: click.partner });
}
}
```
#### 7. Cover sales that have no click
Give podcast, YouTube and Instagram partners a personal coupon code and credit the sale when it shows on the invoice, as the [coupon code tracking guide](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) describes. A code shared by all partners cannot tell them apart.
#### 8. Test in Safari, Firefox and a private window
In Stripe test mode, click a partner link in Safari on an iPhone, sign up, delete the site's cookies and pay. The click row, user row and payment should carry one visitor ID. Repeat in Firefox and Chrome Incognito, then pay once with the ID stripped to prove the email route.
### A trial that pays on day 16
The numbers here are invented for illustration. A visitor clicks a partner link in Safari on day 0. The redirect runs on a short domain, so the landing page writes the cookie with JavaScript. The visitor signs up on day 2 for a 14-day trial and pays $79 on day 16, and the partner earns 20% recurring.
| Day | Event | Script cookie in Safari | What the match uses |
| --- | --- | --- | --- |
| 0 | Click on the partner link | None yet | Click row and visitor ID from the redirect |
| 2 | Signup, trial starts | Written | Visitor ID saved on the user row with the email |
| 9 | 7 days without a visit | Deleted | Nothing changes; the user row still holds the ID |
| 16 | Trial converts, $79 charge | Absent | ID read from the user row into Stripe; email as fallback |
At 20%, the first payment earns the partner $15.80 ($79 × 0.20). A customer who stays 12 months earns 12 × $15.80 = $189.60. Without the signup bind, the day-16 payment arrives with no source and the partner loses that whole stream, since every renewal inherits the first payment's credit.
### What a first-party setup still misses
| Gap | Why it happens | Covered by |
| --- | --- | --- |
| Click on a phone, purchase on a laptop | Each browser holds its own cookie | Step 4 |
| Partner shares the bare site URL | No click reaches your redirect | Step 7 |
| A redirect drops the query string | The landing page never sees _vid | Step 3 |
| A content blocker stops your script | No script cookie and no pageview | Steps 2 and 4 |
| Visitors in regions that require consent | The [UK ICO says](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guidance-on-the-use-of-storage-and-access-technologies/what-are-the-exceptions/) online advertising storage and cross-site tracking need consent | Counsel, plus the [FTC and GDPR guide](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) |
### What TrackRev does for first-party affiliate tracking
TrackRev covers the click log, the visitor ID and the payment match; you add the `p.js` pixel and one `trk.identify(email)` call at signup. Each partner link is a [server-side redirect](https://www.trackrev.io/products/first-party-tracking) that logs the click and sends the visitor to your page with the ID in `_vid`, on a TrackRev-hosted subdomain, a custom domain with 1 CNAME record, or the shared short domain. At payment, TrackRev looks for the visitor in this order:
| Order | Where TrackRev looks |
| --- | --- |
| 1 | Charge metadata, key vid |
| 2 | Checkout Session client_reference_id |
| 3 | Checkout Session metadata, key vid |
| 4 | The customer's email, matched to the visitor bound by identify |
*The pixel adds the ID to Stripe Payment Links, Buy Buttons and pricing tables itself.*
One workspace-wide rule sets credit (last click, first click or shared) over a lookback window of 1 to 365 days, and renewals copy the first sale's credit. Coupon-code commissions run alongside, a refund reverses its commission, and each program can hold commission for 0 to 180 days, with 0 the default. With `data-requires-consent="true"` the pixel writes no cookie until your code calls `window.trk.grantConsent()`.
Partner programs need a paid plan.
| Plan | Price a month | Workspaces | Partner program | Commission tracked a month |
| --- | --- | --- | --- | --- |
| Free | $0 | 1 | Locked; link tracking only, 50 links and 1,000 events | None |
| Starter | $39 | 1 | Unlocked | Up to $10K |
| Growth | $99 | Unlimited | Unlocked | Up to $100K |
| Scale | $199 | Unlimited | Unlocked | Unlimited |
*From the [pricing page](https://www.trackrev.io/pricing); the [affiliate program](https://www.trackrev.io/solutions/affiliate-program) page covers links and payouts. Annual billing pays for 9 months and gives 12.*
Skip the switch if your current tool already writes a first-party cookie and sends the referral ID to Stripe; step 8 will tell you. A network whose contract makes its pixel the record for disputes keeps that pixel, with first-party logging beside it. TrackRev reads revenue from Stripe, Polar, Lemon Squeezy and Paddle.
### Frequently asked questions
**Did Chrome remove third-party cookies?**
No. Chrome allows them unless the person blocks them or browses in Incognito, and nothing Google announced in 2025 changed that.
**Do my partners have to change their links?**
Only if their links point at a network's click URL. Map old deep links to the new format with 301 redirects.
**Do first-party cookies need a consent banner?**
It depends on your jurisdiction and the cookie's purpose, so ask counsel before launch.
**How long should the lookback window be?**
Count the trial plus your partners' usual decision time, then round up: 14 and 30 make 44, so 45. Longer windows credit more clicks that had no effect on the sale.
**Which Stripe field should hold the visitor ID?**
Use client_reference_id (200 characters) on Checkout Sessions and Payment Links, plus subscription_data.metadata (50 keys) so the Subscription carries it too.
**Does Safari delete a cookie my own server sets?**
Not one set in a response from your own domain. The 7-day deletion targets JavaScript-written cookies, and the response-cookie cap covers cloaked third-party hosts.
---
## Affonso alternatives by the limit you are hitting
URL: https://www.trackrev.io/blog/affonso-alternative
Published: 2026-07-17
Author: Muzahid Maruf
Affonso meters partner revenue, credits the last click and reads five billing systems. Tolt, Rewardful, FirstPromoter and TrackRev compared on 2026 prices.
The best Affonso alternative depends on which of its limits you have hit. Affonso charges $15, $29 or $79 monthly when billed yearly, sized by the revenue your partners bring in each month ($1,000, $10,000 or $30,000). It pays the last affiliate to touch a customer with no way to change that, and it connects natively to five billing systems, from Stripe to Dodo Payments. Tolt, Rewardful and FirstPromoter change the meter, the billing list or the attribution rule. TrackRev changes what the program is measured against, since partner revenue sits next to every other channel.
I run TrackRev, so it gets the same checks as the other three, including where Affonso comes out ahead.
> **Key takeaways:**
>
> - Affonso's plans meter the revenue partners bring in: $1,000 on Launch ($15 monthly when billed yearly), $10,000 on Growth ($29) and $30,000 on Elite ($79), and overage costs $19 per extra $1,000.
> - Affonso credits the most recent affiliate click, and its help center says attribution logic cannot be changed. Rewardful and FirstPromoter let you choose first or last touch.
> - Billing coverage is the other split. Affonso reads five systems natively, FirstPromoter adds Chargebee, Recurly and Braintree, and TrackRev reads Lemon Squeezy.
> - A program whose partners refer $25,000 a month at a 20% commission fits Affonso Elite at $79 on yearly billing ($99 monthly) and TrackRev Starter at $39 ($29.25 yearly), because TrackRev meters the $5,000 of commission.
> - Stay on Affonso when recruiting partners or having someone else pay them is the bottleneck. Move to TrackRev when partners are one channel of several.
### What Affonso costs and how its meter works
[Affonso's pricing page](https://affonso.io/pricing) lists four plans and a 14-day free trial.
| Plan | Yearly rate | Monthly rate | Partner revenue limit | Partner groups | Discovery credits/year | Email-finder credits/year |
| --- | --- | --- | --- | --- | --- | --- |
| Launch | $15 | $19 | $1,000 | 3 | 180 | None |
| Growth | $29 | $39 | $10,000 | 5 | 420 | 600 |
| Elite | $79 | $99 | $30,000 | Unlimited | 600 | 3,000 |
*Prices a month from each vendor's pricing page, October 2026. The page shows yearly rates, and the monthly rates for Growth and Elite follow from the yearly savings it lists ($120 and $240). Enterprise starts at $149 above $30,000 and is quoted by sales.*
The limit counts [affiliate-attributed revenue](https://affonso.io/help/commissions/affiliate-revenue-cap), which is what referred customers pay you. Launch's $1,000 is $1,000 of customer payments, and the commission paid out is a fraction of that. Going over does not stop checkout. Affonso offers an upgrade or an overage of $19 for each additional $1,000, billed at the end of the cycle, and warns that new signups, commissions and tracking can pause if you do neither. At $12,000 of referred revenue, Growth bought yearly plus overage costs $29 + 2 × $19 = $67. At $13,000 it costs $86, so Elite at $79 is cheaper.
Paying by hand costs nothing extra on any plan: Affonso exports payouts for PayPal mass payments, Wise bulk payments or bank wires, and you mark them paid. [Managed payouts](https://affonso.io/help/payouts/managed-payouts-explained), where Affonso sends the money, start on Growth. They add a flat $25 service fee per invoice, a 3.25% surcharge if you pay the invoice through Stripe (2.8% through Revolut), and $0.50 for each affiliate payout after the first 25 in a cycle. Paying 40 partners in a month adds $25 plus 15 × $0.50, or $32.50, before any surcharge. Partners receive the money within 15 business days of Affonso getting your payment.
Early-stage startups can apply to Affonso's startup program, which takes 50% off the first year, 25% off the second and 10% off the third.
### What Affonso does well
Recruiting is Affonso's strongest pitch. All plans include a discovery agent, a marketplace listing and a search for affiliates already promoting your competitors, with the credit allowances in the table above.
Recurring and one-time commissions, partner-specific rates, currency conversion and non-monetary rewards come on every tier. Growth adds pay-per-lead, double-sided coupon incentives, a custom portal domain and [multi-level commissions](https://affonso.io/help/commissions/multi-level-commissions) up to 3 levels deep, and Elite adds W-8 and W-9 collection. Hold periods are set per incentive in days, and a refund during the hold voids or reduces the commission before payout.
Affonso also documents an embedded referral dashboard for your own app and recommends proxying the pixel through your own domain so blockers are less likely to catch it. Its API allows 300, 600 and 1,200 requests a minute by plan.
### Why teams look for an Affonso alternative
#### Last touch is the only attribution rule
When a customer clicks two affiliate links, [Affonso pays the most recent one](https://affonso.io/help/tracking-settings/first-touch-vs-last-touch-attribution), and its help center says attribution logic is not customizable today. On a $49 plan at 20%, the $9.80 goes to the coupon site that appeared the day before checkout, and the creator whose link started the sale gets $0. [Rewardful's pricing page](https://www.rewardful.com/pricing) lists first- or last-touch attribution on every plan, and [FirstPromoter](https://firstpromoter.com/pricing) offers first-click or last-click with a cookie life up to 9,999 days. TrackRev has last-touch, first-touch and linear credit as a workspace setting, and the [attribution model comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers when each one fits.
#### Billing systems outside the native list
Affonso's [integrations page](https://affonso.io/integrations) sends every other provider through its API, where your backend posts each sale and refund. Lemon Squeezy and Chargebee fall into that group. [Rewardful's Paddle page](https://www.rewardful.com/paddle) says it integrates with Paddle Classic and not Paddle Billing. TrackRev reads both Paddle versions and Lemon Squeezy, and [this walkthrough](https://www.trackrev.io/blog/lemon-squeezy-revenue-attribution) shows the Lemon Squeezy side.
#### Reporting that stops at the partner program
Affonso's [analytics page](https://affonso.io/analytics-tracking) describes revenue by affiliate, campaign, country, device and browser, plus new versus recurring revenue. I found nothing on attributing newsletter, YouTube, SEO or paid-ad revenue that never touched a partner link, which costs nothing when partners are your only channel. Alongside ad spend or a newsletter, affiliate revenue sits in one tool and everything else in Google Analytics 4 or a spreadsheet, and the totals disagree.
### Affonso alternatives compared on price, billing systems and meter
| Tool | Monthly price | Yearly price | Entry limit | Billing systems | Trial or free plan |
| --- | --- | --- | --- | --- | --- |
| Affonso | $19 | $180/year | $1,000 partner revenue | Stripe, Paddle Billing, Polar, Creem, Dodo Payments | 14-day trial |
| Tolt | $69 | Not listed | $10,000 earned from affiliates | Stripe, Paddle, Chargebee | 14-day trial |
| Rewardful | $49 | $490/year | $7,500 affiliate-attributed revenue | Stripe, Paddle Classic | 14-day trial |
| FirstPromoter | $49 | $490/year | $5,000 revenue from affiliates | Stripe, Paddle, Chargebee, Recurly, Braintree | 14-day trial |
| TrackRev | $39 | $351/year | $10,000 of commission | Stripe, Paddle, Polar, Lemon Squeezy | Link tracking only |
*Entry plans from each vendor's pricing page, October 2026. Affonso's $180 is $15 a month on yearly billing. Tolt words its limit as earned from affiliates, so confirm with Tolt which amount it meters.*
Entry prices hide the meter, so take one program at two sizes. Partners refer $8,000 a month in the first column and $25,000 in the second, at a 20% commission, which TrackRev's meter reads as $1,600 and $5,000.
| Tool | $8,000 referred | $25,000 referred |
| --- | --- | --- |
| Affonso | Growth, $39 monthly or $29 yearly | Elite, $99 monthly or $79 yearly |
| Tolt | Basic, $69 | Pro, $199 |
| Rewardful | Growth, $99 | Enterprise, from $149 |
| FirstPromoter | Business, $99 | Enterprise, $149 |
| TrackRev | Starter, $39 | Starter, $39 |
*Cheapest published plan whose limit covers the revenue, billed monthly unless stated.*
At $8,000 the two tie: $39 for Affonso Growth and TrackRev Starter on monthly billing, and $29 against $29.25 on yearly billing. Affonso is clearly cheaper only under $1,000 of partner revenue, where Launch costs $15 to $19. Past $10,000 the meters diverge. Starter's $10,000 of commission covers $50,000 of referred revenue at a 20% rate and $20,000 at 50%, so the more generous your commission, the less the gap helps you.
### How each alternative differs from Affonso
#### Tolt, for Chargebee or 1099 filing
[Tolt](https://tolt.com/pricing) starts at $69 for $10,000 and pays affiliates by hand on that plan. Growth, at $99 for $20,000, adds automatic payouts with a 2% processing fee, W-9 and W-8 collection and 1099 filing, where Affonso lists tax-form collection only on Elite and no filing. Tolt also reads Chargebee. It wins over Affonso for a Chargebee billing system or a team that wants the 1099s handled.
#### Rewardful, for a choice of attribution rule on Stripe
Rewardful's Starter plan costs $49 for $7,500 with 1 campaign and 2 team members. The branded affiliate portal and custom domain wait until Growth at $99 for $15,000, while Affonso includes dashboard branding on Launch and a custom domain on Growth. Every Rewardful plan has first- or last-touch credit and a 0% transaction fee. It suits a Stripe or Paddle Classic stack that wants first-touch credit. [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev) sets those two side by side.
#### FirstPromoter, for Recurly, Braintree or long cookie windows
FirstPromoter's Starter plan is $49 for $5,000 and 1,000 affiliates, Business is $99 for $15,000 with no caps on affiliates, and Enterprise is $149 above that. It adds Recurly and Braintree to the billing list and allows cookie life up to 9,999 days with first-click or last-click credit. That makes it the pick when billing runs through one of those two or the attribution window needs to run long. The [FirstPromoter alternatives guide](https://www.trackrev.io/blog/best-firstpromoter-alternatives-2026) covers the rest of its field.
### How TrackRev compares and what it gives up
Every TrackRev paid plan includes the affiliate program, link tracking and revenue attribution, and the plans differ in what they meter and how many workspaces they allow.
| Plan | Per month | Billed yearly | Commission metered monthly | Workspaces |
| --- | --- | --- | --- | --- |
| Starter | $39 | $351/year | $10,000 | 1 |
| Growth | $99 | $891/year | $100,000 | Unlimited |
| Scale | $199 | $1,791/year | Unlimited | Unlimited |
*TrackRev's published prices, October 2026. Yearly billing charges for 9 months and gives 12. Scale adds priority support.*
The free plan covers 50 links and 1,000 tracked events a month for link tracking only, so the affiliate program starts on Starter. [Pricing](https://www.trackrev.io/pricing) lists every plan. Commissions can be recurring, one-time or multi-tier through Partner Accelerator, paid as cash or credit, held for 0 to 180 days per program (the default is 0) and reversed on refunds and disputes. Partners upload W-9 and W-8 forms during onboarding. TrackRev's Stripe page says no SDK goes in your checkout, since a charge is joined to its click through the customer's email, which TrackRev's pixel binds to the visitor at signup or checkout.
A partner's link is a tracked link like any other, so one channel report ranks affiliates against a newsletter, a YouTube channel and paid ads by the MRR each pays. The [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows it. Switch when partners are one channel of several and two tools' totals no longer reconcile.
Affonso is cheaper under $1,000 of partner revenue, publishes far more detail on its recruiting tools, reads Creem and Dodo Payments, and can pay partners for you from Growth. TrackRev's payouts are a PayPal or Wise CSV that you pay and mark paid, the same routine Affonso uses on every plan. If finding partners is your bottleneck, that outweighs most of the above. For a Stripe-only program under $10,000 a month, I would not leave Affonso over price alone.
### Moving a program off Affonso
Affonso's help center says to [email its team for an export](https://affonso.io/help/managing-affiliates/how-to-export-your-affiliate-data) covering affiliates, referral records, payment history and commission structures. TrackRev imports an affiliate CSV through its option for any other platform.
- Ask Affonso for the export and keep each partner's referral code and any coupon codes.
- Upload the file to TrackRev on a paid plan and map the columns. Only an email is required per row. Referral codes can become link slugs, coupon codes and status come across, and each unpaid balance is written as one carried-over commission. Past clicks, leads, sales and revenue arrive as opening balances.
- Connect billing and install TrackRev's pixel beside Affonso's. Keep both running through your cookie window, which is [30 days by default](https://affonso.io/help/tracking-settings/pixel-cookie-duration-default) in Affonso unless you set `data-cookie_duration`, and pay commissions from one system only so no sale is paid twice.
- Ask partners to swap in their new links. Then remove Affonso's script and the `affonso_referral` value your server code passes into Stripe Checkout metadata, and pay out what Affonso tracked before you cancel.
### Checks to run before you cancel
Run one real purchase through your checkout with a partner link, refund it, and confirm the commission reverses. Affonso's [Stripe Checkout guide](https://affonso.io/help/integrations/stripe/stripe-checkout-api) says Stripe test mode purchases do not appear in Affonso and suggests a 100% discount code for live testing.
Then check Safari. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Intelligent Tracking Prevention deletes cookies created in JavaScript, and other script-writeable storage, after 7 days without user interaction with the site. Affonso's pixel is a script, and the help pages I read do not say whether its cookie is written by script or by a server response. Click a partner link in Safari on day 1, buy on day 9, and see whether the sale is credited. TrackRev logs the click server-side at the tracked redirect (the [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers it), and the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) lists what a paid plan adds.
### Frequently asked questions
**What is the best Affonso alternative for a Stripe SaaS?**
Pick by the limit that bothers you. Attribution rules point to Rewardful or FirstPromoter, Chargebee to Tolt or FirstPromoter, and revenue beside your other channels to TrackRev. If none of those bothers you, stay: Affonso costs the least under $1,000 of partner revenue.
**Is there a free Affonso alternative?**
PromoteKit has a free plan limited to 3 referrals and 1 campaign. TrackRev's free plan covers link tracking only, because the affiliate program needs Starter. Tolt, Rewardful and FirstPromoter each offer a 14-day trial, the same as Affonso.
**Does Affonso support Lemon Squeezy?**
Not natively. Affonso's docs send unsupported providers through its API, where your server posts each purchase to the conversions endpoint with a sale amount, currency and an external event ID, and posts refunds separately. TrackRev has a native Lemon Squeezy integration.
**How long does Affonso's tracking cookie last?**
The pixel's data-cookie_duration attribute sets it, with 30 days as the default.
**Can I use Affonso for partners and TrackRev for other channels?**
Yes, but clicks on Affonso partner links never pass through TrackRev, so TrackRev's channel report cannot show partner revenue. The pairing gives you partner management in one tool and every other channel in the other, at the price of two sets of totals.
**How does Affonso compare with Rewardful and FirstPromoter?**
Every Affonso plan allows unlimited affiliates, where FirstPromoter Starter stops at 1,000, and Affonso Launch allows unlimited programs where Rewardful Starter allows 1 campaign. Rewardful reads Paddle Classic only, and FirstPromoter adds Recurly and Braintree.
**Does TrackRev pay my affiliates automatically?**
No. You pay from your own PayPal or Wise account using the exported CSV and mark each payout paid. Affonso can pay partners for you from its Growth plan, with fees on the invoice.
---
## The best AnyTrack alternative depends on what you track
URL: https://www.trackrev.io/blog/anytrack-alternative
Published: 2026-06-10
Author: Muzahid Maruf
AnyTrack costs $100 to $300 a month and credits ad clicks only. Compare ClickMagick, RedTrack, Voluum and TrackRev on price, refunds and channel revenue.
The right AnyTrack alternative depends on the job you hired it for. AnyTrack sends your sales back to Google Ads, Meta and four other ad networks, and its paid plans cost $100, $150 and $300/month. If that feedback loop is the point, ClickMagick, RedTrack and Voluum do the same job from $79 to $149/month. If you sell SaaS and want to know which channel pays your MRR, including the newsletter and the partners who never touch an ad, TrackRev does that from $39/month.
I run TrackRev, which is one of the options below.
> **Key takeaways:**
>
> - AnyTrack runs $100, $150 or $300/month after a free tier of 5,000 sessions, and pushing sales to Meta or Google needs at least the $100 plan.
> - Both AnyTrack attribution models read ad clicks with UTMs, and its docs say refunds and chargebacks are ignored once a sale is recorded. That skews revenue by channel.
> - RedTrack and ClickMagick start at $79 and Voluum at $149 if the goal is bidding feedback for Meta and Google.
> - TrackRev starts at $39 ($351 on annual billing), nets refunds out of channel revenue and credits last-touch, first-touch or linear, and does no ad-network forwarding.
> - Running AnyTrack and TrackRev together costs $139/month at entry prices, and the revenue totals will differ.
### What AnyTrack costs and what each plan includes
[AnyTrack's pricing page](https://anytrack.io/pricing) meters sessions. Each time a visitor enters your site counts once, new or returning, and extra pages in the same visit add nothing. Sessions past the limit bill at $0.40 to $0.20 per 1,000 depending on plan, so 130,000 sessions on Starter cost $6 to $12 on top of the $100. Advance can add websites at $30 a month each, and paying yearly makes Starter $1,000 and Advance $3,000.
Paid plans start with a 14-day trial, and the $0 tier is more useful than most. It includes server-side tracking and both attribution models, so a small SaaS with Stripe and one ad account can run on it. The first paid step is the steep one: Conversion API forwarding starts at Starter and Google Analytics 4 at Personal, and Starter covers all 6 networks whether you advertise on 1 or 6.
| Plan | Price per month | Sessions | Websites | Added at this tier |
| --- | --- | --- | --- | --- |
| Free | $0 | 5,000 | 1 | 1 ad platform integration, 1 conversion source, server-side tracking |
| Starter | $100 | 100,000 | 1 | All 6 ad networks, 100+ integrations, Conversion API, 2 team members |
| Personal | $150 | 500,000 | 3 | Cross-domain tracking, Google Analytics 4, 2 outgoing webhooks, custom conversions |
| Advance | $300 | 3,000,000 | 10 | Unlimited Conversion API, 10 outgoing webhooks, 10 team members, dedicated support |
*Prices from each vendor's pricing page, October 2026. Yearly billing costs 10 months of the monthly price.*
### What AnyTrack does well
AnyTrack installs one tag and records each visit in the browser and on the server at once. When a sale happens it sends the conversion to Google Ads, Meta, TikTok, Microsoft Ads, Taboola or Outbrain through server-side links such as [Meta's Conversions API](https://developers.facebook.com/documentation/ads-commerce/conversions-api), deduplicating browser and server events so each sale counts once. Its [multi-channel page](https://anytrack.io/features/multi-channel-marketing) says most users connect every network within 15 minutes, a vendor claim I have not timed.
The catalog is the other strength: more than 100 integrations, 90+ of them affiliate networks, and the [knowledge base](https://readme.anytrack.io/docs/stripe) names Awin, CJ Affiliates, Impact, PartnerStack, Rakuten and ShareASale. A marketer who buys traffic and gets paid by those networks can carry one click ID from the ad to the commission postback.
### Where a SaaS team runs into AnyTrack's limits
#### Credit goes to ad clicks
Say a buyer clicks a newsletter link, then a Google ad, and pays $49 for a plan. AnyTrack's [attribution doc](https://readme.anytrack.io/docs/first-click-vs-last-click) describes two models, First Click and Last Click, and both read ad clicks that carry UTM parameters. Views never earn credit, and organic, email and direct visits never take credit from an ad click. With UTMs on the ad, either model gives the Google ad all $49 and the newsletter nothing.
The [Stripe integration page](https://anytrack.io/integrations/e-commerce/stripe) is broader, saying paid, organic, email and affiliate sales are tied back to the campaign that earned them. I found no documented way to rank a newsletter send or a YouTube description link as a channel beside your ads, which is the comparison a SaaS budget usually needs.
#### Refunds and chargebacks never change a report
AnyTrack's [refunds page](https://readme.anytrack.io/docs/commission-reversals-refunds) says a conversion records the sale as reported at that moment, and later reversals never reach reports or the ad networks. The page says reversals rarely hurt ad optimization, since the click did produce a buyer.
It matters when you rank channels by revenue and their refund rates differ. Say channel A charged $20,000 and refunded 12%, while channel B charged $18,500 and refunded 2%. Gross figures put A ahead, $20,000 to $18,500. Net figures put B ahead, $18,130 to $17,600. To correct Google Ads, the page points you to manual conversion adjustments that you upload there yourself.
#### The Stripe route in the docs
AnyTrack's Stripe page promises a connection in under 5 minutes without a developer. Its [Stripe guide](https://readme.anytrack.io/docs/stripe) describes another route. You append a click ID to each Payment Link through the `client_reference_id` parameter, which [Stripe accepts](https://docs.stripe.com/payment-links/url-parameters) at up to 200 characters and passes to the `checkout.session.completed` webhook. Then you forward that event with Zapier, Make or Stripe itself, map the fields by hand and divide the amount by 100, because Stripe reports cents.
That fits a first purchase. The Stripe page also says AnyTrack tracks every payment and subscription, yet I found no page that explains how a renewal is recorded, and [Stripe reports a renewal](https://docs.stripe.com/billing/subscriptions/webhooks) as `invoice.paid`. Ask support for an example before relying on it for MRR.
### How TrackRev answers the same questions
TrackRev starts from the link. You create one tracking link per channel, such as a newsletter issue, a YouTube description or a partner's page. Each click is logged server-side at the redirect, before the destination loads, and a one-line pixel sets a first-party visitor ID on your own domain. When the visitor gives an email at signup or checkout, TrackRev binds the email to that ID.
Revenue comes from [Stripe](https://www.trackrev.io/integrations/stripe) through a restricted key with read access to charges, customers, subscriptions and PaymentIntents. An hourly poll pulls new paid charges, and an optional webhook gives near-real-time updates. Paddle, Polar and Lemon Squeezy connect too. Renewals inherit the original click, and a refunded charge leaves channel revenue on the next sync, so refunds like those in the $20,000 example show up in channel totals.
Credit rules are a dropdown over the same click data. For that same $49 buyer, with both clicks on TrackRev links, the sale reads three ways. The [attribution models comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers when each fits.
Starter is $39/month. Growth is $99 with unlimited workspaces, and Scale is $199 with priority support. Annual billing pays for 9 months and gives 12, which makes them $351, $891 and $1,791 a year. Every paid tier includes unlimited links and events, revenue figures and the [affiliate program](https://www.trackrev.io/solutions/affiliate-program). Starter caps commission tracked for partners at $10,000 a month and Growth at $100,000, while sale revenue has no cap. The $0 tier covers 50 links and 1,000 events a month but hides revenue, so it tests links and cannot rank channels.
TrackRev does not forward conversions to ad networks. Its pages list no Conversion API connection, so Meta's bidding will not learn from your sales through it. A checkout on Shopify or ClickFunnels is a case for AnyTrack's wider catalog, since TrackRev's integrations list stops at those 4 billing platforms.
| Model | Newsletter | Google Ads |
| --- | --- | --- |
| Last-touch | $0 | $49 |
| First-touch | $49 | $0 |
| Linear | $24.50 | $24.50 |
*One $49 sale credited three ways. Last-touch is the TrackRev default.*
### AnyTrack vs TrackRev side by side
| Question | AnyTrack | TrackRev |
| --- | --- | --- |
| Built to | Send sales back to ad networks | Rank channels by the MRR they pay |
| Cheapest paid plan | $100/month, $1,000 a year | $39/month, $351 a year |
| Free tier | 5,000 sessions, 1 website, 1 ad platform | 50 links, 1,000 events, revenue hidden |
| Credit models | First Click or Last Click on ad clicks with UTMs | Last-touch, first-touch or linear across any tracked link |
| Refunds and chargebacks | Ignored after the sale | Netted out at each hourly sync |
| Conversion API | 6 ad networks from Starter up | None listed |
| Your own partner program | Takes conversions from 90+ networks and affiliate software, no portal or payouts listed | Portal, commissions and payouts |
*Figures from each vendor's own pages, October 2026.*
### AnyTrack alternatives compared on price
The tools meter different things, so entry prices only roughly compare. AnyTrack counts sessions, ClickMagick counts tracked visitors, RedTrack and Voluum count events, and TrackRev counts partner commission.
| Tool | Plan ladder per month | Cheapest plan, yearly rate | Volume on cheapest plan | What is counted |
| --- | --- | --- | --- | --- |
| AnyTrack | $100, $150, $300 | $83 | 100,000 | Sessions |
| ClickMagick | $79, $199, $349 | $66 | 10,000 | Tracked visitors |
| RedTrack | $79, $169, $399, $999 | $69 | 2,000,000 | Clicks and conversions |
| Voluum | $149, $349 | $119 | 1,000,000 | Visits, clicks, conversions, impressions |
| TrackRev | $39, $99, $199 | $29.25 | Unlimited events | Partner commission, $10,000 |
*Vendor pricing pages, October 2026. Yearly figures are per month. RedTrack's ladder is its affiliate and lead gen tab, and Voluum's is its individual tab.*
[ClickMagick](https://www.clickmagick.com/pricing/) Starter covers 10,000 tracked visitors for 1 user and 1 website, Standard at $199 raises that to 100,000, and Pro at $349 to 1,000,000. Its [comparison with TrackRev](https://www.trackrev.io/blog/clickmagick-vs-trackrev) goes through the ad cost sync and conversion feedback.
[RedTrack](https://www.redtrack.io/pricing/) lists native Conversion API links for 8 platforms: Meta, Google, TikTok, Snapchat, Microsoft and Bing, X, Pinterest and OpenAI Ads. It pulls ad spend every 6 hours, allows 5 ad accounts per platform, and events past the monthly limit bill at $0.04 per 1,000 while tracking keeps running.
[Voluum](https://voluum.com/pricing/) Profit allows 20 active campaigns and keeps 6 months of data. Cometly prices by monthly pageviews, quotes plans on a call and runs no free trial, according to its pricing page, and the [Cometly alternative](https://www.trackrev.io/blog/cometly-alternative-affordable) post covers where it fits.
### Choosing between AnyTrack, its rivals and TrackRev
Pick AnyTrack, ClickMagick, RedTrack or Voluum when most of your budget goes to ads and the sale has to travel back to the networks. RedTrack covers 8 platforms against AnyTrack's 6, AnyTrack lists 90+ affiliate networks, and ClickMagick and RedTrack tie on the $79 entry price.
Pick TrackRev when the Monday question is which channel paid last month's MRR. Below $10,000 of partner commission, one $39 plan covers link tracking, revenue by channel and the partner program. The guide to [attributing Stripe revenue to channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels) explains the mechanics first, and the post on [newsletter link tracking](https://www.trackrev.io/blog/track-links-in-newsletters-revenue) covers the kind of source that AnyTrack's attribution doc does not credit.
Some teams need both. AnyTrack at $100 plus TrackRev at $39 is $139/month, and the two will disagree on revenue because AnyTrack keeps refunded sales and TrackRev nets them out. Decide which total your finance review uses before you wire up both. TrackRev's $0 tier is enough to watch the redirect and pixel work before you pay for [Starter](https://www.trackrev.io/pricing).
### Frequently asked questions
**What is the best AnyTrack alternative?**
Match the tool to the decision. Bidding on Meta or Google points to RedTrack or ClickMagick at $79, or Voluum at $149. Budget decisions across newsletter, video, partners and ads at a SaaS company point to TrackRev at $39. A team with heavy ad spend and a content engine can reasonably run one of each.
**How much does AnyTrack cost?**
Plans run $0, $100, $150 and $300 a month, with 5,000, 100,000, 500,000 and 3,000,000 sessions. Yearly billing gives 2 months free, overage sessions bill at $0.20 to $0.40 per 1,000, and each added Advance website is $30.
**Does AnyTrack track Stripe subscriptions and MRR?**
Its Stripe guide covers completed checkouts. No AnyTrack page I read describes how renewals, upgrades or MRR are recorded, and its refunds page says later refunds are ignored. Ask support for a renewal example first. TrackRev reads Stripe charges and subscriptions directly and carries the original click through every renewal.
**Is there a free AnyTrack alternative?**
AnyTrack has its own free tier with 5,000 sessions. ClickMagick and RedTrack both run free trials, ClickMagick's lasting 14 days. TrackRev's free tier allows 50 links and 1,000 events monthly, with revenue hidden until you move to Starter.
**Does TrackRev send conversions to Meta or Google Ads?**
No, and its pages list no such connection. It reports revenue by channel without feeding ad bidding, so use AnyTrack, RedTrack or ClickMagick for that feedback.
**Can I use TrackRev without running an affiliate program?**
Yes. Revenue attribution works on its own on any paid plan, and you can add partners whenever you like. Starter's $10,000 monthly cap applies to partner commission, so a team with no partners never meets it.
---
## Attribution modeling for SaaS: how each model splits credit for one sale
URL: https://www.trackrev.io/blog/attribution-models-saas-comparison
Published: 2026-06-22
Author: Muzahid Maruf
Attribution modeling decides which channel gets credit for a sale. See five rule-based models split one $600 SaaS sale, and which type fits your funnel.
Attribution modeling is the practice of choosing a rule that divides credit for a sale among the marketing touchpoints that came before it. Take a $600 annual plan bought after 5 touches: last touch gives paid search all $600, first touch gives YouTube all $600, and linear gives each of the 5 channels $120.
For a SaaS team with a few dozen paid conversions a month, read last touch and first touch side by side, then add linear once journeys regularly run past 3 touches. Google Analytics 4 dropped first click, linear, position-based and time-decay attribution in November 2023, so guides written before then describe options its reports no longer have.
> **Key takeaways:**
>
> - Attribution modeling is the rule that splits a sale's revenue across the touchpoints before it. A $600 sale adds back up to $600 under every rule, and only the channel rows change.
> - On a $600 annual plan with 5 touches, last touch gives paid search $600, first touch gives YouTube $600, linear gives every channel $120, and 7-day half-life time decay gives paid search $311 and YouTube $18.
> - Google removed first click, linear, time decay and position-based attribution from Google Analytics 4 in November 2023. HubSpot, Adobe Analytics, Mixpanel and TrackRev still offer rule-based models.
> - Under about 30 paid conversions a month, read last touch and first touch side by side. Data-driven attribution needs more conversion paths than most SaaS teams have.
### How attribution modeling works
Every model starts from two inputs: an ordered list of touchpoints for each buyer (a click on a link tagged utm_source=newsletter, a Google Ads click, a referrer, each timestamped) and a conversion with a dollar value. For SaaS, make the conversion the first paid charge, such as a $600 payment in Stripe, because a trial signup is a lead with no revenue. The credits the model assigns add up to the conversion value.
[Google Analytics Help](https://support.google.com/analytics/answer/10596866) defines a model as a rule, a set of rules or a data-driven algorithm. Single-touch models, first touch and last touch, hand one touchpoint the whole sale. Rule-based multi-touch models (linear, position-based, time decay) split it with a formula you can work out by hand. Algorithmic models, such as Google's data-driven attribution and the Adobe Analytics algorithmic model, estimate the split from your own conversion paths.
No model changes the total. The $600 sale still sums to $600 and only the channel rows move, so the report ties back to what your payment processor collected.
### Five rule-based models split one $600 sale
The buyer watches a YouTube review on day 1, reads a blog post found through organic search on day 6, opens a newsletter on day 15, clicks an affiliate's review link on day 24, and pays on day 30 after clicking a branded paid-search ad.
| Touchpoint | Day | First touch | Last touch | Linear | U-shaped | Time decay |
| --- | --- | --- | --- | --- | --- | --- |
| YouTube review | 1 | $600 | $0 | $120 | $240 | $18 |
| Organic search blog post | 6 | $0 | $0 | $120 | $40 | $29 |
| Newsletter | 15 | $0 | $0 | $120 | $40 | $70 |
| Affiliate review link | 24 | $0 | $0 | $120 | $40 | $172 |
| Branded paid search | 30 | $0 | $600 | $120 | $240 | $311 |
| Total | | $600 | $600 | $600 | $600 | $600 |
*Illustrative journey. U-shaped gives 40% to each end and shares 20% across the middle 3. Time decay uses a 7-day half-life. Amounts are rounded to whole dollars.*
First touch and last touch put the whole $600 on opposite ends of the journey, and linear spreads it flat. U-shaped spends $480 on the two ends and shares $120 across the middle 3. Time decay behaves like last touch with a softer edge: the final 2 touches take $483 of the $600, and the YouTube review that started the journey gets $18.
> **Time-decay arithmetic for this journey:** Adobe documents the weight as 2^(-t/h), where t is the days between a touch and the purchase and h is the half-life. With h = 7, the weights are 0.06 for day 1, 0.09 for day 6, 0.23 for day 15, 0.55 for day 24 and 1.00 for day 30. They sum to 1.93, so the closing click takes 1 / 1.93, or 52%, of the sale. Stretch the half-life to 30 days and the same click takes 27%, with no change in what the buyer did.
### Types of attribution models
#### Last touch attribution
Last touch gives the final touchpoint before the conversion the whole sale. Mixpanel assigns it with a 30-day lookback unless you change that, and the rule-based models in Google Analytics 4 are two last-click variants. The main one, paid and organic last click, credits the last non-direct click.
In Google's own examples, a path of Display, Social, Paid Search and Direct gives 100% to Paid Search, because GA4 excludes direct visits unless the whole path was direct. A tool that counts Direct as a channel gives that sale to Direct, which is one reason two tools disagree on the same model.
Last touch is accurate when the closing click is the decision: a self-serve plan on a 7-day trial or a retargeting budget you are tuning. It misleads when creators and closers share a journey, and in the monthly example below the podcast earns $0 under it.
#### Last touch attribution for B2B SaaS
A longer sales cycle and a buying committee stretch every weakness of last touch. In a 3-person committee, one finds you through a podcast, another books a demo after searching your brand name, and the third pays by card. A model that follows a single visitor sees only that visitor's touches, so last touch credits the payer's final action, often a branded search or a pricing page visit.
On a 60 to 90 day cycle the closing click tends to land after the buyer has decided, so it tells you where they signed up. What made them want the demo sits earlier in the path. Pair last touch with first touch and read the gap.
#### First touch attribution
First touch gives the whole sale to the earliest touchpoint inside the lookback window. It answers where buyers first met you, which is what podcast, video, SEO and community budgets depend on. Its blind spot mirrors last touch: the newsletter that kept the buyer warm and the ad that closed them both score $0.
It is also the model most exposed to lost cookies, because it has to remember a visitor for weeks. [WebKit](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) caps JavaScript-written cookies at 7 days and deletes other script-writable storage after 7 days of Safari use without interaction on the site. A first visit a script recorded on day 6 can vanish before the same person returns on day 24, and the return then counts as a new first touch. Setting the first-click cookie from your own server avoids the script cap, and the [Safari ITP guide](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers what survives.
#### Linear attribution
Linear divides the sale equally across every touchpoint, so 5 touches get $120 each on the $600 sale and 3 get $200 each. It is the simplest answer to which channels took part at all, and it puts a newsletter or a podcast into a budget meeting. It overpays trivial touches: a retargeting click carries the same weight as a 40-minute product demo. Slices also thin as journeys lengthen. At 10 touches each channel gets $60, and a ranking built on that mostly counts how often you contacted people.
#### Position-based attribution
Position-based, or U-shaped, attribution gives the first and last touches 40% each and shares the remaining 20% across the middle: $240, $40, $40, $40 and $240 on the example. Adobe Analytics and Mixpanel put the 40% shares on the first and last touch. HubSpot puts them on the first interaction and the interaction that turned the visitor into a contact, which may not be the click before the sale.
Mixpanel's own example gives a 6-touch path 40%, 5%, 5%, 5%, 5% and 40%, and with 2 touches it normalizes to 50% each. U-shaped therefore only does distinct work from the third touch onward, and its middle slices thin as the path grows.
| Touches in the journey | Linear, each touch | U-shaped, each end | U-shaped, each middle touch |
| --- | --- | --- | --- |
| 2 | 50% | 50% | none |
| 3 | 33.3% | 40% | 20% |
| 5 | 20% | 40% | 6.7% |
| 6 | 16.7% | 40% | 5% |
| 10 | 10% | 40% | 2.5% |
*Share of one sale per touch. The 2-touch row uses Mixpanel's normalization.*
#### Time-decay attribution
Time decay bets that recent touches matter more. HubSpot, Adobe Analytics and Mixpanel all document a 7-day half-life as the default, and the half-life is the dial that decides the answer. The model suits cycles that are short next to the half-life. On a 90-day cycle, a discovery touch carries almost no weight at 7 days and an eighth of the closer's at 30, so the half-life decides whether early touches count at all.
| Days before purchase | Weight, 7-day half-life | Weight, 30-day half-life |
| --- | --- | --- |
| 0 | 1.000 | 1.000 |
| 7 | 0.500 | 0.851 |
| 14 | 0.250 | 0.724 |
| 30 | 0.051 | 0.500 |
| 60 | 0.003 | 0.250 |
| 90 | 0.0001 | 0.125 |
*Weight of a touch relative to the closing click, from 2^(-days/half-life).*
#### Data-driven attribution
Data-driven attribution estimates credit from the paths in your own data, comparing buyers who converted with paths that did not. [Google Ads Help](https://support.google.com/google-ads/answer/6259715) calls it the default for most conversion actions. In Google Analytics 4 it weighs how adding each interaction changes the estimated probability of a conversion, using features such as the time between the interaction and the event.
Google removed first click, linear, time decay and position-based from GA4 in November 2023 and no longer supports them in Google Ads. Data-driven attribution trades a rule you can compute by hand for an estimate you cannot reproduce for a single sale. With 40 conversions a month, a path-based model has 40 converting paths to learn from, spread across every channel and touch order. Teams with thousands of conversions and an analyst to check the output get value from it. Most SaaS teams are better served by a rule they can audit.
### Where each model lives in the tools you already use
| Tool | Models offered | Notes |
| --- | --- | --- |
| [Google Analytics 4](https://support.google.com/analytics/answer/10596866) | Data-driven, paid and organic last click, Google paid channels last click | First click, linear, time decay and position-based were removed in November 2023 |
| [Google Ads](https://support.google.com/google-ads/answer/6259715) | Last click, data-driven | Data-driven is the default for most conversion actions; the 4 other rule-based models are no longer supported |
| [HubSpot](https://knowledge.hubspot.com/reports/understand-attribution-reporting) revenue attribution | Linear, first interaction, last interaction, U-shaped, W-shaped, full path, time decay, J-shaped, inverse J-shaped | 9 models; full path gives 22.5% to each of 4 milestones and 10% to the rest |
| [Adobe Analytics](https://experienceleague.adobe.com/en/docs/analytics/analyze/analysis-workspace/attribution/models) | First touch, last touch, linear, participation, same touch, U-shaped, J curve, inverse J, time decay, custom, algorithmic | 11 models; J curve gives 60% to the last touch and 20% to the first |
| [Mixpanel](https://docs.mixpanel.com/docs/features/computed-properties#attribution) | First touch, last touch, linear, participation, time decay, U-shaped, J-shaped, inverse J-shaped, custom | Defaults to last touch with a 30-day lookback |
| TrackRev | First touch, last touch, linear | Last touch is the default; no position-based, time-decay or data-driven model |
*Marketing attribution models listed in each vendor's documentation, checked October 2026.*
### How the models disagree across a month of sales
Take six customers who each pay $600, $3,600 in all:
| Customer | Touchpoints in order |
| --- | --- |
| 1 | Podcast, branded search |
| 2 | Podcast, newsletter, branded search |
| 3 | Newsletter, affiliate |
| 4 | Affiliate |
| 5 | Branded search |
| 6 | Podcast, affiliate, branded search |
| Channel | First touch | Last touch | Linear | First minus last |
| --- | --- | --- | --- | --- |
| Podcast | $1,800 | $0 | $700 | +$1,800 |
| Newsletter | $600 | $0 | $500 | +$600 |
| Affiliate | $600 | $1,200 | $1,100 | -$600 |
| Branded search | $600 | $2,400 | $1,300 | -$1,800 |
| Total | $3,600 | $3,600 | $3,600 | $0 |
*Illustrative month. Every column adds up to the $3,600 collected.*
Read across a row and the channel's role shows. The podcast earns $1,800 under first touch and $0 under last touch, so a team that looked only at last touch would cancel it. Branded search runs the other way: $2,400 under last touch and $600 under first, because it closed 4 of the 6 sales and was the only touch in 1 of them. The first-minus-last column sorts creators (positive) from closers (negative) and sums to $0 because the models only move credit.
Six sales is too few to act on. At 20 paid conversions a month, one customer is 5% of the month's revenue, and under first or last touch a single journey moves a channel's share by 5 points.
### Which attribution model to use
| Decision | Model to read | Why |
| --- | --- | --- |
| Raising or cutting paid search and retargeting spend | Last touch | The closing click is the one a bid or budget change acts on directly |
| Funding podcasts, video, SEO content or community | First touch | In the month above the podcast earns $1,800 under first touch and $0 under last touch |
| Defending several channels in one budget review | Linear | Every channel with a touch gets a share, $120 each on the 5-touch sale |
| Journeys with a clear opener, a clear closer and nurture between | Position-based | 40% to each end and 20% to the middle, where the tool offers it |
| Fewer than about 30 paid conversions a month | Last touch and first touch side by side | One customer is 3.3% of the month, so keep rules you can trace sale by sale |
| Thousands of conversions a month and an analyst to check the output | Data-driven | Enough paths to learn from, though the split cannot be reproduced by hand |
*The 30-conversion line is a rule of thumb.*
#### Sales cycle and lookback window
A model decides who gets credit inside the lookback window, and the window decides which touches are eligible at all. GA4 defaults to 30 days for acquisition events and 90 days for other conversions, and its [attribution settings page](https://support.google.com/analytics/answer/10597962) lists the options. To size yours, take customers who paid in the last 90 days and find the median days between first tracked click and first payment.
TrackRev's [attribution benchmarks](https://www.trackrev.io/data/saas-attribution-benchmarks) put that median at 6.3 days, the 75th percentile at 21.0 days and the 90th at 48.2 days, so a 30-day window would cut off more than the slowest tenth of buyers in a typical workspace.
#### Check a model against customers you know
Pull 5 to 10 recent customers whose real path you know, such as one who replied to a newsletter or one who found you through a podcast, and check what each model says about them. If last touch files them under Direct, the gap is in the data, and a different model will not close it. The comparison of [self-reported and tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data) covers asking buyers directly.
### What subscription revenue changes
Credit is assigned once, at the first payment, and renewals ride along with it. A $49 monthly plan kept for 12 months is $588, so moving the customer from the closing channel to the opening one shifts $588 of credit. Channels also differ in the customers they bring. In the same benchmarks the 12-month lifetime value multiplier is 2.1x for organic search and 0.8x for paid social, so two channels that bring the same $49 first invoice can be worth very different amounts a year later.
Three rules keep the model honest on subscriptions:
- Make the first paid charge the conversion. A model fed trial signups credits channels that bring free accounts that never pay.
- Net refunds and chargebacks out of the credited revenue, or channels that attract refunds look better than they are.
- Decide how renewals inherit credit before the first dispute. The [subscription LTV attribution](https://www.trackrev.io/blog/subscription-ltv-attribution) guide compares three ways to do it.
### What to store so you can switch models
A model is a calculation over stored touchpoints, so keep every touch with its timestamp, visitor ID, utm_source, utm_medium and utm_campaign, and apply the model at report time. A tool that keeps only the attributed result cannot re-run last quarter under another rule. Tag every link you control, because a session without a source is reported as Direct in Google Analytics 4. The [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming.
Carry a click ID into the payment too. [Stripe metadata](https://docs.stripe.com/metadata) accepts 50 key-value pairs, with keys up to 40 characters and values up to 500, and copies a subscription's metadata onto each invoice it creates as a one-time snapshot. The [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) shows the wiring.
### How TrackRev handles attribution modeling
TrackRev stores every click and computes first-touch, last-touch and linear from the same log, with last touch as the default. Revenue from Stripe, Paddle, Polar or Lemon Squeezy is joined to each click, so a model switch changes the channel credit while the total still ties to the processor. Refunds are netted out and no re-tagging is needed.
It has no position-based, time-decay or data-driven model. If a preset like that is a hard requirement, the tools in the table above offer them. Revenue by channel needs a paid plan, which starts at $39 a month. The free plan covers link tracking for up to 50 links and 1,000 events a month. The [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows the channel report.
To build the six-sale table from your own data, the [multi-touch attribution setup guide](https://www.trackrev.io/blog/multi-touch-attribution-setup-guide) walks through the five parts of the build.
### Frequently asked questions
**What is an attribution model in marketing?**
An attribution model is the formula that turns an ordered list of touchpoints into a credit for each channel. Last touch is the simplest, with one row getting 100%. Algorithmic models are the most complex, with weights estimated from data. Everything between applies a fixed split, such as 40% to each end and 20% to the middle.
**What is the difference between single-touch and multi-touch attribution models?**
Single-touch models, first touch and last touch, give 100% of the credit to one touchpoint and $0 to every other. Multi-touch models split credit across several touchpoints by a rule or an algorithm. A buyer with a single touchpoint gets the same answer from every model, so the choice only matters for journeys with at least 2 touches, and the gap grows with journey length.
**Does changing the lookback window in Google Analytics 4 rewrite old reports?**
No. A change applies going forward, and the window applies to all attribution models. The options are 7 or 30 days for acquisition events such as first_open and first_visit, and 30, 60 or 90 days for every other conversion event. Data-driven conversions can be reattributed for up to 7 days after the conversion, so the most recent numbers can still shift.
**What is the difference between U-shaped and W-shaped attribution?**
U-shaped has two heavy positions and W-shaped has three. In HubSpot's definitions, U-shaped gives 40% to the first interaction and 40% to the interaction that created the contact, then splits 20% across the rest. W-shaped gives 30% to the first interaction, 30% to the one that created the contact and 30% to the one that created the deal, then splits the remaining 10% across everything between. Both need contact and deal creation recorded in a CRM.
**Can I do attribution modeling in a spreadsheet?**
Yes, at small volume. Export each customer's touches with timestamps and the payment amount, sort by date, then apply the rule: first touch takes the first row, last touch the last, and linear divides the payment by the row count. Time decay weights each row by 2^(-days/half-life) and divides by the weight total. Joining payments to touches is the slow part, and it gets tedious past a few hundred conversions.
**How do attribution models apply to affiliate commissions?**
A commission rule is an attribution model with payouts attached. Last touch pays the affiliate clicked last inside the cookie window, and first touch pays the one who introduced the buyer, which favors reviewers over coupon sites. Put the rule in the partner terms and apply it to renewals too, since partners optimize for whatever you publish.
**Why do two tools report different numbers for the same model?**
Settings differ more than formulas do. The lookback window can be 30 days in one tool and 90 in another, one tool may count a trial signup as the conversion while the other counts the first paid charge, and each handles refunds and Safari's cookie cap in its own way. Align the conversion event and the window before comparing two reports.
---
## B2B affiliate marketing for high-ACV SaaS: how to run a program
URL: https://www.trackrev.io/blog/b2b-affiliate-marketing-high-acv
Published: 2026-07-03
Author: Muzahid Maruf
B2B affiliate marketing pays partners when a referred company buys, often 60 to 180 days after the click. Set the window, commission and deal rules to match.
B2B affiliate marketing pays outside partners, such as consultants, agencies, integration vendors and newsletter owners, a commission when a company they referred becomes a paying customer. The buying process is what changes: a business purchase takes weeks or months and needs several approvals, so a 30-day cookie and a one-time payout often credit the wrong partner or nobody at all. [HubSpot's affiliate program](https://www.hubspot.com/partners/affiliates) pays 30% monthly recurring commission for up to one year, with a 180-day cookie window. [Semrush](https://www.semrush.com/lp/affiliate-program/en/) pays up to $450 per sale and $10 per trial activation, depending on product and partner tier, with 120 days of last-click credit.
> **Key takeaways:**
>
> - B2B affiliate marketing pays a partner when a referred company pays, so the cookie window has to outlast your sales cycle: HubSpot uses 180 days and Semrush 120, against a 60-day median across programs.
> - Set the window from your own closed deals: take the 90th percentile of days from first click to payment and round up.
> - On a $300-a-month customer who stays 24 months, 20% of the first payment pays $60, a flat $500 pays $500 even if they leave after month 3, and $150 plus 15% for 24 months pays $1,230.
> - Pay on the first paid invoice, hold through your refund window, and write a deal registration rule with 90-day protection before a partner and a sales rep collide.
### What B2B affiliate marketing is, and how it differs from consumer programs
A partner gets a tracked link or code, and a commission accrues when the referred company pays. What changes is who buys and how long it takes, and each difference maps to a program setting.
| Setting | Consumer or low-ticket self-serve | B2B, high ACV |
| --- | --- | --- |
| Click to payment | Minutes to a few days | Weeks to months, with a demo, trial or security review in between |
| People who approve the purchase | 1 (the buyer) | A champion, a budget owner and often IT or procurement |
| What the partner does | Sends traffic | Recommends, demos or implements the product |
| Cookie window | 30 days or less (28% of programs) | 90 to 180 days (HubSpot 180, Semrush 120) |
| Commission trigger | Order placed | First invoice paid |
| Payout shape | One-time percentage | Percentage for 12 to 24 months, or a flat amount per closed deal |
| Paperwork | Standard affiliate terms | Standard terms plus confidentiality and a deal registration rule |
*The 28% figure is the share of programs on a window of 30 days or shorter in the affiliate benchmark roundup.*
That roundup, [SaaS affiliate program benchmarks](https://www.trackrev.io/data/affiliate-program-benchmarks), puts the median B2B SaaS commission at 20%, usually recurring for 12 months, and the median cookie window at 60 days, with 7% of programs on 180 days or longer. Sixty days suits a self-serve product. It is short for a deal that stops for a security questionnaire halfway through.
### Partner types that send B2B referrals
A creator with a large audience is the partner consumer programs are built around, and in my experience this type fits a long, multi-approver sale worst.
| Partner | How the referral happens | What they need from you | Starting commission |
| --- | --- | --- | --- |
| Consultants and implementers | Recommend your product during a client engagement and often join the demo | Deal protection and a named contact on your sales team | $500 flat at close, or 15% for 24 months |
| Agencies | Build your product into a service they sell | Documentation they can hand to clients | 20% for 12 months |
| Integration partners | Customers of an adjacent tool need yours too | A listing in their marketplace and a shared case study | 10% for 12 months |
| Newsletters and communities | Sponsored reads and link placements to a specialist audience | A tracked link per issue and monthly numbers | $150 flat, or 15% for 12 months |
*Starting points to adjust to your margin, not benchmarks.*
Ask your last 20 customers who advised them on the purchase. Anyone named is already steering deals without sending a trackable click. Then check who publishes comparison pages for your category.
### Commission shapes for B2B, with the arithmetic
Most programs use 1 of 3 shapes: a percentage of the first payment, a flat amount per closed deal, or a percentage of every payment for a fixed term. Take a $300-a-month product and a customer who stays 24 months.
| Shape | Formula | Customer stays 24 months | Customer leaves after month 3 |
| --- | --- | --- | --- |
| 20% of first payment | 0.20 x $300 | $60 | $60 |
| Flat fee at close | $500 | $500 | $500 |
| 15% for 12 months | 0.15 x $300 x 12 | $540 | $135 |
| 20% for 24 months | 0.20 x $300 x 24 | $1,440 | $180 |
| $150 flat plus 15% for 24 months | $150 + 0.15 x $300 x 24 | $1,230 | $285 |
*Illustrative arithmetic for one customer, not a benchmark.*
Paying 20% of the first payment gives a consultant $60 for a deal that took hours of calls. A flat fee fixes that, then pays $500 for a customer who leaves after 3 invoices. A recurring percentage follows retention but delivers $45 a month at 15%, so the partner is paid slowly for work done before the sale. In the hybrid row, $1,080 of the $1,230 depends on the customer staying, and the $150 at close covers the effort. The 20%, 12-month median from the benchmark roundup is $720 on this customer, and HubSpot's 30% for a year would be $1,080.
#### Annual and multi-year contracts
Pay on each paid invoice and never on total contract value. On a $12,000 annual invoice, 15% is $1,800 when the invoice is paid and another $1,800 at each renewal. Take a 3-year, $36,000 contract billed yearly that ends after the second invoice: invoice-by-invoice payment cost you $3,600, while a commission on the whole contract would have cost $5,400, with $1,800 of it paid on revenue you never collected.
### Set the cookie window from your own close dates
A cookie window is the number of days after a click that a payment still credits the partner. Pull your last 50 to 100 closed-won deals, record the days from the first tracked click to the first payment, and sort them. Here are 10 example deals at 12, 28, 35, 44, 52, 61, 77, 94, 118 and 171 days, each paying a $720 commission.
| Window | Deals credited | Commission credited | Commission lost |
| --- | --- | --- | --- |
| 30 days | 2 of 10 | $1,440 | $5,760 |
| 60 days | 5 of 10 | $3,600 | $3,600 |
| 90 days | 7 of 10 | $5,040 | $2,160 |
| 120 days | 9 of 10 | $6,480 | $720 |
| 180 days | 10 of 10 | $7,200 | $0 |
*Illustrative sample, not a benchmark. The median here is 56.5 days, and 9 of 10 deals close within 118 days.*
In this sample a 30-day cookie underpays the partner by 80% and a 120-day window catches 9 deals in 10. The shape in your data will differ. In [TrackRev's workspace data](https://www.trackrev.io/data/saas-attribution-benchmarks), the median time from first click to first paid charge is 6.3 days, the 90th percentile is 48.2 days and the 95th is 73.5, but that sample skews toward bootstrapped self-serve SaaS with a median MRR of $14,800. A sales-assisted product should expect a longer tail, so measure yours.
A long window keeps old clicks alive: a click from 4 months ago still claims the payment. Last click is the easiest rule to explain to a partner, and Semrush uses it. When several partners touch one deal, [first-touch and linear credit](https://www.trackrev.io/blog/attribution-models-saas-comparison) split it differently.
Check how your tool stores the visitor ID, too. [Safari Intelligent Tracking Prevention caps the expiry of cookies written by JavaScript at 7 days](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/), so a 120-day window kept in a script cookie can end after a week without a visit. The fix is to tie the visitor to an email at signup or demo request, so the gap before payment no longer depends on a cookie. TrackRev's pixel has an identify call that attaches an email to the visitor ID, which it uses to match a Stripe payment later.
### Pay on the first paid invoice, then hold for the refund window
The cookie window covers click to signup. A second lag sits between signup and payment: a contract signed on day 0, invoiced on day 7 and due net 30 pays on day 37 at the earliest. Trigger the commission on the first paid invoice, never the form fill. In Stripe Billing that is `invoice.paid`, which [Stripe sends when an invoice is successfully paid](https://docs.stripe.com/billing/subscriptions/webhooks), by card on file or by emailed invoice.
After payment, hold the commission through the period in which the customer can undo the purchase. TrackRev sets the hold per program from 0 to 180 days and defaults to 0, so set it on purpose: a 30-day money-back clause means a 30-day hold, and an annual contract with a 60-day opt-out means 60. If a refund or dispute arrives anyway, [affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers voiding and netting.
### Deal registration and who owns the deal
Deal registration lets a partner claim a company before a rep or another partner reaches it, and protects the claim for a set period. Without it, the first conflict decides whether your best consultant stays. A workable rule has 5 parts:
- The partner submits the company, a contact, the date and a one-line note on where the deal stands.
- Within 2 business days your CRM account gets a partner-registered tag with the partner's name, and the owning rep is notified.
- Protection lasts 90 days and renews in 30-day extensions while the deal progresses.
- The earliest of 3 timestamps wins: the registration, a CRM lead source set to partner, or your rep's first logged activity on the account.
- A sales leader settles disputes, because a partner reads a ruling from the affiliate manager as one side's opinion. Give reps full quota credit for partner-sourced deals, or they will work against the rule.
A form that writes to your CRM is enough while the program is small. PartnerStack builds this into its plans: its [pricing page](https://partnerstack.com/pricing) lists Launch, Growth and Enterprise tiers with deal registration and CRM integrations, and publishes no prices because they are quoted on a demo.
When a partner sits on the demo, the buyer may type your URL instead of clicking the partner's link, so no click exists. A per-partner code on the quote covers that case, and [coupon code tracking](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) explains why one code shared by every partner credits nobody.
#### Agreement terms for partners who join calls
A partner on a discovery call sees customer details that standard affiliate terms never anticipated, so add a confidentiality clause or a mutual NDA. A consultant who also bills you for implementation work needs a Master Services Agreement, with the affiliate terms attached as a schedule. Write the registration rule and the payment trigger into the terms.
Two outside rules touch the paperwork. The [Federal Trade Commission says to disclose any financial relationship with a brand](https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers), and the [Internal Revenue Service sets the Form 1099-NEC threshold at $2,000](https://www.irs.gov/instructions/i1099mec) for payments made in 2026. The [compliance guide](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers both with the privacy rules.
### What TrackRev covers in a B2B program, and where it stops
The [TrackRev Affiliate Program](https://www.trackrev.io/solutions/affiliate-program) is on every paid plan from $39 a month (Starter); the free plan tracks links only. For each program you set the cookie window from 1 to 3,650 days (the default is 60), the recurring term (first payment only, 1 to 120 months, or lifetime) and the commission as a percentage or a flat amount. Each program has its own rate, term and window, so consultants and newsletters can run as separate programs. Refunds reverse the commission, partners get a branded portal with W-9 and W-8 upload, and you pay from one PayPal or Wise CSV export. Revenue comes from Stripe, Paddle, Polar and Lemon Squeezy.
TrackRev has 3 limits that matter for B2B. A program pays a percentage or a flat amount, never both, so the hybrid row above cannot be built in one program. There is no deal registration form or CRM sync (TrackRev has webhooks for your own automation), so that rule lives in your CRM. A contract billed and paid outside those 4 billing systems never reaches the revenue data.
Pick a partner relationship management (PRM) tool such as PartnerStack when partners co-sell and you want registration and CRM sync in one place. [PartnerStack vs TrackRev](https://www.trackrev.io/blog/partnerstack-vs-trackrev) compares the two.
### What to expect from your first 20 partners
Across SaaS affiliate programs, the same roundup reports that a median 18% of recruited affiliates make a paid conversion within 30 days, against 31% in the top quartile and 6% in the bottom one. The top 10% of affiliates bring 71% of revenue in the median program. Applied to 20 recruited partners, the median case is about 4 active partners, with 1 or 2 carrying most of the result. The median affiliate takes 14 days to a first commission, and a B2B partner with a 120-day cycle waits much longer, so wait until month 6 before judging the program.
### Frequently asked questions
**Is affiliate marketing worth it for B2B SaaS?**
Yes, when your buyers take advice from people outside your company. A partner already trusted with a client's tooling decision reaches deals that ads and cold outreach reach slowly, and commission accrues only on a paid invoice. You do need to connect each payment to the partner behind it.
**What should a B2B affiliate program pay?**
Start from your own acquisition cost and keep total commission per customer under it. If paid channels cost $1,500 to win a $300-a-month customer, a 20% commission for 12 months ($720) leaves $780 of headroom, and the $1,230 hybrid still fits. Offer the richer shapes only to partners who join calls.
**How is a B2B affiliate program different from a partner program?**
An affiliate program pays commission on tracked links and codes. A partner program adds co-selling: lead handoffs, tiers, shared pipeline and often market development funds. Start with the affiliate version and add a PRM tool once partners sit inside sales calls on most deals.
**Where should a B2B partner put the affiliate disclosure?**
Next to the recommendation, in plain words. The FTC's influencer guidance says to place the disclosure with the endorsement itself and warns that one on a profile page or at the end of a post is likely to be missed. Terms like "ad" or "sponsored" are enough.
**Do I have to send 1099s to B2B partners?**
For US partners paid $2,000 or more in a year, yes, on Form 1099-NEC. Payments to corporations are generally exempt, which covers many agencies, but collect a W-9 at onboarding so the status is on file. Non-US partners send a W-8BEN (individuals) or W-8BEN-E (entities).
**How do renewals, upgrades and downgrades affect commission?**
Inside the recurring term, each renewal invoice pays at the partner's rate. At 20%, a customer who upgrades from $300 to $500 a month moves the partner from $60 to $100 on the next invoice, and a downgrade lowers it the same way. Cancellation stops accrual and leaves commission already paid in place. After the term ends, renewals pay nothing.
**Can I run a B2B affiliate program on TrackRev's free plan?**
No. The free plan covers link tracking, with 50 links and 1,000 tracked events a month, and it hides revenue figures. The affiliate program needs a paid plan, which starts with Starter at $39 a month and up to $10K of partner commission tracked monthly. You can test your link structure on the free plan first.
---
## Affiliate management software: 11 platforms compared on price, payouts and tax forms
URL: https://www.trackrev.io/blog/best-affiliate-management-software
Published: 2026-10-01
Author: Muzahid Maruf
Affiliate management software compared: 11 platforms with October 2026 prices, how each plan meters growth, who sends payouts and which tax forms it collects.
The best affiliate management software depends on what your payments run through and how much revenue your partners will bring in. For a Stripe-billed SaaS program, Rewardful, FirstPromoter, Tolt, Partnero and TrackRev start between $39 and $69 a month. PartnerStack and impact.com suit B2B partner ecosystems and bigger budgets. Tapfiliate, LeadDyno and Post Affiliate Pro cover mixed or small programs, and AffiliateWP fits WordPress sites. Plan details come from each vendor's own pricing page, checked in October 2026, and prices are monthly unless noted.
I build TrackRev, so it is entry 5 and gets judged on the same criteria as the rest, including where it falls short. Tracking is table stakes here ([how affiliate tracking works](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) covers it), and the gaps show up after the payment.
> **Key takeaways:**
>
> - The 9 tools with a published monthly price start between $30 and $89, and each plan meters something different: affiliate revenue, commission tracked, clicks, active affiliates or tracking requests.
> - A program that grows from $12,000 to $40,000 of monthly affiliate revenue moves Rewardful from $99 to $299 and Tolt from $99 to $199, while Partnero stays at $49 billed annually.
> - Vendors that send the money charge for it: Tolt takes 2%, Rewardful 3% on ACH payouts and Partnero 7%, which is $60, $90 and $210 a month on $3,000 of commissions.
> - The IRS raised the Form 1099-NEC threshold to $2,000 starting in 2026, so collect a W-9 or W-8BEN before the first payout.
> - PartnerStack gives no price and impact.com's marketplace tier starts at $500, which fits large partner ecosystems better than a small SaaS program.
### What affiliate management software has to handle
Every tool here ties a sale to a partner's link. Management is the work that follows: approving partners, calculating commissions, reversing them on refunds, holding money until the refund window closes, paying people abroad and keeping the paperwork the IRS expects. [How to create an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) covers the design that comes before the software.
| Job | What to test in a trial |
| --- | --- |
| Recruiting | A branded sign-up page, invite-only programs, a marketplace that supplies new partners |
| Commission rules | Recurring or lifetime pay, a different rate for the first order, per-product rates, sub-affiliate tiers |
| Refunds | Whether a refund, dispute or downgrade changes the commission without you touching it |
| Holds | Whether payment can wait 30 days once a period closes |
| Payouts | Which party sends funds, in which currencies, for what fee |
| Tax and disclosure | Tax-form upload in the portal, totals that export for 1099 prep |
### 11 platforms side by side
| Tool | Starts at | Free trial | What the plan meters | Billing systems |
| --- | --- | --- | --- | --- |
| Rewardful | $49 | 14 days | Attributed revenue, $7,500 on Starter | Stripe, Paddle |
| FirstPromoter | $49 | 14 days, no card | Revenue from affiliates, $5,000 on Starter | Stripe, Paddle, Chargebee, Recurly, Braintree |
| Tolt | $69 | 14 days, no card | Revenue earned, $10,000 on Basic | Stripe, Paddle, Chargebee |
| Partnero | $49 on annual billing | 30 days | Programs and team seats | Stripe, Paddle, Chargebee, Shopify |
| TrackRev | $39 | Free plan, 1,000 events | Commission tracked, $10K on Starter | Stripe, Paddle, Polar, Lemon Squeezy |
| Tapfiliate | $89 | 7 days on Launch | 5,000 clicks and 500 conversions on Launch | 30+ including Stripe and Shopify |
| LeadDyno | $49 | 30 days | Active affiliates, 50 on Lite | Stripe, Shopify |
| Post Affiliate Pro | $89 | Free trial, length not stated | Tracking requests, 10,000 on Starter | 125+ plugins |
| AffiliateWP | $149.50 first year | None, 14-day refund | Sites, 1 on Personal | WordPress, WooCommerce and 20+ integrations |
| PartnerStack | Not published | Demo | Not stated | CRM integrations |
| impact.com | $30, needs an eCommerce platform | Self-serve Starter, demo for the rest | Feature tier | Shopify, BigCommerce, WooCommerce |
*Prices from each vendor's pricing page, October 2026.*
### The 11 platforms, one at a time
#### 1. Rewardful, for Stripe-first SaaS programs
[Rewardful](https://www.rewardful.com/pricing) prices on the revenue your affiliates bring in. Its [pricing schedule](https://www.rewardful.com/pricing-schedule), updated January 20, 2026, puts Starter at $49 for up to $7,500 of affiliate-attributed revenue and Growth at $99 for up to $15,000. Enterprise tiers begin at $149 for $30,000 and reach $5,000 for $2.5 million. Every plan has unlimited affiliates and visitors with a 0% transaction fee.
Starter runs 1 campaign and has no branded portal; Growth adds the portal, a custom domain, private campaigns and custom rewards. Rewardful connects to Stripe and Paddle, adjusts commissions when a customer refunds, upgrades, downgrades or cancels, and syncs both ways with Stripe. Starter caps team members at 2.
#### 2. FirstPromoter, for the widest billing support
[FirstPromoter](https://firstpromoter.com/pricing) starts at $49 with a 14-day trial and no card. Starter allows up to $5,000 of affiliate revenue, 1,000 affiliates and 3 campaigns. Business is $99 for up to $15,000, unlimited campaigns and affiliates, and 2 workspaces. Enterprise begins at $149 for anything above $15,000.
It connects to Stripe, Paddle, Chargebee, Recurly and Braintree, and imports historical Stripe data when you migrate. Rules include a separate first-order rate, rates that change over time, earning caps and up to 3 tiers of sub-affiliates, and refunds produce negative commissions automatically. A custom domain, white-labeling and an in-app dashboard start at Business, and agreements, leaderboards and a marketing asset library come on every plan. Billing on Recurly or Braintree is the clearest reason to pick it.
#### 3. Tolt, for auto payouts and 1099 filing
[Tolt](https://tolt.com/pricing) charges $69 for Basic, $99 for Growth and $199 for Pro, each with 14 days free and no card. Its meter is revenue earned from affiliates: up to $10,000, $20,000 and $50,000, with custom pricing above that. All three plans include a custom domain and a branded portal, and programs climb from 2 to 5 to unlimited.
Payouts set it apart: Basic is manual, while Growth adds auto payouts for a 2% fee plus tax-form collection and 1099 filing. It works with Stripe, Paddle and Chargebee and backs the plan with a 30-day refund policy.
#### 4. Partnero, for plans that ignore revenue
[Partnero](https://www.partnero.com/pricing) leaves revenue, transactions and partner counts unmetered. Starter is $49 on annual billing ($59 monthly) for 1 program and 1 team member, Partner is $159 ($199 monthly) for 3 programs and 3 team members, and Enterprise starts at $599. Extra seats cost $29, and the 30-day trial includes every feature.
Affiliate, referral, influencer and newsletter programs all run on each plan. Its [payout settings](https://www.partnero.com/features/automated-payouts) allow manual, scheduled or automated payments, free when you pay directly and 7% when Partnero pays.
#### 5. TrackRev, for partners that run beside other channels
[TrackRev](https://www.trackrev.io/solutions/affiliate-program) runs an affiliate program, link tracking and revenue attribution on one data model. The free plan covers 50 links and 1,000 tracked events a month with revenue figures hidden. Paid plans are [Starter at $39, Growth at $99 and Scale at $199](https://www.trackrev.io/pricing), each with the whole product, unlimited partners and unlimited programs. The meter is partner commission tracked in a month: up to $10K on Starter, $100K on Growth and unlimited on Scale. Sale revenue is never capped, and annual billing pays for 9 months and gives 12.
It handles recurring, one-time and tiered commissions and reverses a commission when a charge is refunded or disputed. Partners sign in to a portal on your domain to grab links and watch earnings, and fraud and self-referral detection come built in. W-9 and W-8 upload sits in onboarding, and Partner Accelerator pays partners who recruit partners from one capped pool. Payout periods close weekly, every 2 weeks, monthly or quarterly. Each program sets a hold from 0 to 180 days (default 0), and you pay from one PayPal or Wise export, then mark each payout paid. Revenue syncs from Stripe, Paddle, Polar and Lemon Squeezy.
It loses on four counts: it does not send the money or file 1099s, it has webhooks instead of a Zapier app, and it has no marketplace of ready-made partners. Tolt, Partnero or Tapfiliate's Scale plan fit better when automated payouts decide the purchase, FirstPromoter when billing runs on Recurly or Braintree, and PartnerStack when you need partners you do not know yet.
#### 6. Tapfiliate, for programs that mix store and SaaS sales
[Tapfiliate](https://tapfiliate.com/pricing/) meters clicks and conversions instead of revenue. Launch is $89 ($74 on annual billing) for 1 program, 50 affiliates, 5,000 clicks and 500 conversions, with overage at $1.50 per 1,000 clicks and $15 per 1,000 conversions. Scale is $179 ($149 annually) with unlimited affiliates and programs, 100,000 clicks and 10,000 conversions, and overage at $1 and $10. Enterprise is quoted and is where full white-label sits.
More than 30 integrations include Stripe, Shopify, BigCommerce, WooCommerce and Magento. Scale adds multi-level marketing, item-based commissions and automated payouts through [Trolley](https://tapfiliate.com/blog/automated-affiliate-payouts), a separate paid service funded by a balance you top up, which also collects W-9 and other tax forms. Trials run 7 days on Launch and 14 on Scale.
#### 7. LeadDyno, for small programs priced by affiliate count
[LeadDyno](https://www.leaddyno.com/pricing) prices by active affiliates and leaves clicks and conversions unlimited. Lite is $49 for 50 active affiliates, Essential is $129 for 150, Advanced is $349 for 500 and Unlimited is $749. The 30-day trial matches Partnero's, and annual billing saves 15%, which brings Essential to $110.
Essential adds multi-level commissions, a custom dashboard domain and 1:1 call support; Advanced adds per-product commissions and a white-labeled dashboard. Payouts run through PayPal Masspay, and affiliates upload a W-9 or W-8BEN that you can export with commission totals for 1099 prep (see its [feature list](https://www.leaddyno.com/features)). Because price follows affiliate count, 500 active affiliates cost $349 here against $99 on Rewardful's Growth plan while revenue stays under $15,000.
#### 8. Post Affiliate Pro, for unusual commission structures
[Post Affiliate Pro](https://www.postaffiliatepro.com/pricing/) meters tracking requests. Starter costs $89 ($79 on annual billing) and covers 10,000 requests and 1 campaign. Pro, $139 ($129), covers 1 million and unlimited campaigns; Ultimate, $269 ($249), 6 million; Network, $649 ($599), 20 million plus multiple merchant accounts. Affiliates are unlimited throughout, and extra requests cost $5 per 10,000 on Starter.
Every plan includes lifetime commissions, multi-tier structures up to 99 tiers, per-click, per-sale and CPM rates, mass payments in one batch, and fraud rules that block duplicate commissions on one order ID and repeat sign-ups from one IP address. Recurring commissions, the feature most SaaS programs need, start at Ultimate. The full setup on Starter is capped at 2 hours.
#### 9. AffiliateWP, for WordPress and WooCommerce stores
[AffiliateWP](https://affiliatewp.com/pricing/) is a WordPress plugin, so you buy a yearly license and run it on your own site. Personal is $149.50 for the first year ($299 list, which is also the renewal price) and covers 1 site. Plus is $199.50 ($399) for 2 sites, and Pro is $299.50 ($599) for 5 sites with automatic payouts, recurring referrals and multi-tier commissions. Every tier has unlimited affiliates and no platform fees.
Payouts run through Stripe or PayPal. There is no trial, only a 14-day money-back guarantee, and it needs a self-hosted WordPress site.
#### 10. PartnerStack, for partner marketplaces
[PartnerStack](https://partnerstack.com/pricing) publishes no prices. Its pricing page names Launch, Growth and Enterprise plans and says cost depends on program size, features and support level, confirmed in a demo. Launch already includes marketplace access to active B2B partners, affiliate link tracking or lead and deal registration, and partner payments built for B2B sales cycles. Growth adds a learning management system and marketing development fund payments, and Enterprise adds a designated customer success manager. The page sets no limit on partners or internal users.
#### 11. impact.com, for large multi-channel programs
[impact.com](https://impact.com/integrated-platform-prices/) lists four tiers. Starter is priced from $30, and its sign-up note requires an eCommerce integration with Shopify, BigCommerce, WooCommerce, Adobe Commerce or Squarespace. Essentials starts at $500 and adds marketplace access to 90,000 partners, unlimited contract templates and performance bonuses. Pro starts at $2,500 with dedicated support, API-based tracking, a Data Lab for custom reports and SAML. Enterprise is priced by quote and adds fraud scoring and partner deduplication across channels.
Its [SaaS page](https://impact.com/saas-partnership-marketing/) describes contracts built in minutes and automatic payouts in 80+ currencies out of a balance you deposit. A Stripe-billed SaaS company will likely start at Essentials, at least $6,000 a year.
### What the same program costs on each plan
Entry prices mislead because every vendor sets a different ceiling. Take a program whose partners bring in $12,000 of revenue a month at a 25% commission, which is $3,000 in commissions. Then let it grow to $40,000 of revenue and $10,000 in commissions.
| Tool | At $12,000 | At $40,000 |
| --- | --- | --- |
| Rewardful | Growth, $99 | Enterprise 75k, $299 |
| FirstPromoter | Business, $99 | Enterprise, from $149, quoted |
| Tolt | Growth, $99 | Pro, $199 |
| Partnero | Starter, $49 on annual billing | Starter, $49 on annual billing |
| TrackRev | Starter, $39 | Starter at its $10K cap; Growth, $99, adds room |
*Prices from each vendor's pricing page, October 2026.*
Read the tier above the one you need before signing with any revenue-metered plan. Rewardful lists $299 for its 75k tier, while FirstPromoter puts everything above $15,000 behind a call. Tapfiliate counts clicks and conversions, Post Affiliate Pro counts tracking requests and LeadDyno counts active affiliates, so one program can cost $49 or $349 on LeadDyno depending on whether 50 or 500 affiliates are active. Annual billing takes about 2 months off at Rewardful, FirstPromoter, Tapfiliate and Partnero, 15% off at LeadDyno and 25% off at TrackRev, which charges for 9 months and gives 12. Tolt's page lists monthly prices only.
### Recruiting and partner portals
Most tools here assume you bring your own partners. PartnerStack and impact.com are the exceptions, with marketplaces of existing partners (impact.com's Essentials tier lists 90,000). A custom portal domain is a plan boundary at most vendors: it starts at Growth ($99) on Rewardful, Business ($99) on FirstPromoter and Essential ($129) on LeadDyno, comes with Tolt's $69 Basic plan and every paid TrackRev plan from $39, and starts at Scale ($179) on Tapfiliate, which keeps full white-label for Enterprise.
### Payouts, tax forms and holds
#### Who pays the partners
Payout design falls into three models. In the first, the tool produces a PayPal or Wise file and you upload it yourself, as TrackRev and Rewardful's lower plans do. In the second, it triggers payments from your own PayPal Business account, which Rewardful reserves for Enterprise and FirstPromoter starts at Business. In the third, the vendor sends the money for you against an invoice or a funded balance and charges a fee. On $3,000 of monthly commissions, Tolt's 2% costs $60, Rewardful's 3% on ACH costs $90 and Partnero's 7% costs $210, or $2,520 a year.
| Tool | How you pay partners | Fee when the vendor sends | Tax forms in the portal |
| --- | --- | --- | --- |
| Rewardful | PayPal and Wise mass-payout files on every plan; one-click PayPal on Enterprise | Managed Payouts: 3% on commissions paid via ACH | Collected in Managed Payouts onboarding |
| FirstPromoter | Mass payouts over PayPal, Wise, Stripe, crypto and bank transfer in 190 currencies; one-click PayPal from Business | Managed Auto Payouts on Enterprise by approval; fee not published | W-9 and W-8BEN on every plan |
| Tolt | Manual on Basic; auto payouts from Growth over PayPal, Wise, local bank, crypto and wire | 2% processing fee | Collection plus 1099 filing from Growth |
| Partnero | Manual, scheduled or fully automated over PayPal, wire transfer, Venmo or crypto | 0% on direct payouts, 7% when Partnero pays | Collection, forms not named |
| TrackRev | File upload to PayPal or Wise, then record each payment | None, because TrackRev does not send money | Uploaded at onboarding |
| Tapfiliate | Trolley from Scale, funded by a balance you maintain | Billed separately by Trolley, amount not stated | Collected through Trolley |
| LeadDyno | PayPal Masspay, check, wire or gift card | Not published | Dashboard upload, export for 1099 prep |
*Fees and forms as listed on each vendor's pricing and feature pages.*
#### Tax forms and the 1099 threshold
Get a W-9 from US partners before the first payment and a W-8BEN from partners abroad. FirstPromoter, Tolt, LeadDyno and TrackRev collect them in the partner portal, Tapfiliate does it through Trolley, and Tolt goes furthest by filing 1099s from Growth. The [IRS instructions for Form 1099-NEC](https://www.irs.gov/instructions/i1099mec) set the threshold at $2,000 for tax years beginning after 2025, due January 31, and many older guides still say $600. Card and third-party network payments go on Form 1099-K from the payment settlement entity instead, so ask an accountant how PayPal and Wise payouts are treated for you. [How to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers methods and forms in more depth.
#### Holds and refunds
Commission earned today can be reversed next week, so safer designs delay payment. TrackRev counts its per-program hold from the day the period ends. With monthly periods and a 30-day refund guarantee, a 30-day hold makes a March 3 sale payable on April 30, 58 days later, and a March 31 sale payable on day 30. FirstPromoter schedules payouts with NET terms and minimum thresholds. Rewardful, Tolt, FirstPromoter and TrackRev all claw back commission on a refund. [Affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers refunds that arrive after the money has gone out.
#### Disclosure rules your partners follow
Affiliates must disclose that they earn a commission. The [FTC's endorsement guide FAQ](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking), which points to the Guides revised in 2023, says to place the disclosure close to the recommendation, calls "paid link" beside a link adequate and warns that consumers may not understand "affiliate link" alone. Put that wording in your program terms; FirstPromoter lists affiliate agreements signed in the portal. The [affiliate compliance guide](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers FTC and GDPR requirements.
### Which platform fits which program
| Your situation | Shortlist |
| --- | --- |
| Stripe or Paddle billing, a branded portal and under $10,000 of monthly affiliate revenue | Rewardful Growth ($99), FirstPromoter Business ($99), Tolt Basic ($69), Partnero Starter ($49 on annual billing) or TrackRev Starter ($39) |
| You want the vendor to send payments and handle tax paperwork | Tolt Growth sends for 2% and files 1099s; Partnero sends for 7%; LeadDyno exports forms and totals for your own filing |
| Affiliates run beside a newsletter, paid ads and content, and you want channels compared on revenue | TrackRev, which measures every channel on one data model |
| You need a marketplace of existing partners, co-selling or deal registration | PartnerStack (quoted) or impact.com (Essentials from $500) |
| Ecommerce and subscription sales share one program | Tapfiliate Launch ($89) or Scale ($179) |
| Your store runs on WordPress with WooCommerce | AffiliateWP, $149.50 in year one |
| Commissions are unusual: CPM, lifetime referrals or deep tiers | Post Affiliate Pro, with up to 99 tiers |
| A small program under 150 affiliates that wants 1:1 calls | LeadDyno Essential ($129) |
TrackRev's free plan is enough to test the tracking before you invite a partner, and the paid plans start at $39. Teams that bill only through Stripe can also read the [best affiliate software for Stripe](https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026) comparison.
### Frequently asked questions
**What is affiliate management software?**
It is the system a company uses to approve partners, record the sales they refer, calculate and reverse commissions, and pay and document what it owes. Some products add a partner marketplace, and some add referral programs for customers.
**How much does affiliate management software cost?**
Published monthly entry prices run from $30 for impact.com Starter to $89 for Tapfiliate and Post Affiliate Pro, while PartnerStack quotes by demo. Extra costs come from the ceiling you outgrow and from any fee on vendor-sent payouts, which run from 2% to 7% at the vendors that publish one.
**Is there free affiliate management software?**
Free forever plans are rare, and TrackRev's is link tracking only (1,000 events a month, revenue hidden); running an affiliate program there needs a paid plan from $39. Most of the others start with a 7 to 30 day trial, AffiliateWP gives a 14-day refund window and PartnerStack sells through a demo.
**Should I use an affiliate network or my own software?**
Use your own software when the partners are customers, creators and consultants you recruit yourself. A network or marketplace helps when you need to find partners you do not know yet, and it usually costs more: the impact.com tier with marketplace access starts at $500 a month.
**Can I switch platforms without losing partner history?**
Ask the new vendor for an import before the trial ends. FirstPromoter lists a historical Stripe import for migrating teams, and Partnero lists onboarding and migration help on Enterprise. Keep the old tracking links working until the longest cookie window you ever promised has passed, so referrals in flight still credit the right partner.
**How do I pay affiliates in other countries?**
Collect a W-8BEN from non-US partners and pick a rail that supports their currency. FirstPromoter's mass payouts cover 190 currencies and impact.com says 80+. PayPal and Wise can add their own fees on top of any vendor fee, so compare the total on each rail.
**Can one tool run referral and affiliate programs?**
Mostly yes. Partnero runs affiliate, referral, influencer and newsletter programs on each plan, FirstPromoter and Rewardful list double-sided rewards, and TrackRev keeps referral campaigns and partner programs in one workspace.
---
## Best affiliate software for Paddle in 2026, checked against Paddle Billing's own docs
URL: https://www.trackrev.io/blog/best-affiliate-software-for-paddle-2026
Published: 2026-08-10
Author: Muzahid Maruf
Seven affiliate tools compared on Paddle Billing support, refund handling and price. Rewardful is Classic only; FirstPromoter, Partnero and Tolt read Billing.
The best affiliate software for Paddle is the tool that reads Paddle Billing's transactions and its refund adjustments. In October 2026 that points to FirstPromoter, Partnero or Tolt for most programs. Rewardful's own Paddle page says it integrates with Paddle Classic only, Tapfiliate lists no Paddle connector, and TrackRev, which I run, reads Billing sales but has two gaps on Paddle. For a program that drives $8,000 a month of affiliate revenue, plans cost $39 to $99 a month.
Paddle is the seller of record, so the sale, the tax and any refund live in Paddle's records. Paddle Billing runs beside the older Paddle Classic, with a new API and new webhooks. Four details decide which tool works: the Paddle version it connects to, how it hears about refunds, the amount it pays commission on, and how the referral survives renewals. If you also bill through Stripe, [affiliate software for Stripe](https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026) covers that side.
> **Key takeaways:**
>
> - Rewardful's own Paddle page says it integrates with Paddle Classic only, and Paddle says accounts opened before August 8, 2023 run Paddle Classic, so most newer sellers need another tool.
> - A Paddle Billing transaction has 7 statuses and none is refunded, because refunds are adjustments that Paddle approves. FirstPromoter and Tolt list the adjustment events they read, and Partnero documents refund claw-backs.
> - Paddle's transaction total includes tax. On a $100 plan with 20% VAT, a 20% commission is $24 on the total and $20 without tax.
> - A program driving $8,000 a month of affiliate revenue costs $39 on Affonso Growth or TrackRev Starter, $59 on Partnero, $69 on Tolt and $99 on FirstPromoter.
> - TrackRev reads Paddle Billing only, applies commission to the total including tax and does not read refund adjustments, so set a hold period (0 to 180 days) that matches your refund window.
### Best affiliate software for Paddle, side by side
| Tool | Paddle versions | Refunds read | Entry price | Trial |
| --- | --- | --- | --- | --- |
| FirstPromoter | Billing and Classic | Refunds and chargebacks | $49 | 14 days |
| Partnero | Billing and Classic | Paddle adjustments | $59 ($49 billed yearly) | 30 days |
| Tolt | Billing and Classic | Refunds | $69 | 14 days |
| Affonso | Billing; Classic not listed | Refunds and partial refunds | $15 billed yearly | 14 days |
| TrackRev | Billing | None | $39 | Free plan without affiliates |
| Rewardful | Classic only | None on Billing | $49 | 14 days |
| Tapfiliate | No native connector | None | $89 | 7 days |
*Prices from each vendor's pricing page, October 2026. Entry price is the cheapest paid plan per month.*
### What Paddle changes for affiliate tracking
#### Paddle Billing and Paddle Classic need different integrations
Paddle's [migration guide](https://developer.paddle.com/migrate/learn/) says accounts opened before August 8, 2023 run Paddle Classic, while newer accounts run Paddle Billing, which has its own API, webhooks and JavaScript library. A tool that says it supports Paddle may mean either one. Rewardful's Classic guide passes the referral in a `passthrough` string, while Paddle Billing uses a `custom_data` object. The webhook events differ too, so a connector built for one says nothing about the other. Vendors note the version on their Paddle page, which is where Rewardful states its Classic-only status.
#### Refunds arrive as adjustments, and Paddle approves most of them
A Paddle transaction has no refunded status. Its [7 statuses](https://developer.paddle.com/api-reference/transactions/get-transaction/) are draft, ready, billed, paid, completed, canceled and past_due, and a refund is a separate [adjustment](https://developer.paddle.com/api-reference/adjustments/) record with 4 statuses of its own: pending_approval, approved, rejected and reversed. On live accounts most refunds start as `pending_approval` until Paddle reviews them, and a chargeback creates an adjustment automatically.
So FirstPromoter reads refunds from `adjustment.updated` and chargebacks from `adjustment.created`, and Tolt subscribes to `adjustment.updated`. A tool that listens only for `transaction.completed` pays a commission and never takes it back, and [affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers the reversal rules.
#### The commission base can include tax and Paddle's fee
Paddle Billing's transaction totals separate subtotal, discount, tax, total, fee and earnings. The [transactions reference](https://developer.paddle.com/api-reference/transactions/get-transaction/) defines total as the amount after discount and tax, and earnings as the total minus Paddle's fee. A price's `tax_mode` puts tax on top of the price or inside it, and the total includes it either way, so a tool that takes the total pays partners a share of the VAT.
Take a $100 monthly plan priced exclusive of tax, sold to a customer in a country with 20% VAT, with a 20% partner commission. The customer pays $120.
| Commission base | Amount | Commission at 20% | Over 12 renewals |
| --- | --- | --- | --- |
| Total including tax | $120.00 | $24.00 | $288.00 |
| Total minus tax | $100.00 | $20.00 | $240.00 |
| Difference | $20.00 | $4.00 | $48.00 |
*Worked example: $100 plan priced exclusive of tax, 20% VAT, 20% commission.*
Across 100 referred customers, that $48 a year becomes $4,800 a year paid out on VAT that never reaches your revenue. Paddle's [fee is 5% + 50¢](https://www.paddle.com/pricing) per checkout transaction, which takes 7.5% of a $20 sale and 5.5% of a $100 one, so some programs pay on net earnings instead. FirstPromoter has a toggle for this: with "Exclude Paddle's fees" off, commission uses your earnings plus Paddle's fee, and with it on, your earnings after the fee. Its docs don't say whether tax is in either base, so confirm that on a sandbox sale. My default is to pay on the total minus tax and to write that base into the partner terms.
#### Custom data carries the referral through renewals
Paddle's [custom data guide](https://developer.paddle.com/build/transactions/custom-data/) says data on a transaction is copied to its subscription, and from the subscription to each renewal, upgrade and one-time charge. Pass the referral ID once at checkout and every later payment carries it. Tolt reads `tolt_referral`, Affonso `affonso_referral` and TrackRev `vid`, each passed in custom data from the checkout call. The [custom_data walkthrough](https://www.trackrev.io/blog/paddle-checkout-attribution-passthrough) covers what breaks when the field is missing.
Paddle.js on Paddle Billing: passing TrackRev's visitor ID
```
Paddle.Checkout.open({
items: [{ priceId: "pri_xxx", quantity: 1 }],
customer: { email: user.email },
customData: { vid: window.trk.vid },
});
```
### The seven tools in detail
#### 1. FirstPromoter, for both Paddle versions and a fee toggle
[FirstPromoter](https://firstpromoter.com/pricing) gives every plan a 14-day trial with no card, and its [Paddle documentation](https://docs.firstpromoter.com/integrations/billing/paddle) covers Paddle Classic on v1 webhooks and Paddle Billing on v2 webhooks. On Paddle Billing it reads `transaction.completed` for sales, `adjustment.created` for chargebacks, `adjustment.updated` for refunds and `subscription.canceled` for cancellations, and it ignores zero-amount sales and refunds.
Its docs link a setup guide for the connection. It suits accounts on Paddle Classic or mid-migration, and anyone who wants the fee toggle. Starter allows 1,000 affiliates, Business and Enterprise are unlimited, and a program near $5,000 a month will soon need the $99 Business plan.
#### 2. Partnero, for a Paddle connection that builds its own webhook
[Partnero](https://www.partnero.com/integrations/paddle) lists 3 Paddle guides: Paddle Billing through the Overlay checkout, Paddle Billing through user sign-up, and Paddle Classic through the Overlay checkout. You paste a Paddle API key into the program's integration settings, and Partnero creates the webhook itself. It connects to a Paddle sandbox account, imports your existing Paddle discounts as tracking codes, pushes discounts you create in Partnero back to Paddle, and says refunds claw the commission back automatically.
On its [pricing page](https://www.partnero.com/pricing), every plan allows unlimited partners, transactions and revenue, and the trial lasts 30 days. Starter covers 1 program and 1 team member, so a second program means the $159 to $199 plan.
#### 3. Tolt, for a step-by-step Paddle Billing guide
[Tolt's Paddle Billing guide](https://help.tolt.com/en/articles/8455444-how-to-set-up-paddle-billing-with-tolt), dated March 2026, has you add a 4 KB tracking script, send `window.tolt_referral` to checkout in `customData`, create a Paddle notification endpoint for `subscription.created`, `subscription.canceled`, `transaction.completed` and `adjustment.updated`, then paste in a Paddle API key and the webhook secret. The key needs read access to Adjustments, Customers, Products, Subscriptions, Transactions and Notifications, plus read and write on Discounts, so create a dedicated key for it.
On its [pricing page](https://tolt.com/pricing), every plan has a 14-day trial with no card, Basic allows 2 programs and 3 team members, a refund deducts the commission and a cancellation stops it. Growth adds automatic payouts at a 2% fee, which is $20 per $1,000 sent. [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev) sets the two side by side.
#### 4. Affonso, for the lowest entry price
[Affonso](https://affonso.io/pricing) gives every plan a 14-day trial. Its [Paddle Billing guide](https://affonso.io/help/integrations/paddle/paddle-billing-checkout) has you pass `window.affonso_referral` in `customData`, and its changelog describes native Paddle support for subscriptions, one-time purchases, refunds and partial refunds.
Two lines in that guide deserve a question to support. Paddle sandbox transactions don't appear in Affonso, so you test with a 100% discount code on a live account. And its last section tells you to extract the referral from Paddle's webhook payload and report transactions to Affonso, which reads like a custom backend step, so ask whether the native connection covers it.
#### 5. TrackRev, for Paddle sales that sit next to other channels
I run TrackRev, so judge this entry by the same checks as the others. The affiliate program needs a paid plan, while the free plan tracks 50 links and 1,000 events a month without it. Annual billing on [pricing](https://www.trackrev.io/pricing) pays for 9 months and gives 12, and Scale adds priority support.
TrackRev connects to Paddle Billing with a read-only API key, and a key containing `_sdbx` points it at Paddle's sandbox. You pass `window.trk.vid` as `vid` in custom data, and TrackRev matches the buyer's email when it is missing. Renewals inherit the visitor from the subscription's first transaction, and a Paddle discount code assigned to a partner credits them with no link click. Sales sync hourly, or within seconds once a Paddle notification destination for `transaction.completed` is added and its secret saved.
Two gaps matter on Paddle. TrackRev reads each transaction's grand total from the Paddle API, which includes tax, and applies the commission rate to it, so the 20% example above pays $24 instead of $20, and there is no net-of-tax or net-of-fee setting. It also does not read Paddle adjustments today, so a refund approved in Paddle does not take the commission back out by itself. Set the program's hold period, which runs from 0 to 180 days and defaults to 0, to your refund window, and check Paddle's refund list before each payout batch. It connects to Billing only, not Classic.
Choose FirstPromoter or Partnero when automatic refund reversal on Paddle is a requirement. Choose TrackRev when the same Paddle revenue also needs a split by newsletter or paid-ad channel. [Paddle revenue attribution by channel](https://www.trackrev.io/blog/paddle-revenue-attribution-marketing-channels) covers that side, and the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) lists the program features.
#### 6. Rewardful, for accounts that are still on Paddle Classic
[Rewardful's Paddle page](https://www.rewardful.com/paddle) says it integrates with Paddle Classic, not Paddle Billing, and its [help center article](https://help.rewardful.com/en/articles/6252551-integrating-rewardful-with-paddle) says the same. Paddle's guide says only accounts opened before August 8, 2023 have Classic, so a newer seller has nothing for Rewardful to connect to. Its [pricing page](https://www.rewardful.com/pricing) shows a 14-day trial and a 0% transaction fee on every plan. Starter allows 1 campaign and 2 team members, and Growth adds a branded portal and unlimited campaigns. A Classic account with a small program can still use it, and [6 Rewardful alternatives](https://www.trackrev.io/blog/best-rewardful-alternatives-2026) cover the sellers who can't.
#### 7. Tapfiliate, which needs a custom build for Paddle
Tapfiliate's old Paddle integration page now redirects to its [integrations directory](https://tapfiliate.com/integrations/), which lists no Paddle connector. For platforms without a listed integration, its [help center](https://support.tapfiliate.com/en/articles/1443996-does-tapfiliate-integrate-with-my-platform) points to the generic JavaScript and REST API guides and says manual integrations fall outside standard support, so budget developer time. Its [pricing page](https://tapfiliate.com/pricing/) offers a 7-day trial on Launch.
### What each plan meters, and what an $8,000 program costs
| Tool | The limit counts | First plan | Second plan | Third plan |
| --- | --- | --- | --- | --- |
| FirstPromoter | Affiliate revenue a month | $49 to $5,000 | $99 to $15,000 | $149 above $15,000 |
| Partnero | Programs | $59 for 1 program | $199 for 3 programs | Custom |
| Tolt | Earned from affiliates | $69 to $10,000 | $99 to $20,000 | $199 to $50,000 |
| Affonso | Partner revenue a month | $15 to $1,000, billed yearly | $39 to $10,000 | $99 to $30,000 |
| TrackRev | Partner commission a month | $39 to $10K | $99 to $100K | $199, unlimited |
| Rewardful | Affiliate revenue a month | $49 to $7,500 | $99 to $15,000 | $149+ to $30,000 |
| Tapfiliate | Clicks and conversions | $89 for 5,000 clicks | $179 for 100,000 clicks | Custom |
*Monthly prices from each vendor's pricing page, October 2026, unless a cell says billed yearly.*
Take $8,000 a month of affiliate-driven Paddle revenue at a 20% commission, which is $1,600 of commission, billed monthly.
| Tool | What decides the plan | Plan needed | Per month |
| --- | --- | --- | --- |
| Affonso | $8,000 against $1,000 on Launch | Growth | $39 |
| TrackRev | $1,600 commission against $10,000 on Starter | Starter | $39 |
| Partnero | No revenue cap, 1 program on Starter | Starter | $59 |
| Tolt | $8,000 against $10,000 on Basic | Basic | $69 |
| FirstPromoter | $8,000 against $5,000 on Starter | Business | $99 |
| Rewardful (Classic only) | $8,000 against $7,500 on Starter | Growth | $99 |
*Worked from the plan limits above. Affonso Growth is $29 billed yearly.*
FirstPromoter and Rewardful step up at $5,000 and $7,500, so a program that grows 10% past either line pays $99. TrackRev meters the $1,600 commission, so Starter holds until commission reaches $10,000 a month, which is $50,000 of sales at 20%. Against FirstPromoter Business that is $60 a month, or $720 a year, before weighing the refund gap above. Tolt labels its tiers "earned from affiliates", so ask whether that counts revenue or commission.
### Test refunds in Paddle's sandbox before paying for a year
- Create a Paddle [sandbox account](https://developer.paddle.com/sdks/sandbox/), which has separate data and API keys containing `_sdbx`, and connect the tool to it. Partnero and TrackRev accept one, while Affonso's guide says sandbox sales don't appear there, so test it with a 100% discount code on a live account.
- Open checkout from a partner link and pay with test card 4242 4242 4242 4242, which Paddle lists as a valid card without 3DS.
- Compare the commission with the transaction's tax line. In the $120 example above, a $24 commission means tax is in the base and $20 means it is not.
- Refund the transaction and wait 10 minutes, the interval at which Paddle approves sandbox refunds. The commission should appear and then reverse.
- If an event goes missing, check the endpoint first. Sandbox gives up on a failed webhook after 3 retries in 15 minutes, against 60 retries over 3 days on live accounts.
### Which tool fits which Paddle setup
| Your Paddle setup | Start with | Reason |
| --- | --- | --- |
| Still on Paddle Classic | FirstPromoter, Partnero or Tolt | All 3 document Classic, and Rewardful works only there |
| Billing, refunds must reverse on their own | FirstPromoter, Partnero or Tolt | Each documents how Paddle refunds reach commissions |
| Billing, lowest monthly bill | Affonso or TrackRev | $39 a month for the $8,000 program |
| Billing, no webhook to maintain | Partnero | It creates the Paddle webhook itself |
| Billing, partner revenue next to other channels | TrackRev | One pixel attributes partners and other channels |
### Frequently asked questions
**What is the best affiliate software for Paddle?**
FirstPromoter, Partnero and Tolt document Paddle refund handling, and Affonso and TrackRev are cheapest at $39 a month for an $8,000-a-month program. TrackRev does not read Paddle refunds today.
**Does Rewardful work with Paddle Billing?**
No. Rewardful's Paddle page and help center say Paddle Classic only, and Paddle says accounts opened before August 8, 2023 are the ones on Paddle Classic.
**What happens to an affiliate commission when Paddle refunds a customer?**
Paddle Billing records an adjustment, and on live accounts most adjustments wait for Paddle's approval. The tool has to read that adjustment to reverse the commission, and a hold period equal to your refund window delays payment until refunds can arrive.
**Should affiliate commission include VAT on Paddle sales?**
Usually not. Paddle collects the VAT for tax authorities, yet its total includes it, so a tool applying 20% to a $120 total pays $24 instead of $20. A sandbox sale shows which base a tool uses.
**Can I run a Paddle affiliate program on TrackRev's free plan?**
No. The free plan covers link tracking, with 50 links and 1,000 tracked events a month. Partner commissions and revenue figures start on Starter at $39 a month.
**Can one tool track Paddle affiliates and my other marketing channels?**
TrackRev can: it attributes Paddle revenue to channels such as newsletters and paid ads and pays partner commissions from the same data, starting at $39 a month. FirstPromoter, Partnero, Tolt and Affonso describe affiliate programs, so channel comparison would need a second tool.
---
## Best affiliate software for Stripe in 2026, compared on setup, refunds and price
URL: https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026
Published: 2026-08-09
Author: Muzahid Maruf
Six tools that connect to Stripe, weighed on setup work, refund and dispute handling, and plan limits, with entry plans from $0 to $69 a month in October 2026.
Six tools are worth comparing as affiliate software for Stripe: Rewardful, FirstPromoter, Tolt, PromoteKit, Affonso and TrackRev. PromoteKit and Affonso cost least, FirstPromoter and Affonso read the most billing systems, and TrackRev is the one that also compares partner revenue with other channels. Entry plans run from PromoteKit's free tier (3 referrals) to $69 a month at Tolt, and each vendor caps a different number, so a $9,000-a-month program lands on a $29 plan (billed yearly) at one vendor and a $99 plan at another. I run TrackRev, which is entry 6, and I say where it loses.
> **Key takeaways:**
>
> - Stripe ships no affiliate features, so what separates these tools is how the referral ID reaches the charge and which Stripe events they act on.
> - Entry prices: $0 for PromoteKit's 3 referrals, $19 monthly for Affonso, $39 for TrackRev, $49 for Rewardful and FirstPromoter, and $69 for Tolt.
> - A $9,000-a-month program at a 30% payout costs $29 to $99 a month depending on the vendor, because most vendors cap referred revenue while TrackRev caps commission.
> - Dispute handling differs most: FirstPromoter documents it by Stripe event, Affonso lists it on every plan, and TrackRev does not subscribe to dispute events.
> - Hold payouts at least as long as your refund window, and test each tool with Stripe's 4242 4242 4242 4242 and 4000 0000 0000 0259 cards first.
### What Stripe gives an affiliate tool to work with
Stripe has no affiliate links, partner portals or commission rules, so every tool here builds on the Stripe API. The referral rides on a Checkout Session's `client_reference_id`, on metadata your server writes, or on a promo code read off the charge. Payment Links accept `client_reference_id` as a URL parameter of up to 200 characters, returned in the `checkout.session.completed` webhook ([Stripe's Payment Links documentation](https://docs.stripe.com/payment-links/url-parameters)).
On the event side, `charge.refunded` fires for every refund, partial ones included, and `charge.dispute.created` fires when a customer disputes a charge ([Stripe's event types](https://docs.stripe.com/api/events/types)), so a tool that listens only for refunds never hears about a lost chargeback. Stripe retries a failed webhook for up to 3 days in live mode and warns against relying on event order ([Stripe's webhook documentation](https://docs.stripe.com/webhooks)), so a tool should re-read the charge after each event.
| Stripe event | What the affiliate tool should do |
| --- | --- |
| `checkout.session.completed` | Create the referral and first commission from the referral ID or metadata |
| `invoice.paid` | Add a commission for each subscription renewal |
| `charge.refunded` | Cut or void the commission |
| `charge.dispute.created` | Hold the commission |
| `charge.dispute.closed` | Release it if the dispute is won, remove it if lost |
*Event names are from Stripe's API reference. The right-hand column is my recommendation.*
### Affiliate software for Stripe by price and plan limits
Plan limits decide the bill more than the entry price does: Rewardful, FirstPromoter, PromoteKit and Affonso cap the revenue your affiliates generate in a month, Tolt's page says "earned from affiliates" without defining it, and TrackRev caps the commission you pay out.
| Tool | Entry price | What the entry plan caps | Next plan up | Trial |
| --- | --- | --- | --- | --- |
| Rewardful | $49 | $7,500 a month of affiliate-attributed revenue | Growth, $99 for $15,000 | 14 days |
| FirstPromoter | $49 | $5,000 a month of revenue from affiliates | Business, $99 for $15,000 | 14 days, no card |
| Tolt | $69 | $10,000 a month "earned from affiliates" | Growth, $99 for $20,000 | 14 days, no card |
| PromoteKit | $0, then $39 ($29 billed yearly) | Free: 3 referrals. Pro: $10,000 a month from affiliates | Enterprise, quoted | Free plan |
| Affonso | $19 ($15 billed yearly) | $1,000 a month of revenue from partners | Growth, $29 on yearly billing, for $10,000 | 14 days |
| TrackRev | $39 | Partner commission up to $10K | Growth, $99 for $100K of commission | No free affiliate plan |
*Prices from each vendor's pricing page, October 2026.*
### How each tool connects to Stripe and receives the referral
Everything except promo codes needs something from you. A custom Stripe Checkout takes one extra line at Tolt, PromoteKit, Rewardful, TrackRev and FirstPromoter, while Payment Links and Pricing Tables need only a script at PromoteKit and FirstPromoter. TrackRev's pixel adds client_reference_id to them itself.
| Tool | Connects with | Referral reaches the charge through |
| --- | --- | --- |
| Rewardful | Stripe connection, read plus modify access | clientReferenceId on Stripe Checkout, script cookie, promo codes |
| FirstPromoter | Stripe connection, test or live mode | _fprom_track cookie as client_reference_id; no-code scripts; Stripe coupons it creates |
| Tolt | Stripe authorization | tolt_referral metadata; separate guides for the Buy Button and Payment Links |
| PromoteKit | Stripe account, required | promotekit_referral metadata; Payment Links script; promo codes with no script |
| Affonso | Stripe authorization plus a pixel | Checkout Session metadata; Payment Links add-on for client_reference_id |
| TrackRev | Restricted key you paste in | client_reference_id with the visitor ID, customer email fallback, partner promo codes |
### The six tools in detail
#### 1. Rewardful, for programs up to $15,000 of referred revenue a month
[Rewardful](https://www.rewardful.com/pricing) Starter costs $49 with 1 campaign and 2 team members. Rewardful Growth ($99) adds the branded portal, custom domain, private campaigns and custom rewards, and Rewardful Enterprise begins at $149 for $30,000 of revenue. Every plan has a 0% transaction fee, coupon code tracking and self-referral detection, and annual billing is 12 months for the price of 10, which makes Starter $490 a year and Growth $990. Its site lists it as a Premier Stripe Partner. The [permissions article](https://help.rewardful.com/en/articles/13863552-stripe-permissions-to-integrate-with-rewardful) says it cannot move money, issue refunds or change subscriptions, and that it writes only tracking metadata and promo codes to your account.
#### 2. FirstPromoter, for billing beyond Stripe
[FirstPromoter](https://firstpromoter.com/pricing) Starter ($49) caps 1,000 affiliates and 3 campaigns. FirstPromoter Business ($99, or $990 billed yearly) removes both limits and adds a custom domain and white-labeling, and FirstPromoter Enterprise is listed at $149 for revenue above $15,000. It reads 5 billing systems (Stripe, Paddle, Chargebee, Recurly and Braintree), imports historical Stripe data when you migrate and creates a Stripe coupon for each affiliate. Cookies last up to 9,999 days, and multi-tier commissions reach 3 levels.
FirstPromoter's docs list the Stripe events it handles, which I did not find for the other five. [Its Stripe page](https://docs.firstpromoter.com/integrations/billing/stripe) maps `invoice.payment_succeeded` and `charge.succeeded` to sales, `charge.refunded` to a refund and `customer.subscription.deleted` to a cancellation, and it ignores charges of zero or without a customer email.
#### 3. Tolt, for teams that already pass metadata to Stripe
[Tolt](https://tolt.com/pricing) Basic ($69) includes 2 programs, 3 partner groups and 3 team members, Tolt Growth ($99) raises programs, groups and seats to 5 each, and Tolt Pro is $199 for $50,000 a month with unlimited programs. The [Stripe guide](https://help.tolt.com/en/articles/6843411-how-to-set-up-stripe-with-tolt) has you load a 4 KB script and write the referral ID into metadata from your backend, so a checkout path you forget to wire can record a sale with no partner attached, so test each path.
#### 4. PromoteKit, for the cheapest start
[PromoteKit](https://www.promotekit.com/pricing) is built for Stripe alone, and its FAQ says a Stripe account is required. The free plan covers 3 referrals, 1 campaign, unlimited affiliates and coupon code tracking. PromoteKit Pro ($39 monthly) adds self-referral detection, commission tiers, per-product commissions and a custom portal domain, and above $10,000 a month the page says to contact them. A coupon created in Stripe becomes a promo code for each affiliate, and the [link route](https://www.promotekit.com/docs/affiliate-links/stripe-api) writes the referral into metadata with a 60-day cookie by default.
#### 5. Affonso, for the smallest programs
[Affonso](https://affonso.io/pricing) Launch ($19 monthly) is the lowest paid price here, with 1 team seat and 3 partner groups. Affonso Growth adds 5 team seats and 5 partner groups, and Affonso Elite is $79 on yearly billing for $30,000 a month, and Affonso Enterprise starts at $149 above that. Every plan lists self-referral detection, a Risk Center and automated chargeback and refund handling. It also connects Paddle Billing, Polar.sh, Creem.io and Dodo Payments. Launch caps partner revenue at $1,000 a month, which 34 subscribers on a $30 plan reach, and it leaves out multi-level commissions, double-sided incentives, private programs and a custom domain.
#### 6. TrackRev, for programs that also compare channels
TrackRev Starter is $39 a month ($351 billed annually, 12 months for the price of 9) for 1 workspace and up to $10K of partner commission tracked a month. TrackRev Growth is $99 for $100K with unlimited workspaces, and TrackRev Scale is $199 with no cap and priority support. Every paid plan includes unlimited partners and programs, multi-tier commissions, cash or credit rewards and white-label partner pages. The free tier stops at 50 links and 1,000 events a month and cannot run an affiliate program. Past the monthly cap, new commissions stop accruing until you upgrade or the month rolls over ([plans and limits](https://www.trackrev.io/pricing)).
You paste in a restricted Stripe key with read access to charges, Checkout Sessions, customers and payment intents, plus webhook write. With webhook write, TrackRev registers an endpoint for `charge.succeeded`, `charge.refunded` and `checkout.session.completed`, and each event triggers a sync; without it, a scheduled sync runs, hourly according to the [Stripe integration page](https://www.trackrev.io/integrations/stripe). Paddle, Polar and Lemon Squeezy connect through their own credentials.
The hold period is set per program from 0 to 180 days and defaults to 0, so set it before the first payout. Promo codes match by text: you create the code in Stripe and assign the same string to a partner, because TrackRev does not generate codes in Stripe the way Rewardful, FirstPromoter and PromoteKit do. Choose FirstPromoter if Recurly or Braintree handle your billing, and Affonso if referred revenue stays under $1,000. TrackRev earns its place when the same Stripe connection should also show partner revenue next to newsletters and paid ads.
### How partners get paid
| Tool | Payout routes | Automated payouts |
| --- | --- | --- |
| Rewardful | PayPal and Wise mass payments for up to 5,000 affiliates per click | Managed payouts, 3% processing fee |
| FirstPromoter | PayPal, Wise, Stripe, crypto and bank transfer in 190 currencies | Managed Auto Payouts, Enterprise only |
| Tolt | Manual on Basic; PayPal, Wise, bank, crypto and wire from Growth | Auto payouts from Growth, 2% fee |
| PromoteKit | One-click Stripe Connect payouts to 100+ countries; PayPal and Wise | 5% for a bank account, 8% for a card |
| Affonso | PayPal, Wise and wire bulk payouts | Managed payouts from Growth, fees may apply |
| TrackRev | A PayPal or Wise CSV you pay, then mark each payout paid | None yet |
*Listed on the vendors' pricing pages in October 2026.*
### What a $9,000-a-month program costs on each plan
Take a program that refers $9,000 a month of Stripe revenue at a 30% commission, which pays partners $2,700.
| Tool | What decides the plan | Plan needed | Per month |
| --- | --- | --- | --- |
| Rewardful | $9,000 against $7,500 on Starter | Growth | $99 |
| FirstPromoter | $9,000 against $5,000 on Starter | Business | $99 |
| Tolt | $9,000 against $10,000 on Basic | Basic | $69 |
| PromoteKit | $9,000 against $10,000 on Pro | Pro | $39 ($29 billed yearly) |
| Affonso | $9,000 against $10,000 on Growth | Growth | $29 on yearly billing |
| TrackRev | $2,700 of commission against $10,000 on Starter | Starter | $39 |
*Monthly billing unless noted, using plan limits as published in October 2026.*
Rewardful Growth and FirstPromoter Business land at $99 because $9,000 clears both entry limits, and PromoteKit and Affonso come out cheapest at this size. TrackRev meters the $2,700 of commission, so Starter holds until commission reaches $10,000, which at 30% is $33,333 of referred revenue. At $99, Rewardful and FirstPromoter cover $15,000, Tolt $20,000 and TrackRev Growth $333,333 (its $100K commission cap at 30%). On annual billing, TrackRev Starter is $351 a year against $990 for Rewardful Growth or FirstPromoter Business, a gap of $639. Commission metering cuts the other way at high payout rates: at 50%, Starter's ceiling falls to $20,000 of referred revenue.
### Refunds, disputes and the hold period
| Tool | Refunds | Disputes |
| --- | --- | --- |
| Rewardful | Stripe refund notices update the commission; a partial refund recalculates it from the refunded amount | Not in its help center pages on refunds |
| FirstPromoter | charge.refunded creates a refund and a negative commission | charge.dispute.created counts as a refund; a won dispute is not described |
| Tolt | A refund deducts the commission, and a cancellation stops new commission | Silent in its pricing FAQ |
| PromoteKit | Refunds are detected in Stripe and the commission adjusts | Silent in its FAQ |
| Affonso | Full or partial refunds reduce the commission | Automated chargeback handling on every plan |
| TrackRev | Any refund reverses the whole commission at every tier | No dispute events subscribed; use the hold period |
*As stated by each vendor in its pricing page, help center or docs.*
Stripe says cardholders can typically dispute a payment within 120 days, you usually get 7 to 21 days to respond, and the issuer takes another 60 to 75 days to decide ([Stripe's dispute documentation](https://docs.stripe.com/disputes/how-disputes-work)). When a dispute opens, Stripe debits the disputed amount plus a dispute fee from your balance. Take a $300 annual plan with a 30% commission that you paid out on day 30. A lost dispute on day 90 costs you the $300, Stripe's fee and the $90 the partner already holds.
The hold period is the main control. Rewardful's help center advises setting the days before commissions become due to match your refund policy, and a 90-day refund policy gets 90 days. Upgrades and downgrades add their own edge cases, covered in [affiliate commissions on Stripe refunds](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades).
### A test to run before you pay a partner
Use Stripe's test mode where the tool supports it (FirstPromoter's docs say you can connect in test or live mode), or a $1 plan and real refunds where it does not.
- Open a partner link in a private window and pay with test card 4242 4242 4242 4242. Check which partner it names.
- Refund half the charge in the Stripe Dashboard. Rewardful and Affonso document a reduced commission for a partial refund, while TrackRev reverses the whole commission on that charge.
- Pay again with 4000 0000 0000 0259. Stripe's [testing guide](https://docs.stripe.com/testing) says that card succeeds and is then disputed as fraudulent, which shows whether a tool holds, reverses or ignores the commission.
- Pay with a promo code and no partner link, to see whether the code credits the partner who owns it. Use a code below 100% off, because FirstPromoter ignores zero-amount charges.
- Advance a test subscription with a [Stripe test clock](https://docs.stripe.com/billing/testing/test-clocks) to produce a renewal, then upgrade it mid-cycle. The commission should follow the invoice Stripe issued.
### Which tool fits which program
| Your situation | Start with |
| --- | --- |
| Testing the idea with a few partners | PromoteKit's free plan, or any 14-day trial |
| Under $1,000 a month of referred revenue | Affonso Launch, $15 billed yearly or $19 monthly |
| Under $10,000 a month and watching cost | PromoteKit Pro or Affonso Growth, both $29 on yearly billing |
| Billing through Recurly or Braintree | FirstPromoter |
| Paying affiliates through Stripe | PromoteKit one-click payouts, or FirstPromoter mass payouts |
| Affiliates as the only channel, $7,500 to $15,000 a month | Rewardful Growth or FirstPromoter Business, $99 |
| Partner revenue beside other channels on one Stripe connection | TrackRev from $39 |
For single-vendor comparisons see [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev), [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev), [the Affonso alternative](https://www.trackrev.io/blog/affonso-alternative) and [FirstPromoter alternatives](https://www.trackrev.io/blog/best-firstpromoter-alternatives-2026). If your billing sits on Paddle instead, [the Paddle comparison](https://www.trackrev.io/blog/best-affiliate-software-for-paddle-2026) covers that stack.
### Frequently asked questions
**Do I have to edit my checkout code to track affiliate sales in Stripe?**
Only for link tracking on a custom Checkout, where one line passes the referral ID to Stripe. No-code surfaces such as Payment Links need just a script, and promo code tracking needs none.
**Is there free affiliate software for Stripe?**
PromoteKit's free plan stops at 3 referrals. Rewardful, FirstPromoter, Tolt and Affonso give 14-day trials, and TrackRev's free plan covers links only.
**What happens if a customer refunds after I paid the affiliate?**
Rewardful's help center says it cannot issue refunds and advises holding commissions for as long as your refund policy runs, and it does not describe a clawback after payout. Ask any vendor what its ledger does with a late refund before you rely on it.
**How long should the commission hold period be?**
Begin with the length of your money-back guarantee and extend it if disputes arrive late, since Stripe puts the usual cardholder window at 120 days. TrackRev accepts 0 to 180 days.
**Can these tools track billing systems other than Stripe?**
FirstPromoter and Affonso each list 5 billing systems and TrackRev lists 4. Tolt's pricing FAQ names Stripe and Paddle, though the same page also mentions Chargebee, and PromoteKit requires Stripe.
**Do affiliate tools need write access to my Stripe account?**
Some do: Rewardful asks for modify access to write metadata and create coupons. Stripe recommends restricted API keys limited to what an integration needs.
---
## Best affiliate tracking software in 2026, compared on tracking, price and payouts
URL: https://www.trackrev.io/blog/best-affiliate-tracking-software
Published: 2026-10-01
Author: Muzahid Maruf
Nine affiliate tracking platforms compared on tracking method, billing integrations, payouts, fraud checks and price, with entry plans from $30 to $89 a month.
Affiliate tracking software records which partner's link, coupon or postback produced each sale and turns that record into a commission you can pay. For a SaaS product billed through Stripe, entry plans at Rewardful, FirstPromoter, Tolt and TrackRev run $39 to $69 a month. Stores on Shopify or WooCommerce, and programs that report sales by postback, fit Tapfiliate, LeadDyno, Post Affiliate Pro, Everflow or impact.com better.
I run TrackRev, so it is entry 9 and gets the same scrutiny as the rest, including where it loses. If Stripe is your only processor, [affiliate software for Stripe](https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026) narrows the list.
> **Key takeaways:**
>
> - Entry plans run from $30 a month at impact.com to $89 at Tapfiliate and Post Affiliate Pro, but each vendor meters something different: affiliate revenue, clicks, tracking requests, active affiliates or partner commission.
> - Safari deletes script-written cookies after 7 days without a visit, LeadDyno's tracking needs third-party cookies to be allowed, and a postback needs your server to store a click ID.
> - FirstPromoter reads Stripe, Paddle, Chargebee, Recurly and Braintree; Rewardful reads Stripe and Paddle; TrackRev reads Stripe, Paddle, Polar and Lemon Squeezy.
> - A program with $12,000 a month of affiliate revenue and 60 affiliates costs $39 a month on TrackRev, $99 on Rewardful or FirstPromoter, $129 on LeadDyno and $179 on Tapfiliate.
> - None of the pricing pages here lists a free plan that pays partners. PromoteKit's free plan stops at 3 referrals, and most of the others sell 7 to 30 day trials.
### How affiliate tracking software follows a sale
An affiliate tracker needs two records to pay anyone: who sent the visitor and which payment came later. Most tools here keep the first record in a cookie that a script on your site writes when a visitor lands on a partner link. Everflow, Tapfiliate and Post Affiliate Pro also accept a click ID plus a server postback, and TrackRev logs the click server-side at a tracked redirect.
[WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Intelligent Tracking Prevention deletes cookies created in JavaScript, and other script-writeable storage, after 7 days without user interaction with the site, so a 60-day window can lose a Safari visitor who returns on day 8. A postback reports the sale from your server, though your site still has to hold the click ID until then. For subscriptions the tool should read billing events instead of a thank-you page, because only billing events catch the month-2 renewal and the month-5 refund. [How affiliate tracking works](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) and [postback versus pixel](https://www.trackrev.io/blog/postback-url-vs-pixel-tracking-affiliate) go deeper.
### Affiliate tracking platforms compared on price, tracking and payouts
| Tool | Entry price | Tracking | Sales read from | Payouts | Fraud checks |
| --- | --- | --- | --- | --- | --- |
| Rewardful | $49 | Script cookie, coupon codes | [Stripe, Paddle](https://www.rewardful.com/integrations) | PayPal and Wise mass payouts | Self-referral detection |
| FirstPromoter | $49 | Script cookie up to 9,999 days, coupon codes | Stripe, Paddle, Chargebee, Recurly, Braintree | PayPal, Wise, Stripe, crypto, bank transfer | Self-referral detection, reCAPTCHA, approval thresholds |
| Tolt | $69 | Script plus Stripe metadata | Stripe, Paddle, Chargebee | Manual on Basic, automatic from $99 at 2% | Not listed |
| Tapfiliate | $89 | JS pixel, REST API, S2S postback, coupon codes | 30+ integrations, including Magento, WooCommerce, Shopify, Stripe | Trolley payouts on Scale, $179 | Not listed |
| LeadDyno | $49 | Third-party cookie, coupon codes | Stripe, Shopify, WooCommerce, Chargebee, PayPal | PayPal mass payments | Fraud prevention on every plan |
| Post Affiliate Pro | $89 | Cookies, local storage, IP, S2S | Shopify, PrestaShop, Wix, Stripe, 200+ more | Mass payments | Duplicate order ID and same-IP checks |
| Everflow | On request | Click ID plus S2S postback | Shopify, BigCommerce, WooCommerce, ClickFunnels, ClickBank | Everflow Pay | Fraud-detection integrations |
| impact.com | $30 | Promo code and link tracking; API from $2,500 | Shopify, BigCommerce, WooCommerce, Adobe Commerce, Squarespace | Contracting and clearinghouse | Fraud scoring on Enterprise |
| TrackRev | $39 | Server-side click, first-party pixel, coupon codes | Stripe, Paddle, Polar, Lemon Squeezy | PayPal or Wise CSV, then mark paid | Fraud and self-referral detection |
*Prices from each vendor's pricing page, October 2026. Entry price is per month on the cheapest paid plan.*
### The nine platforms in detail
#### 1. Rewardful, for Stripe-first SaaS programs
[Rewardful](https://www.rewardful.com/pricing) starts at $49 and covers $7,500 of affiliate-attributed revenue, 1 campaign and 2 team members, with a 14-day trial, a 0% transaction fee and annual billing at 12 months for the price of 10. Rewardful Growth ($99, $15,000) adds the branded portal, custom domain, private campaigns and custom rewards, and Enterprise starts at $149.
A script writes a cookie when a visitor lands on a `?via=` link, and checkout passes the referral ID to Stripe as the client reference ID, per [Rewardful's Stripe Checkout guide](https://help.rewardful.com/en/articles/4209748-stripe-checkout-client-side-integration). Commissions are fixed or percentage, one-time or recurring, first or last touch, and they adjust on upgrades, downgrades and refunds. Self-referral detection and PayPal and Wise mass payouts come on every plan, while managed payouts add a 3% fee, or $30 per $1,000 sent. The integrations page names Stripe and Paddle as the billing systems.
#### 2. FirstPromoter, for SaaS billing beyond Stripe
[FirstPromoter](https://firstpromoter.com/pricing) Starter is $49 for $5,000 of affiliate revenue, 1,000 affiliates and 3 campaigns. FirstPromoter Business ($99, $15,000) removes the affiliate and campaign limits and adds the custom domain, white-labeling and one-click PayPal payouts. It lists 5 billing systems and imports historical Stripe data when you migrate.
Cookie life runs up to 9,999 days, with first or last click and sub-IDs that let affiliates split one link by channel. [Its help center](https://help.firstpromoter.com/en/articles/4670575-stripe-checkout-integration) describes a `_fprom_track` cookie passed into Stripe Checkout. Commission rules include a separate first-order rate, earning caps, cost-per-lead and multi-tier commissions across 3 levels. Fraud controls cover self-referral detection, a paid-ad traffic policy, reCAPTCHA, negative commissions on refunds, approval thresholds and two-factor authentication on large payments. Postback URLs, SSO and managed payouts require Enterprise, at $149.
#### 3. Tolt, for flat-fee Stripe, Paddle and Chargebee programs
[Tolt](https://tolt.com/pricing) Basic is $69 and covers $10,000 "earned from affiliates", 2 programs, 3 team members and manual payouts. Tolt Growth ($99, $20,000) adds automatic payouts, affiliate invoices, W-9 and W-8 collection and 1099 filing, and Pro is $199 for $50,000, all with a 14-day trial. Automatic payouts carry a 2% fee, which is $20 per $1,000.
A 4 KB script exposes the visitor ID as `window.tolt_referral`. Your backend passes it to Stripe as `tolt_referral` metadata and Tolt reads it back from the payment, per [Tolt's Stripe guide](https://help.tolt.com/en/articles/6843411-how-to-set-up-stripe-with-tolt). The pricing page says cancellations stop commission and refunds deduct it, and it lists no fraud controls, so ask about self-referral checks.
#### 4. Tapfiliate, for a store and a subscription product on one tool
[Tapfiliate](https://tapfiliate.com/pricing/) meters traffic as well as affiliates. Tapfiliate Launch is $89 ($74 billed annually) for 1 program, 1 team member, 50 affiliates, 5,000 clicks and 500 conversions, with overage at $1.50 per 1,000 clicks and $15 per 1,000 conversions. Tapfiliate Scale is $179 ($149 billed annually) for unlimited affiliates and programs, 100,000 clicks, 10,000 conversions, multi-level and group commissions and Trolley payouts. Trials last 7 days on Launch and 14 on Scale.
Tracking options are a JavaScript pixel, a REST API and S2S postbacks, plus coupons and over 30 integrations. Its [developer guide](https://tapfiliate.com/blog/developers-guide-to-server-side-affiliate-tracking_ag/) calls storing the click ID on the first page load the hard part of server-side tracking.
#### 5. LeadDyno, for small stores that want a 30-day trial
[LeadDyno](https://www.leaddyno.com/pricing) gives every plan unlimited clicks and conversions plus a 30-day free trial, and limits active affiliates: Lite is $49 for 50, Essential $129 for 150, Advanced $349 for 500 and Unlimited $749. Yearly billing saves 15%, so LeadDyno Essential drops to $110. Essential adds multi-level commissions and a custom affiliate domain, and Advanced adds per-product commissions and white-labeling.
Its [integrations page](https://www.leaddyno.com/integrations) counts over 25 direct connections. [Its cookie documentation](https://support.leaddyno.com/hc/en-us/articles/32599122061469-How-LeadDyno-Cookie-Tracking-Works-and-Which-Cookies-We-Use) says tracking cookies sit under LeadDyno's domain, so browsers treat them as third-party cookies on your site, and visitors who block them can't be matched to an affiliate.
#### 6. Post Affiliate Pro, for the most tracking fallbacks
[Post Affiliate Pro](https://www.postaffiliatepro.com/pricing/) prices on tracking requests, and impressions, events, clicks and sales all count. Starter is $89 ($79 billed annually) for 10,000 requests and 2 years of tracking history, with extras at $5 per 10,000. Pro is $139 for 1 million requests with 220+ integrations, Ultimate $269 for 6 million and Network $649 for 20 million. The page still tags Starter a limited offer valid through May to July 2026, so confirm that price.
Its [tracking methods page](https://www.postaffiliatepro.com/features/tracking-methods/) lists browser cookies, HTML5 local storage, IP address and user agent plus IP, evaluated in that order, with S2S separate. A visitor with cleared cookies can still match by IP, which gives the broadest fallback chain here and the loosest on shared networks. The page names Pro, Ultimate and Network as the plans with these methods, so confirm what Starter covers. Commissions include recurring, lifetime, product-specific and multi-tier structures up to 99 tiers, and fraud protection blocks duplicate order IDs and repeat sign-ups from one IP.
#### 7. Everflow, for partner networks and performance marketing
[Everflow](https://www.everflow.io/pricing) publishes no prices: the pricing page is a quote form, plans carry a 6-month commitment, and new clients get a one-time onboarding service. Tracking centers on a transaction ID generated per click. Your site stores it and your server fires a postback at the sale, a path the [help center](https://helpdesk.everflow.io/customer/understanding-tracking-with-server-to-server-postbacks) rates as immune to ad blockers and cookie limits and medium effort to set up, against a Safari 7-day limit for the HTML pixel. Everflow tracks CPA, CPC and CPM payouts plus recurring revenue through offer events, runs an affiliate marketplace and lists SOC 2 compliance and free migrations from Tune, Cake and HitPath. It is built for brands managing many partners across paid media, so a SaaS with 30 affiliates would carry more machinery than it needs.
#### 8. impact.com, for brands that want a partner marketplace
[impact.com](https://impact.com/integrated-platform-prices/) lists Starter from $30, Essentials from $500, Pro from $2,500 and Enterprise by quote. Starter needs a supported store platform and covers promo code and link tracking, product feeds and basic contracting. Essentials adds a marketplace the page sizes at 90,000 partners, unlimited contract templates and performance bonuses. API-based and cross-device tracking start at Pro, and fraud scoring needs Enterprise. A 2.5% transaction fee applies to partner-driven sales ($2,500 on $100,000), plus a one-time setup fee. The jump from $30 to $500 to $2,500 makes it a poor first program and a fair fit for a brand that already wants a publisher marketplace.
#### 9. TrackRev, for SaaS programs that also compare channels
[Plans](https://www.trackrev.io/pricing) are Starter at $39 (1 workspace, $10K of partner commission tracked monthly, $351 billed annually), Growth at $99 ($100K, unlimited workspaces) and Scale at $199 (unlimited, priority support), and annual billing pays for 9 months and gives 12. Every paid plan includes unlimited partners and programs, multi-tier commissions, cash or credit rewards, white-label partner pages and unlimited tracking links.
Partner links are tracked redirects that log the click server-side, and one first-party pixel on your site ties a visit to the payment. The cookie window runs 1 to 3,650 days per program (60 by default), and the workspace picks last click, first click or shared credit. Refunds and disputes reverse commission. Because partner links are ordinary tracked links, the same affiliate link tracking covers newsletters, YouTube and paid ads, so partner revenue can be compared with other channels.
Payout batches run weekly to quarterly, with a hold period of 0 to 180 days (default 0). You export a PayPal or Wise CSV, pay it and mark each payout paid, and partners upload W-9 or W-8 forms at onboarding. The free plan tracks 50 links and 1,000 events a month, and partner commissions start on Starter. It has no postback URL, no Shopify or WooCommerce connector and no automatic payouts, so look at FirstPromoter if you bill through Chargebee, Recurly or Braintree, Tapfiliate or LeadDyno for Shopify orders, and Everflow for postbacks. The [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) lists the features.
### What a $12,000-a-month program costs on each plan
Affiliate commission tracking is metered differently at each vendor. Take a program that drives $12,000 a month of affiliate revenue at a 20% commission ($2,400) with 60 active affiliates, billed monthly.
| Tool | What decides the plan | Plan needed | Per month |
| --- | --- | --- | --- |
| Rewardful | $12,000 revenue against $7,500 on Starter | Growth | $99 |
| FirstPromoter | $12,000 revenue against $5,000 on Starter | Business | $99 |
| LeadDyno | 60 active affiliates against 50 on Lite | Essential | $129 |
| Tapfiliate | 60 affiliates against 50 on Launch | Scale | $179 |
| TrackRev | $2,400 commission against $10,000 on Starter | Starter | $39 |
*Worked from each vendor's published plan limits, October 2026.*
Rewardful Growth and FirstPromoter Business land on $99 because $12,000 clears both entry limits. LeadDyno and Tapfiliate jump on affiliate count. TrackRev meters the $2,400 commission, so Starter holds until commission reaches $10,000, or $50,000 of sales at 20%. Against Rewardful Growth that is $60 a month, $720 a year. Tolt labels its tiers "earned from affiliates", so read that wording first, and Post Affiliate Pro and Tapfiliate also count clicks.
### Free affiliate tracking software and cheaper options
None of the pricing pages above lists a free plan that pays partners. Rewardful, FirstPromoter and Tolt give 14-day trials, LeadDyno 30 days and Tapfiliate 7 to 30. TrackRev's free plan covers 50 links and 1,000 events a month, with partner commissions starting on Starter.
[PromoteKit](https://www.promotekit.com/pricing) has a free plan for your first 3 referrals with 1 campaign, coupon tracking and PayPal or Wise payouts, and PromoteKit Pro is $29 for $10,000 a month from affiliates and adds self-referral detection. [Affonso](https://affonso.io/pricing) starts at $15 billed yearly ($19 monthly) for $1,000 a month of partner revenue, with fraud detection and a 14-day trial, and its Growth plan ($29 billed yearly, $10,000) adds managed payouts. [The Affonso comparison](https://www.trackrev.io/blog/affonso-alternative) covers where each fits.
Before paying for a year, click a partner link in a private window, buy your cheapest plan and refund it. The commission should appear, then reverse. For a first program, [how to create an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) covers commission math, terms and payouts, and [preventing self-referral fraud](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) covers the checks to turn on first.
### Frequently asked questions
**What is affiliate tracking software?**
A system that credits each sale to the partner who sent the customer. It stores a visitor ID at the click, reads the payment from billing or a cart and keeps the commission ledger you pay from.
**Which affiliate tracking software is best for SaaS on Stripe?**
Rewardful, FirstPromoter, Tolt and TrackRev all read Stripe subscriptions. FirstPromoter adds Chargebee, Recurly and Braintree, and TrackRev compares partner revenue with other channels. Check each plan's cap against your own affiliate revenue first.
**Is there free affiliate tracking software?**
Few vendors keep a permanent free tier, since most price on affiliate-driven revenue. PromoteKit's stops at 3 referrals, so use it as a trial and run 14 to 30 days with real partners before choosing.
**Should I choose cookie tracking or postback tracking?**
On Stripe or Paddle, pick the tool that reads billing events, since renewals and refunds arrive through the processor whichever method started the visit. Script tools need a pasted script and a referral ID passed to checkout. Postbacks need your server to store a click ID and call a URL after the sale, so choose them when sales happen outside a browser.
**How much does affiliate tracking software cost?**
Entry plans run from $30 a month at impact.com, which requires a store, to $89 at Tapfiliate and Post Affiliate Pro, and mid-tier plans land between $99 and $179. Everflow prices by quote. Commission is the larger cost: $2,400 in the $12,000 example against $39 to $179 of software.
**How do I stop affiliates buying through their own links?**
Combine self-referral detection, a hold period matching your refund window and manual approval for new partners. Detection sits on different plans at different vendors, so check the plan.
---
## Bitly alternatives: six link shorteners compared on price, free plans and revenue data
URL: https://www.trackrev.io/blog/best-bitly-alternatives-2026
Published: 2026-08-08
Author: Muzahid Maruf
Six Bitly alternatives compared in October 2026: Short.io, Rebrandly, Dub, YOURLS, Pretty Links and TrackRev, with entry prices from $0 to $39 a month.
For the lowest price, the best Bitly alternative is Short.io: paid plans start at $5 a month and its free plan connects 5 custom domains, while Bitly sells your own domain from Growth at $29 a month billed yearly. Rebrandly is the closest swap, Dub and YOURLS offer open-source code, and TrackRev shows which payment each link earned.
I run TrackRev, which is entry 6, so every entry below says when to pick a competitor instead. Bitly's figures come from its [pricing page](https://bitly.com/pages/pricing) and help center.
> **Key takeaways:**
>
> - Bitly gates your own domain behind Growth ($29 billed yearly), and three alternatives connect one for $0.
> - Short.io offers the biggest free allowances, while Rebrandly copies Bitly's feature set most closely.
> - YOURLS is MIT licensed and Dub's core is AGPLv3, so both can run on a server you control.
> - No other tool can serve a bit.ly link, so register your own domain before you print or share anything new.
> - TrackRev ties Stripe, Paddle, Polar and Lemon Squeezy payments to clicks from $39 a month, and Dub's sales tracking starts at $90.
### Bitly alternatives compared on price and free plans
Short.io, Rebrandly and Dub each include a custom domain on a free plan, and Bitly does not.
| Tool | Free plan | Cheapest paid plan | Your own domain on | Conversion data from |
| --- | --- | --- | --- | --- |
| Bitly | 5 links, 2 QR codes, ad page | Core, $10 billed yearly only | Growth, $29 yearly or $35 monthly | None listed |
| Short.io | 5 domains, 1,000 links, 50,000 clicks | Hobby, $5 | Free plan | Free plan, 50 a month |
| Rebrandly | 10 links, 1 domain | Essentials, $8 to $11 billed yearly | Free plan | Professional, $22 to $32 billed yearly |
| Dub | 25 links, 3 domains, 1,000 events | Pro, $30 | Free plan | Business, $90 |
| YOURLS | Free software, you host it | Hosting cost only | Any domain you point at it | None listed |
| Pretty Links | Lite plugin for WordPress | Beginner, $99.60 for year one | Your WordPress domain | Marketer, $149.60 for year one, lists conversion reports |
| TrackRev | 50 links, 1,000 events, no revenue figures | Starter, $39 monthly or $29.25 yearly | Every paid plan | Starter, revenue from 4 processors |
*Prices from each vendor's pricing page, October 2026. Rebrandly's page shows different prices to different visitors, so its figures are ranges.*
### Why people leave Bitly
Bitly's pricing page puts its limits where growing teams hit them. Your own domain needs Growth, and click and scan history lasts 30 days on Core, 4 months on Growth and 1 year on Premium ($199 billed yearly, $300 monthly), with none on the free plan. No plan lists conversion tracking, so Bitly reports how often a link opened and nothing about what the visitor did next.
One branded domain costs $420 over 12 months on Growth billed monthly, against $216 on Short.io Pro at $18 and $60 on Short.io Hobby at $5. Three free plans connect a domain for $0, with link allowances that differ.
Free links now carry an ad. Bitly's [help article](https://support.bitly.com/hc/en-us/articles/32874287800333-Why-are-there-ads-on-my-links), updated January 12, 2026, says free accounts send visitors through an interstitial page with a destination preview and an ad, and that a paid plan removes it.
The other reason is who owns the domain. Google's goo.gl shows the extreme case: its [developer blog](https://developers.googleblog.com/en/google-url-shortener-links-will-no-longer-be-available/) says Google stopped taking new links in 2018, and on August 25, 2025 it switched off the links that had shown no activity in late 2024. A link on a domain you own turns a vendor decision into a DNS edit, and [what a branded short link is](https://www.trackrev.io/blog/what-is-a-branded-short-link) covers how the DNS side works.
### Do branded links get more clicks than bit.ly links?
Bitly's [branded links page](https://bitly.com/pages/features/branded-links) promises 2.3x your click-throughs when you replace bit.ly with your own domain, and it shows no test behind the number. Split one send at random, give half the recipients links on your domain and half a bit.ly link, and keep the copy and offer identical. Then compare sign-ups or paid conversions per 1,000 delivered, because a familiar domain can attract curious clicks that never buy.
### Bitly vs Rebrandly
Bitly vs Rebrandly is close on price, and the two meter different things: Bitly caps links created and leaves clicks unlimited, while Rebrandly caps how many clicks get detailed data.
| Feature | Bitly | Rebrandly |
| --- | --- | --- |
| Free plan | 5 links, 2 QR codes, no domain | 10 links, 10 watermarked QR codes, 1 domain |
| Cheapest paid plan | Core, $10 billed yearly only | Essentials, $8 to $11 billed yearly |
| Mid plan | Growth, $29 billed yearly: 500 links, 1 complimentary domain | Professional, $22 to $32 billed yearly: 1,500 links, 3 domains |
| Detailed click data | Unlimited clicks, 4 months of history on Growth | Engagement data on 25,000 clicks a month on Professional |
| Destination edits a month | 20 on Growth | 50 on Professional |
| Conversion tracking | None listed | Professional, kept 6 months |
| Enterprise | SSO logins, group permissions, 99.99% uptime | SAML SSO, SCIM, SOC 2 Type 2, 99.99% uptime |
*Prices and limits from each vendor's pricing page, October 2026.*
A link that draws 40,000 clicks in a month passes Rebrandly Professional's 25,000-click allowance by 15,000, while the same traffic costs Bitly nothing extra. A team that creates links in volume has the reverse problem, since Growth stops at 500 links a month and Professional at 1,500. Rebrandly's [pricing page](https://www.rebrandly.com/pricing) has the full limits.
### Plan limits side by side
| Plan | Price per month | Links created | Clicks or events counted | Custom domains | History kept |
| --- | --- | --- | --- | --- | --- |
| Bitly Core | $10 billed yearly | 100 | Unlimited | 0 | 30 days |
| Bitly Growth | $35 | 500 | Unlimited | 1 | 4 months |
| Short.io Free | $0 | 1,000 in total | 50,000 tracked | 5 | Not listed |
| Short.io Hobby | $5 | 2,500 in total | 100,000 tracked | 7 | Not listed |
| Short.io Pro | $18 | Unlimited | Unlimited | 10 | Not listed |
| Rebrandly Free | $0 | 10 | 100 with detail | 1 | Not listed |
| Rebrandly Essentials | $9 to $16 | 250 | 10,000 with detail | 2 | Not listed |
| Rebrandly Professional | $27 to $39 | 1,500 | 25,000 with detail | 3 | 6 months of conversions |
| Dub Free | $0 | 25 | 1,000 events | 3 | 30 days |
| Dub Pro | $30 | 1,000 | 50,000 events | 10 | 1 year |
| Dub Business | $90 | 10,000 | 250,000 events | 100 | 3 years |
| TrackRev Starter | $39 | Unlimited | Unlimited events | Unlimited | Not listed |
*Monthly billing and monthly limits from each vendor's pricing page, October 2026.*
### What happens to QR codes when you leave Bitly
Bitly counts QR codes against a monthly allowance of 2 on Free, 5 on Core, 10 on Growth and 200 on Premium. Its downgrade article calls each code a scannable form of a short link, so a printed code that points at a bit.ly link cannot move to another tool, while one on your own domain can.
Rebrandly allows 10 codes a month on Free, watermarked, and 250 on Essentials. Short.io lists QR codes with custom colors and logos on every plan. A static code from TrackRev's free [QR code generator](https://www.trackrev.io/tools/qr-code-generator) encodes your URL directly, so it needs no account and its destination cannot change after printing; [dynamic vs static QR codes](https://www.trackrev.io/blog/dynamic-qr-codes-vs-static) covers that trade.
### Does the redirect status code matter?
A short link answers with an HTTP status code, and the two common choices behave differently for search. MDN says a [301](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301) makes search engines attribute links to the original URL to the destination, passing its ranking along, while a [302](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/302) transfers no SEO value. For links shared in email and social posts the code makes little difference. It matters for short links that other sites cite. Short.io lists a 301 option, Pretty Links offers 301, 302 and 307 per link, and TrackRev answers every click with a 302.
### The six alternatives in detail
#### 1. Short.io, for the largest free plan
[Short.io](https://short.io/pricing) allows commercial use on its free plan, and the 1,000 branded links there are a lifetime total. Hobby adds country targeting and referrer hiding. Pro brings password protection, link expiration and link cloaking. Team is $48 for city and region targeting, mobile deep links and a 99.9% uptime SLA, and Enterprise is $148 with single sign-on. Paid plans start with a 7-day trial, and yearly billing takes 17% off.
Conversions are capped at 50 a month on Free and 200 on Hobby. Its [conversion tracking](https://docs.short.io/articles/features/features/how-to-enable-conversion-tracking) passes a clid parameter through every short URL for third-party analytics to detect conversions, and its integrations page lists no Stripe, Paddle, Polar or Lemon Squeezy connection. It has the lowest paid entry price of the hosted tools here, and [Short.io vs TrackRev](https://www.trackrev.io/blog/short-io-vs-trackrev) covers the rest.
#### 2. Rebrandly, for the closest swap with an enterprise tier
Rebrandly keeps Bitly's shape and lowers the domain price. Professional is the first plan with conversion tracking, link expiration, dynamic traffic routing and 50 password-protected links. Growth is $69 to $99 billed yearly and adds mobile deep linking and 5 workspaces. Enterprise is a quote with SAML SSO, SCIM provisioning, SOC 2 Type 2 and 99.99% uptime.
#### 3. Dub, for open-source links with a free tier
[Dub's](https://dub.co/pricing/links) free plan keeps 30 days of analytics, Pro a year and Business 3 years. Business also adds A/B testing and event webhooks. Per Dub's [sales docs](https://dub.co/docs/conversions/sales/introduction), conversion tracking also starts at Business and runs on an analytics script plus a server-side SDK.
The code is on [GitHub](https://github.com/dubinc/dub), 99% under AGPLv3 and the rest under a commercial license in an /ee folder. Dub fits teams that want to read or host the code, or to test link variants, and [Dub.co vs TrackRev](https://www.trackrev.io/blog/dub-co-vs-trackrev) covers what a self-hosted copy leaves out.
#### 4. YOURLS, for a shortener you host yourself
[YOURLS](https://yourls.org/) is a set of PHP scripts that runs your own URL shortener under the MIT license, so the software costs nothing and your links and click data stay on your server. Its site lists a developer API, bookmarklets, plugins, and stats with historical click reports, referrer tracking and visitor geolocation. You pay for hosting and a domain, and you own the upgrades and backups. [Kutt](https://github.com/thedevs-network/kutt) is the other MIT-licensed option, with custom domain support. It fits a team with a server and a developer to look after it, and anything past click stats comes from plugins you vet yourself.
#### 5. Pretty Links, for outbound links on WordPress
[Pretty Links](https://wordpress.org/plugins/pretty-link/) is a WordPress plugin, so its links live on your site's domain. The free Lite version makes branded short links, offers 301, 302 and 307 redirects per link, logs clicks and unique clicks with referrer, browser and OS, filters bots, and imports or exports links as CSV.
Paid plans on its [pricing page](https://prettylinks.com/pricing/) are Beginner for 1 site at $99.60 for the first year, Marketer for 2 sites at $149.60 and Super Affiliate for 5 sites at $199.60. The page says renewals bill at full price, listed as $249, $374 and $499. It suits a content site whose links are affiliate links on WordPress.
#### 6. TrackRev, for links tied to revenue
TrackRev's links record each click on the server, and a paid plan matches later payments from Stripe, Paddle, Polar and Lemon Squeezy to that click under last-touch, first-touch or linear credit. Renewals credit the original click, so a payment billed with no page view still counts. The free plan allows 50 links and 1,000 events a month and shows no revenue. Starter is $39 a month, or $351 billed yearly (12 months for the price of 9), and includes custom domains, unlimited links and events, the revenue sync and the affiliate program. Growth at $99 and Scale at $199 add workspaces, partner commission volume and, on Scale, priority support. Billed yearly, Starter's $351 costs $3 more than Bitly Growth's $348.
A [custom domain](https://www.trackrev.io/products/custom-tracking-domains) needs one CNAME record pointing at cname.trackrev.io, and CSV imports take 500 rows per upload. TrackRev routes by device and operating system only, has no A/B split and no country or city targeting, and lists no SSO or uptime SLA. Short.io and Dub cover the routing, and Rebrandly covers the enterprise tier.
### When Bitly is still the better choice
Bitly's Enterprise plan is a quote with multiple users and group permissions, SSO logins, 99.99% uptime, 2 years of click data and a dedicated customer success manager. If procurement asks for those, Rebrandly Enterprise lists a comparable set, and Short.io offers a 99.9% uptime SLA on Team at $48 and SSO on Enterprise at $148. Bitly also bundles landing pages, a mobile app and browser extensions, plus Bitly Assist, an AI helper that comes with Core.
### Moving off Bitly without breaking links
Only links on a domain you control can move, since bit.ly belongs to Bitly. The order of the steps matters, because Bitly's [downgrade article](https://support.bitly.com/hc/en-us/articles/360029870551-What-happens-when-I-downgrade-to-a-lower-subscription-plan) describes what lapses when a plan loses its custom domain.
- Check which domain your links use. If it is the complimentary domain that came with Growth, the article says Bitly does not renew its registration after a downgrade to a plan without a custom domain, and links on it stop working when the registration expires. Register a domain yourself before you leave.
- Rebuild your most-used slugs in the new tool. Short.io lists link import from other shorteners, and TrackRev keeps your slugs on a CSV import.
- Point the CNAME at the new tool once those slugs resolve, and do it before you cancel. After a downgrade, links on your own domain keep redirecting while DNS points at Bitly, but Bitly stops renewing the certificate and visitors then see a security warning.
- Leave bit.ly links where they are. The article says they keep working after a downgrade, but it was last updated April 15, 2024 and says nothing about the ad page its January 2026 article describes, so open one old link after you downgrade to check.
### Which alternative to pick
A TrackRev free account takes 50 links with no card, and revenue figures start on a paid plan ([pricing](https://www.trackrev.io/pricing)). [Best link tracking software for SaaS](https://www.trackrev.io/blog/best-link-tracking-software-saas-2026) prices six tools at 40,000 clicks a month.
| Your situation | Pick | Starts at |
| --- | --- | --- |
| Your own domain at the lowest price | Short.io | $0, then $5 on Hobby |
| A close copy of Bitly with an enterprise tier | Rebrandly | $0, then $8 to $11 billed yearly |
| Open-source code and a hosted free plan | Dub | $0, then $30 on Pro |
| No license fee and full control of the data | YOURLS | Your hosting bill |
| Outbound affiliate links on WordPress | Pretty Links | $0 for Lite, $99.60 in year one |
| Which link earned the payment | TrackRev | $39 on Starter |
### Frequently asked questions
**What is the best alternative to Bitly?**
Short.io wins on price, Rebrandly on likeness to Bitly, and Dub or YOURLS on open code. SaaS teams that need payments tied to links should look at TrackRev. The right answer follows from your reason for leaving.
**Is there a free Bitly alternative?**
Yes. Short.io, Rebrandly and Dub have free plans, and YOURLS and Pretty Links Lite are free software. Caps differ widely, so test one campaign first.
**Is Rebrandly cheaper than Bitly?**
Often, though Rebrandly shows different prices to different visitors. Billed yearly, Essentials is $8 to $11 against $10 for Bitly Core, and Professional is $22 to $32 against $29 for Bitly Growth. Check the price at checkout.
**Can I move my bit.ly links to another shortener?**
No. Bitly owns that domain, so no other tool can answer for it. Only links on a domain you control can move, by a DNS change.
**Does Bitly track conversions or revenue?**
No plan on its pricing page lists either. Premium adds city-level and device data plus campaign-level tracking.
**Why do my free Bitly links show an ad?**
Bitly says the ads pay for free plans and that a paid plan removes them. The page between the click and your destination also previews the link.
**How much does Bitly cost per year?**
Billed yearly, Core is $120, Growth $348 and Premium $2,388. Billed monthly, Growth is $420 and Premium $3,600, and Core has no monthly option.
---
## Best FirstPromoter alternatives in 2026: 9 tools, their prices and limits
URL: https://www.trackrev.io/blog/best-firstpromoter-alternatives-2026
Published: 2026-08-07
Author: Muzahid Maruf
FirstPromoter alternatives compared on price and plan limits: Rewardful, Tolt, Reditus, Tapfiliate, LeadDyno, Dub, Affonso, TUNE and TrackRev.
The best FirstPromoter alternative depends on which limit you hit first. FirstPromoter Starter costs $49 and covers up to $5,000 of monthly revenue from affiliates, and Business costs $99 for up to $15,000. Rewardful, Tolt, Reditus, Tapfiliate, LeadDyno, Dub Partners and Affonso each meter something different, TUNE is built for partner networks, and TrackRev meters the commission you pay out.
I run TrackRev, so it is entry 9 and gets judged by the same terms as the others, including where it loses. Prices are each vendor's published rate in October 2026, per month unless stated.
> **Key takeaways:**
>
> - FirstPromoter prices by the revenue your affiliates generate: $49 covers $5,000 of it and $99 covers $15,000, so a growing program changes plan on a schedule.
> - Rewardful Starter reaches $7,500 for $49, Tolt Basic reaches $10,000 for $69, and Affonso Growth reaches $10,000 for $29 billed yearly.
> - Dub counts partner payouts, Reditus annual recurring revenue, Tapfiliate clicks and conversions, LeadDyno active affiliates and TrackRev commission, so the same $9,000-a-month program lands on plans from $29 to $179.
> - FirstPromoter reads Stripe, Paddle, Chargebee, Recurly and Braintree. Check an alternative's connector list before you compare prices.
> - TUNE starts at $1,500 and suits partner networks, not a single in-house SaaS program.
### What FirstPromoter's plans limit
[FirstPromoter's pricing page](https://firstpromoter.com/pricing) sizes each plan by the monthly revenue your affiliates generate, and total revenue never enters it. Starter ($49, or $490 a year) covers $5,000, up to 1,000 affiliates, 3 campaigns and 1 website. Business ($99, $990 a year) covers $15,000 and lifts the affiliate and campaign limits. Enterprise ($149, $1,490 a year) starts above $15,000 and adds 3 websites. A 14-day trial needs no card, and the page lists no free plan.
The plan decides features as well. A custom dashboard domain, white-labeling, the embedded dashboard and one-click PayPal payouts begin on Business, while a postback URL, SSO and activity logs need Enterprise.
In return you get connectors for Stripe, Paddle, Chargebee, Recurly and Braintree, click credit for up to 9,999 days, payouts through PayPal, Wise, Stripe, crypto and bank transfer in 190 currencies, W-9 and W-8BEN collection, and commission across 3 levels of sub-affiliates. Recurly and Braintree are the connectors to check before you compare prices. FirstPromoter names both, LeadDyno names Recurly, and no other page I read names either.
### FirstPromoter alternatives compared on price and what the plan counts
| Tool | Entry plan | Plan limit counts | Connectors named | Trial |
| --- | --- | --- | --- | --- |
| FirstPromoter | Starter, $49 | Affiliate revenue, $5,000 | Stripe, Paddle, Chargebee, Recurly, Braintree | 14 days, no card |
| Rewardful | Starter, $49 | Affiliate-attributed revenue, $7,500 | Stripe, Paddle | 14 days |
| Tolt | Basic, $69 | Earned from affiliates, $10,000 | Stripe, Paddle, Chargebee | 14 days, no card |
| Reditus | Growth, $99 yearly ($149 monthly) | Annual recurring revenue, $60K | Stripe, Paddle, Chargebee, API | 14 days, no card |
| Tapfiliate | Launch, $89 ($74 yearly) | 50 affiliates, 5,000 clicks, 500 conversions | 30+, including Stripe, PayPal, Shopify | 7 days |
| LeadDyno | Lite, $49 | 50 active affiliates | Stripe, Chargebee, Recurly, PayPal, Shopify | 30 days |
| Dub Partners | Business, $90 | Partner payouts, $2.5K | Stripe, Shopify, API | 14 days |
| Affonso | Launch, $15 yearly ($19 monthly) | Partner revenue, $1,000 | Stripe, Paddle, Polar, Creem, Dodo Payments, API | 14 days |
| TUNE | Scale, $1,500 yearly | 2,500 conversions included | Postbacks, API | Demo |
| TrackRev | Starter, $39 | Commission tracked, $10K | Stripe, Paddle, Polar, Lemon Squeezy | Free link-tracking plan |
*Prices from each vendor's pricing page, October 2026. Entry plan is the cheapest paid plan, and revenue and click limits are monthly.*
At the $99 tier the Stripe-first tools line up: FirstPromoter Business and Rewardful Growth cover $15,000 each, and Tolt Growth covers $20,000. Below that tier the gap is $20 and a few thousand dollars of ceiling, so features and connectors decide more than price.
### Cookie windows and Safari
A tool's cookie window sets how long it credits a click, and the browser sets how long the click ID survives. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Intelligent Tracking Prevention deletes cookies created in JavaScript, and other script-writeable storage, after 7 days of no user interaction with the site. Any window backed by a script-written cookie, TrackRev's pixel cookie included, ends after 7 days on Safari for a visitor who doesn't come back in that time, whether the setting reads 3,650 days or FirstPromoter's 9,999. LeadDyno has a different exposure: [its cookie documentation](https://support.leaddyno.com/hc/en-us/articles/32599122061469-How-LeadDyno-Cookie-Tracking-Works-and-Which-Cookies-We-Use) says the tracking cookies sit under LeadDyno's domain, so browsers treat them as third-party cookies on your site.
### The nine tools, one at a time
#### 1. Rewardful, for Stripe programs between $5,000 and $7,500
[Rewardful](https://www.rewardful.com/pricing) Starter costs the same $49 as FirstPromoter Starter and covers $7,500 of affiliate-attributed revenue, against $5,000. It also has 1 campaign, 2 team members, and no branded portal, custom domain, private campaigns or custom rewards. Those arrive on Growth ($99, $15,000), and Enterprise starts at $149 for up to $30,000. Every plan has unlimited affiliates and a 0% transaction fee, and annual billing gives 12 months for the price of 10.
Its [integrations page](https://www.rewardful.com/integrations) counts more than 20 connections. PayPal and Wise mass payouts come with every plan, optional Managed Payouts adds a 3% processing fee, and self-referral detection is standard. First or last touch attribution is your choice. [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev) sets it against my product.
#### 2. Tolt, for programs under $10,000 that want a custom domain early
[Tolt](https://tolt.com/pricing) Basic costs $69 and covers $10,000 "earned from affiliates", double FirstPromoter Starter's limit for $20 more. It includes a custom domain, a branded portal, 2 programs, 3 partner groups and 3 team members, with manual payouts. Growth ($99, $20,000) adds automatic payouts at a 2% processing fee, W-9 and W-8 collection and 1099 filing, and Pro is $199 for $50,000.
The pricing page lists Chargebee beside Stripe and Paddle, though its FAQ names only the last two, so confirm it before relying on it. The phrase "earned from affiliates" could mean revenue or commission, so ask which before sizing a plan. For a Stripe SaaS with a few affiliates paid through PayPal, Tolt is the nearest swap for FirstPromoter Starter. [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev) has the head-to-head with mine.
#### 3. Reditus, for B2B SaaS that wants affiliates to find you
[Reditus](https://getreditus.com/pricing) sells recruitment on top of tracking. Growth is $99 on a yearly plan ($1,188 a year, or $149 monthly) for up to $60K ARR. Scale Up is $399 on an annual plan, up to $360K ARR, with a marketplace listing, a vetted affiliate database and a dedicated account manager. The page counts 27,000+ B2B SaaS affiliates in the network and gives Growth 1 AI affiliate search a month. Annual plans include a free migration.
Other processors connect through its API, and automated payouts cost 5% by card or 2% by invoice. Its FAQ says consumer and ecommerce companies probably don't fit. Pick it when you have few partners and want help finding more. With partners already in hand, FirstPromoter is cheaper. [Reditus vs TrackRev](https://www.trackrev.io/blog/reditus-vs-trackrev) weighs it against mine.
#### 4. Tapfiliate, for a store and a subscription product on one tool
[Tapfiliate](https://tapfiliate.com/pricing/) prices traffic as well as affiliates. Launch is $89 ($74 on a yearly plan) for 1 program, 1 team member, 50 affiliates, 5,000 clicks and 500 conversions. Overage runs $1.50 per 1,000 clicks and $15 per 1,000 conversions, so 20,000 clicks add $22.50. Scale is $179 ($149 yearly) for unlimited affiliates and programs, 100,000 clicks, 10,000 conversions, multi-level commissions and Trolley payouts.
Tracking runs through a JavaScript pixel, a REST API or server-to-server postbacks, plus coupons, and the pricing page counts 30+ integrations including Shopify, WooCommerce, BigCommerce and Magento. Launch costs $40 more than FirstPromoter Starter, and the premium pays off when a store sits next to the subscription product and one tool has to cover both. [The Tapfiliate alternative breakdown](https://www.trackrev.io/blog/tapfiliate-alternative) goes deeper.
#### 5. LeadDyno, for few affiliates and large revenue
[LeadDyno](https://www.leaddyno.com/pricing) doesn't meter revenue. Every plan has unlimited clicks and conversions, and the limit is active affiliates: Lite is $49 for 50, Essential $129 for 150, Advanced $349 for 500 and Unlimited $749, and yearly billing takes 15% off. Thirty affiliates bringing in $20,000 fit Lite, while FirstPromoter prices that revenue at Enterprise, $149. Multi-level commissions and a custom dashboard domain start on Essential, per-product commissions and white-labeling on Advanced.
Its [integrations page](https://www.leaddyno.com/integrations) counts 25+ direct connections. The cost is tracking: with cookies under LeadDyno's domain, a visitor who blocks third-party cookies can't be matched to an affiliate. It suits a store-heavy program with a small, high-volume partner list.
#### 6. Dub Partners, for teams that already run links on Dub
[Dub Partners](https://dub.co/pricing) starts at $90 on Business and meters partner payouts: $2.5K of them, 500 partners and 3 partner groups. Advanced is $300 for $15K of payouts, unlimited partners, an embedded referral dashboard, email campaigns and risk monitoring, and Enterprise is by quote with unlimited payouts. Against FirstPromoter Starter it costs $41 more and counts payouts where FirstPromoter counts revenue. Dub's FAQ says that once you reach the payout limit you can't send payouts until the next billing period, so size the plan to commission.
Dub sends the payouts itself. [Its payout guide](https://dub.co/help/article/partner-payouts) lists ACH at 5% on Business and Advanced (3% on Enterprise), arriving in up to 4 business days, and cards at 8%, instantly. Holding periods run 0 to 90 days, and a Stripe refund marks the matching commission refunded. [Native sale tracking](https://dub.co/docs/conversions/sales/introduction) covers Stripe and Shopify, with the API for other systems. If you cover the ACH fee, it adds $90 on $1,800 of commission, doubling the $90 plan's cost.
#### 7. Affonso, for the lowest entry price
[Affonso](https://affonso.io/pricing) has the lowest list prices here. Launch is $15 billed yearly ($19 monthly) for $1,000 of partner revenue. Growth, $29 billed yearly, covers $10,000 and adds managed payouts, private programs, a custom domain and 5 team seats. Elite is $79 for $30,000 with unlimited seats and no "Powered by" link. Every plan has unlimited affiliates, programs and tracked clicks, and early-stage startups get 50% off the first year.
Growth costs $348 a year for a $10,000 ceiling, against $490 a year for FirstPromoter Starter's $5,000. The [integrations page](https://affonso.io/integrations) lists 5 native payment processors and an API for the rest. Fraud checks cover self-referrals, disposable emails, paid traffic and duplicate payout methods.
#### 8. TUNE, for partner networks and media buyers
[TUNE](https://www.tune.com/solutions/advertisers/compare-plans/) sells to advertisers and networks. Scale is $1,500 paid annually with 2,500 conversions included, partner payments and onboarding are fee based, and a Contract tier is by quote. That is more than 30 times FirstPromoter Starter. The price covers infrastructure: an [API with over 650 endpoints](https://www.tune.com/), native postbacks across mobile and web, SOC 2 Type II and SOC 1 Type II certification, and marketplace access with extra network fees. A SaaS with 30 affiliates and a Stripe account would carry machinery it never uses. TUNE pays off when media buyers and affiliate networks send the traffic and you need postbacks and partner-level controls.
#### 9. TrackRev, for programs that compare partners with other channels
I run TrackRev, so weigh this entry accordingly. [Plans](https://www.trackrev.io/pricing) are Starter at $39 (1 workspace, up to $10K of commission tracked, $351 billed yearly), Growth at $99 ($100K, unlimited workspaces) and Scale at $199 (unlimited commission, priority support). Annual billing pays for 9 months and gives 12. Every paid plan has unlimited partners and programs, multi-tier commissions, cash or credit rewards, white-label partner pages and unlimited tracking links. Sale revenue is never capped, and once commission reaches the plan's limit, new commissions stop accruing until the 1st or an upgrade.
Partner links are tracked redirects that log the click server-side, and one first-party pixel ties the visit to the charge. Each program sets its own cookie window from 1 to 3,650 days (60 by default) and a hold period from 0 to 180 days (default 0). Stripe, Paddle, Polar and Lemon Squeezy supply the revenue, and refunds and disputes reverse commission. Partner links are ordinary tracked links, so newsletter, YouTube and paid links land in the same report, with last click, first click or shared credit chosen per workspace.
Payouts are a batch: you export a PayPal or Wise CSV, pay it and mark each payout paid, with W-9 and W-8 forms uploaded at partner onboarding. There is no automatic payout, no Chargebee, Recurly or Braintree connector and no marketplace of ready-made affiliates, so FirstPromoter, Reditus or Dub fit better on those. The free plan covers link tracking (50 links, 1,000 events), and the program begins on Starter. [TrackRev against FirstPromoter](https://www.trackrev.io/compare/first-promoter) lines up the features, and the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) lists the rest.
### What a $9,000-a-month program costs on each plan
Each vendor meters something different, so one program lands on different plans. Take affiliates who bring in $9,000 of revenue at a 20% commission ($1,800), with 60 active affiliates, billed monthly.
| Tool | What decides the plan | Plan needed | Cost |
| --- | --- | --- | --- |
| FirstPromoter | $9,000 against a $5,000 Starter limit | Business | $99 |
| Rewardful | $9,000 against $7,500 on Starter | Growth | $99 |
| Tolt | $9,000 against $10,000 on Basic | Basic, manual payouts | $69 |
| Tapfiliate | 60 affiliates against 50 on Launch | Scale | $179 |
| LeadDyno | 60 active affiliates against 50 on Lite | Essential | $129 |
| Dub Partners | $1,800 of payouts against $2.5K | Business | $90, plus $90 ACH fee |
| Affonso | $9,000 against $10,000 on Growth | Growth | $29 billed yearly |
| TrackRev | $1,800 of commission against $10K | Starter | $39 |
*Worked from each vendor's published plan limits, October 2026.*
Reditus caps annual recurring revenue, $60K on Growth, so a monthly figure needs a question about how it counts, and TUNE starts at $1,500, so neither fits this comparison. On Tolt, automatic payouts need Growth at $99 plus a 2% fee, which is $36 on $1,800. Against FirstPromoter Business, TrackRev Starter saves $60, or $720 a year, until commission passes $10K, which is $50,000 of monthly sales at 20%.
### Moving off FirstPromoter
- Export the Promoters list from the campaign as CSV, keeping the referral code, promo code and current balance columns.
- Settle each balance in FirstPromoter, or carry it over. TrackRev's importer brings affiliates, referral and coupon codes, approval status, payout emails and unpaid balances, reuses each promoter's code as their link slug, and leaves order history behind. Reditus says affiliates keep their links through a 30-day cookie transition window.
- Connect billing and install the new script, then buy your cheapest plan through a partner link in a private window and refund it. The commission should appear and then reverse.
- Keep FirstPromoter running until the refund window has passed on the last commissions it recorded, because reversals on those sales still happen there. [How refund clawbacks work](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers the mechanics.
### Frequently asked questions
**What is the best FirstPromoter alternative for a SaaS on Stripe?**
Rewardful and Tolt are the closest swaps, and the choice follows the ceiling you are near: Rewardful Starter stops at $7,500 of affiliate revenue, Tolt Basic at $10,000. Affonso Growth is cheapest, and TrackRev fits when you want partner revenue next to other channels.
**Is there a free FirstPromoter alternative?**
None of the pricing pages I read lists a free plan that pays partners. Most sell a two-week trial, while Tapfiliate runs 7 to 30 days and LeadDyno 30. TrackRev's free plan covers link tracking only, and its affiliate program starts on the $39 Starter plan.
**FirstPromoter vs Tolt: which costs less?**
FirstPromoter Starter is $20 cheaper but stops at $5,000 of affiliate revenue and holds the custom domain for Business at $99. Tolt Basic covers $10,000 with the domain included and manual payouts. Past $10,000, Tolt Growth at $99 covers $20,000 and pays automatically for a 2% fee.
**Which alternatives read Paddle, Polar or Lemon Squeezy?**
Paddle is on six lists: FirstPromoter, Rewardful, Tolt, Reditus, Affonso and TrackRev. Polar appears on Affonso's list and TrackRev's, and Lemon Squeezy only on TrackRev's. Dub and TUNE take sales through an API or postback, which suits a custom billing setup.
**Which tools pay affiliates automatically?**
Tolt (from Growth), Dub, Reditus, Affonso (from Growth), Tapfiliate (Scale, through Trolley) and Rewardful (optional Managed Payouts) will pay for you, and each can carry a fee. FirstPromoter runs mass payouts through PayPal, Wise, Stripe, crypto or bank transfer. TrackRev hands you a PayPal or Wise CSV to pay and mark paid.
**FirstPromoter vs Reditus: what is the difference?**
Reditus is a B2B SaaS network with a marketplace of affiliates and starts at $99 on a yearly plan. FirstPromoter's pages list no marketplace, so it fits a program whose partners you already know. Reditus plans cap ARR, while FirstPromoter plans cap monthly affiliate revenue.
**When should I stay on FirstPromoter?**
Stay if Braintree runs your billing, or if your affiliate revenue sits under $5,000 and the $49 plan already works. Moving makes sense once the next plan jump costs more than the alternatives above.
---
## Best link in bio tools in 2026, compared on price, limits and domains
URL: https://www.trackrev.io/blog/best-link-in-bio-tools
Published: 2026-10-01
Author: Muzahid Maruf
Ten link in bio tools measured by free plan limits, paid cost, selling, design, analytics and domains, with prices read in October 2026.
The best link in bio tools depend on the job. Linktree is the default, though its pages stay on linktr.ee. Beacons and Stan Store sell, Carrd gives you a domain and no badge for $19 a year, Later turns an Instagram feed into tappable tiles, and Bio Sites, Milkshake and Campsite.bio put analytics on a free plan. Ten link in bio platforms follow, with prices read from each vendor's page in October 2026.
I run TrackRev, which includes a free bio-page builder, so it is entry 10, judged on the same criteria.
> **Key takeaways:**
>
> - Linktree offers no custom domain on any plan, and removing its badge costs $144 a year on Pro.
> - Carrd's Pro Standard, at $19 a year, is the cheapest listed way to get your own domain among the ten.
> - Free plans cap different things: 2 Bitly landing pages, 3 Carrd sites, 14 days of Campsite.bio analytics, or a 9% to 12% seller fee.
> - Beacons' Creator Plus plan beats its free plan's 9% seller fee once sales pass about $3,333 a year.
> - Every dashboard counts views and taps. Revenue per button needs UTM-tagged or tracked links.
### Link in bio tools side by side
| Tool | Free plan | Paid from | Own domain | Analytics | Selling |
| --- | --- | --- | --- | --- | --- |
| Linktree | Unlimited basic links, restricted | Starter, $6/mo billed yearly | Not offered | Basic from Starter; all-time on Premium, $30/mo | 0% fees from Pro |
| Beacons | Unlimited links, 9% seller fee | Creator, $100/yr | Creator | On every plan | Digital products on every plan; 0% fee from Creator Plus |
| Stan Store | None, 14-day trial | Creator, $29/mo | Not stated | Store and product analytics | 0% platform fee; courses, bookings, memberships |
| Bio Sites | Unlimited links, up to 10 pages | None listed | Not stated | Built in, free | Digital goods and bookings via Stripe or PayPal |
| Later | Link in Bio page, introductory analytics | Starter, $18.75/mo billed yearly | No mention | Up to 1 year on Starter | Links out to your shop |
| Carrd | 3 sites, Carrd badge | Pro Lite, $9/yr | Pro Standard, $19/yr | Google Analytics, Plausible or Matomo | Payment forms and embeds from Pro Standard |
| Milkshake | Unlimited links, 30 days of analytics | Lite, $2.99/mo | Pro+, $99.99/yr | 365 days from Pro, $59.99/yr | Sell card for downloads; 12% fee on Free |
| Campsite.bio | Unlimited links, 14 days of analytics | Pro, $7/mo | Pro | 60 days on Pro; lifetime on Pro+ | Tip jar and requests |
| Bitly | 2 landing pages | Core, $10/mo billed yearly | Growth, $29/mo billed yearly | Views, clicks, devices, referrers, locations | None |
| TrackRev | 50 items, no signup | $39/mo for revenue tracking | Free account | None on anonymous pages | None |
*Prices from each vendor's pricing page, October 2026.*
#### Design and branding
| Tool | Design on the free plan | Badge removed at |
| --- | --- | --- |
| Linktree | Restricted; custom designs at Pro | Pro, $12/mo |
| Beacons | Unlimited colors, fonts and layouts | Creator Plus, $300/yr |
| Stan Store | 11 templates, paid plans only | Not stated |
| Bio Sites | Templates and drag-and-drop layouts | Not stated |
| Later | Buttons, backgrounds and themes | Paid plans |
| Carrd | Full one-page layouts, 3 sites | Pro Lite, $9/yr |
| Milkshake | Templates, color and font controls | Lite, $2.99/mo |
| Campsite.bio | Themes, plus a theme of your own | Pro, $7/mo |
| Bitly | Logo, fonts, colors and backgrounds | Not stated |
| TrackRev | 12 presets, 5 fonts, 3 button styles | Never |
*Design controls and the plan that removes the badge, October 2026.*
### Link in bio tools for Instagram: start with the five native links
Instagram announced in April 2023 that a profile can hold up to 5 links. [TechRadar's launch coverage](https://www.techradar.com/news/instagram-now-lets-you-add-even-more-links-in-your-bio) describes the setup: edit your profile in the mobile app, add each link, title it and drag it into order. Once a second link is added, the profile shows the first beside "and 1 other", and a visitor taps through to see the rest.
A tool earns its place at 6 destinations or more, or when you want a designed page, a checkout or click counts per link. Later is built around the Instagram grid; the other nine work wherever a URL does.
### 1. Linktree, the familiar default
[Linktree's pricing page](https://linktr.ee/s/pricing) lists 4 plans, and the free one is labeled "Free with restrictions": unlimited basic links plus email and phone sign-ups. Starter is $6 a month billed annually ($8 monthly) for a personalized page and basic analytics. Pro is $12 ($15 monthly) for custom designs, mailing list integrations, 0% selling fees and no Linktree badge. Premium, at $30 ($35 monthly), adds link routing rules, all-time analytics, data export, social scheduling and Instagram auto-replies. Pro and Premium start with a 7-day trial.
A [help center article](https://linktr.ee/help/en/articles/6571689-can-i-change-the-linktree-url-to-a-custom-domain) dated October 15, 2024 says it offers no custom domain to replace the linktr.ee URL, so every plan keeps you on its address. Dropping the badge takes Pro, $144 a year ($12 times 12). It suits people who value familiarity, or who want Instagram auto-replies and scheduling under one login.
### 2. Beacons, for selling from a free plan
[Beacons](https://beacons.ai/i/pricing) sells digital products on every tier, including Free ($0), where it keeps a 9% seller fee. Creator costs $100 a year ($10 monthly) and adds a domain of your own. Creator Plus is $300 a year ($30 monthly): the seller fee drops to 0%, the Beacons badge goes away, and memberships and courses with video hosting open up. Creator Max, at $900 a year, bundles an NFC card and onboarding help.
Nine percent of $3,333 is $300, so a page selling more than about $278 a month costs less on Creator Plus than on Free, before counting anything else the upgrade brings. For a small shop that pays only when it sells, Beacons is the easiest place to start.
### 3. Stan Store, when the page is the shop
[Stan's pricing guide](https://stan.store/blog/stan-store-pricing/), updated July 22, 2026, lists 2 plans and no free one, only a 14-day trial. Creator is $29 a month or $300 a year for the storefront, booking calendar, courses and store analytics. Creator Pro is $99 a month or $948 a year and adds discount codes, upsells and order bumps, affiliate management, email flows and pixel tracking for Meta, Google, Pinterest and TikTok.
Stan takes no transaction fee, though Stripe or PayPal processing applies, and the guide lists no domain option on either plan. It fits coaches and course sellers whose whole page is a checkout. For a list of links with a few tips, $348 a year at monthly billing is hard to justify.
### 4. Bio Sites, Squarespace's free option
[Bio Sites](https://biosites.com/) belongs to Squarespace, and its FAQ says no Squarespace subscription is needed. It is free, with unlimited links, up to 10 Bio Sites per account, built-in analytics and Stripe or PayPal payments for digital downloads and 1:1 appointments. Logging in with an existing Squarespace site copies over your logo, colors and website link.
The FAQ names no paid plan, seller fee or domain option, so ask about each before building a shop there.
### 5. Later, for a bio page that mirrors your feed
[Later](https://later.com/pricing/) is a social media scheduler with a Link in Bio page attached. Each Instagram or TikTok post you tag with a link becomes a tappable tile. Its [help center](https://help.later.com/hc/en-us/articles/360059362253-Choose-a-Later-Social-Plan) says the Free plan includes a customizable page and introductory analytics beside limited scheduling.
Starter is $18.75 a month billed yearly after a 14-day trial, mostly a scheduling bill for 8 profiles. It adds Link in Bio analytics for up to 1 year, Google Analytics support and a page without a Later banner. Scale, at $82.50, stretches that history to 2 years. The comparison mentions no custom domain and no checkout. Choose it if you already schedule posts there.
### 6. Carrd, the cheapest route to your own domain
[Carrd](https://carrd.com/pro) builds one-page sites, bio pages among them. The free plan allows 3 sites with a "Made with Carrd" badge. Pro Lite is $9 a year and removes the badge. Pro Standard is $19 a year and adds custom domains with SSL, forms, embeds from Stripe, PayPal or Gumroad, 10 sites and third-party analytics.
The pricing page lists no click dashboard or store, so analytics and selling come from outside services.
### 7. Milkshake, a free page with 30 days of numbers
[Milkshake](https://milkshake.app/pricing) gives its free plan unlimited links and cards, 30 days of Insights analytics and a Sell card for digital files through Stripe, at a 12% fee plus Stripe's own. Lite is $2.99 a month and only removes the Milkshake badge. Pro is $5 a month billed yearly ($59.99; $6.99 monthly) and adds 365 days of analytics with export, a mailing list, a Meta pixel and a 9% fee. Pro+ is $99.99 a year ($8.33 a month) for the custom domain, Google Analytics and a 7% fee.
On fee savings alone, both paid tiers pay for themselves at roughly $2,000 a year in sales: $59.99 divided by 3 points saved, and $99.99 divided by 5.
### 8. Campsite.bio, a free plan that still counts clicks
[Campsite.bio](https://campsite.bio/pricing) keeps unlimited links, themes, tips and requests on its free-forever plan, with link clicks and views for the last 14 days plus totals. Pro is $7 a month (yearly billing takes 16% off) and adds a custom domain, badge removal, 60 days of analytics with location, referrer and device detail, opt-in forms and tracking pixels. Pro+ is $24 a month, keeps lifetime analytics, exports CSV, filters by campaign and includes 6 profiles. Paid plans start with a 10-day trial.
A domain here runs $84 over twelve monthly payments, against $19 at Carrd. Team plans cost $14 a month for Org Pro and $29 for Org Pro+. Its fee line reads 0% for a limited time, which is thin ground for planning a shop.
### 9. Bitly, for teams that already shorten links there
[Bitly's pricing page](https://bitly.com/pages/pricing) counts bio pages as custom landing pages. Free allows 2, next to 5 short links a month and unlimited clicks and scans. Core is $10 a month, billed annually only, with 5 pages and 30 days of click and scan data. Growth is $29 a month billed annually ($35 monthly) and brings 10 pages, a complimentary custom domain and 4 months of data. Premium, at $199 a month billed annually, adds 20 pages and 1 year of data.
The [link-in-bio feature page](https://bitly.com/pages/features/link-in-bio) adds a QR code for the page and views and clicks by device, referrer and location. No store appears. Reaching the complimentary domain means Growth at $348 a year, so this makes sense mostly when a team already runs short links and QR codes on Bitly.
### 10. TrackRev, for bio links that have to show revenue
TrackRev's [free link-in-bio builder](https://www.trackrev.io/tools/link-in-bio) publishes without an account: pick a name, add links, and the page goes live at trackrev.io/yourname. A free account lets you serve it from a domain you own, such as links.yourbrand.com. It has 12 theme presets, up to 50 items and 12 social icons, with no store, email capture or link scheduling and no way to remove the "Made with TrackRev" footer.
For per-button numbers, put a TrackRev tracking link behind each one with UTM parameters (the [UTM guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming). The free plan allows 50 tracked links and 1,000 tracked events a month with revenue hidden. Paid plans start at $39 a month (see [pricing](https://www.trackrev.io/pricing)) and match clicks to the Stripe, Paddle, Polar or Lemon Squeezy payment they produced, as [link tracking](https://www.trackrev.io/solutions/links-and-analytics) describes.
Pick it when the page sends people to something with a price and you want to know which button earned the money. For a richer page choose Beacons or Carrd, and for a checkout, Stan Store.
### Getting from a bio tap to a payment
Each dashboard above stops at the tap, while the payment happens later on your own site. The usual fix is to tag each button's destination with UTM parameters, with a different utm_content value per button:
A destination URL for one bio button
```
https://example.com/pricing?utm_source=instagram&utm_medium=bio&utm_campaign=oct-launch&utm_content=pricing-button
```
Milkshake Pro has a campaign builder for UTM-tagged links, and Campsite.bio Pro+ filters analytics by campaign. Carrd Pro Standard, Later and Milkshake Pro+ connect Google Analytics, while Stan Store Creator Pro and Beacons Creator Plus add ad pixels. The free [UTM builder](https://www.trackrev.io/tools/utm-builder) tags links for any of them.
Google Analytics then shows sessions per tag, which stops short of the Stripe charge. Matching a tap to the payment it produced means recording the click before the visitor reaches your site, the job covered in [best link tracking software for SaaS](https://www.trackrev.io/blog/best-link-tracking-software-saas-2026). Sales made through Stan Store or Beacons are the exception, since those tools host the checkout.
### Frequently asked questions
**What is the best free link in bio tool?**
For selling, Beacons allows digital products on its $0 plan at a 9% fee. For history, Milkshake keeps 30 days of analytics and Campsite.bio 14. Bio Sites allows 10 pages per account.
**Do I need a custom domain for my link in bio page?**
Not to start. A custom domain can be repointed if you switch tools, while an address like linktr.ee/yourname stays with the old one. Domains run $19 a year on Carrd Pro Standard and $84 on Campsite.bio Pro.
**What if I need more than one page?**
Carrd Pro Lite 10 costs $14 a year for 10 sites, and Campsite.bio charges $1.50 a month for each extra profile. Linktree's Agency and Enterprise option, for multiple profiles, is sold through its sales team.
**Does Linktree take a cut of sales?**
Its pricing FAQ says it charges US$0.25 per payout, and Pro lists 0% selling fees. For comparison, Beacons keeps 9% on its free plan and Milkshake 12%, while Stan Store charges no platform fee.
**Can I move my page to another tool later?**
Your content can move, but the address changes unless it sits on your own domain. Later's FAQ says it imports an existing Linktree page with its profile, social links and design. Elsewhere, check for an import option first.
**How do I see which bio link earns money?**
Give each button its own destination tagged with UTM parameters, then match visits to payments in Stripe or another processor. A link tracking tool such as TrackRev does that join for you.
---
## Best link tracking software for SaaS: six tools compared on price, revenue data and Safari
URL: https://www.trackrev.io/blog/best-link-tracking-software-saas-2026
Published: 2026-06-15
Author: Muzahid Maruf
Six link tracking tools compared in October 2026: Bitly, Rebrandly, Short.io, Dub, ClickMagick and TrackRev, with entry prices from $0 to $90 a month.
The best link tracking software for a SaaS team depends on what a link has to prove. Bitly is the one tool of the six here that lists no conversion tracking, so its reports end at the click or scan. Short.io, Rebrandly, Dub, ClickMagick and TrackRev record conversions, with entry prices from $0 to $90 monthly. What separates them is how a sale reaches the link: through a script on your checkout page or through your billing system. I run TrackRev, entry 6, and each entry names a case for picking something else.
> **Key takeaways:**
>
> - No Bitly plan lists conversion tracking. The other five record conversions, starting at Short.io's free allowance of 50 and reaching $90 on Dub Business.
> - Three differences decide the choice: how a sale is recorded, how long the attribution window runs, and what the plan meters.
> - At 40,000 clicks a month with conversions, a year costs $180 on Short.io Pro, $351 on TrackRev Starter, $972 on Dub Business and $1,990 on ClickMagick Standard.
> - Safari deletes cookies written by JavaScript after 7 days without a visit, so ask vendors how theirs is written and what joins a payment to a click without it.
### Best link tracking software compared on price and conversion data
Short.io is the only tool whose free plan lists a conversion allowance, 50 each month. TrackRev's free plan covers link tracking, and revenue figures need a paid plan.
| Tool | Free plan | Plan to start on | Monthly | Billed yearly, per month | Conversions |
| --- | --- | --- | --- | --- | --- |
| Bitly | 5 links, 2 QR codes | Growth, the first with branded links | $35 | $29 | None listed |
| Rebrandly | 10 links | Professional | $32 | $22 | From Professional |
| Short.io | 1,000 links, 50 conversions | Pro | $18 | $15 | 50 free, 200 on Hobby ($5), unlimited on Pro |
| Dub | 25 links, 1,000 events | Business | $90 | $81 | From Business |
| ClickMagick | 14-day trial | Starter | $79 | $66 | Every plan |
| TrackRev | 50 links, 1,000 events | Starter | $39 | $29.25 | Revenue on every paid plan |
*Prices from each vendor's pricing page, October 2026.*
### What separates link trackers that all record conversions
#### How a sale gets back to the link
A script sees only the pages that carry it, so a renewal that Stripe bills 30 days later never reaches it. A billing connection sees every charge but has to match each one to a click afterward.
Rebrandly's [conversion tracking](https://www.rebrandly.com/conversion-tracking) asks for one script tag on the destination page and a list of events that count, such as revenue or sign-ups. Dub's [sales docs](https://dub.co/docs/conversions/sales/introduction) describe two native integrations, plus an SDK and REST API for other processors. ClickMagick's product pages name no payment processor and offer webhooks, Zapier and a REST API. TrackRev reads Stripe, Paddle, Polar and Lemon Squeezy with a restricted read-only key.
#### Attribution window and renewals
Rebrandly offers a 7, 14 or 30 day window. TrackRev defaults to 30 days and accepts anything from 1 to 365. With a 14-day trial and a 14-day window, a buyer who pays on day 15 vanishes from the report.
A second question for subscriptions: does a renewal credit the click that started it? Dub's docs say later purchases by the same customer go to the original link, and TrackRev carries the click across every renewal. Rebrandly's and Short.io's pages say nothing about renewals.
#### What each plan counts and how long it keeps data
| Tool | What the plan counts monthly | Click or conversion data kept |
| --- | --- | --- |
| Bitly | Links created: 100 (Core), 500 (Growth), 3,000 (Premium); clicks unlimited | 30 days (Core), 4 months (Growth), 1 year (Premium) |
| Rebrandly | Links: 1,500 (Professional); engagement data on 25,000 clicks | Conversions: 6 months (Professional), 1 year (Growth) |
| Short.io | Pro: links, tracked clicks and conversions unlimited; 10,000 links a year by API | Not listed |
| Dub | New links and tracked events: 1,000 and 50,000 (Pro), 10,000 and 250,000 (Business) | 30 days (free), 1 year (Pro), 3 years (Business) |
| ClickMagick | Tracked visitors: 10,000, 100,000 and 1,000,000 | 6 months (Starter), 1 year (Standard) |
| TrackRev | Partner commission tracked: $10K, $100K or no cap; links and events unlimited | Not listed |
### How these tools behave on Safari and iOS
WebKit's [tracking prevention policy](https://webkit.org/tracking-prevention/) sets the rules. Intelligent Tracking Prevention deletes cookies created in JavaScript, and other script-writable storage, after 7 days without the visitor interacting with the site. When it detects cross-site tracking through click IDs in link URLs, it caps JavaScript cookies on the landing page at 24 hours. Cookies set in HTTP responses are capped at 7 days when a first-party subresource resolves through a CNAME that differs from the site's own. A domain that redirects people across many sites can be classified as a bounce tracker and lose its stored data after 30 days without a direct visit, though WebKit publishes no thresholds. Safari 17 also [blocks known tracking query parameters](https://webkit.org/blog/14445/webkit-features-in-safari-17-0/) in links opened in Private Browsing.
A click log written on the server at the redirect sits outside all of that, while a visitor ID in a script-written cookie sits inside the 7-day cap. Ask each vendor whether its cookie is written by script or by an HTTP Set-Cookie header, and what joins a payment to a click once the cookie is gone.
TrackRev's redirect logs the click on the server. Its pixel writes the visitor cookie with JavaScript, so the 7-day cap covers it. A later payment still matches when the visitor ID was bound to the customer's email at signup. The hardest case for any cookie-based tool is a visitor who clicks, stays away for 8 days and buys without signing up first. [Safari ITP and SaaS attribution](https://www.trackrev.io/blog/safari-itp-attribution-saas) works through it.
### The six tools in detail
Prices below are per month, with the yearly-billing rate in parentheses.
#### 1. Bitly, for branded links and QR codes at scale
[Bitly](https://bitly.com/pages/pricing) gives a free account 5 links and 2 QR codes. Core is $10 (annual billing only) and adds a UTM builder, 100 links and 30 days of data. Growth is $35 ($29), the first plan with branded URLs plus a complimentary custom domain. Premium is $300 ($199) with 3,000 links, and adds city and device data, campaign-level tracking and mobile deep linking. Its pricing page lists no revenue tracking, so Bitly reports how many people clicked or scanned, and Google Analytics has to say who bought. It fits teams whose traffic arrives from print and scanned codes. Cheaper routes are in [six Bitly alternatives](https://www.trackrev.io/blog/best-bitly-alternatives-2026).
#### 2. Rebrandly, for conversion data inside a 30-day window
[Rebrandly](https://www.rebrandly.com/pricing) has a free tier of 10 links. Essentials is $11 ($8) for 250 links, Professional $32 ($22) and Growth $99 ($69). Start on Professional: it adds conversion tracking, link retargeting, routing by location or device, link expiration and 50 password-protected links, with room for 1,500 links and 3 custom domains. Growth raises that to 3,500 links, 10 domains. It suits a product whose buyers decide within 30 days and buy on a page you can put a script on. Check how a renewal billed outside any page would be recorded.
#### 3. Short.io, for the largest free plan
A [Short.io](https://short.io/pricing) free account has 1 user, 5 custom domains, 1,000 branded links and 50,000 tracked clicks, and the FAQ allows commercial use. Hobby is $5 for 2,500 links, 100,000 clicks, 200 conversions. Pro is $18 ($15) with no cap on links, clicks or conversions, plus password protection, link expiration and link cloaking. Team is $48 and adds unlimited users, city and region targeting, mobile deep links and a 99.9% uptime SLA. The pricing page counts conversions without saying how one is recorded or whether it carries an amount, so run a test sale before trusting it for revenue. The longer comparison is [Short.io vs TrackRev](https://www.trackrev.io/blog/short-io-vs-trackrev).
#### 4. Dub, for open-source links and Stripe sales tracking
[Dub's](https://dub.co/pricing/links) free plan covers 25 new links, 1,000 tracked events, 3 custom domains and 30 days of analytics. Pro is $30 ($27) with 1,000 links and 50,000 events but no conversions. Business is $90 ($81) with 10,000 links, 250,000 events, A/B testing and event webhooks, and it is where sale tracking starts. Advanced is $300 for 1,000,000 events. Stripe and Shopify connect natively, and Paddle, Polar or Lemon Squeezy sales go through the SDK or REST API. The core code is AGPLv3 on [GitHub](https://github.com/dubinc/dub), with an `/ee` folder under a commercial license. Dub fits teams that want to self-host the link layer or test link variants, and [Dub.co vs TrackRev](https://www.trackrev.io/blog/dub-co-vs-trackrev) covers what self-hosting leaves out.
#### 5. ClickMagick, for tracking paid ads
[ClickMagick](https://www.clickmagick.com/pricing/) has no free plan, only a 14-day trial. Starter is $79 ($66) with 10,000 tracked visitors, 1 website and a first-party tracking domain. Standard is $199 ($166) with 100,000 visitors, bot and click fraud protection, advanced attribution models and phone or offline sales tracking, and Pro is $349 for 1,000,000 visitors. Its [tracking page](https://www.clickmagick.com/product/?tab=tracking) describes conversion data flowing back to your ad platforms, the reason to buy it if you spend on ads. A team whose best channels are content, newsletters and partners gets less from that loop. [ClickMagick vs TrackRev](https://www.trackrev.io/blog/clickmagick-vs-trackrev) sets them side by side.
#### 6. TrackRev, for channel revenue with an affiliate program on one bill
TrackRev's free tier allows 50 links and 1,000 tracked events, for link tracking only. Starter is $39 ($29.25, nine months' price for twelve) and has unlimited links and events, revenue sync from Stripe, Paddle, Polar and Lemon Squeezy, last-touch, first-touch and linear attribution, custom domains and the affiliate program. Growth is $99 and Scale is $199. The three differ in workspaces, in monthly partner commission tracked ($10K, $100K, no cap) and, on Scale, in priority support.
The redirect logs each click on the server, so click capture needs no script on your site. Revenue attribution adds one first-party pixel and a restricted Stripe key, with charges synced hourly or on a Stripe webhook, and renewals credit the original click. Device targeting, link expiration, password protection and CSV bulk import cover the link side, and the [links and analytics page](https://www.trackrev.io/solutions/links-and-analytics) lists the rest. TrackRev's app is closed source and hosted only, has no A/B split between destinations, and hides revenue until you pay. Pick Dub to self-host or test link variants, and ClickMagick for ad feedback.
### ClickMagick vs Bitly: link management or ad tracking
Bitly Growth at $35 organizes branded URLs and QR codes. ClickMagick Starter at $79 tracks visitors from paid campaigns and feeds the results to ad platforms, and it meters visitors where Bitly meters links. With no ad spend, Bitly alone is the cheaper purchase. If ads are your largest cost, ClickMagick's $79 is small against them.
### What 40,000 clicks a month costs
Meters differ, so price each plan at your own volume. Take 40,000 clicks monthly with conversions per link, at October 2026 prices. Rebrandly Professional shows engagement data on 25,000 clicks and ClickMagick Starter tracks 10,000 visitors, so both step up a tier. The ClickMagick row assumes roughly one visitor per click.
| Tool | Plan that fits | Monthly | Billed yearly |
| --- | --- | --- | --- |
| Short.io | Pro | $18 | $180 |
| TrackRev | Starter | $39 | $351 |
| Dub | Business | $90 | $972 |
| Rebrandly | Growth | $99 | $828 |
| ClickMagick | Standard | $199 | $1,990 |
| Bitly (no conversion data) | Growth | $35 | $348 |
### When a free UTM builder is enough
If you only need to know which campaign sent a visitor, a free [UTM builder](https://www.trackrev.io/tools/utm-builder) plus Google Analytics 4 covers it. Google's [campaign URL guidance](https://support.google.com/analytics/answer/10917952) says to set utm_source, utm_medium and utm_campaign on every link and that values are case sensitive, so Google and google report as two sources.
### Which tool to pick
I built TrackRev for the last row. A free account covers 50 links with no card, and every paid plan includes the revenue sync and the affiliate program; [pricing](https://www.trackrev.io/pricing) has the yearly figures.
| Your main question | Pick | Starts at |
| --- | --- | --- |
| Which printed link or QR code gets used? | Bitly | Free, then $35 on Growth |
| Do sign-ups convert within 30 days? | Rebrandly Professional | $32 |
| Can I get branded links for free? | Short.io | $0 for 1,000 links |
| Can I self-host, and see Stripe sales per link? | Dub | $90 on Business |
| Which ad pays back? | ClickMagick | $79 |
| Which channel pays my MRR, renewals included? | TrackRev | $39 |
### Frequently asked questions
**What is the best link tracking software for a SaaS company?**
Start from the question. Counting scans of a printed code points to Bitly, judging ad spend points to ClickMagick, and ranking channels by revenue points to TrackRev or Dub. Then price each plan at your real click volume, because the meters differ.
**ClickMagick or Bitly: which should I choose?**
They answer different questions. Bitly at $35 manages links that people click or scan, while ClickMagick at $79 serves advertisers who send conversions back to ad platforms. A team with no ad budget rarely needs ClickMagick.
**Do link tracking and referral software still work with Safari ITP?**
Yes for the click, and partly for the sale. Server-side logging never relied on browser storage, but a cookie written by a script is deleted after a week of absence. Referral tools follow the same split, so buy something through Safari on day 8 before launch. TrackRev's affiliate program needs a paid plan, from $39.
**What does link tracking software cost for a small SaaS team?**
It can cost nothing, since every tool except ClickMagick has a free plan. Plans with conversions start at $18 on Short.io Pro, $32 on Rebrandly Professional, $39 on TrackRev Starter, $79 on ClickMagick Starter and $90 for Dub's Business plan, and yearly billing lowers each.
**Which link analytics platform suits a marketing team?**
Compare what each plan breaks clicks down by and how long it keeps them. Bitly adds city and device data at Premium, Dub keeps 3 years of analytics from Business, and TrackRev breaks clicks down by operating system, browser, device and location, each tied to revenue on paid plans.
**Which revenue attribution software works for SaaS?**
Look for a tool that reads payments from the processor instead of relying on a thank-you page script. TrackRev reads four processors and Dub reads Stripe and Shopify. Check that renewals credit the original click and that the window outlasts your trial.
---
## Linktree alternatives: 9 tools compared on free limits, price and custom domains
URL: https://www.trackrev.io/blog/best-linktree-alternatives
Published: 2026-10-04
Author: Muzahid Maruf
9 Linktree alternatives compared on free plan limits, paid price, custom domain, analytics and selling, with prices from October 2026.
The Linktree alternatives worth testing first are Beacons, which lets you sell from its $0 plan, and Campsite.bio, which shows link clicks on its free plan. [Carrd](https://carrd.com/pro) is the cheapest way to get your own domain and no badge, at $19 a year, and Stan Store suits anyone selling courses. Linktree's help center says it offers no custom domain in place of the linktr.ee URL. I run TrackRev, which is entry 9.
> **Key takeaways:**
>
> - Linktree has no custom-domain option on any plan, and dropping its branding takes Pro at $144 a year.
> - Carrd's $19 a year covers your own domain and badge removal together; Beacons asks $300 for the same pair.
> - Free plans cap different things: 25 links, 14 days of analytics, or seller fees of 9% to 12%.
> - TrackRev's free builder accepts your domain but has no store and keeps its footer credit.
### What Linktree charges today
[Linktree's pricing page](https://linktr.ee/s/pricing) lists 4 priced plans, and the free one is labeled "Free with restrictions": unlimited basic links plus email and phone sign-ups.
| Plan | Per month, billed annually | Per month, billed monthly | What the page adds |
| --- | --- | --- | --- |
| Free | $0 | $0 | Unlimited basic links, email and phone sign-ups |
| Starter | $6 | $8 | Personalized Linktree, unlimited featured links, basic analytics |
| Pro | $12 | $15 | Branding removal, custom designs, selling with 0% fees, mailing list integrations |
| Premium | $30 | $35 | Link rules and routing, all-time analytics, data export, social scheduling, Instagram auto-replies |
*Linktree plans and prices, October 2026.*
Branding comes off at Pro: $12 a month times 12 is $144 a year on annual billing. A custom domain sits on no plan, and a [help center article](https://linktr.ee/help/en/articles/6571689-can-i-change-the-linktree-url-to-a-custom-domain) dated October 15, 2024 suggests a Redirect link if you want people sent to your own website.
The pricing page lists 0% selling fees from Pro and states no rate for the plans below it. The FAQ cites a US$0.25 charge per payout. Premium costs $360 a year ($30 times 12) and adds social scheduling and Instagram auto-replies.
### Linktree alternatives compared on the same criteria
| Tool | Free plan | Own domain | No branding | Selling | Analytics |
| --- | --- | --- | --- | --- | --- |
| Linktree | Unlimited basic links | Not offered | Pro, $12/mo annual | 0% fees from Pro; US$0.25 per payout | Basic from Starter; all-time on Premium |
| Beacons | Unlimited links; 9% seller fee | Creator, $100/yr | Creator Plus, $300/yr | 9%, or 0% on Plus | On every plan |
| Stan Store | None | Not supported | Not stated | Digital products and courses; no fee from Stan | Store analytics from Creator, $29/mo |
| Carrd | 3 sites, Carrd badge | Pro Standard, $19/yr | Pro Lite, $9/yr | Payment forms and embeds from Pro Standard | Google Analytics, Plausible or Matomo |
| Milkshake | Unlimited links; 30 days of analytics | Pro+, $99.99/yr | Lite, $2.99/mo | 12% on Free and Lite, 9% on Pro, 7% on Pro+ | 30 days free; 365 on Pro |
| solo.to | 25 links; 1 month of page views | Professional, $10/mo annual | Professional | Tip jar from Personal, $1/mo | Link clicks from Entrepreneur, $5/mo |
| Campsite.bio | Unlimited links; 14 days of analytics | Pro, $7/mo | Pro | Tips and requests | 60 days on Pro; lifetime on Pro+, $24/mo |
| Lnk.Bio | Unlimited links; 3 pages | $39.99/yr add-on | Unique, $24.99 once | Shop on Unique | Basic free; advanced from Mini |
| LinkStack | Free, open source | Self-hosted, or $5/mo hosted | Not stated | None listed | Built in |
| TrackRev | 50 items, no signup | Free account | Not removable | None | None on anonymous pages |
*Prices from each vendor's pricing page, October 2026.*
### 9 Linktree alternatives, one at a time
#### 1. Beacons, for selling from a free plan
[Beacons](https://beacons.ai/i/pricing) lets you sell from its $0 plan, which also has unlimited links, color, font and layout control, traffic analytics, a media kit and 50 email sends a month. The cost is a 9% seller fee that stays through Creator ($10 monthly, $100 a year, which adds a free custom domain). Only Creator Plus ($30 monthly, $300 a year) drops the fee to 0% and removes the Beacons badge. The free plan costs nothing until something sells, so it is an inexpensive way to test whether an audience buys downloads.
#### 2. Stan Store, for a store that lives in your bio
Stan Store has no free plan, per [its pricing article](https://stan.store/blog/stan-store-pricing/), which offers a 14-day free trial. Creator is $29 a month or $300 a year, and Creator Pro is $99 a month or $948 a year. Stan takes no transaction fee of its own, though Stripe or PayPal fees apply. Both plans include unlimited digital products, a course builder and email collection; Pro adds upsells, payment plans, email flows and affiliate management. The article mentions 11 link in bio templates, and the help center says you [cannot connect a custom domain](https://help.stan.store/article/151-can-i-create-a-custom-domain-for-my-stan-store), so the store stays at stan.store/yourusername. It earns its price only when courses, coaching or memberships are the business; at $300 a year it is poor value as a link list.
#### 3. Carrd, for your own domain at $19 a year
[Carrd](https://carrd.com/pro) builds [one-page sites](https://carrd.co/), from personal profiles to landing pages, so a bio page is one thing you can make with it. A free account gets 3 sites with the "Made with Carrd" footer. Pro Lite, at $9 a year, removes the branding. Pro Standard, at $19 for 10 sites, adds custom domains, forms including payment-enabled ones, embeds for Stripe, PayPal or Gumroad, and analytics through Google Analytics, Plausible or Matomo. The plans list no built-in click dashboard. Pro Standard is still the cheapest plan here that gives you your own domain and no badge together.
#### 4. Milkshake, for building from your phone
[Milkshake](https://milkshake.app/pricing/) makes each page a swipeable "Card" and pitches itself as a mobile website builder, with subscriptions billed through the App Store or Google Play. The free plan has unlimited links and Cards, color and font customization, QR sharing and 30 days of analytics, and it sells digital files through Stripe at a 12% fee plus Stripe's own. Lite ($2.99 a month) removes the branding. Pro ($59.99 a year, or $6.99 monthly) brings 365 days of analytics, a contact form, a mailing list, a Meta pixel and a 9% selling fee. Pro+ ($99.99 a year) adds the custom domain and cuts the fee to 7%.
#### 5. solo.to, for a short list on a small budget
[solo.to](https://solo.to/pricing) has four plans, and each one states how far back its analytics go. Beginner is free with 25 links, themes, a background color and 1 month of daily page views. Personal is $1 a month billed annually, with 50 links and 6 months of analytics. Entrepreneur ($5 a month billed annually, $6 monthly) brings 100 links and embeds, 12 months of analytics that include link clicks, scheduled links and background video. Custom domains, ad pixels and optional branding removal start at Professional ($10 a month billed annually, $15 monthly), so $120 a year is the cheapest route to your own domain. Monetization is a tip jar, with no store listed.
#### 6. Campsite.bio, for click counts on the free plan
[Campsite.bio](https://campsite.bio/pricing) has unlimited links, theme customization, a tip jar, and link clicks and views for the last 14 days plus totals on its free plan. Pro ($7 a month billed monthly) adds a custom domain, hides the Campsite logo, stretches analytics to 60 days with location, referrer and device breakdowns, and supports UTM parameters and ad pixels. Pro+ ($24 a month) adds lifetime analytics, a CSV export and 6 profiles. Paid plans start with a 10-day trial. Monetization stops at tips and requests, so it suits watching what gets tapped more than selling.
#### 7. Lnk.Bio, for one-time payments
[Lnk.Bio](https://lnk.bio/) sells its upgrades as one-time payments. Free gives you unlimited links, basic statistics and 3 pages. Mini ($0.99 a month or $9.99 once) adds scheduling, advanced analytics, external pixels and password-protected links. Unique ($24.99 once) brings no Lnk.Bio logo, custom colors, wallpaper, a shop, 10 pages and a free .bio domain for the first year. Connecting a domain of yours costs $39.99 a year as an add-on, which makes year one $64.98 and leaves the page itself as the only one-time payment.
#### 8. LinkStack, for running it yourself
[LinkStack](https://linkstack.org/) is open source, and its site says it is free to use, distribute and modify. Run it on a web server with PHP 8 or newer, or in Docker, join a community instance, or buy hosting from the project: $1 a month for 1 user on a subdomain, $5 for a custom domain and up to 10 users, $8 for up to 100 users. The site lists analytics, themes and an export that moves your data between instances, and mentions no store or checkout.
#### 9. TrackRev, for bio links that feed something you sell
TrackRev's [free link-in-bio builder](https://www.trackrev.io/tools/link-in-bio) publishes without an account: pick a name, add links, and the page is live at trackrev.io/yourname. A free account lets you serve it from a domain you own, such as links.yourbrand.com. Design controls are 12 theme presets, solid, gradient or image backgrounds, 5 fonts, 3 button styles, 4 corner radii, hard or soft shadows, a thumbnail per link and section dividers, with up to 50 items and 12 social icons.
There is no store, email capture, embed or link scheduling, and the "Made with TrackRev" footer cannot be removed. Pages published without an account carry no analytics. For per-button numbers, put a TrackRev tracking link behind each button and tag it with UTM parameters (see the [UTM guide](https://www.trackrev.io/blog/utm-parameters-guide)). The free plan allows 50 tracked links and 1,000 tracked events a month with revenue hidden. Paid plans start at $39 a month (see [pricing](https://www.trackrev.io/pricing)) and match clicks to the Stripe, Paddle, Polar or Lemon Squeezy payment they produced ([TrackRev's link tracking](https://www.trackrev.io/solutions/links-and-analytics)). It fits when the page sends people to something with a price and you want to know which button earned money. For a richer page pick Beacons, Carrd or solo.to, and when selling is the point, Stan Store.
### What your own domain costs in the first year
| Tool | Plan with your domain | Year one | Branding gone |
| --- | --- | --- | --- |
| TrackRev | Free account | $0 | No, footer credit stays |
| Carrd | Pro Standard | $19 | Yes |
| LinkStack hosted | $5/mo custom domain tier | $60 | Not stated |
| Lnk.Bio | Unique plus $39.99/yr domain add-on | $64.98 | Yes |
| Campsite.bio | Pro, $7/mo billed monthly | $84 | Yes |
| Milkshake | Pro+ | $99.99 | Yes |
| Beacons | Creator | $100 | No, Beacons badge stays |
| solo.to | Professional, $10/mo annual | $120 | Optional |
| Linktree | Not offered | None | Pro, $144/yr |
| Stan Store | Not supported | None | Not stated |
*Year-one cost of putting each page on your own domain, at October 2026 prices.*
Beacons needs Creator Plus at $300 a year to get a domain and lose its badge together, which is $281 more than Carrd charges for both. With a domain you own, the next switch is a DNS change, and the same holds for a [branded short link](https://www.trackrev.io/blog/what-is-a-branded-short-link).
### When a paid plan beats the seller fee
Beacons' Creator Plus costs $25 a month billed annually, so against the 9% fee on its free plan it pays for itself once monthly sales pass about $278 ($25 divided by 0.09). Milkshake Pro at $5 a month billed annually cuts its fee from 12% to 9%, which breaks even near $167 in monthly sales ($5 divided by 0.03). Stan Store's $29 monthly price beats Beacons' free-plan 9% fee above roughly $322 a month in sales. These break-even points leave out Stripe and PayPal processing fees.
### Frequently asked questions
**What is the best free Linktree alternative?**
Beacons, if you plan to sell: its $0 plan carries a 9% seller fee and no monthly charge. For a plain link list, Campsite.bio shows 14 days of clicks for nothing, and TrackRev's builder publishes without an account.
**Which alternative has the deepest analytics?**
Campsite.bio Pro+ keeps lifetime history with a CSV export for $24 a month. solo.to Professional keeps 24 months of daily page views and link clicks for $10 a month billed annually. Linktree's counterpart is Premium at $30 a month billed annually, listed with all-time analytics and data export.
**Which Linktree alternative takes no cut of sales?**
Stan Store charges no transaction fee of its own, Beacons reaches 0% on Creator Plus and Linktree reaches it at Pro. Payment processors still take their normal fee on each sale.
**How do I see which bio link earns money?**
Click counts tell you which button gets tapped. To see which one earns money, give each button its own tracking link, tag the destination with UTM parameters, and match visits to payments in Stripe or another processor. A tool such as TrackRev does that join for you.
**Is Linktree still worth keeping?**
Keep it if you use Premium's Instagram auto-replies or social scheduling and can live with a linktr.ee address. Its help center says it does not offer a custom domain.
**What is the cheapest paid plan among these tools?**
Carrd's Pro Lite costs $9 a year and removes the badge. Lnk.Bio Mini is $9.99 once and adds scheduling and advanced analytics. solo.to Personal costs $12 a year for 50 links.
---
## Best referral marketing software in 2026: 10 tools, their prices and limits
URL: https://www.trackrev.io/blog/best-referral-program-software
Published: 2026-10-01
Author: Muzahid Maruf
Referral marketing software compared: GrowSurf, Viral Loops, Cello, ReferralCandy, Rewardful and 5 more, with plan prices checked in October 2026.
The best referral marketing software depends on what you reward and where your customers buy. GrowSurf and Viral Loops price by participant count and suit programs where customers refer customers. Rewardful, FirstPromoter and Tolt start between $49 and $69 a month and pay commission on SaaS subscription revenue. ReferralCandy fits Shopify stores, Cello puts referrals inside a B2B product, and Friendbuy and PartnerStack sell through demos.
I run TrackRev, so it is entry 10 and gets judged by the same criteria, including where it loses. Every price comes from the vendor's own pricing page, read in October 2026.
> **Key takeaways:**
>
> - Entry plans run from $9 to $125 a month, and each vendor meters something different: participants, affiliate revenue, referral ARR, a success fee or commission paid.
> - FirstPromoter's $49 Starter stops at $5,000 a month of affiliate revenue, while Rewardful's $49 Starter reaches $7,500.
> - GrowSurf counts referred friends as participants, so a program with many sign-ups costs more than a small one.
> - Friendbuy and PartnerStack publish no prices, so you book a demo to get a quote.
> - TrackRev's referral campaigns start at $39 a month, and a friend's discount is a promo code you create in your payment provider.
### What referral marketing software costs
Entry prices run from $9 to $125 a month, and they measure different things. GrowSurf and Viral Loops bill by participants. Rewardful, FirstPromoter and Tolt cap the monthly revenue their affiliates generate. Cello caps referral ARR, ReferralCandy takes a success fee on new customers, TrackRev caps the commission it tracks, and Friendbuy and PartnerStack quote only after a demo.
| Tool | Cheapest paid plan | What the plan limit counts | Trial or free plan |
| --- | --- | --- | --- |
| GrowSurf | Startup, $125/mo billed yearly ($179 monthly) | Participants: from 2,500 on Startup, from 10,000 on Business | 14-day trial, no card; no free referral plan |
| Viral Loops | Start-up, $35/mo billed yearly ($49 monthly) | Participants: 1,000 on Start-up, 25,000 on Power | 14-day trial limited to 10 participants |
| Cello | Start, 65/mo billed yearly (95 monthly) | Referral ARR: up to 10K on Start, 100K on Scale | Start for free buttons, terms unstated; free partner-referral plan |
| ReferralCandy | Basic, $9/mo plus a 10.5% success fee | Success fee on each new customer's first 3 orders | 7-day trial, no success fee during it |
| Friendbuy | Not published | Quote after a demo | None listed |
| Rewardful | Starter, $49/mo ($490 a year) | Affiliate-attributed revenue: $7,500/mo on Starter | 14-day trial |
| FirstPromoter | Starter, $49/mo ($490 a year) | Revenue from affiliates: $5,000/mo on Starter | 14-day trial, no card |
| Tolt | Basic, $69/mo | Money earned from affiliates: $10,000/mo on Basic | 14-day trial, no card |
| PartnerStack | Not published | Program size, features and support, set in a demo | None listed |
| TrackRev | Starter, $39/mo ($351 a year) | Commission tracked: $10K/mo on Starter | Free plan: link tracking only, 1,000 tracked events/mo |
*Prices from each vendor's pricing page, October 2026.*
Metering changes which plan you land on. Take a SaaS whose referred customers pay $6,000 a month. Rewardful's Starter covers it at $49 because its ceiling is $7,500, while FirstPromoter's Starter stops at $5,000, so the same program needs Business at $99. TrackRev's Starter meters commission, so at a 30% commission the $6,000 produces $1,800 against a $10,000 ceiling, which that plan reaches at about $33,333 of referred revenue a month. GrowSurf and Viral Loops ignore revenue and count the people who join.
> **Worked example: where ReferralCandy's tiers cross:** Basic costs $9 plus 10.5% of new-customer revenue and Grow costs $79 plus 3.5%. At $1,000 a month both cost $114 ($9 + $105, and $79 + $35), so Grow is cheaper above that. Grow and Scale ($249 plus 1.5%) meet at $8,500 a month, where each costs $376.50, and Scale and Enterprise ($799 plus 0.25%) meet at $44,000, where each costs $909. The fee counts only each new customer's first 3 orders, so the revenue that matters is smaller than total referred sales.
### Referral program software with a free plan
Few vendors give referrals a free tier. GrowSurf's affiliate product costs $0 a month plus a 3% success fee on the revenue affiliates bring in, and Cello's partner-referral Free plan allows 1 campaign and 5 transacting partners with 5% transaction costs. TrackRev's free plan covers link tracking only, with 50 links and 1,000 tracked events a month, and the referral program and revenue figures start on a paid plan. Most other vendors run a 7 to 14 day trial, while Friendbuy and PartnerStack list none.
A percentage fee overtakes a flat plan at a predictable volume. GrowSurf's 3% costs more than Rewardful's $49 Starter plan once affiliates bring in about $1,633 a month (49 divided by 0.03), and Starter covers up to $7,500.
### The ten tools, one at a time
#### 1. GrowSurf, for customer referrals priced by participant
[GrowSurf](https://growsurf.com/pricing/referral-programs/) counts a participant as any referrer or referred person with a unique email address. Startup is $125 a month billed yearly (30% below the $179 monthly rate) at up to 2,500 participants, with 2 referral programs and 2 team members. Business is $314 billed yearly ($449 monthly) from 10,000 participants up to 150,000, with 5 programs, a custom portal domain and live support. Referral programs have no free plan, only a 14-day trial with every feature and no card. Developers get a REST API, a JavaScript SDK, iOS and Android SDKs and webhooks. It suits a SaaS with a modest participant count whose customers share from inside the product.
#### 2. Viral Loops, for waitlists, giveaways and milestone rewards
[Viral Loops](https://viral-loops.com/pricing) sells campaign templates such as The Startup Prelaunch, The Leaderboard Giveaway and The Milestone Referral. The Start-up plan ($35 billed yearly) covers lead-generation campaigns only, for up to 1,000 participants. Campaigns where customers refer friends begin at Plus ($99 billed yearly, $139 monthly, up to 5,000 participants), which also adds a custom domain and API access. Growing ($159 billed yearly, 10,000 participants) adds Stripe and Tremendous rewarding, referral revenue tracking and branding removal, and Power is $279 for 25,000. The pricing page lists no commission or partner payouts, so a commission program fits elsewhere.
#### 3. Cello, for B2B products that want referrals inside the app
[Cello](https://cello.so/pricing) embeds referrals through the Cello Web SDK, the Cello Mobile SDK (iOS, Android, Flutter and React Native), a menu launcher or a floating button, and gives every user a personal link, with text customizable in 10 languages. Start is 65 a month billed yearly (95 monthly) for 1 campaign and up to 10K referral ARR, Grow is 200 yearly (300 monthly) for unlimited campaigns and 50K, Scale is 750 for 100K, and Enterprise is custom. Referral ARR annualizes the recurring revenue of referred customers who still pay, so churn lowers it, and referred free or trial users cost nothing. User referrals carry 0% transaction costs. Cello's page markup says prices show in euros by default, so check the currency you see. Yearly plans carry a 12-month commitment, and monthly plans cancel any time. See also [Cello alternatives](https://www.trackrev.io/blog/cello-alternative).
#### 4. ReferralCandy, for Shopify and other online stores
[ReferralCandy](https://www.referralcandy.com/pricing) puts every feature on every plan, including unlimited campaigns, custom coupon codes and full API access, and charges for volume: Basic is $9 a month plus 10.5%, Grow $79 plus 3.5%, Scale $249 plus 1.5% and Enterprise $799 plus 0.25%. The percentage applies to the subtotal of a net-new customer's first 3 orders, never to the reward paid out, and each extra store costs $20 a month. The page is written around Shopify first, then BigCommerce, WooCommerce, Magento and custom stores, and never mentions subscriptions or Stripe, so a SaaS should ask how recurring revenue is counted before trialing it.
#### 5. Friendbuy, for large consumer brands with a lifecycle stack
[Friendbuy](https://www.friendbuy.com/products/referral-program-software/) publishes no prices, and friendbuy.com/pricing redirects to its home page, so every conversation starts with a demo. Onboarding is project-managed over 4 to 6 weeks, with Friendbuy building the widgets and emails. It connects to Shopify, Salesforce Commerce Cloud, Recharge, Ordergroove, Klaviyo, Attentive, Braze, Iterable and Segment, and your own systems can approve each reward through a Reward Validation Callback before it fires.
#### 6. Rewardful, for Stripe-billed SaaS paying commissions
[Rewardful](https://www.rewardful.com/pricing) calls itself a Premier Stripe Partner, its integrations page names Paddle too, and it takes 0% of affiliate-attributed revenue. Starter is $49 a month, or $490 a year for 2 months free, with 1 campaign, 2 team members and up to $7,500 a month of affiliate-attributed revenue. Growth is $99 ($990 a year) with unlimited campaigns, a branded portal, a custom domain and a $15,000 ceiling, and Enterprise starts at $149 with phone support. Double-sided incentives, coupon-code tracking, first- or last-touch attribution, self-referral detection and a Two-Way Stripe Sync come on every plan. It fits when commission on Stripe revenue is the whole job, and [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev) covers the overlap.
#### 7. FirstPromoter, for commission programs beyond Stripe
[FirstPromoter](https://firstpromoter.com/pricing) connects to Stripe, Paddle, Chargebee, Recurly and Braintree. Starter is $49 a month ($490 a year) for up to $5,000 a month of revenue from affiliates, 1,000 affiliates, 3 campaigns and cookie windows up to 9,999 days. Business is $99 ($990 a year) for up to $15,000, unlimited affiliates and campaigns, a custom domain, white-labeling and an affiliate dashboard embedded in your app, and Enterprise is $149 above $15,000 with Managed Auto Payouts. Double-sided rewards and non-monetary rewards such as free months, credits and points come on every plan, and multi-tier commissions reach 3 levels. Its Starter ceiling is the lowest of the three commission tools.
#### 8. Tolt, for auto payouts at $99 a month
[Tolt](https://tolt.com/pricing) starts at $69 a month for up to $10,000 a month earned from affiliates, 2 programs, a custom domain and manual payouts. Growth is $99 for $20,000, 5 programs, Tolt Auto Payouts at a 2% processing fee, W-9 and W-8 collection and 1099 filing, and Pro is $199 for $50,000, unlimited programs and a Slack channel. The "powered by" link stays until Pro. Basic, Growth and Pro list double-sided rewards through coupons, and the page names Stripe, Paddle and Chargebee. The trial runs 14 days without a card, backed by a 30-day refund policy. A program that wants to skip payout spreadsheets should budget $99, and [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev) sets the two side by side.
#### 9. PartnerStack, for B2B partner ecosystems
[PartnerStack](https://partnerstack.com/pricing) sells 3 plans, Launch, Growth and Enterprise, and publishes no prices; cost depends on program size, features and support, and a demo confirms it. Launch covers affiliate link tracking or lead and deal registration, PartnerStack Marketplace access, Partner Payments built for B2B sales cycles and CRM integrations. Growth adds a Learning Management Solution, partner challenges and MDF payments, and Enterprise adds a designated customer success manager. The page sets no limit on partners or users and says most teams go live within weeks, which makes it heavy for a first customer-referral program. [PartnerStack vs TrackRev](https://www.trackrev.io/blog/partnerstack-vs-trackrev) goes through the trade-offs.
#### 10. TrackRev, for referrals measured next to every other channel
TrackRev's [referral campaigns](https://www.trackrev.io/products/referral-campaigns) sit inside its Affiliate Program and are two-sided. The referrer earns a one-time or recurring commission, flat or percentage, and the referred customer gets 1 of 4 rewards: a percentage discount, a flat discount, free months or extra trial days. The friend's discount needs a promo code you create in your payment provider and assign per partner or program-wide. Credit rewards need a connected database or webhook, since TrackRev has no manual fulfilment for them. Revenue syncs from Stripe, Paddle, Polar and Lemon Squeezy, refunds reverse commissions, and a hold of 0 to 180 days (default 0) can outlast your refund window.
The referral program needs a paid plan: Starter is $39 a month ($351 a year, since annual billing charges 9 months for 12), Growth $99 and Scale $199, and each includes the whole product. Starter tracks up to $10K of commission a month, and sale revenue is never capped (see [pricing](https://www.trackrev.io/pricing)).
GrowSurf and Cello fit better for in-product widgets and mobile SDKs, Viral Loops for waitlists and giveaways, ReferralCandy for Shopify and Friendbuy for enterprise teams. TrackRev fits when referrals, affiliates and other channels share one dashboard.
### How rewards and payouts work in each tool
| Tool | Reward types listed | Payout method |
| --- | --- | --- |
| GrowSurf | Gift cards, credits, cash | PayPal, Wise, Tango Card, Tremendous |
| Viral Loops | Prizes, early access, milestones | Stripe and Tremendous rewarding from Growing |
| Cello | Set by campaign payout rules | Your card is billed up to 2 times a month for timely payouts |
| ReferralCandy | Coupons, cash, store credit | PayPal, Venmo, bank transfer, Tremendous cards |
| Friendbuy | Coupons, store credit, cash back, gift cards | Held until conditions you set are met, such as a closed return window |
| Rewardful | Commission plus friend discount | PayPal and Wise mass payouts |
| FirstPromoter | Commission, discounts, free months, credits, points | PayPal, Wise, Stripe, crypto, bank; 190 currencies |
| Tolt | Commission plus coupon-based friend rewards | Manual on Basic; automatic from Growth at 2% |
| PartnerStack | Commission, MDF payments on Growth | Partner Payments |
| TrackRev | Cash commission; credits through your backend | PayPal or Wise CSV, then mark paid |
*Reward types and payout methods as each vendor's site lists them, October 2026.*
On Stripe, a friend's discount is a coupon that applies once, for a set number of months or indefinitely, and a promotion code is the customer-facing code wrapped around it, per [Stripe's coupons documentation](https://docs.stripe.com/billing/subscriptions/coupons). A referrer's credit can sit in the customer's invoice balance, which [Stripe applies to future invoices](https://docs.stripe.com/billing/customer/balance).
### How referral tracking software credits a signup
Every tool here ties a signup to a referrer through a link and its cookie, a coupon code, or a user ID your app passes in through an API or SDK. Links break first. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Safari caps script-created cookies at 24 hours when it detects cross-site link decoration and deletes script-created storage after 7 days without user interaction, so a friend who clicks on Monday and buys the Tuesday after can arrive uncredited (the [Safari Intelligent Tracking Prevention write-up](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the fix). Rewardful and FirstPromoter list [coupon tracking](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) for that case, Cello recovers missed attributions, and TrackRev records the click on the server at the redirect and joins it to the Stripe, Paddle, Polar or Lemon Squeezy charge.
Whichever trial you start, push 1 referral through it before paying: click your own link in a private window, sign up with a second email, buy at the lowest price and refund the order. The reward should appear under the right referrer within minutes and then reverse.
### Frequently asked questions
**What is referral marketing software?**
Referral marketing software gives each customer or partner a unique link or code, records who they bring in, applies the reward when the new customer signs up or pays, and tracks payouts.
**What is the difference between referral software and affiliate software?**
Referral software usually rewards existing customers with credit, discounts or gift cards. Affiliate software pays commission, often recurring, to creators and consultants. Rewardful, FirstPromoter, Tolt and TrackRev pay commission with an optional friend discount, while GrowSurf, Viral Loops and Cello lean toward customer rewards.
**Is paid referral software worth it compared with a spreadsheet?**
A $49 plan costs $588 a year. A customer paying $39 a month with a 20% commission for 12 months yields $468 of revenue and $93.60 of commission, leaving $374.40. Two referred customers a year cover the plan, and the software also handles refund reversals and payout records.
**Which referral tools work with Paddle, Lemon Squeezy or Chargebee?**
FirstPromoter lists Stripe, Paddle, Chargebee, Recurly and Braintree. Tolt names Stripe, Paddle and Chargebee. TrackRev syncs Stripe, Paddle, Polar and Lemon Squeezy. Rewardful names Stripe and Paddle, and ReferralCandy's pricing page describes store checkouts.
**How do I stop people gaming a referral program?**
Choose a tool that checks for self-referrals and holds payouts. FirstPromoter lists self-referral detection, reCAPTCHA and automatic negative commissions on refunds. GrowSurf lists burner email and data-center IP detection. TrackRev has self-referral detection and a hold you set from 0 to 180 days.
**Should referral rewards be cash or credit?**
Credit costs you margin instead of cash and stays inside your product, but you need a way to deliver it. In Stripe Billing a credit can be an adjustment to the customer's invoice balance. Cash suits partners with an outside audience.
---
## Rewardful alternatives in 2026, with prices and plan limits
URL: https://www.trackrev.io/blog/best-rewardful-alternatives-2026
Published: 2026-08-06
Author: Muzahid Maruf
Eight Rewardful alternatives from a $15 plan to quote-only PartnerStack, checked against each pricing page, plus where TrackRev fits.
The best Rewardful alternatives depend on which of Rewardful's limits you hit first. Rewardful sizes its tiers by affiliate-attributed revenue: $49 buys up to $7,500 a month on Starter, and $99 stretches to $15,000 on Growth. FirstPromoter, Tolt, Tapfiliate, LeadDyno, Affonso, Dub Partners and PartnerStack each meter a different unit, and TrackRev counts the commission you pay out. A Stripe SaaS that only needs affiliates will find Tolt and FirstPromoter closest.
I run TrackRev, so it is entry 8 and gets judged on the same terms as the rest, including where it loses. Prices are each vendor's published rate in October 2026, per month unless stated. PartnerStack publishes none.
> **Key takeaways:**
>
> - Rewardful prices by affiliate-attributed revenue: $49 covers $7,500 a month and $99 covers $15,000, and the branded portal and custom domain begin at $99.
> - The same $12,000-a-month program lands on plans from $39 to $99, because vendors count revenue, affiliates, clicks, payouts or commission.
> - FirstPromoter reads Chargebee, Recurly and Braintree, Tolt includes a custom domain at $69, and Affonso reaches $10,000 for $29 a month on a yearly plan.
> - Safari expires script-written cookies after a week of no visits, so a long cookie window protects less than its setting suggests. Coupon codes attribute a sale without any cookie.
> - PartnerStack quotes prices after a demo, and TrackRev's affiliate program starts on the $39 Starter tier, with payouts run as a manual batch.
### What Rewardful's plans limit
[Rewardful's pricing page](https://www.rewardful.com/pricing) lists three plans. Starter ($49, or $490 paid yearly) allows $7,500 of affiliate-attributed revenue, 1 campaign and 2 team members. Growth ($99, $990 yearly) raises the revenue limit to $15,000 and lifts the campaign and team caps. Enterprise starts at $149 with a $30,000 entry tier and steps up with usage. Affiliates and visitors are unlimited everywhere, the transaction fee is 0%, and each plan opens with a 14-day trial.
Features follow the plan. The branded affiliate portal, the custom domain, private invite-only campaigns and custom rewards all begin on Growth, so a program that wants its portal at its own address pays $99 at any size. [Its help center](https://help.rewardful.com/en/articles/3492319-does-rewardful-track-referred-visitors-across-domains) puts cross-domain tracking, for a marketing site and an app on different domains, on Growth and Enterprise as well. PayPal mass payouts and Wise bulk payouts come with every plan, and one-click PayPal payouts need Enterprise. Optional Managed Payouts, where Rewardful sends the money, add a 3% processing fee.
Rewardful's tracking script writes a first-party cookie, [60 days by default and configurable per campaign](https://help.rewardful.com/en/articles/2155812-how-long-are-referral-cookies-valid), and every plan offers first or last touch attribution and self-referral detection. The help center documents Stripe and Paddle integrations. If your affiliates bring in under $7,500 a month and you can live without a branded portal, you may have no reason to move.
Its reports cover affiliate traffic only. In [Rewardful's definitions](https://help.rewardful.com/en/articles/4202371-visitors-leads-conversions), a visitor is someone who clicks a valid affiliate link and lands on your site, and a conversion is a successful charge in Stripe. Revenue from a newsletter, a YouTube channel or paid ads never enters that count.
### Best Rewardful alternatives and what each plan counts
| Tool | Entry plan | Plan limit counts | Trial |
| --- | --- | --- | --- |
| Rewardful | Starter, $49 | Affiliate-attributed revenue, $7,500 | 14 days |
| FirstPromoter | Starter, $49 | Affiliate revenue, $5,000 | 14 days, no card |
| Tolt | Basic, $69 | Earned from affiliates, $10,000 | 14 days, no card |
| Tapfiliate | Launch, $89 ($74 yearly) | 50 affiliates, 5,000 clicks, 500 conversions | 7 days |
| LeadDyno | Lite, $49 | 50 active affiliates | 30 days |
| Affonso | Launch, $15 yearly ($19 monthly) | Partner revenue, $1,000 | 14 days |
| Dub Partners | Business, $90 | Partner payouts, $2.5K | 14 days |
| PartnerStack | Not published | Program size and features | Demo first |
| TrackRev | Starter, $39 | Commission tracked, $10K | Free plan, link tracking only |
*Prices from each vendor's pricing page, October 2026. Entry plan is the cheapest paid plan, and revenue, click and payout limits are monthly.*
### Cookie windows and Safari
A cookie window sets how long a click earns credit, and the browser sets how long the cookie survives. Rewardful defaults to 60 days, FirstPromoter allows up to 9,999, and a TrackRev program takes anything from 1 to 3,650. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Safari's Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days of no user interaction with the website. Rewardful's tracking script and TrackRev's pixel both write their cookie that way, so a Safari visitor who clicks a partner link and then stays away for a week can sign up unattributed, whatever the setting says.
Coupon codes sidestep the problem, because the sale carries the code and no cookie is involved. Rewardful, FirstPromoter, Tapfiliate, Affonso and TrackRev all list coupon tracking. TrackRev's partner links are also tracked redirects that log the click on the server, so the click itself is on record even after the cookie has gone.
### The eight tools in turn
#### 1. FirstPromoter, for Chargebee, Recurly or Braintree billing
[FirstPromoter](https://firstpromoter.com/pricing) Starter is the same $49 with a lower ceiling, $5,000 of affiliate revenue, plus 1,000 affiliates and 3 campaigns. Business ($99, or $990 yearly) allows $15,000, drops the affiliate and campaign limits, adds white-labeling on your own dashboard address and permits 2 websites. Enterprise ($149, $1,490 yearly) begins above $15,000 and brings SSO, activity logs and a postback URL.
Your own logo and colors are already on Starter, a feature Rewardful holds back until $99. The connector list is the main draw: Stripe, Paddle, Chargebee, Recurly and Braintree, plus click credit for up to 9,999 days, commissions across 3 levels of sub-affiliates, mass payouts through PayPal, Wise, Stripe, crypto and bank transfer, and W-9 and W-8BEN collection in the portal. The trial needs no card, and no free plan is listed. The [FirstPromoter alternatives guide](https://www.trackrev.io/blog/best-firstpromoter-alternatives-2026) covers the other direction.
#### 2. Tolt, for a branded portal below $99
[Tolt](https://tolt.com/pricing) Basic is $69 for $10,000 "earned from affiliates", and it already includes the custom domain and branded portal, along with 2 programs, 3 partner groups and 3 team members. Growth ($99, $20,000) adds automatic payouts for a 2% processing fee, W-9 and W-8 collection with 1099 filing, and 5 programs. Pro ($199, $50,000) has unlimited programs and a dedicated Slack channel.
Tolt reads Stripe and Paddle, and the pricing page also lists Chargebee. A 30-day refund policy sits on top of the trial. The earned-from-affiliates wording could mean sales or what you pay out, so ask which before sizing a plan. [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev) puts it next to mine.
#### 3. Tapfiliate, for a store and a subscription product on one tool
[Tapfiliate](https://tapfiliate.com/pricing/) meters traffic as well as affiliates, where Rewardful gives unlimited visitors on every plan. Launch is $89 ($74 on a yearly plan) for 1 program, 1 team member, 50 affiliates, 5,000 clicks and 500 conversions a month, and overage runs $1.50 per 1,000 clicks and $15 per 1,000 conversions. Scale is $179 ($149 yearly) with unlimited affiliates and programs, 100,000 clicks, 10,000 conversions and 5 team members, plus multi-level commissions, Trolley payouts and shortlinks.
Tracking runs through a JavaScript pixel, a REST API, server-to-server postbacks and 30+ integrations such as Shopify, WooCommerce, BigCommerce, Magento and Stripe. Launch costs $40 more than Rewardful Starter, and the premium pays off only when one tool has to cover a store and a SaaS product.
#### 4. LeadDyno, for few affiliates and large revenue
[LeadDyno](https://www.leaddyno.com/pricing) doesn't meter revenue. Clicks and conversions are unlimited, and the limit is active affiliates: Lite is $49 for 50, Essential $129 for 150, Advanced $349 for 500 and Unlimited $749. Paying yearly takes 15% off, and the trial lasts 30 days. Forty affiliates bringing in $20,000 a month fit the $49 plan, where Rewardful would ask for Enterprise at $149 or more.
Branding narrows the gap: a dashboard on your own domain starts on Essential, and a white-labeled one on Advanced. The pricing page promises 25+ no-code integrations, and the integrations page lists Stripe, Chargebee, Recurly and PayPal among the payment ones.
#### 5. Affonso, for the lowest list price
[Affonso](https://affonso.io/pricing) has the lowest prices here. Launch is $15 paid yearly ($19 monthly) for $1,000 of partner revenue a month. Growth is $29 paid yearly for $10,000, with 5 team seats, and Elite is $79 for $30,000 with unlimited seats and no "Powered by" label. Affiliates, programs and tracked clicks are unlimited throughout, and early-stage startups get 50% off the first year, 25% off the second and 10% off the third.
Growth is where the features land: a custom domain, private programs, multi-level commissions and managed payouts, where Affonso pays your affiliates. Rewardful starts its portal, domain and private campaigns at $99, though its ceiling is $15,000. Affonso lists native [integrations](https://affonso.io/integrations) for Stripe, Paddle, Polar, Creem and Dodo Payments, plus a REST API for the rest.
#### 6. Dub Partners, for teams that already run links on Dub
[Dub Partners](https://dub.co/pricing) starts at $90 on Business and meters partner payouts: $2.5K a month, 500 partners and 3 partner groups, with a 5% fee when Dub sends the money. Advanced ($300) allows $15K of payouts and unlimited partners, and adds an embedded referral dashboard, email campaigns and risk monitoring. Enterprise has unlimited payouts at a 3% fee. Every Partners plan includes Dub's link shortener, so the price makes sense if you already shorten links there.
Its [sale tracking documentation](https://dub.co/docs/conversions/sales/introduction) names Stripe and Shopify as native integrations and gives other processors a sale-tracking API endpoint, which suits a custom billing setup. [Dub.co vs TrackRev](https://www.trackrev.io/blog/dub-co-vs-trackrev) compares the two on links.
#### 7. PartnerStack, for B2B partner ecosystems
[PartnerStack](https://www.partnerstack.com/pricing) lists Launch, Growth and Enterprise plans without prices. The page says cost follows program size, features and support, and the figure is confirmed after a demo. It sets no cap on partners or internal users. Launch includes marketplace access, partner payments and CRM integrations, and you pick either affiliate link tracking or lead and deal registration. Growth adds a learning management system, partner challenges, marketing development fund payments and segmentation, and Enterprise adds a designated customer success manager.
That is a different product from Rewardful, built for resellers, co-sell and a marketplace of B2B partners. If you only need referrers paid on Stripe subscriptions, a published rate card is easier to buy against. [PartnerStack vs TrackRev](https://www.trackrev.io/blog/partnerstack-vs-trackrev) sets the two side by side.
#### 8. TrackRev, for programs that compare partners with other channels
[Plans](https://www.trackrev.io/pricing) are Starter at $39 (1 workspace, up to $10K of commission tracked a month, $351 billed yearly), Growth at $99 ($100K, unlimited workspaces) and Scale at $199 (unlimited commission, priority support). Annual billing pays for 9 months and gives 12. Every paid plan includes unlimited partners and programs, multi-tier commissions, cash or credit rewards, white-label partner pages and unlimited tracking links. Sale revenue is never capped, because the meter counts commission, and $10K of commission equals $50,000 of sales at 20%. When a month's commission reaches the cap, new commissions stop accruing until the month resets.
Each program sets its own hold period from 0 to 180 days, which defaults to 0. Stripe, Paddle, Polar and Lemon Squeezy supply the revenue, and refunds and disputes reverse commission. Partner links are ordinary tracked links, so newsletter, YouTube and paid links report in the same place, with last-touch, first-touch or linear credit.
Payouts are a batch: you export a PayPal or Wise file, pay it yourself and mark each payout paid, and automatic payouts are listed as coming soon. There is no Chargebee, Recurly or Braintree connector and no marketplace of ready-made affiliates. The free plan covers link tracking only, with 50 links and 1,000 events a month, so the affiliate program itself starts on Starter. A TrackRev link is a tracked link where Rewardful's is a ?via= parameter on your own pages, so partners swap links when you move. Choose Rewardful, Tolt or Affonso if you want the vendor to send the money. The [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) lists the rest, and [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev) goes feature by feature.
### What a partner-only report leaves out
Suppose a customer joins your newsletter in March, clicks a partner's link in April and pays $100 a month. The partner earns a 20% commission, $20 a month, and a report built only on partner links shows $100 of partner revenue. It cannot show that the newsletter reached the customer first. With newsletter, YouTube and paid links tracked beside the partner link, TrackRev credits that $100 to the partner under last-touch, to the newsletter under first-touch, and splits it under linear.
### What a $12,000-a-month program costs on each plan
Vendors meter different units, so one program fits different plans. Take affiliates who bring in $12,000 of revenue at a 20% commission ($2,400), with 40 active affiliates, 4,000 clicks and 300 conversions in the month.
| Tool | The limit that matters | Plan needed | Cost |
| --- | --- | --- | --- |
| Rewardful | Revenue passes the $7,500 Starter ceiling | Growth | $99 |
| FirstPromoter | Revenue passes $5,000 | Business | $99 |
| Tolt | Revenue passes $10,000 | Growth | $99 |
| Tapfiliate | All three Launch allowances hold | Launch | $89 |
| LeadDyno | 40 of 50 affiliates used | Lite | $49 |
| Affonso | Growth tops out at $10,000 | Elite | $79 on a yearly plan |
| Dub Partners | $2,400 due against $2.5K of payouts | Business | $90, plus $120 if Dub pays out |
| PartnerStack | Program size and features | Quoted after a demo | Not published |
| TrackRev | $2,400 due against $10K of commission | Starter | $39 |
*Worked from published plan limits, October 2026.*
LeadDyno's $49 fits because it ignores revenue, and its own-domain dashboard starts at $129. On Tolt, automatic payouts need Growth plus the 2% fee, which is $48 on $2,400. TrackRev Starter runs $60 a month under Rewardful Growth, or $720 a year, until commission passes $10K.
Commission meters also read differently at other rates. At 20%, Dub's $2.5K of payouts covers $12,500 of revenue and TrackRev's $10K covers $50,000; at 40% the same limits cover $6,250 and $25,000.
### Moving off Rewardful
- Export the affiliate list from the campaign you are moving and keep the token column, which holds each affiliate's ?via= value. [Rewardful's help center](https://help.rewardful.com/en/articles/2051902-how-do-i-export-my-data-from-rewardful) also says its team will help export your data on request.
- Recreate the program terms first: commission rate, recurring policy and cookie window, which is 60 days by default on both sides. Per-affiliate overrides don't import as rules, so rebuild them as groups and pick the group during the import.
- Connect billing, then upload the file on the Migration page under Settings. One file takes up to 1,000 affiliates. The import carries email, name, approval status, PayPal email, coupon codes and lifetime clicks, leads and sales as opening figures, and writes each unpaid balance as one carried-over commission for the next payout. A token that is already taken gets a fresh slug, and the results screen lists those affiliates.
- Sales history, tax forms and anything built against Rewardful's REST API stay behind, so partners upload their W-9 or W-8 forms again in the portal. Send them their new links at the same time.
- Keep Rewardful read-only until the refund window has passed on the last commissions it recorded, since reversals on those sales still happen there, then remove its script. [Affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers the mechanics.
### Frequently asked questions
**Which tool is the closest swap for a SaaS on Stripe?**
Tolt and FirstPromoter are the nearest swaps, because both read Stripe and Paddle and size plans by affiliate revenue. At $99, FirstPromoter Business reaches $15,000 and Tolt Growth reaches $20,000. Affonso is cheapest on paper, and TrackRev suits programs that also track other channels.
**Is there a free Rewardful alternative?**
None of the pricing pages I read lists a free plan that pays partners. Trials run 14 days at Rewardful, FirstPromoter, Tolt, Affonso and Dub, 7 days on Tapfiliate Launch and 30 days at LeadDyno. TrackRev's free plan covers link tracking only, so its affiliate program begins at $39 on Starter.
**Does Rewardful take a cut of affiliate sales?**
No. Its pricing page states a 0% transaction fee on affiliate-attributed revenue. Three costs sit outside the subscription: the commissions you set, the 3% fee if you opt into Managed Payouts, and whatever PayPal, Wise or your payment processor charges.
**Does Rewardful work with Paddle, Polar or Lemon Squeezy?**
Its help center documents Stripe and Paddle integrations. I found no Polar or Lemon Squeezy article there, so check its integrations page before relying on either. Affonso lists Polar, and TrackRev reads Polar and Lemon Squeezy alongside Stripe and Paddle.
**Does Rewardful track newsletter or YouTube traffic?**
Only through an affiliate link or coupon. Its dashboard reports the visitors, leads and conversions that arrived that way. To see a newsletter or a channel next to your partners, send those links through a tracker that shares the revenue source, or reconcile a second tool by hand.
**Can I keep my affiliates' referral codes when I switch?**
TrackRev's importer reuses each Rewardful token as the partner's link slug when the slug is free, imports coupon codes and carries unpaid balances over. The URL itself changes. Before you move to any other tool, ask whether it imports a CSV with the token column.
**Should I leave Rewardful if I earn under $7,500 a month from affiliates?**
Usually not. Starter covers that volume with unlimited affiliates and visitors. The reasons to move are a branded portal or custom domain without the $99 plan, a billing system Rewardful doesn't document, or wanting partner revenue compared with other channels.
---
## Bot traffic filtering for links: what gets flagged and what slips through
URL: https://www.trackrev.io/blog/bot-traffic-filtering-for-links
Published: 2026-09-25
Author: Muzahid Maruf
Bot traffic filtering for links runs 3 tests: known crawlers, empty user agents and prefetch headers. See what a flagged click changes and what slips through.
Bot traffic filtering for links decides, request by request, whether a hit on a short link counts as a click. TrackRev flags a request when its user agent matches the isbot 5.2.1 pattern list, when the user agent is empty, or when a purpose header marks it as a prefetch. A flagged request still gets its 302 redirect, is stored with is_bot true, and stays out of every report.
That removes Googlebot, Slack and Facebook preview fetchers, curl and python-requests scripts, and Chrome's speculative loads. A scanner with an ordinary Chrome 120 user agent passes, and finding those takes a look at your own click data.
> **Key takeaways:**
>
> - TrackRev flags a click as a bot when the user agent matches isbot 5.2.1, is empty, or carries a prefetch header, and still sends the 302 redirect.
> - Flagged clicks leave dashboard totals, partner counts and the 30-day attribution window, and bots=include on the clicks API brings them back.
> - An ordinary Chrome 120 string passes the filter, so look for clicks that bunch within a second and never produce a pageview.
> - Credited revenue ignores phantom clicks, but conversion rates carry them, so a $0.25 per-click payout pays for every fake one.
### Where non-human clicks come from
The Media Rating Council's [invalid traffic addendum](https://mediaratingcouncil.org/sites/default/files/Standards/IVT%20Addendum%20Update%20062520.pdf) (June 2020 update) calls what list-based filtering finds general invalid traffic: bots and spiders, non-browser user agents, pre-fetch and pre-render traffic, and known data-center traffic. Sophisticated invalid traffic takes advanced analytics and human review. The standard covers ad impressions, and the split carries over to links.
| Source | Identified by | Caught by a user-agent list |
| --- | --- | --- |
| Search crawlers | Googlebot/2.1 in the user agent. Google [publishes reverse DNS names and IP ranges](https://developers.google.com/crawling/docs/crawlers-fetchers/verify-google-requests) to check the claim | Yes |
| Chat and social preview fetchers | [Slackbot-LinkExpanding 1.0](https://api.slack.com/robots) from Slack and [facebookexternalhit/1.1](https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers) from Meta | Yes |
| Browser prefetch and prerender | A [Sec-Purpose header](https://developer.chrome.com/docs/web-platform/prerender-pages) set to prefetch or prefetch;prerender in Chrome | No, a header test catches it |
| Scripts and HTTP libraries | curl/8.4.0 and python-requests/2.31.0 default strings | Yes |
| Headless browsers | HeadlessChrome/120.0.0.0 in the string unless the script overrides it | Yes, until the string is changed |
| Email security scanners | [Microsoft Defender for Office 365](https://learn.microsoft.com/en-us/defender-office-365/safe-links-about) Safe Links scans URLs in mail flow and verifies them again at click time | Only when the scanner announces itself |
| Click farms and residential proxies | Ordinary browser strings from consumer networks | No |
#### Preview fetchers and email scanners
Slack's robots page says Slackbot-LinkExpanding 1.0 fetches links posted into channels with HTTP Range headers and caches responses across the service for around 30 minutes. Meta documents facebookexternalhit/1.1 as the crawler behind previews on Facebook, Instagram and Messenger. [Mailchimp's bot activity page](https://mailchimp.com/help/about-bot-activity/) names anti-spam filters at email providers, Apple's Mail Privacy Protection and link preview generators as tools that often click links or open emails before the recipient does. Its bot-filtered email click data starts on August 10, 2025, and it hides flagged activity without deleting it, the design TrackRev uses. The [newsletter guide](https://www.trackrev.io/blog/track-links-in-newsletters-revenue) and the [Slack and Discord guide](https://www.trackrev.io/blog/track-links-shared-slack-discord) go deeper on those channels.
### How bot traffic filtering for links works in TrackRev
- A missing or blank user-agent header is flagged.
- The user agent is checked against [isbot](https://github.com/omrilotan/isbot) 5.2.1, the version TrackRev's lockfile resolves. It is an open-source list of 209 patterns built from public crawler lists such as monperrus/crawler-user-agents and user-agents.net. It matches names like Googlebot and HeadlessChrome, any string where bot ends a word, and any string containing http, which is how Googlebot, Slackbot-LinkExpanding and facebookexternalhit point to their documentation.
- The headers x-purpose, purpose and sec-purpose are read, and a value containing prefetch flags the request. Chrome sends `Sec-Purpose: prefetch` for a Speculation Rules prefetch and `prefetch;prerender` for a prerender, and [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Sec-Purpose) says a server can treat such requests differently when counting visits.
| User agent sent | Verdict |
| --- | --- |
| Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) | Bot |
| Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots) | Bot |
| facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) | Bot |
| curl/8.4.0 | Bot |
| python-requests/2.31.0 | Bot |
| Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.0.0 Safari/537.36 | Bot |
| Empty header | Bot (TrackRev's own test; isbot alone returns false) |
| Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 | Counted as a person |
| Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1 | Counted as a person |
*Results of TrackRev's check, isbot 5.2.1 plus the empty-header test.*
#### What a flagged request changes
| Part of TrackRev | What happens to a flagged request |
| --- | --- |
| Redirect at /r/slug | 302 to the destination, because a person can sit behind a preview or a scan; click stored with is_bot true, no rate limit and no de-duplication |
| Dashboard, channel and per-link totals | Counted for unflagged clicks only |
| Attribution engine | Credits unflagged clicks inside the attribution window, 30 days by default |
| Partner click counts | Unflagged clicks only |
| click.created webhook | Not sent |
| Retargeting pixel page | Skipped, so a plain 302 |
| Pixel endpoints /api/collect and /api/identify | 200 with skipped set to bot, nothing written |
| Pixel endpoints, unflagged requests | 429 above 300 requests a minute per IP on /api/collect and 30 on /api/identify, 413 above a 16 KB body |
*Behavior as of October 2026.*
#### Why flagged clicks are kept
Google Analytics excludes known bots automatically, using Google research and the International Spiders and Bots List kept by the Interactive Advertising Bureau. The exclusion cannot be switched off, and Google does not report [how much it removed](https://support.google.com/analytics/answer/9888366). TrackRev keeps the rows. The clicks API leaves them out unless you pass bots=include, and the CLI has the same switch, so you can measure your own bot share. The API needs a paid plan and a secret key, and --all stops after 200 pages of up to 500 clicks, so on a large workspace add --link with one link ID.
Flagged versus counted requests across the click stream
```
trackrev clicks --bots --all --json \
| jq '.clicks | group_by(.is_bot) | map({is_bot: .[0].is_bot, requests: length})'
```
### What a user-agent list cannot see
The isbot README says the package identifies good bots that announce themselves and does not try to recognize malicious bots or programs posing as real users. TrackRev stores each click's IP address and user agent but sets the flag from the three tests alone. It checks no IP ranges, runs no timing or rate analysis and does not de-duplicate repeat requests, so a script that requests a link 10,000 times with a Chrome 120 string adds 10,000 counted clicks.
#### How much bot traffic to expect
For scale, Imperva's [2025 Bad Bot Report](https://www.imperva.com/resources/resource-library/reports/2025-bad-bot-report/) put automated traffic at 51% of all web traffic and bad bots at 37%, and its [2026 edition](https://www.imperva.com/resources/resource-library/reports/2026-bad-bot-report/) says bots now make up the majority. Those figures cover web traffic as a whole and say nothing about your links, so measure your flagged share with the command above.
### How to spot the bot clicks that got through
The clicks API returns a timestamp, city, device, browser, referrer and visitor ID per click, enough to catch bursts within a second of a send and every link in a message clicked from one city. The visitor journey, in the dashboard or through `trackrev visitors journey`, lists pixel events after a click, so a click with no pageview behind it stands out.
| Click id | Time (UTC) | Link | City | Browser and OS | Pixel pageview |
| --- | --- | --- | --- | --- | --- |
| 90417 | 08:00:01 | /r/launch-a | Ashburn | Chrome on Windows | none |
| 90418 | 08:00:01 | /r/launch-b | Ashburn | Chrome on Windows | none |
| 90419 | 08:00:02 | /r/launch-c | Ashburn | Chrome on Windows | none |
| 90420 | 08:00:02 | /r/launch-d | Ashburn | Chrome on Windows | none |
| 90431 | 08:07:41 | /r/launch-b | Austin | Safari on iOS | 08:07:43 |
| 90466 | 08:19:15 | /r/launch-a | Berlin | Chrome on macOS | 08:19:16 |
| 90589 | 09:02:30 | /r/launch-c | Toronto | Firefox on Windows | 09:02:33 |
*Invented log for 4 links sent at 08:00:00, every row with is_bot false. The first 4 rows look like software: all 4 links in 2 seconds, one city, no pageview.*
> **Worked example with made-up numbers:** A link logs 2,000 requests in a week and the filter flags 300, so 1,700 clicks are counted. If 340 of those are gateway scans with browser strings, 1,360 are people. With 34 signups, the dashboard shows 34 / 1,700 = 2.0%, the true rate is 34 / 1,360 = 2.5%, and a counter with no filter would show 34 / 2,000 = 1.7%. Cost per click and revenue per click shift the same way.
### Revenue as the second filter
For each paid order, the attribution engine credits that visitor's unflagged clicks inside the 30-day default window under last-touch, first-touch or linear. A scanner's click carries its own visitor ID, so it cannot take credit for someone else's sale, and credited revenue per channel stays clean even when click counts are not. [Revenue attribution](https://www.trackrev.io/solutions/revenue-attribution) shows the join.
Click-based payouts are where phantom clicks cost cash. At $0.25 a click, 10,000 scripted requests earn $2,500 for someone who never sold anything. TrackRev's affiliate commissions are calculated on payments synced from Stripe, Polar, Lemon Squeezy and Paddle, a refunded or disputed charge takes its commission back out, and a program's hold period (0 to 180 days, 0 by default) delays payout past the refund window. The [affiliate fraud guide](https://www.trackrev.io/blog/affiliate-attribution-fraud-prevention) covers the attacks that do complete a purchase.
### When a header and list filter is not enough
For paid ads, the platform's own filter is the record. Google Ads [says](https://support.google.com/google-ads/answer/42995) it removes invalid clicks from metrics and billing and credits the next invoice when it finds them later, so the ad platform and a link tool report different click totals. For attacks on a site, put a bot-management product such as Imperva's Advanced Bot Protection in front of it.
In TrackRev the [link tracking](https://www.trackrev.io/solutions/links-and-analytics) redirect sets the flag, [first-party tracking](https://www.trackrev.io/products/first-party-tracking) covers the server-side capture behind it, and the [server-side versus client-side guide](https://www.trackrev.io/blog/server-side-click-tracking-vs-client-side-pixel) explains why a check on the server survives blockers. Flagging runs on every plan, and [pricing](https://www.trackrev.io/pricing) lists the rest.
| Plan | Price | Links and tracked events | Clicks API and revenue figures | Commission tracked a month |
| --- | --- | --- | --- | --- |
| Free | $0 | 50 links, 1,000 events a month | No | None |
| Starter | $39 a month | Unlimited | Yes | Up to $10,000 |
| Growth | $99 a month | Unlimited | Yes | Up to $100,000 |
| Scale | $199 a month | Unlimited | Yes | Unlimited |
*Plan limits as of October 2026. Bot flagging runs on all 4.*
### Frequently asked questions
**Can I see flagged bot clicks in the dashboard?**
No. Dashboard totals and the 25 most recent clicks on each link page show unflagged clicks only. Flagged rows come back from GET /api/v1/clicks?bots=include or from trackrev clicks --bots, and both need a paid plan.
**Why do clicks spike seconds after I send a newsletter or post a link?**
Email gateways such as Microsoft Defender Safe Links, anti-spam filters and chat previews request a URL on delivery or posting. Declared ones are flagged. One that sends a Chrome 120 string is not, so look for every link in a message clicked from one city in the same second.
**How do I check that a request really came from Googlebot?**
Run a reverse DNS lookup on the IP from your logs and confirm the hostname ends in googlebot.com, google.com or googleusercontent.com, then run a forward lookup and confirm it returns the same IP. In Google's example, 66.249.66.1 resolves to crawl-66-249-66-1.googlebot.com, which resolves back to 66.249.66.1. Google also publishes JSON range files such as common-crawlers.json. TrackRev does not run this check.
**How accurate is the isbot list?**
The README gives no accuracy figure for the main pattern. For the less accurate fallback pattern, used where regex lookbehind is unsupported, its tests accept 1% false positives and 75% bot coverage.
**Is bot traffic the same as click fraud?**
Click fraud is the deliberate part. Google Ads lists accidental clicks, automated traffic and manual clicks that raise costs or inflate publisher profits as invalid clicks. Crawlers and previews are harmless automation, while click farms and scripts aimed at payouts are fraud, and a header test cannot tell them apart.
**Why does my link tool show different clicks than Google Ads?**
Each system applies its own filter at its own time. Google can remove invalid clicks after the fact, while a link tool filters when the request arrives.
---
## Cello alternatives: what Cello charges and who to pick instead
URL: https://www.trackrev.io/blog/cello-alternative
Published: 2026-07-16
Author: Muzahid Maruf
Cello meters referral ARR from 65 a month and needs a logged-in app. Compare GrowSurf, FirstPromoter, Rewardful and TrackRev on price, billing and payouts.
The right Cello alternative depends on what made you look. Cello meters its price by referral ARR, from 65 a month for 10,000 up to 750 for 100,000, expects a logged-in product and keeps its own logo on the in-app widget. GrowSurf prices by participants, FirstPromoter embeds an affiliate dashboard in your app and reads 5 billing systems, Rewardful is the Stripe default for affiliates, and TrackRev ranks referrals against your other channels.
I run TrackRev, so it is one of the four and gets the same scrutiny, including where Cello beats it. Cello also sells partner plans for 5 to 100 transacting partners with their own portal, so it no longer stops at customers referring friends.
> **Key takeaways:**
>
> - Cello's user-referral plans run 65 to 750 a month and meter referral ARR: 20 referred customers paying $50 a month read $12,000 and outgrow the 10,000 Start plan.
> - Cello needs a logged-in product, keeps its logo on the widget and has webhooks for 2 billing systems, Stripe and Chargebee, so Paddle shops and products without accounts start looking elsewhere.
> - GrowSurf covers 2,500 participants from $125, FirstPromoter's $99 Business plan embeds an affiliate dashboard in your app, and Rewardful starts at $49 for Stripe affiliates.
> - TrackRev starts at $39, meters up to $10,000 of partner commission, and ranks referrals against ads, SEO and email, but you pay out the batch yourself.
> - Cello still wins on automated PayPal and Venmo payouts, in-app notifications and 4 native mobile SDKs.
### What Cello costs and how it counts
[Cello's pricing page](https://cello.so/pricing/) sells user referrals in 4 plans, where customers refer friends from inside your app, against a referral ARR meter. Cello annualizes the recurring revenue of referred customers who still pay, which its [ARR documentation](https://docs.cello.so/guides/attribution/program-performance) calls Net New Annual Recurring Revenue, and drops customers who churn.
| Plan | Yearly billing, a month | Monthly billing | Referral ARR limit | Campaigns | Support |
| --- | --- | --- | --- | --- | --- |
| Start | 65 | 95 | 10,000 | 1 | Slack |
| Grow | 200 | 300 | 50,000 | Unlimited | Priority Slack, success manager |
| Scale | Not offered | 750 | 100,000 | Unlimited | Success manager, custom SLAs |
| Enterprise | Custom | Custom | Unlimited | Unlimited | Custom SLAs |
*Prices from Cello's pricing page, October 2026. The plan cards I loaded show dollars while the page's structured data says euros, so check the currency at checkout. User referrals carry 0% transaction costs.*
A customer on $50 a month counts as $600, so 16 referred customers ($9,600) fit under Start and 20 ($12,000) need Grow.
Partners have their own plans. [Cello's partner guide](https://docs.cello.so/guides/partners/partner-overview) describes a Partner Portal with a personal link, referral status, rewards and media kits for each partner.
| Partner plan | Yearly billing, a month | Monthly billing | Campaigns | Transacting partners | Transaction cost |
| --- | --- | --- | --- | --- | --- |
| Free | Not offered | 0 | 1 | 5 | 5% |
| Plus | 80 | 100 | 3 | 25 | 3.5% |
| Pro | 280 | 350 | 10 | 100 | 3.5% |
| Enterprise | Custom | Custom | Unlimited | Unlimited | 2% |
*Prices from Cello's pricing page, October 2026. A transacting partner has attributed referral revenue in the billing month.*
Cello charges your card up to 2 times a month to fund reward payouts. Yearly plans lock in 12 months, and the FAQ markup on the pricing page adds that a product with under 1,000 monthly unique users on a free tier or trial starts on a Startup access plan at the Grow level, committed for 12 months.
### Why teams look for a Cello alternative
The pricing FAQ says Cello works with products that have a logged-in web or mobile experience, so a product without accounts cannot use the Cello Web SDK or the Cello Mobile SDK, and outside referrers enter through the Partner Portal.
[Cello's support FAQ](https://docs.cello.so/guides/support/faqs) says the branding on the Referral Component cannot be removed, because payouts arrive as a payment from Cello and referrers should recognize it.
Cello reads a Stripe Webhook or a Chargebee Webhook, and a Paddle or Recurly shop posts events to the Cello API from its own code. A wrong event source breaks attribution without an error, per the FAQ.
Rewards go out by PayPal and Venmo, and the homepage lists gift cards, donations and product rewards as coming soon. In the [campaign guide's](https://docs.cello.so/guides/campaigns/setting-up-campaigns) example, a referrer earns 50% of each payment up to a $100 cap plus a $5 signup bonus, the new user gets 50% off for 6 months, and your own code must apply that discount at checkout.
### Cello alternatives compared on price, meter and billing
| Tool | Entry price a month | What the price meters | Billing systems | Payouts |
| --- | --- | --- | --- | --- |
| Cello | 65 yearly, 95 monthly | Referral ARR up to 10,000 | Stripe and Chargebee webhooks, others by API | Automated PayPal and Venmo |
| GrowSurf | $125 yearly, $179 monthly | Participants up to 2,500 | Stripe, Chargebee, Recurly | Gift cards, credits and cash; PayPal, Wise, Tango Card and Tremendous integrations |
| FirstPromoter | $49 monthly, $490 yearly | Affiliate revenue up to $5,000 | Stripe, Paddle, Chargebee, Recurly, Braintree | Mass payouts via PayPal, Wise, Stripe, crypto, bank |
| Rewardful | $49 monthly, $490 yearly | Affiliate revenue up to $7,500 | Stripe first, 20+ integrations | PayPal and Wise mass payouts, managed at 3% |
| TrackRev | $39 | Partner commission up to $10,000 | Stripe, Paddle, Polar, Lemon Squeezy | PayPal or Wise CSV, then mark paid |
*Prices from each vendor's pricing page, October 2026. GrowSurf bills its yearly price as one payment, $1,503.60 for Startup.*
#### The same program on each meter
Entry prices mislead because the meters count different things. Take referred customers who each pay $50 a month, with a 25% commission where a tool meters commission. Twenty customers read as $12,000 of referral ARR on Cello, $1,000 of monthly revenue on the affiliate tools and $250 of commission on TrackRev. At 200 customers the readings are $120,000, $10,000 and $2,500, which pushes Cello to Enterprise pricing and FirstPromoter and Rewardful to their $99 tiers, while GrowSurf and TrackRev stay put.
| Tool | 20 referred customers | A year, monthly billing | A year, annual billing |
| --- | --- | --- | --- |
| Cello | Grow, 300 | 3,600 | 2,400 |
| GrowSurf | Startup, $179 | $2,148 | $1,503.60 |
| FirstPromoter | Starter, $49 | $588 | $490 |
| Rewardful | Starter, $49 | $588 | $490 |
| TrackRev | Starter, $39 | $468 | $351 |
*Cheapest plan whose published limit covers the load, from each vendor's pricing page, October 2026. TrackRev annual billing charges for 9 months. GrowSurf counts referrers and referred friends as participants, which I assumed stays under 2,500. Cello's price also covers the in-app panel, notifications and automated payouts.*
### How each alternative differs from Cello
#### GrowSurf, for customer referrals priced by participants
[GrowSurf](https://growsurf.com/pricing/referral-programs/) counts participants, meaning people who refer or are referred. Startup is $125 a month billed yearly ($179 monthly) for up to 2,500 participants, 2 referral programs and 2 team members, and Business is $314 yearly ($449 monthly) for 5 programs and up to 150,000 participants. Referral plans start with a 14-day trial and have no free tier, and yearly billing takes 30% off.
The pricing page lists iOS, Android and JavaScript SDKs, embeddable widgets and rewards in gift cards, credits or cash, with 1099 filing charged separately. Pick it over Cello when rewards should be gift cards or participants will number in the thousands at modest revenue each.
#### FirstPromoter, for an in-app dashboard and more billing systems
[FirstPromoter](https://firstpromoter.com/pricing) sells Starter at $49 a month for up to $5,000 of affiliate revenue, 1,000 affiliates and 3 campaigns, Business at $99 for $15,000 with unlimited affiliates and campaigns, and Enterprise at $149 beyond that. Business adds the in-app affiliate dashboard with automatic login, a custom domain and removal of the powered-by link.
All plans read Stripe, Paddle, Chargebee, Recurly and Braintree, and include double-sided rewards, multi-tier commissions across 3 levels and cookie life up to 9999 days. Managed Auto Payouts need Enterprise plus approval. It beats Cello when you bill through Recurly or Braintree or want no vendor logo on the dashboard.
#### Rewardful, for the established Stripe affiliate tool
[Rewardful](https://www.rewardful.com/pricing) starts at $49 for up to $7,500 of monthly affiliate-attributed revenue with 1 campaign and 2 team members. Growth is $99 for $15,000 with unlimited campaigns, and Enterprise starts at $149 with $30,000 on its entry tier. Annual billing gives 12 months for the price of 10. Every plan has a 0% transaction fee and a 14-day trial, while the branded portal and custom domain begin at Growth.
Its [integrations page](https://www.rewardful.com/integrations) lists 20+ integrations around Stripe, and I found no in-app panel on its pricing page. Rewardful makes more sense than Cello when your referrers are outside affiliates and you bill on Stripe. [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev) goes deeper.
#### TrackRev, for referrals ranked against every other channel
TrackRev starts at $39 a month, and every paid plan includes [referral campaigns](https://www.trackrev.io/products/referral-campaigns), the [affiliate program](https://www.trackrev.io/solutions/affiliate-program), link tracking and revenue attribution. Starter meters up to $10,000 of partner commission a month in 1 workspace, Growth is $99 for $100,000 across unlimited workspaces, and Scale is $199. The free plan stops at link tracking, with 50 links and 1,000 tracked events a month.
The in-app piece is 1 script tag with a publishable key. Given a signed-in user's id, email and plan tier, it draws a Refer & Earn dashboard in an iframe with the referral link, share buttons, clicks, signups, purchases and earnings over a 7 to 90 day window (30 by default), in light or dark mode, with a small Powered by TrackRev link. Rewards can be cash commission or account credit, and friends can get a discount, free months or a free trial. Your backend reports each signup with the referral ID, and cash rewards pick up purchases from Stripe, Paddle, Polar or Lemon Squeezy.
One report ranks referrals, affiliates, newsletter, YouTube and paid ads by the MRR each pays, under last-touch, first-touch or linear credit, because a referral link shares its data model with every other tracked link. Commissions can be held 0 to 180 days per program (default 0) and reverse on refunds. The [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows the report.
### Where Cello is still the better pick
Pick Cello when customers refer customers inside a logged-in product, rewards are cash and you want the loop run for you. Its [contextual sharing guide](https://docs.cello.so/guides/best-practices/contextual-sharing) says contextual sharing prompts can lift sharing rates 3.4x, and TrackRev's embed has no prompt system.
| Capability | Cello | TrackRev |
| --- | --- | --- |
| Payouts | Automated PayPal and Venmo, with credit notes | CSV batch for PayPal or Wise |
| Mobile apps | SDKs for iOS, Android, Flutter, React Native | Web iframe only |
| Notifications | In-app and email | None in the embed |
| Billing providers | 2 webhooks: Stripe, Chargebee; Paddle and Recurly by API | 4: Stripe, Paddle, Polar, Lemon Squeezy |
| Referral analytics | Referral ARR by new, expansion, contraction, churn | Referrals ranked against all channels |
| Entry price a month | 65 yearly, 95 monthly | $39 |
*Cello details from its pricing page and docs, October 2026; TrackRev details from its pricing page and product pages.*
### Before you cancel Cello
Test Safari first. Cello's Attribution JS is a JavaScript library, and its FAQ says it stores the referral code in first-party cookies named cello-referral and cello-productId for 3 months. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without user interaction. Cello offers an Auto Attribution fallback that it switches on per account, so click a test link in Safari on day 1, sign up on day 9 and see whether the referral survives, in Cello and in the replacement. The [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the effect on SaaS conversions.
Run a refund next. Cello cancels pending rewards when it receives a charge.refunded event but does not claw back rewards already paid. Its [fraud guide](https://docs.cello.so/guides/fraud-detection) describes a 30-day initial review period, and the FAQ says longer payout delays, such as 14 days, are set up on request. Buy through your real checkout, refund it and confirm the replacement reverses the commission. The [refunds and upgrades post](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) lists the cases.
Then ask Cello what happens to pending rewards at cancellation. Its FAQ says recurring percentage rewards typically stop when the subscription stops and that annual rewards are spread over the payment period. Keep both tools live through the 3-month cookie window and pay each commission from one system only.
TrackRev's free plan is enough to test redirects and click logging, while the referral and affiliate program starts on Starter at $39. Annual billing charges for 9 months and gives 12. [Pricing](https://www.trackrev.io/pricing) lists the plans, and [the affiliate program guide](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) covers the setup.
### Frequently asked questions
**Is there a free Cello alternative?**
For affiliates, yes. GrowSurf's affiliate plan costs $0 with a 3% success fee on affiliate revenue, against a 5% transaction cost on Cello's free partner plan. Rewardful and FirstPromoter sell 14-day trials, and TrackRev's free plan stops at link tracking.
**Does Cello work with Paddle, Polar or Lemon Squeezy?**
Cello sends Paddle and similar providers through its events API, which a developer calls with signup and purchase data. Its webhook guides cover 2 providers, Stripe and Chargebee, and I found no Polar or Lemon Squeezy guide. TrackRev reads Paddle, Polar and Lemon Squeezy as well as Stripe.
**Can I use Cello and TrackRev together?**
Yes, with a gap: visitors who click a Cello referral link never pass through a TrackRev link, so TrackRev's channel report cannot show Cello-referred revenue.
**How does Cello count referral ARR for yearly plans?**
A customer paying $600 a year stays at $600, a $150 quarterly plan counts as $600, and Cello rolls annual payments forward so a January invoice counts all year. An invoice up to 7 days late is attributed to the month it was expected, and a missing renewal drops the revenue off the chart.
**Can TrackRev reward customers with account credit?**
Yes. A program can pay credit instead of cash, and TrackRev delivers it by writing to your database or calling your webhook, so your backend has to apply it, and a credit-earning user can be offered a switch to cash. There is no manual fulfilment queue.
**How do I list who Cello referred before I leave?**
If Cello received events through Stripe, its docs have you write cello_ucc and new_user_id into each Stripe customer's metadata, so an export of Stripe customers shows who carries a referral code.
---
## ClickMagick alternative for SaaS: what each tool tracks and costs
URL: https://www.trackrev.io/blog/clickmagick-vs-trackrev
Published: 2026-06-11
Author: Muzahid Maruf
ClickMagick vs TrackRev in October 2026: ClickMagick starts at $79 a month for 10,000 visitors, TrackRev at $39. What each tracks, and who should pick which.
ClickMagick vs TrackRev comes down to where your revenue is counted. ClickMagick tracks paid clicks, pulls ad costs from 7 ad platforms and feeds conversions back to them, from $79 a month for 10,000 tracked visitors. TrackRev, the ClickMagick alternative for subscription businesses, reads charges from Stripe, Paddle, Polar and Lemon Squeezy and credits every renewal to the channel behind the first click, from $39 a month. A team that buys Meta Ads or Google Ads and optimizes inside those platforms fits ClickMagick. A SaaS whose best customers arrive from content and partner links fits TrackRev.
I run TrackRev, so weigh my read accordingly. Every figure is as of October 2026.
> **Key takeaways:**
>
> - ClickMagick lists Starter at $79, Standard at $199 and Pro at $349 a month, metered by tracked visitors. TrackRev costs $39, $99 and $199 and meters partner commission, so traffic never raises the bill.
> - ClickMagick pulls ad costs from 7 platforms, including Facebook Ads and Google Ads, and sends conversions back to them. TrackRev does neither, and it has no split testing.
> - A tracking code on a thank-you page fires once, while Stripe bills renewals later. TrackRev reads charges from Stripe, Paddle, Polar and Lemon Squeezy and credits every renewal to the click behind the original sale.
> - Click fraud protection, linear, position-based and time-decay models, and offline sales tracking all start on ClickMagick Standard at $199 a month, with 100,000 tracked visitors.
### ClickMagick vs TrackRev at a glance
| Feature | ClickMagick | TrackRev |
| --- | --- | --- |
| Built for | Advertisers and affiliates who buy paid traffic | SaaS and subscription businesses |
| Listed price | Starter $79, Standard $199, Pro $349 a month | Starter $39, Growth $99, Scale $199 a month |
| Free option | 14-day free trial | Free plan for link tracking only: 50 links, 1,000 events a month |
| What moves the price | Tracked visitors: 10,000, 100,000, 1,000,000 | Partner commission tracked: $10,000, $100,000, unlimited. Links and events are unlimited |
| Yearly billing | 12 months for the price of 10 | 12 months for the price of 9 |
| How a sale gets in | TrueTracking code on your pages, plus webhooks, Zapier and a REST API. No payment processor is named | Read-only connections to Stripe, Paddle, Polar and Lemon Squeezy |
| Setup | Tracking code, a setup wizard and a URL builder. Its FAQ puts basic setup at 20 to 30 minutes | One pixel and a read-only key for each billing system |
| Ad platforms | Costs pulled from 7 platforms, conversions sent back | No cost import, no conversion feedback |
| Attribution models | Last click, plus linear, position-based and time decay from Standard | Last touch (default), first touch, linear |
| Bot and click fraud | Basic bot filtering on Starter, fraud protection from Standard | Bots flagged by user agent and prefetch header, then left out of attribution |
| Split testing | Yes | No |
| Your own affiliate program | None listed. Tracks the offers you promote on 100+ networks | Included on every paid plan, paid out by PayPal or Wise CSV |
*Prices from each vendor's pricing page, October 2026.*
### What ClickMagick costs and what it counts
ClickMagick's [pricing page](https://www.clickmagick.com/pricing/) offers a 14-day trial and no free plan. Yearly billing lists 2 months free, so Starter comes to $790 a year.
| Plan | Monthly | Billed yearly, per month | Tracked visitors | Data kept | What the tier adds |
| --- | --- | --- | --- | --- | --- |
| Starter | $79 | $66 | 10,000 | 6 months | 1 user, 1 website or store, 1 ad account per platform, basic bot filtering |
| Standard | $199 | $166 | 100,000 | 1 year | 2 more users, 5 ad accounts per platform, click fraud protection, advanced attribution models, phone and offline sales |
| Pro | $349 | $291 | 1,000,000 | Not listed | Unlimited users and ad accounts |
*ClickMagick's published plans, October 2026.*
### What ClickMagick is built to do
ClickMagick launched in 2014 as a link tracker and says more than 122,000 accounts have been created. Its [tracking page](https://www.clickmagick.com/product/?tab=tracking) describes a two-way loop. The [FAQ](https://www.clickmagick.com/faqs/) lists ChatGPT Ads, Facebook Ads, Google Ads, LinkedIn Ads, Microsoft Ads, TikTok Ads and X Ads as integrations, with ad costs retrieved every hour. Sales flow back in real time through Facebook's Conversions API and Google's WBRAID parameter, and by webhook to networks such as Taboola, Outbrain and RevContent. It says ad platforms miss or misattribute 25 to 50 percent of conversions, a vendor figure I can't check, and the loop matters most when ads are your largest cost.
Standard adds bot and click fraud protection, and the tracking page describes Click Shield, which blocks clicks that break rules you set. ClickMagick says its filtering blocks 99% of bots, another claim I can't verify. On the reporting side it lists a UTM Performance Report, a Conversion Velocity Report, a cohort Lifetime Value Report and a Funnel Steps Report. Around those sit split testing, Smart Links with custom domains and geotargeting, server-to-server postbacks to 100+ affiliate networks, a mobile app and a support desk that answers Starter tickets in 8 hours or less, by its own account. A daily Morning Magick email from AI Insights says which ads to scale or pause, covering 10 active ads on Starter, 25 on Standard and 50 on Pro.
It does more than count ad clicks: its stats list recurring revenue, refunds, net profit and lifetime value, and its FAQ says Starter suits businesses with no paid ads. Its pricing, tracking and FAQ pages name no payment processor, only tracking code, webhooks, Zapier and the REST API, so check its knowledge base for Stripe, Paddle or Lemon Squeezy before counting on renewals.
### How subscription renewals reach a tracking tool
A tracking code on a thank-you page fires once, when the buyer lands on it, and renewals load no page. [Stripe's subscription documentation](https://docs.stripe.com/billing/subscriptions/webhooks) says some events fire at creation while others recur each billing period, and a paid renewal arrives as an `invoice.paid` event. A tool fed by page code sees month 1 only unless a webhook, Zapier step or API call carries each renewal in. ClickMagick's public pages don't say how renewals are recorded, so ask support before paying.
Take a made-up example: 10 customers from each of two channels, all on a $49 plan.
| Channel | Months a customer stays | Revenue at first payment | Revenue over the stay |
| --- | --- | --- | --- |
| Paid ads | 2 | $490 | $980 |
| Newsletter | 10 | $490 | $4,900 |
*A hypothetical comparison: 10 customers per channel, each paying $49 a month.*
On first payments the channels tie at $490, but on what customers paid the newsletter brings 5 times as much, $4,900 against $980. Anyone deciding where the next marketing dollar goes needs the last column, and it needs every renewal tied back to the original click.
### How TrackRev tracks revenue by channel
TrackRev records each click on the server at your tracking link, ties later pageviews to a first-party visitor ID through one pixel, and reads each Stripe, Paddle, Polar or Lemon Squeezy charge with a read-only key. A charge joins to the visitor ID when checkout carries it and falls back to the customer's email. Sync runs every hour, with an optional webhook for sales within seconds. Renewals credit the original click, refunds and chargebacks come out of the channel's revenue, and the window takes 1 to 365 days, 30 by default.
The 3 credit rules are compared in [last-touch vs first-touch vs linear](https://www.trackrev.io/blog/attribution-models-saas-comparison): last touch is the default, and switching to first touch or linear recalculates the stored clicks without re-tagging. Stripe wiring is in [attributing Stripe revenue to marketing channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels).
Partners earn commission on the same orders that feed the channel table, with a hold you set from 0 to 180 days per program and payouts by PayPal or Wise CSV export. Starter at $39 includes the affiliate program, and the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) covers the partner side.
### What TrackRev costs and what it counts
| Plan | Monthly | Billed yearly, per month | Commission tracked a month | Workspaces | What the tier adds |
| --- | --- | --- | --- | --- | --- |
| Free | $0 | $0 | Affiliate program locked | 1 | 50 links, 1,000 events a month, link tracking only |
| Starter | $39 | $29.25 | $10,000 | 1 | Unlimited links and events, revenue sync, affiliate program |
| Growth | $99 | $74.25 | $100,000 | Unlimited | Everything in Starter |
| Scale | $199 | $149.25 | Unlimited | Unlimited | Priority support |
*TrackRev's published plans, October 2026. Every paid plan includes the whole product.*
### What TrackRev does not do
- It imports no ad costs from Facebook Ads or Google Ads, so it reports no return on ad spend or cost per acquisition from platform data.
- It sends no purchases back to Meta Ads, Microsoft Ads or TikTok, so their bidding keeps learning from each platform's own pixel.
- Click filtering checks the user agent against the open-source isbot list, plus empty agents and prefetch headers such as Apple Mail's. There is no IP reputation, data-center blocking or rules like Click Shield.
- There is no A/B split between destinations and no view-through credit: an ad someone viewed and never clicked earns nothing.
- Revenue figures stay hidden on the free plan. Attribution against real charges needs a paid plan from $39 a month.
### What a year costs at the same traffic
ClickMagick steps up a plan each time tracked visitors pass 10,000 or 100,000 a month. TrackRev's meter is partner commission: Starter stops accruing new commission past $10,000 in a month, and a company with no affiliate program never gets near that.
| Tracked visitors a month | ClickMagick plan | ClickMagick a year | TrackRev plan | TrackRev a year |
| --- | --- | --- | --- | --- |
| 8,000 | Starter | $948 monthly, $790 yearly | Starter | $468 monthly, $351 yearly |
| 25,000 | Standard | $2,388 monthly, $1,990 yearly | Starter | $468 monthly, $351 yearly |
| 250,000 | Pro | $4,188 monthly, $3,490 yearly | Starter | $468 monthly, $351 yearly |
*Prices from each vendor's pricing page, October 2026. Assumes no affiliate program, so partner commission stays under Starter's $10,000 cap.*
At 25,000 visitors the gap is $1,639 a year on yearly billing. Set against the spend it watches, though, ClickMagick is cheap: Standard's $199 is 4% of a $5,000 monthly ad budget, and if 5% of that budget goes to clicks that can never convert, that is $250 a month, more than the plan costs.
### ClickMagick alternatives in the same lane
| Tool | Entry plan | Monthly | Billed yearly, per month | What the plan counts |
| --- | --- | --- | --- | --- |
| ClickMagick | Starter | $79 | $66 | 10,000 tracked visitors |
| [RedTrack](https://www.redtrack.io/pricing/) | Builder | $79 | $69 | 2M events a month, ad spend synced every 6 hours |
| [Voluum](https://voluum.com/pricing/) | Profit | $149 | $119 | 1,000,000 events, 20 active campaigns |
*Prices from each vendor's pricing page, October 2026. RedTrack's figures are from its affiliates and lead gen tab, and Voluum counts visits, clicks, conversions and impressions as events.*
RedTrack and Voluum count events where ClickMagick counts visitors, so price each at your own traffic. For SaaS-side options, the [link tracking roundup](https://www.trackrev.io/blog/best-link-tracking-software-saas-2026) prices 6 tools at 40,000 clicks a month, ClickMagick, Dub, Short.io and TrackRev among them, and [Northbeam vs TrackRev](https://www.trackrev.io/blog/northbeam-vs-trackrev) covers an ecommerce ad-attribution suite.
### Running ClickMagick and TrackRev together
A SaaS with a real ad budget and subscription revenue can run both, each with its own links and pixel. I would let ClickMagick steer bids inside Meta Ads and Google Ads, and let TrackRev's billing-backed channel table set each channel's budget, since the two will report different conversion counts.
### Which one fits
| Your situation | Better fit | Reason |
| --- | --- | --- |
| You buy Meta Ads or Google Ads and bid on conversions | ClickMagick | Costs flow in from 7 platforms and sales flow back to them |
| You promote other companies' offers on affiliate networks | ClickMagick | Postback tracking for 100+ networks |
| Subscriptions on Stripe, Paddle, Polar or Lemon Squeezy | TrackRev | Each is read directly, and renewals credit the original click |
| You run your own affiliate program | TrackRev | Commissions and payouts share the order data |
| Revenue by channel on a budget under $100 a month | TrackRev | $39 against $79 for the first ClickMagick plan |
| Big ad budget and subscription revenue | Depends on the question | ClickMagick feeds the ad platform, TrackRev follows renewals |
TrackRev's free plan covers 50 links and 1,000 events a month with no card, and revenue and the affiliate program start on Starter. The [pricing page](https://www.trackrev.io/pricing) has the yearly figures, the [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows the channel table, and [subscription LTV attribution by channel](https://www.trackrev.io/blog/subscription-ltv-attribution) explains how lifetime value is credited.
### Frequently asked questions
**Is TrackRev a ClickMagick alternative?**
For a business that sells subscriptions, usually: it ranks channels by revenue from $39 a month, against $79 for ClickMagick, and runs affiliates. For cost import, Meta Ads feedback or click fraud rules it is no replacement.
**How much does ClickMagick cost?**
There is no free plan. Entry is $79 a month for 10,000 tracked visitors, every plan starts with a 14-day trial, and Standard at $199 is the first with click fraud protection.
**Does ClickMagick track SaaS subscription revenue?**
The reports exist: recurring revenue, refunds and cohort lifetime value. The public pages do not show how a Stripe Billing renewal gets in, so get that answer in writing before the 14-day trial ends.
**Does TrackRev send conversions to Meta or Google Ads?**
No. TrackRev pulls no costs from Meta Ads or Google Ads and pushes no purchases to them, so their optimization stays on the platform's own pixel. A campaign still ranks as a channel when its ad points at a TrackRev link.
**Can I use ClickMagick and TrackRev together?**
Yes, each with its own links and pixel. Name one tool's conversion count as the budget source, because the two will differ.
**Does ClickMagick run an affiliate program for my product?**
Its pages describe tracking offers you promote, postbacks to 100+ networks and shareable stats links for influencers. They list no partner portal, commission rules or payouts. TrackRev's affiliate program runs on any paid plan from $39 a month.
**What are other ClickMagick alternatives?**
RedTrack Builder is $79 a month for 2M events and Voluum Profit is $149 for 1,000,000 events, both aimed at affiliates and media buyers.
---
## Cometly alternative for SaaS: what it costs and what to use instead
URL: https://www.trackrev.io/blog/cometly-alternative-affordable
Published: 2026-04-23
Author: Muzahid Maruf
Cometly publishes no price and runs no free trial. See how it compares with TrackRev, from $39 a month, and six other tools, for SaaS channel revenue.
Cometly ties Meta Ads, Google Ads and LinkedIn spend to Stripe revenue and CRM pipeline, then sends paying-customer events back to those networks. Its [pricing page](https://www.cometly.com/pricing) lists no price, only Core and Enterprise tiers sized by monthly pageviews, and no free trial. The Cometly alternative I build, TrackRev, costs $39 a month on Starter, has a free plan for link tracking, and ranks channels by the subscription revenue they bring in, partner links and newsletters included. It imports no ad spend and sends nothing back to Meta Ads or Google Ads.
Disclosure: I run TrackRev, so discount my read accordingly. Every figure is as of October 2026.
> **Key takeaways:**
>
> - Cometly lists no price: Core and Enterprise are sized by monthly pageviews and quoted on a call, with no free trial. TrackRev lists $39, $99 and $199 a month, plus a free plan for link tracking.
> - Cometly calls itself built for B2B SaaS, with Stripe by OAuth, 10 CRM integrations and paying-customer events sent to Meta Ads and Google Ads. TrackRev reads Stripe, Paddle, Polar and Lemon Squeezy and imports no ad spend.
> - A $450 a month tool, a stand-in since Cometly lists no rate, is 0.9% of a $50,000 ad budget and 22.5% of a $2,000 one, so price matters least to big spenders.
> - TrackRev has 3 credit rules to Cometly's 8, and its affiliate program pays partners from the same orders that feed the channel table.
### Cometly vs TrackRev at a glance
| Feature | Cometly | TrackRev |
| --- | --- | --- |
| Built for | B2B SaaS teams that buy ads and run a CRM | SaaS businesses with partner, newsletter and paid channels |
| Listed price | None, quoted on a call | $39, $99 and $199 a month |
| Free option | No plan, no trial | Link tracking: 50 links, 1,000 events a month |
| What moves the price | Monthly pageviews, 1.5 per visit | Partner commission: $10,000, $100,000, unlimited |
| Yearly billing | 20% off | 12 months for the price of 9 |
| Billing systems | Stripe, Paddle, Chargebee, SamCart, ThriveCart, Whop | Stripe, Paddle, Polar, Lemon Squeezy |
| CRM integrations | 10, including HubSpot and Salesforce | None |
| Ad networks | Spend imported, conversions sent to Meta Ads, Google Ads and more | No import, nothing sent |
| Attribution models | 8 models, 7 windows up to lifetime | 3 models, windows of 1 to 365 days |
| Visitor matching | Cookieless fingerprint, cross-device | First-party cookie, then checkout email |
| Your own affiliate program | No tool listed | Every paid plan, PayPal or Wise CSV payouts |
*Prices from each vendor's pricing page, October 2026. Cometly's billing systems and CRMs come from its [integration directory](https://www.cometly.com/integrations).*
### What Cometly costs
Cometly's pricing page shows two plan cards and no number on either. Both are sized to your monthly pageviews, which its FAQ counts as every page load the pixel or a server-side event records, estimated at 1.5 times your sessions: 20,000 sessions a month is about 30,000 pageviews. Pass 90% of a tier and Cometly moves you up at the start of the next billing period.
| Plan | Price | Sized by | What it includes |
| --- | --- | --- | --- |
| Core | Not listed | Monthly pageviews | Pixel, server-side tracking, multi-touch attribution, dashboards, an AI agent, Conversion API, AI Ads Manager, 70+ integrations |
| Enterprise | Not listed, talk to sales | Higher pageview and AI credit limits | Core plus CRM and warehouse sync, MCP, the Cometly API, Snowflake and BigQuery support, a dedicated solutions engineer |
*Cometly's published plans, October 2026.*
Yearly billing takes 20% off. There is no free trial, because the FAQ says attribution needs CRM and ad-network setup first, and a setup specialist comes with onboarding. The page's social-preview image description carries one figure, "starting at $150/seat/mo", that the plan cards never repeat. Treat it as a lead for the sales call and ask whether the rate is per seat, per pageview or both.
#### What a $450 tool has to save
| Monthly ad spend | $450 tool, share of spend | $39 plan, share of spend |
| --- | --- | --- |
| $2,000 | 22.5% | 1.95% |
| $5,000 | 9% | 0.78% |
| $20,000 | 2.25% | 0.2% |
| $50,000 | 0.9% | 0.08% |
*The share of ad spend a tool must save to pay for itself. The $450 is a stand-in: $150 a seat for 3 seats.*
Cometly's solutions menu says most teams cut CAC 20 to 40%, a vendor figure I can't check. If it holds, $450 repays itself many times over at $50,000 a month. At $2,000 a month the tool must find $450 of waste, a 22.5% gain, and ranking channels with a cheaper tool makes more sense.
### What Cometly does well
Cometly's [pixel](https://www.cometly.com/platform/pixel) is first-party and cookieless: it identifies visitors from IP address, user agent, screen resolution and device traits, and stitches phone, laptop and tablet visits into one journey once the visitor identifies themselves by form fill, signup or login. Stripe connects by OAuth with [8 triggers](https://www.cometly.com/integration/stripe), from new payment and first payment to canceled subscription and refund. Its [Stripe revenue attribution page](https://www.cometly.com/solutions/stripe-revenue-attribution) says refunds and chargebacks reduce attributed revenue and cohort dashboards reach year-3 lifetime value.
The ad side reaches furthest. Its [Conversion API page](https://www.cometly.com/platform/conversion-api) lists server-side delivery to Meta Ads, Google Ads, LinkedIn, TikTok, Microsoft and Reddit, so bidding can optimize for paying customers instead of trial starts, and it reports Meta event match quality rising from about 4 of 10 to 9.3, a vendor figure I can't verify. Meta's [Conversions API documentation](https://developers.facebook.com/documentation/ads-commerce/conversions-api) describes the mechanism: server events link to a dataset and are processed like pixel events. The [attribution page](https://www.cometly.com/platform/attribution) lists 8 models, including U-shaped, last non-direct touch and source-specific first and last touch.
Its directory lists 76 integrations: 13 ad networks, 10 CRMs, 10 ecommerce platforms and 6 payment tools. A team that closes deals in HubSpot or Salesforce can follow a LinkedIn click to a closed-won deal in Cometly. TrackRev reads no CRM, so it can't.
### One customer, two credit systems
Take a $49 monthly plan that a customer keeps for 12 months, $588 in all. The buyer clicked a LinkedIn ad on day 1, a newsletter link on day 9 and a partner's link on day 20, each pointing at a tracking link.
| Credit rule | Offered by | LinkedIn ad, day 1 | Newsletter, day 9 | Partner link, day 20 |
| --- | --- | --- | --- | --- |
| First touch | Both | $588.00 | $0 | $0 |
| Last touch | Both | $0 | $0 | $588.00 |
| Linear | Both | $196.00 | $196.00 | $196.00 |
| U-shaped | Cometly only | $235.20 | $117.60 | $235.20 |
*One $588 customer credited four ways. U-shaped follows Cometly's documented split: 40% to the first touch, 40% to the last, 20% shared by the middle.*
TrackRev's three rules cover first touch, last touch and an even split, with last touch as the default. U-shaped takes $78.40 off the middle touch compared with linear, and a team with a handful of channels rarely needs more. [Last-touch vs first-touch vs linear](https://www.trackrev.io/blog/attribution-models-saas-comparison) walks through the choice.
### How TrackRev tracks revenue by channel
TrackRev records each click on the server at your tracking link, so click capture needs no script on your site. One first-party pixel sets a visitor ID cookie on your domain and ties later pageviews to the click. Revenue comes from a read-only key for Stripe, Paddle, Polar or Lemon Squeezy: a charge joins to the visitor ID when checkout carries it, and to the buyer's email when it doesn't. Renewals inherit the first sale's click, refunds and chargebacks come out of the channel's revenue, and the window runs 1 to 365 days, 30 by default. Sync runs hourly, with an optional webhook for sales within seconds.
Stripe's [subscription webhook documentation](https://docs.stripe.com/billing/subscriptions/webhooks) says some events fire at creation and others recur each billing period, and a paid Stripe Billing renewal arrives as `invoice.paid`. TrackRev reads the charges, so month 12 is credited like month 1. [Subscription LTV attribution by channel](https://www.trackrev.io/blog/subscription-ltv-attribution) covers the lifetime rollup and [attributing Stripe revenue to marketing channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels) the wiring.
Partners earn commission on the same orders that feed the channel table. The hold before payout is set per program from 0 to 180 days and defaults to 0, and payouts go out by PayPal or Wise CSV export. The [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) covers the partner side, and Starter at $39 includes it. Cometly's navigation lists no tool for running a partner program of your own.
### What TrackRev costs
| Plan | Monthly | Billed yearly, per month | Commission tracked a month | Workspaces |
| --- | --- | --- | --- | --- |
| Free | $0 | $0 | Affiliate program locked | 1 |
| Starter | $39 | $29.25 | $10,000 | 1 |
| Growth | $99 | $74.25 | $100,000 | Unlimited |
| Scale | $199 | $149.25 | Unlimited | Unlimited |
*TrackRev's published plans, October 2026. Every paid plan includes the whole product, and the free plan covers 50 links and 1,000 events a month.*
### What TrackRev leaves out
- No spend import from Meta Ads or Google Ads, so no return on ad spend or cost per acquisition from platform data.
- Nothing sent back to Meta Ads, Google Ads, LinkedIn or TikTok, so their bidding learns from each network's own pixel.
- No CRM: HubSpot and Salesforce deals never reach the channel table.
- No fingerprint matching across devices, only the first-party cookie and the checkout email.
- No native BigQuery or Snowflake connector. CSV export, a REST API and a sale.created webhook carry the raw data, and BigQuery and Postgres connectors are on the roadmap.
- Revenue figures stay hidden on the free plan, and revenue plus affiliates start at $39 on Starter.
### Other Cometly alternatives and what they list
| Tool | Built for | Entry price | What sets the price |
| --- | --- | --- | --- |
| TrackRev | SaaS revenue by channel, with affiliates | Free for link tracking, Starter $39 a month | Partner commission tracked |
| [AnyTrack](https://anytrack.io/pricing) | Conversion tracking sent to ad networks | Free for 5,000 sessions a month, Starter $100 a month with a 14-day trial | Sessions: 100,000 on Starter |
| [Dreamdata](https://dreamdata.io/pricing) | B2B attribution at the account level | Free with 5 seats and 2 months of history, Advanced by quote | Plan and data volume |
| [Ruler Analytics](https://www.ruleranalytics.com/pricing/) | Matching marketing touches to sales in a CRM | From $400 a month, $360 billed yearly | Monthly visits: 10,000 on the first plan |
| [Wicked Reports](https://www.wickedreports.com/pricing) | Ecommerce and subscription lifetime value | Measure at $499 a month for $0 to $2.5M of annual revenue | Annual revenue band |
| [Northbeam](https://www.northbeam.io/pricing) | Ecommerce brands that buy ads | Professional $3,500 a month, Starter listed at $1,500 with no period shown | Pageview volume |
| [Triple Whale](https://www.triplewhale.com/pricing) | Shopify brands | A free plan, paid tiers priced by annual GMV on a slider | Annual GMV |
*Prices from each vendor's pricing page, October 2026.*
[AnyTrack vs TrackRev](https://www.trackrev.io/blog/anytrack-alternative) and [Northbeam vs TrackRev](https://www.trackrev.io/blog/northbeam-vs-trackrev) compare each tool in detail.
### Which Cometly alternative fits
| Your situation | Better fit | Reason |
| --- | --- | --- |
| You bid on paying customers in Meta Ads, Google Ads or LinkedIn | Cometly | Paying-customer events flow back to the networks |
| Deals close in HubSpot or Salesforce | Cometly | It reads 10 CRMs and TrackRev reads none |
| Subscriptions bill through Stripe, Paddle, Polar or Lemon Squeezy | TrackRev | Each charge is credited to its link |
| Affiliates or partners are a real channel | TrackRev | Commissions and payouts use the same orders |
| Conversion feedback to ad networks on a small budget | AnyTrack | Free for 5,000 sessions, Starter $100 |
| Over $20,000 a month in ads plus an affiliate program | Both | Cometly steers bids, TrackRev budgets channels and pays partners |
| Attribution budget under $100 a month | TrackRev | $39 for Starter, against a quote |
The [pricing page](https://www.trackrev.io/pricing) has TrackRev's yearly rates, and the [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows the channel table.
### Frequently asked questions
**What is a good Cometly alternative for a SaaS company?**
TrackRev, from $39 a month, for revenue by channel with affiliates on the same data. AnyTrack, free up to 5,000 sessions a month, for conversion feedback to ad networks. Dreamdata, which has a free plan with 5 seats, for account-based B2B.
**How much does Cometly cost?**
Cometly publishes no rate. Core and Enterprise are quoted on a call by monthly pageviews, yearly billing takes 20% off, and the pricing FAQ says there is no free trial.
**Does Cometly track Stripe Billing subscriptions and renewals?**
Yes. The connection uses OAuth, a New Payment trigger fires on every successful payment above $0 so renewals arrive, and Stripe refunds reduce attributed revenue.
**Can TrackRev replace Cometly?**
Only for the revenue-by-channel job. A team that bids on paying-customer events in Meta Ads or Google Ads, or reports ad to closed-won in HubSpot, needs Cometly or a similar tool.
**Where can I read Cometly reviews?**
Cometly has a G2 profile, which its own site lists. Sort by newest, and weigh a review by whether the writer buys ads at your spend level and bills through Stripe Billing.
**Can I use TrackRev and Cometly together?**
Yes. Give each its own pixel and tracking links, then decide ahead of time which dashboard sets the budget, since a fingerprint count and a billing count rarely agree.
---
## How to connect Google Analytics to Stripe revenue, and where it breaks
URL: https://www.trackrev.io/blog/connect-google-analytics-stripe-revenue
Published: 2026-07-11
Author: Muzahid Maruf
Connect Google Analytics to Stripe revenue in 6 steps, with code. See why a 14-day trial or a month-2 renewal falls outside what GA4 can credit to a channel.
To connect Google Analytics to Stripe revenue, your server sends a `purchase` event to Google Analytics 4 each time Stripe confirms a payment, tagged with the visitor's client ID so the sale joins the visit that earned it. The 6 steps below work for a first payment made on the day of the click. They become unreliable for the first charge of a trial longer than 2 days and for every renewal, because Google says Measurement Protocol events arriving more than 48 hours after the browser event may not be processed as expected for conversion attribution.
Google Analytics 4 records only what its tag or the [Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events) sends it, and Stripe files payments under IDs of its own, so one identifier has to travel from the browser into Stripe and back. Stripe's guide to [analyzing the Checkout funnel with Google Analytics 4](https://docs.stripe.com/payments/checkout/analyze-conversion-funnel) uses this route, but its server-side sample sends an empty `params` object, which records no value.
> **Key takeaways:**
>
> - Google Analytics 4 and Stripe share no identifier, so the usual build stores the client ID and session ID in Stripe metadata and posts a purchase event to the Measurement Protocol from a webhook.
> - Google says Measurement Protocol events should arrive within 48 hours of the browser event they join, so a 14-day trial (336 hours) or a month-2 renewal (720 hours) cannot reliably credit the original campaign.
> - A Payment Link silently drops a client ID that contains a period, and the Stripe invoice ID is the transaction_id that stops 3 days of webhook retries from double counting a purchase.
> - A standard Google Analytics 4 property keeps event data for 2 or 14 months, and the 26-month option belongs to Google Analytics 360.
> - Reading revenue from Stripe and joining it to a click by email, as TrackRev Revenue Attribution does from $39 a month, skips the browser ID but needs the buyer's email at signup or checkout.
### Connect Google Analytics to Stripe in 6 steps
You need the Editor role on the property, a webhook endpoint, and a server route that creates Stripe Checkout Sessions.
#### Step 1: Exclude checkout.stripe.com from referrals
Customers returning from Stripe Checkout arrive with `checkout.stripe.com` as the referrer, so a new session can be filed under it instead of the campaign. Stripe's funnel guide says to exclude it. In Google Analytics 4, open Admin, Data streams, your web stream, Configure tag settings, then [List unwanted referrals](https://support.google.com/analytics/answer/10327750), and add the domain. A stream holds up to 50, and past sessions keep their source.
#### Step 2: Create a Measurement Protocol API secret
Secrets belong to a Google Analytics 4 data stream, so open Measurement Protocol API secrets in the web stream from step 1, create one, and copy it with the measurement ID that starts with G-. Posts go to `https://www.google-analytics.com/mp/collect`, or to `region1.google-analytics.com` for EU collection. Keep the secret server-side, because anyone holding it can send arbitrary events to your property.
#### Step 3: Read the client ID and session ID in the browser
The gtag.js [get command](https://developers.google.com/tag-platform/gtagjs/reference) returns `client_id` and `session_id` for a Google Analytics 4 measurement ID. Call it when the visitor clicks checkout and post both values to the route that creates the Session. A client ID is 2 numbers joined by a period, which matters in step 4. A blocked tag can leave the callbacks silent, so the sample starts checkout after 1.5 seconds regardless.
Browser: capture the IDs, then start checkout
```
function startCheckout() {
let started = false;
const ids = { clientId: "", sessionId: "" };
const go = () => {
if (started) return;
started = true;
fetch("/api/checkout", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(ids),
})
.then((res) => res.json())
.then(({ url }) => { window.location.href = url; });
};
setTimeout(go, 1500); // a blocked tag never calls back
if (typeof gtag !== "function") return go();
gtag("get", "G-XXXXXXXXXX", "client_id", (clientId) => {
ids.clientId = String(clientId);
gtag("get", "G-XXXXXXXXXX", "session_id", (sessionId) => {
ids.sessionId = String(sessionId);
go();
});
});
}
```
#### Step 4: Store both IDs on the Stripe objects
Put the 2 IDs in [metadata](https://docs.stripe.com/metadata) on the Checkout Session. Subscriptions also need `subscription_data.metadata`, which Stripe writes to the Subscription and snapshots onto every invoice at `parent.subscription_details.metadata`, so a renewal webhook can find the client ID months later.
Payment Links fix their metadata when you create the link, so append `client_reference_id` instead. Per Stripe's [URL parameters page](https://docs.stripe.com/payment-links/url-parameters), it takes up to 200 characters of letters, digits, `-` and `_`, and silently drops anything else. A client ID has a period, so swap it before sending and restore it in the webhook. The guides to [Payment Links attribution](https://www.trackrev.io/blog/stripe-payment-links-attribution) and [Stripe metadata attribution](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) cover those routes without Google Analytics 4.
| Where the ID lives | Reaches renewal invoices | Size limit |
| --- | --- | --- |
| Checkout Session metadata | No, it stays on the Session | 500 characters per value |
| subscription_data.metadata | Yes, as a snapshot on each invoice | 500 characters per value |
| Payment Link client_reference_id | Only if you copy it onto the subscription | 200 characters |
Server: create the Session with both IDs
```
// POST /api/checkout
export async function POST(req: Request) {
const { clientId, sessionId } = await req.json();
const ga = { ga_client_id: clientId, ga_session_id: sessionId };
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_XXXXXXXX", quantity: 1 }],
success_url: "https://example.com/welcome",
cancel_url: "https://example.com/pricing",
metadata: ga, // stays on the Session
subscription_data: { metadata: ga } // copied onto every invoice
});
return Response.json({ url: session.url });
}
// Payment Links: a client ID like 1234567890.1700000000 has a period,
// which client_reference_id would drop, so swap it before appending
function paymentLink(clientId: string, sessionId: string) {
const ref = clientId.replace(".", "_") + "-" + sessionId;
return "https://buy.stripe.com/XXXX?client_reference_id=" + ref;
}
// In the webhook, reverse it:
// const [cid, sid] = session.client_reference_id.split("-");
// const clientId = cid.replace("_", ".");
```
#### Step 5: Send purchase and refund events from a webhook
Subscribe an endpoint to 2 events, `invoice.paid` for subscriptions and `checkout.session.completed` for one-time payments, and verify each signature before acting. The [Google Analytics 4 purchase event](https://developers.google.com/analytics/devguides/collection/ga4/reference/events) takes a value without tax and an `items` array, so the sample reads `total_excluding_tax`. Stripe amounts are in the smallest currency unit.
| Currency | Stripe amount | Value to send | Division |
| --- | --- | --- | --- |
| USD | 3900 | 39.00 | By 100 |
| USD | 1099 | 10.99 | By 100 |
| EUR | 4500 | 45.00 | By 100 |
| JPY | 500 | 500 | None |
*Stripe lists JPY as a zero-decimal currency. The sample divides every amount by 100, so add a branch for those.*
Stripe retries failed deliveries for up to 3 days in live mode and [may deliver the same event more than once](https://docs.stripe.com/webhooks), while Google Analytics 4 [deduplicates purchases](https://support.google.com/analytics/answer/12313109) that share a transaction ID, so the invoice ID goes in that field. An empty ID makes every purchase look like a duplicate. Refunds use the `refund` event with the original invoice ID, sent from a `charge.refunded` handler.
Server: forward a paid invoice to Google Analytics 4
```
const MP_URL =
"https://www.google-analytics.com/mp/collect" +
"?measurement_id=" + process.env.GA_MEASUREMENT_ID +
"&api_secret=" + process.env.GA_API_SECRET;
export async function POST(req: Request) {
const event = stripe.webhooks.constructEvent(
await req.text(),
req.headers.get("stripe-signature")!,
process.env.STRIPE_WEBHOOK_SECRET!,
);
if (event.type === "invoice.paid") {
const invoice = event.data.object as Stripe.Invoice;
const meta = invoice.parent?.subscription_details?.metadata ?? {};
if (meta.ga_client_id && invoice.amount_paid > 0) {
await fetch(MP_URL, {
method: "POST",
body: JSON.stringify({
client_id: meta.ga_client_id,
events: [{
name: "purchase",
params: {
transaction_id: invoice.id,
currency: invoice.currency.toUpperCase(),
// two-decimal currencies only; GA4 value excludes tax
value: (invoice.total_excluding_tax ?? invoice.amount_paid) / 100,
session_id: meta.ga_session_id,
engagement_time_msec: 100, // lets the event show in Realtime
items: [{ item_id: "starter-monthly", item_name: "Starter plan" }],
},
}],
}),
});
}
}
return new Response(null, { status: 200 });
}
```
#### Step 6: Validate before trusting the numbers
Post the payload to `https://www.google-analytics.com/debug/mp/collect` first. It returns an empty `validationMessages` array for a valid Google Analytics 4 event and does not check the API secret. The [live endpoint](https://developers.google.com/analytics/devguides/collection/protocol/ga4/validating-events) returns no HTTP error code even for a malformed event, so a handler that watches status codes never sees a failure. Test in a separate property, then compare purchases sent with paid Stripe invoices after 30 days.
### Limits that matter for this build
| Limit | Value |
| --- | --- |
| Measurement Protocol events per request | 25 |
| Parameters per event | 25 |
| Custom parameters per item | 10 |
| Event name length | 40 characters |
| Parameter value length, standard property | 100 characters |
| Request body size | Under 130 kB |
| Non-conversion requests per property | 100 million an hour |
| Backdating an event | Up to 72 hours |
| Joining a server event to a browser event | Within 48 hours |
| Unwanted referrals per data stream | 50 |
| Stripe client_reference_id | 200 characters |
| Stripe metadata | 50 keys, 40-character keys, 500-character values |
| Stripe webhook retries, live mode | Up to 3 days |
| BigQuery export, standard property | 1 million events a day |
*Sources: Google Analytics Measurement Protocol reference, Google Analytics Help and Stripe documentation, October 2026.*
### How much revenue Google Analytics 4 can credit to a channel
Take a $39 monthly plan sold to a visitor who clicks a Google ad on day 0 and pays the same day. Year one is 12 payments, $468 in all. The first payment arrives within an hour of the browser event, and each later one arrives a month further out.
| Payment | Hours after the stored visit | Inside the 48-hour window | Amount |
| --- | --- | --- | --- |
| First charge, no trial | Under 1 | Yes | $39 |
| First charge after a 7-day trial | 168 | No | $39 |
| First charge after a 14-day trial | 336 | No | $39 |
| Month 2 renewal, no trial | 720 | No | $39 |
| Month 6 renewal, no trial | 3,600 | No | $39 |
| Month 12 renewal, no trial | 7,920 | No | $39 |
*Hours are counted from the visit whose IDs the checkout stored, using 30-day months.*
Without a trial, 1 payment in 12 sits inside the window: $39 of $468, or 8.3% of year-one revenue. Google says only that later events may not be processed as expected for attribution, and does not say what Google Analytics 4 does with them. Send one late test event and check which source it lands under before you build a report on it.
### Where the connection breaks
#### Trials and renewals
Stripe's [Checkout Session object](https://docs.stripe.com/api/checkout/sessions/object) reports a subscription with a free trial as paid once its $0 trial invoice is processed, so the session completes with `amount_total` at 0. Send that moment as a custom `trial_start` event marked as a key event, while the visit is inside the 48-hour window. Renewals carry no session Google can credit. I would let Google Analytics 4 judge acquisition up to the signup and leave the money after it to Stripe or a billing-side tool, as [subscription LTV attribution](https://www.trackrev.io/blog/subscription-ltv-attribution) describes.
#### Cookies, blockers and consent
Google's [cookie documentation](https://developers.google.com/analytics/devguides/collection/ga4/cookie-usage) sets the `_ga` cookie to expire after 2 years by default and says browsers cap first-party cookies for visitors who do not return. [WebKit's policy](https://webkit.org/tracking-prevention/) adds a 24-hour cap for Safari Intelligent Tracking Prevention when it detects link decoration on the landing page.
| Case | Cookie lifetime |
| --- | --- |
| Default for the _ga cookie | 2 years |
| Chrome, visitor does not return | 400 days |
| Safari, visitor does not return | 7 days |
| Safari, link decoration detected | 24 hours |
A visitor who clicks an ad on day 1 and returns on day 9 with no visit between arrives as a new client, so the campaign is gone before Stripe is involved. A blocked tag or a consent banner leaves no client ID at all, and the Session carries empty metadata. Skip those events and log how many you skip, since an invented ID would credit the sale to a visit that never happened. The [Safari ITP guide](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the browser side.
#### Retention
The setting affects Explorations and funnel reports and leaves standard aggregated reports alone, so a 24-month lifetime value comparison by channel cannot come from Explorations in a standard Google Analytics 4 property. The [BigQuery export](https://support.google.com/analytics/answer/9358801) is the way around it.
| Data | Retention options |
| --- | --- |
| Event data, standard property | 2 or 14 months |
| Event data, Google Analytics 360 | 2, 14, 26, 38 or 50 months |
| Google signed-in data | 26 months at most |
*From Google's [data retention page](https://support.google.com/analytics/answer/7667196).*
### Four ways to join the two systems
Pick the first row for one-time or same-day sales, the second for teams with a warehouse, and the fourth when most revenue is renewals. The third feeds Google Ads bidding.
| Approach | Join key | Renewals | Main limit |
| --- | --- | --- | --- |
| Webhook to the Measurement Protocol | Client ID in Stripe metadata | Sent, outside the 48-hour window | A blocked tag leaves no ID |
| Google Analytics 4 BigQuery export plus a Stripe warehouse | Client ID, joined in SQL | Yes, with your own credit rule | 1 million events a day |
| [Offline conversion upload](https://support.google.com/google-ads/answer/7014069) to Google Ads | GCLID from the ad click | Reports in Google Ads | Needs the click's GCLID |
| Billing-side attribution | Email bound to a visitor ID | Credits the click under the model you pick | Needs the email at signup |
*Join keys and limits as described in Google's and Stripe's documentation, October 2026.*
### Reading the channel from Stripe instead
Billing-side attribution reverses the order: the click is recorded first, on a tracked link, and the payment is read from Stripe afterward, so no browser ID has to survive until checkout. [TrackRev Revenue Attribution](https://www.trackrev.io/solutions/revenue-attribution) works this way. Setup is a read-only restricted Stripe key and a one-line pixel. TrackRev joins each paid charge to a click through the customer's email, which the pixel binds to the visitor at signup or checkout. It syncs hourly, backfills 90 days on the first sync, credits renewals to the original click, and nets refunds and chargebacks out of channel revenue. The same join covers 6 processors, including Paddle and Lemon Squeezy.
Last-touch is the default, with first-touch and linear one dropdown away. Revenue by channel needs a paid plan from $39 a month on [Starter](https://www.trackrev.io/pricing), and the free plan covers 50 links and 1,000 tracked events a month, link tracking only. Email is the join key, so test the buyer who pays under a different address than the one they signed up with. TrackRev does not replace Google Analytics 4 for page engagement or content performance. For the reporting side, see [GA4 not showing revenue by channel](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) and [attributing Stripe revenue to marketing channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels).
### Frequently asked questions
**Does Google Analytics 4 connect to Stripe directly?**
No. Google Analytics 4 records only what its tag or the Measurement Protocol sends, so a Stripe payment appears only after your server posts it. The usual build saves the client ID in Stripe metadata when checkout starts and sends a purchase event from the payment webhook.
**Why does Stripe revenue show up as checkout.stripe.com or direct?**
A customer returning from Stripe Checkout can arrive with checkout.stripe.com as the referrer, so Google Analytics 4 files the visit as a referral. Listing the domain under unwanted referrals fixes new visits, not past ones. Direct traffic also appears when the visitor's cookie was lost between click and payment.
**Does Google Analytics 4 track Stripe subscription renewals?**
Only if you send them. Stripe produces an invoice.paid event for each renewal with no browser involved, so your server posts the purchase to Google Analytics 4 using the client ID saved in subscription metadata. It arrives about 720 hours after the visit, which makes channel credit unreliable under Google's 48-hour guidance.
**Why doesn't Google Analytics revenue match my Stripe totals?**
Typical causes are tax left inside the value, amounts sent in minor units such as 1099 for $10.99, refunds that never reached Google, payments with no stored client ID, and renewals sent too late to attribute. Stripe's balance is also net of fees, so compare against paid invoices.
**How long does Google Analytics 4 keep event data?**
Standard properties offer 2 or 14 months, which affects Explorations and funnel reports only. The 26, 38 and 50 month options exist for Google Analytics 360.
**Can I send Stripe revenue to Google Ads?**
Yes. Google Ads accepts offline conversions tied to the GCLID of the original ad click, which is separate from the client ID. Google advises uploading an extra day of data with each import, because conversions within 1 day of the click may not be recorded yet.
---
## Coupon code affiliate tracking: how affiliate codes get credited
URL: https://www.trackrev.io/blog/coupon-code-affiliate-tracking
Published: 2026-05-25
Author: Muzahid Maruf
How coupon code affiliate tracking works: what an affiliate code is, how to read it from a Stripe payment, and which limits stop a code from leaking.
Coupon code affiliate tracking credits a sale to an affiliate through the discount code the customer typed at checkout, with no click involved. Say Nora's code NORA20 takes 20% off a $49 monthly plan: the customer pays $39.20, Stripe records the code on the invoice, and the tracking system looks it up and credits Nora $11.76 at a 30% commission rate. Codes reach sales a link cannot, such as a podcast read, a video description, or a phone click followed by a laptop purchase 8 days later.
> **Key takeaways:**
>
> - A coupon code credits an affiliate only when it belongs to that partner alone. A code every partner shares discounts the sale and credits nobody.
> - Create one Stripe coupon, then one promotion code per affiliate, and read the code from the invoice's expanded discounts or from total_details.breakdown.
> - A once coupon rides on the first of 12 yearly invoices only, so renewal commission on code sales depends on how long the discount runs.
> - Cap every code: 200 redemptions on a forever coupon can commit $28,224 of commission in year one.
### What an affiliate code is
An affiliate code is a discount code issued to one affiliate, so the customer gets a price break and the partner who owns the string gets the commission. It works only while unique: a code shared by all 40 of your partners credits none of them. Affiliate tracking code is looser: it can mean a partner ID in a link such as `?ref=nora`, the click-recording script, or a coupon.
### How a code becomes a commission
Stripe keeps the discount and the code apart. A coupon holds the discount (`percent_off` or `amount_off`, lasting once, repeating or forever), and a promotion code is the customer-facing string wrapped around it, so many codes can share one coupon, per [Stripe's coupon documentation](https://docs.stripe.com/billing/subscriptions/coupons). One 20% coupon plus a promotion code per partner gives per-affiliate tracking. A redeemed code leaves a [Discount object](https://docs.stripe.com/api/discounts/object) holding the `promotion_code` ID, and where you read it depends on how the customer paid.
| Payment flow | Where the code appears | What to watch |
| --- | --- | --- |
| Subscription in Stripe Checkout | The invoice's discounts, after invoice.paid | A subscription holds up to 20 discounts, coupons and codes combined |
| One-time payment in Stripe Checkout | total_details.breakdown on the Checkout Session | The breakdown is not returned unless you expand it |
| Payment Link | Same as Checkout | Needs allow_promotion_codes on the link |
| Plan change in the customer portal | The subscription's discounts | Only with portal promotion codes enabled |
Invoice `discounts` return as IDs until expanded, and each `promotion_code` is an ID too, so the handler makes one extra call for the typed string.
Find the partner behind a coupon code (Node.js)
```
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
// partnerByCode maps an uppercased code to a partner, e.g. { NORA20: "ptn_81" }
export async function partnerForInvoice(invoiceId, partnerByCode) {
const invoice = await stripe.invoices.retrieve(invoiceId, {
expand: ["discounts"],
});
for (const discount of invoice.discounts) {
if (!discount.promotion_code) continue;
const promo = await stripe.promotionCodes.retrieve(discount.promotion_code);
const partnerId = partnerByCode[promo.code.toUpperCase()];
if (partnerId) return { partnerId, code: promo.code };
}
return null; // no code on this invoice
}
```
### Affiliate code or affiliate link: what each one catches
A link and a code fail under different conditions, and each records something the other cannot.
| Situation | Link and cookie | Code |
| --- | --- | --- |
| Buyer returns 8 days after clicking in Apple Safari | A cookie created in JavaScript is deleted after 7 days without a visit | Credited at purchase |
| Landing from a decorated link in Apple Safari | The cookie is capped at 24 hours | Unaffected |
| Click on a phone, purchase on a laptop | The cookie stays on the phone | Credited if the buyer remembers it |
| Podcast read or video description | 0 clicks to record | Credited if the buyer types it |
| Buyer skips the code field | Credited by the cookie | No credit |
| Partner wants click-through rates | Full funnel visible | No click data |
Both caps come from WebKit. Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without user interaction and caps them at 24 hours after link decoration from a classified tracker, per [WebKit's tracking prevention policy](https://webkit.org/tracking-prevention/). [Safari ITP and SaaS attribution](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the funnel effect.
I'd give every partner both: podcasters and video creators rarely send clicks, while bloggers and newsletter authors send clicks that give you a conversion rate.
#### When the link and the code belong to different partners
If a buyer arrives through Nora's link and types Priya's code, 2 partners claim 1 sale. Settle the rule before launch. I'd let the code win, since typing is deliberate and a cookie is passive. TrackRev has no precedence setting today: it writes at most 1 commission per partner per order, so a click and a code owned by different partners credit both. See [how affiliate tracking works](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) for the cookie side.
### How to set up coupon code affiliate tracking in Stripe
Build in test mode first. [Stripe's testing guide](https://docs.stripe.com/testing) lists the test card 4242 4242 4242 4242 with any future expiry date and any 3-digit CVC.
#### Step 1: Create the coupon
Create one coupon per offer in the Stripe Dashboard or API, with `percent_off` or `amount_off` and a duration: once covers 1 invoice, repeating with `duration_in_months` covers a set span, and forever covers every invoice.
#### Step 2: Create one promotion code per affiliate
Call `POST /v1/promotion_codes` with the coupon ID and a code such as NORA20. Per Stripe's [promotion code reference](https://docs.stripe.com/api/promotion_codes/object), codes use letters, digits and dashes and are case-insensitive.
#### Step 3: Turn on the code field
Stripe Checkout shows a code box when the Checkout Session sets `allow_promotion_codes=true`, per [Stripe's Checkout discount guide](https://docs.stripe.com/payments/checkout/discounts). A Payment Link has the same setting, and [attribution through Stripe Payment Links](https://www.trackrev.io/blog/stripe-payment-links-attribution) covers it.
#### Step 4: Record which partner owns which code
Store each string against its partner, uppercased on both sides. Codes read aloud get misheard, so pick short strings and avoid pairs such as O and 0 or I and 1.
#### Step 5: Read the code on every payment
Run the handler from your invoice.paid webhook, and for one-time payments read the Checkout Session with `total_details.breakdown` expanded. Credit each invoice once, since [Stripe's webhook guide](https://docs.stripe.com/webhooks) says an event can arrive more than once. Pay on the amount the customer paid, because the discount shrinks the base.
| Coupon on a $49 plan | Customer pays | 30% of amount paid | 30% of list price | Overpayment per invoice |
| --- | --- | --- | --- | --- |
| 10% off | $44.10 | $13.23 | $14.70 | $1.47 |
| 20% off | $39.20 | $11.76 | $14.70 | $2.94 |
| 30% off | $34.30 | $10.29 | $14.70 | $4.41 |
| 40% off | $29.40 | $8.82 | $14.70 | $5.88 |
| 50% off | $24.50 | $7.35 | $14.70 | $7.35 |
#### Step 6: Test before you hand out codes
Redeem a code on a subscription and on a one-time payment with the 4242 test card, then refund one and confirm its commission reverses.
#### Worked example: how coupon duration changes the numbers
NORA20 takes $9.80 off the $49 plan, so each coded invoice is $39.20 and Nora earns $11.76 at 30%. The coupon duration sets how many invoices carry the code, and Stripe drops a once coupon from the subscription's discounts after the first invoice finalizes. The table assumes a tool that credits only invoices carrying the code.
| Coupon duration | Coded invoices in year one | Customer pays | Discount given | Commission at 30% | Commission as share of list price | Revenue after commission |
| --- | --- | --- | --- | --- | --- | --- |
| once | 1 of 12 | $578.20 | $9.80 | $11.76 | 2% | $566.44 |
| repeating, 3 months | 3 of 12 | $558.60 | $29.40 | $35.28 | 6% | $523.32 |
| repeating, 6 months | 6 of 12 | $529.20 | $58.80 | $70.56 | 12% | $458.64 |
| repeating, 9 months | 9 of 12 | $499.80 | $88.20 | $105.84 | 18% | $393.96 |
| forever | 12 of 12 | $470.40 | $117.60 | $141.12 | 24% | $329.28 |
*Year-one totals for one customer on a $49 monthly plan with a 20% coupon and 30% commission on the amount paid. List price is $588.*
The forever row pays Nora on all 12 invoices and leaves $329.28 of the $588 list price. The once row leaves $566.44 but pays her on 1 invoice, because the 11 renewals are plain $49 invoices with no code. Let the discount run as long as you intend to pay commission, or confirm your tool remembers the partner from the first sale. [Affiliate tracking for recurring subscriptions](https://www.trackrev.io/blog/affiliate-tracking-subscriptions-recurring) goes deeper.
### Settings that stop a code from leaking
A code posted publicly gets copied to coupon sites, and every redemption by someone the partner never reached pays commission for nothing.
| Setting | What it does | Value for an affiliate code |
| --- | --- | --- |
| first_time_transaction | Rejects customers with a prior payment or trial | true |
| max_redemptions | Caps total uses, at most the coupon's own cap, and a spent code cannot be reactivated | A count you would gladly pay commission on |
| expires_at | Ends redemption, no later than the coupon's redeem_by | Campaign end, such as 90 days after an episode airs |
*Behavior from Stripe's coupon and promotion code documentation, October 2026.*
Price out the cap. Each redemption commits $11.76 on a once coupon and $141.12 on a forever coupon in year one.
| Redemption cap | Commission on first invoices | Year-one commission, forever coupon | Monthly share of Starter's $10,000 limit |
| --- | --- | --- | --- |
| 25 | $294.00 | $3,528.00 | 2.9% |
| 50 | $588.00 | $7,056.00 | 5.9% |
| 100 | $1,176.00 | $14,112.00 | 11.8% |
| 200 | $2,352.00 | $28,224.00 | 23.5% |
| 500 | $5,880.00 | $70,560.00 | 58.8% |
*Assumes every redemption is an active monthly customer on a forever coupon with recurring commission on.*
Stripe counts a trial subscription, even a canceled one, as a prior transaction, so a customer on a 14-day trial who types a first-time-only code at conversion is rejected. Ask for the code when the trial starts. Stripe's settings also know nothing about the partner, so a code works for its owner too: [preventing affiliate self-referral fraud](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) covers the checks.
### How TrackRev tracks coupon codes
In TrackRev you type the code against the partner on the Partners page or when you invite them. It is 3 to 40 characters of letters, numbers and dashes, unique within a program, matched without regard to case, and credited only to approved partners. TrackRev reads codes but does not create them in your billing account, so make the Stripe promotion code first. Affiliate programs need a paid plan ([pricing](https://www.trackrev.io/pricing)).
| Processor | What TrackRev reads | Setup note |
| --- | --- | --- |
| Stripe | The promotion code on the invoice or Checkout Session, else the coupon's name then ID | Enter the same string on the partner |
| Paddle Billing | The discount's code | The API key needs Discount (Read) |
| Polar | The discount code | A coupon metadata field also works |
| Lemon Squeezy | Nothing | The order data TrackRev syncs carries no discount code |
Commission is the program's rate on the amount paid after the discount, and a renewal pays only while the code is still on its invoice. Code commissions count toward the plan's monthly limit, $10,000 on Starter and $100,000 on Growth. A refund reverses the commission ([affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers partners already paid), each program can set a payout hold of 0 to 180 days with 0 as the default, and a code-only sale has no click behind it, so it carries no link or channel. The [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) shows the rest.
### When another tool fits better
FirstPromoter's [Create promo code endpoint](https://docs.firstpromoter.com/api-reference-v2/api-admin/promo-codes/create-promo-code) is Stripe only and takes a code, a reward ID and a promoter campaign ID. Tolt's [Create Promotion Code endpoint](https://docs.tolt.com/promotion-codes/create) takes a code, a type, a value and the partner_id that owns it. Look there if you want codes created for you, and check any tool's Lemon Squeezy support, which TrackRev lacks.
### Frequently asked questions
**What is an affiliate code?**
A discount code that belongs to one affiliate, such as SAM15 for a newsletter author named Sam who offers 15% off. The payment record carries it after checkout, which traces the sale back to Sam.
**Is an affiliate tracking code the same as a coupon code?**
Sometimes. Vendors also use the phrase for a partner ID in a URL or the script that records clicks, so check which one is meant before comparing tools.
**Can I apply a Stripe coupon directly instead of creating promotion codes?**
You can, but customers cannot type a coupon, so it suits a discount your backend applies to one account. Only a promotion code can be limited to first-time customers or archived without deletion.
**What if my server misses an invoice.paid event?**
Stripe retries undelivered events for up to 3 days in live mode, and sandbox events get 3 retries over a few hours. You can also resend an event from the Dashboard up to 15 days after it was created, or with the Stripe CLI up to 30 days after.
**Do affiliate codes keep working on renewals?**
Only while the discount stays on the invoice. Stripe removes a once coupon from the subscription's discounts after invoice 1 finalizes, so read the invoice that consumed it, not the subscription.
**Can I try coupon code tracking on TrackRev's free plan?**
No. The free plan covers link tracking only, with 50 links and 1,000 tracked events a month. Partner codes belong to the affiliate program, which starts on the Starter plan at $39 a month.
---
## Customer Acquisition Cost (CAC): How to Calculate and Lower It
URL: https://www.trackrev.io/blog/customer-acquisition-cost
Published: 2026-10-04
Author: Muzahid Maruf
Customer acquisition cost explained: the CAC formula with worked examples, blended vs channel CAC, payback, published SaaS benchmarks and ways to lower it.
Customer acquisition cost (CAC) is the cost to acquire one new paying customer: all sales and marketing spend in a period divided by the new customers it produced. A SaaS product that spent $12,600 on ads, content, tools, affiliate commissions and founder time in a quarter and added 42 paying customers has a CAC of $300. That figure means little on its own. It needs a payback period, a lifetime value to set against it, and a customer count that credits the right channel.
> **Key takeaways:**
>
> - CAC is sales and marketing spend divided by the paying customers it won. In the worked example, $12,600 over 42 customers is $300.
> - A blended figure hides the spread. Channels in that quarter ran from $125 for a newsletter to $500 for paid search, and only the $500 channel misses Bessemer's payback target of under 12 months.
> - Published benchmarks come as ratios and payback periods. Benchmarkit's 2025 report puts the median at $2.00 of spend per $1 of new customer ARR.
> - Attribution sets the customer count and therefore CAC: a $6,000 ad budget works out to $286 or $750 depending on who gets the credit.
> - To lower CAC, set a ceiling from the payback you can afford, cut channels above it, and raise conversion before buying more traffic.
### What is customer acquisition cost?
Customer acquisition cost is a ratio of two numbers from one period. The top is every cost of getting customers: ad spend, the share of payroll and contractor fees that goes to marketing and sales, content production, tools and affiliate commissions. The bottom is new paying customers.
The metric travels under other names. Agencies say client acquisition cost, finance teams say the cost of customer acquisition, and ad platforms report cost per acquisition (CPA, sometimes written cost per customer acquisition), which divides spend by whatever conversion you configured, such as a trial start. A funnel rate converts one into the other: $30 per trial at a 10% trial-to-paid rate is a $300 CAC ($30 / 0.10).
### How to calculate the cost of customer acquisition
Add up every acquisition cost in a fixed period, divide by the new paying customers in that period, and keep both numbers on one spreadsheet row so you can split them by channel later.
The formula
```
CAC = (ad spend + sales and marketing payroll + contractors + tools + commissions) / new paying customers
```
Take a hypothetical quarter for a $49-a-month product.
| Cost in the quarter | Amount |
| --- | --- |
| Google Ads spend | $6,000 |
| Freelance writer for blog posts | $2,400 |
| Email, analytics and link tools | $300 |
| Founder time, 40 hours at $75 | $3,000 |
| Affiliate commissions paid | $900 |
| Total | $12,600 |
*Hypothetical figures. The quarter added 42 paying customers, so $12,600 / 42 = $300.*
Drop the 40 founder hours and CAC falls to $229 ($9,600 / 42), which is how a bootstrapped team ends up reporting a flattering number: unbilled time is still a cost. David Skok's [SaaS Metrics 2.0 definitions](https://www.forentrepreneurs.com/saas-metrics-2-definitions/) add one adjustment for early teams: if payroll is sized for far more customers than you have yet, count only a portion of those salaries, which shows what CAC will look like at scale.
Several common mistakes distort the result before attribution gets involved.
- Dividing by trials or free signups. A customer exists once the first payment clears.
- Pairing one period's spend with another's customers. If buyers take weeks to convert, use a trailing 90-day window.
- Counting upgrades from existing customers as new ones. Expansion revenue belongs in a blended ratio.
### Blended, paid and channel CAC
Charge each founder hour to the channel it went to and the $300 splits up like this.
| Channel | Spend | New customers | CAC |
| --- | --- | --- | --- |
| Paid search (Google Ads) | $6,000 | 12 | $500 |
| Content and SEO | $3,900 | 14 | $279 |
| Newsletter | $750 | 6 | $125 |
| Affiliates | $1,650 | 7 | $236 |
| Direct and unassigned | $0 | 3 | no spend to divide |
| Shared tools | $300 | none | not allocated |
| Blended | $12,600 | 42 | $300 |
*Content spend is $2,400 for the writer plus 20 founder hours ($1,500); the newsletter and affiliate rows each include 10 founder hours ($750).*
Blended CAC divides all spend by all new customers, organic and direct signups included. Finance reads it, and it improves whenever free word of mouth grows, whether or not any channel earned it. Paid CAC counts only paid spend against the customers paid channels brought, the figure to hold against an ad platform's reported cost per acquisition. Channel CAC prices each source separately. The blended $300 sits between a $125 newsletter and a $500 ad channel, and no channel acquired customers at $300.
### CAC payback and LTV to CAC
A $300 CAC is cheap or ruinous depending on what a customer pays back, and two ratios supply that context. CAC payback is the months of gross profit one customer needs to repay their acquisition cost: CAC divided by monthly revenue per customer times gross margin. At 80% gross margin a $49 plan yields $39.20 a month, so $300 pays back in 7.7 months.
LTV to CAC sets lifetime gross profit against cost. Skok takes average customer lifetime as 1 divided by monthly churn, so 3% churn means 33 months. Lifetime gross profit is then $39.20 x 33.3 = $1,307, and LTV to CAC is 4.4.
| Channel | CAC | Payback in months | LTV to CAC |
| --- | --- | --- | --- |
| Paid search | $500 | 12.8 | 2.6 |
| Content and SEO | $279 | 7.1 | 4.7 |
| Blended | $300 | 7.7 | 4.4 |
*Every customer is assumed to earn $39.20 a month and $1,307 over a lifetime.*
Only the ad channel fails. [Bessemer's Scaling to $100 Million guide](https://www.bvp.com/atlas/scaling-to-100-million) sets a payback target under 12 months for SMB-focused companies, and 12.8 is past it. Skok's guideline is above 3, and 2.6 is below it. His guideline uses the simpler LTV that ignores gross margin, so the margin-adjusted figure here is the stricter test.
### SaaS customer acquisition cost benchmarks
I haven't found a published study I would trust for dollar customer acquisition costs on a $49 self-serve plan. What gets published are ratios and payback periods, which travel across price points better than dollar figures do.
| Measure | Published figure | Source |
| --- | --- | --- |
| New-customer CAC ratio, 2024 median | $2.00 of sales and marketing spend per $1 of new customer ARR, up 14% on 2023; $2.82 in the fourth quartile | [Benchmarkit 2025 report](https://www.benchmarkit.ai/2025benchmarks) |
| Blended CAC ratio | Down $0.19 (12%) in 2024 but about 10% above 2022, as expansion ARR reached 40% of new ARR | Benchmarkit 2025 report |
| CAC payback target | Under 12 months for SMB, under 18 for mid-market, under 24 for enterprise; 15 months on average at $1M to $10M ARR | Bessemer, September 2021 |
| LTV to CAC | Above 3 for the best SaaS businesses, sometimes 7 or 8 | [Skok, SaaS Metrics 2.0](https://www.forentrepreneurs.com/saas-metrics-2/) |
| Months to recover CAC | 5 to 7 for many top SaaS companies; profitability turns anemic past 12 | Skok |
| Sales and marketing spend as a share of ARR | Median 15% of ARR on selling and 8% on marketing for private B2B SaaS; equity-backed companies spend 70% more on sales and 100% more in marketing than bootstrapped ones | [SaaS Capital 2026 survey](https://www.saas-capital.com/blog-posts/spending-benchmarks-for-private-b2b-saas-companies/) |
*Benchmarkit divides total sales and marketing expense by new customer ARR; its blended ratio adds expansion ARR to the divisor.*
A ratio converts into payback with one line of arithmetic. At $2.00 per $1 of new ARR and an 80% gross margin (my assumption, since margins vary), payback is 2.00 / 0.80 = 2.5 years, or 30 months. To express your own CAC in those units, divide it by a customer's first-year revenue: $300 / ($49 x 12) = $0.51, against the survey's $2.00.
SaaS Capital's figures also show what bootstrapped teams face: equity-backed rivals put twice as much into marketing, and median growth was 20% for bootstrapped companies against 25% for those that raised venture capital.
### Why attribution changes CAC by channel
The numerator of CAC comes from a bank statement. The denominator is a judgment about which channel earns each customer. Count the $6,000 of ad spend four ways and its CAC moves.
| Credit method | Customers credited to ads | Ad CAC | Customers credited to content | Content CAC |
| --- | --- | --- | --- | --- |
| The ad platform's own report, 30-day click window | 21 | $286 | not reported | not reported |
| Last touch | 12 | $500 | 14 | $279 |
| First touch | 8 | $750 | 19 | $205 |
| Linear | 10 | $600 | 16.5 | $236 |
*Illustrative counts for the same 42 customers. Linear splits a sale touched by two channels 0.5 each.*
Identical spend gives a CAC from $286 to $750, a 2.6-times spread, depending on who gets the credit. Last touch suits judging the channels that close sales and first touch suits the ones that introduce buyers; the [comparison of last-touch, first-touch and linear models](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers when each applies. In practice the reported numbers drift apart for the reasons below.
- Google Ads counts a conversion that follows an ad click within a [window that defaults to 30 days](https://support.google.com/google-ads/answer/3123169). A customer who clicked an ad, followed a newsletter link 12 days later and paid a week after that shows up in the ad report and the newsletter's tally, so channel counts add up to more customers than paid. The [gap between self-reported and tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data) is a common reason channel CACs look better than the bank balance.
- GA4's attribution reports offer three models: data-driven, paid and organic last click, and Google paid channels last click. [Google's attribution documentation](https://support.google.com/analytics/answer/10596866) says first click, linear, time decay and position-based were removed in November 2023, and that every remaining model withholds credit from direct visits unless the whole path was direct. A first-touch CAC is therefore unavailable there, and [GA4 may not show revenue by channel](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) in the first place.
- Script-set cookies expire early in Safari. [WebKit's Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) deletes cookies created in JavaScript, and other script-writable storage, after 7 days without a user interaction on the site. A buyer who returns after 8 days arrives with no memory of the ad, so the sale lands in direct, which has no spend. Paid channels lose customers and their CAC rises while direct looks free. The [Safari ITP attribution post](https://www.trackrev.io/blog/safari-itp-attribution-saas) goes deeper on this.
Cost per customer is half of the picture, because channels differ in how long customers stay. In TrackRev's [Q2 2026 benchmark data](https://www.trackrev.io/data/saas-attribution-benchmarks), median 12-month LTV is 0.9x the workspace average for paid search and 0.8x for paid social, against 2.1x for organic search and 1.9x for newsletters. Apply the paid search multiplier to the earlier example: lifetime gross profit becomes $1,307 x 0.9 = $1,176, and the $500 ad CAC gives an LTV to CAC of 2.4 rather than 2.6.
### Getting CAC by channel from billing data
The way out of these distortions is to count customers from the system that charged them and credit each to a click you recorded yourself. [TrackRev's revenue attribution](https://www.trackrev.io/solutions/revenue-attribution) does that for the denominator. It reads charges from Stripe, Paddle, Polar or Lemon Squeezy, ties each to the tracked link that produced it, and lists conversions, revenue and revenue per click by channel on its Channels page. A lifetime value table below shows customers, orders including renewals and average LTV per customer. The credit rule is last touch by default, with first touch and linear one setting away, so the comparison above runs over a single set of click data.
TrackRev does not store ad spend or calculate CAC. You divide each channel's spend by its conversions in a spreadsheet. Revenue and lifetime value columns need a paid plan, which starts at $39 monthly; the free plan tracks 1,000 events a month with revenue figures hidden.
Give each channel time before reading its CAC. In the same benchmark data the median buyer pays 6.3 days after the first click, but the 90th percentile is 48.2 days, so a channel needs about 7 weeks of data before its number settles.
### How to lower customer acquisition cost
CAC is spend divided by customers, so only two things move it: what each channel costs and how many customers each dollar produces.
#### Set a ceiling from payback and cut what exceeds it
Work backward from the payback you can afford. At $39.20 of monthly gross profit, a 12-month ceiling is $39.20 x 12 = $470.40. The ad channel at $500 is over it and content at $279 is well under, so the next dollar of budget goes to content. A channel that looks free needs this test too: 5 hours a week for 13 weeks at $75 an hour is 65 hours, or $4,875. If it brought in no customers, its CAC is undefined and that sum is a pure loss.
#### Raise conversion before buying traffic
If $6,000 buys 600 ad clicks and 2% of them become customers, that is 12 customers at $500 each. A conversion rate of 3% on those clicks gives 18 customers at $333, a one-third cut with no change in spend.
#### Pay commission instead of buying clicks
Affiliate and referral commission is paid only after a customer pays, so its worst case is known in advance. A 20% commission recurring for 12 months on a $49 plan comes to $49 x 0.20 x 12 = $117.60 per customer, charged to you only if the customer stays. An ad channel bills you before anyone buys. The [affiliate program guide](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) works through the commission math, and TrackRev's affiliate product runs on the data model behind the attribution above. A [free workspace](https://www.trackrev.io/pricing) starts collecting data today, which matters because of the 7-week wait.
### Frequently asked questions
**What is a good customer acquisition cost?**
It depends on price, margin and churn, which is why payback and LTV to CAC are the usual tests. A $300 CAC pays back in under 8 months on a $49 plan with an 80% gross margin, but on a $9 plan at that margin a customer yields $7.20 monthly and payback takes 41.7 months.
**Does CAC include customers on a free plan or trial?**
No. A customer is someone who has paid. A person who joins a free plan in January and upgrades in April counts as an April customer, while the January spend that found them sits in an earlier period, which is why a trailing window helps. For products with a free tier, calculate CAC on paying customers and track cost per signup separately as a leading indicator.
**What is client acquisition cost for an agency or freelancer?**
It is the same formula with signed clients as the denominator. If outreach tools, proposal time and one conference ticket cost $2,000 in a quarter and won 4 clients, client acquisition cost is $500. Compare that with first-year gross profit per client: a $1,500 monthly retainer at a 50% margin returns $9,000. With only a handful of wins per quarter, a fifth client moves the figure to $400, so measure over 12 months.
**Can customer acquisition cost be too low?**
It can look low for the wrong reasons. Early adopters are the cheapest customers to acquire, and Bessemer reports that average CAC payback creeps up as companies mature. Treat a CAC measured on your first 30 customers as a floor. Unassigned direct signups also pull the blended number down without any channel earning it.
**How does churn change the CAC I can afford?**
Divide lifetime gross profit by 3 to get the highest CAC that still meets a 3 to 1 target. At 3% monthly churn, the $49 plan earns $1,307 over a lifetime, so the limit is $436. At 6% churn the lifetime halves to 16.7 months and earns $653, so the limit drops to $218, and a $300 CAC that looked comfortable now misses the target.
**Does TrackRev calculate CAC for me?**
No. Spend is an input TrackRev never sees, so the division stays in your spreadsheet. The Channels page supplies the customer side from billing data, and its lifetime value table supplies the LTV side. Revenue and lifetime value figures are locked on the free plan.
---
## What is deep linking, and how do Universal Links and App Links work?
URL: https://www.trackrev.io/blog/deep-linking-for-mobile-apps
Published: 2026-09-17
Author: Muzahid Maruf
What is deep linking? A deep link opens one screen in an app. Compare Universal Links, Android App Links and deferred links, with setup steps and fixes.
What is deep linking? It is the use of a link that opens a specific destination, such as the screen for product 123 in a mobile app, instead of the app's start screen or the site's home page. Such a link is a deep link, or deeplink.
The phrase has 2 meanings. On the web, [Wikipedia](https://en.wikipedia.org/wiki/Deep_linking) defines it as a hyperlink to a specific piece of content, such as example.com/path/page, and calls a 1996 Scottish case, The Shetland Times against The Shetland News, probably the earliest legal dispute over such links. In mobile development it means a link that opens a screen inside an app. Modern iOS and Android deep links are often ordinary https URLs, so the 2 meanings now overlap.
> **Key takeaways:**
>
> - A deep link opens one specific screen or page, such as /products/123. Apple Developer Documentation strongly recommends Universal Links over custom schemes, and Android Developers recommends App Links for your own website.
> - From Android 12 (API level 31), unverified web links open in the browser, so verify every domain, and treat deferred routing as best effort: Google shut down Firebase Dynamic Links on August 25, 2025.
> - A verified Universal Link or Android App Link opens the app without a request to your server, so a redirect log misses those taps.
### What is deep linking in a mobile app?
[Android Developers](https://developer.android.com/training/app-links/deep-linking) lists 3 types of deep link: custom deep links, web links and App Links. iOS offers 2: custom URL schemes and Universal Links.
| Type | Example | App installed | No app | Setup |
| --- | --- | --- | --- | --- |
| Custom URI scheme | myapp://products/123 | Opens the app; on Android a chooser appears if 2 apps share the scheme | Nothing to open | Register the scheme in the app |
| Universal Links (iOS) | https://example.com/products/123 | Opens the app directly, skipping Safari and your website | Opens the URL in the default browser | apple-app-site-association file plus the Associated Domains entitlement |
| App Links (Android 6.0 and later) | https://example.com/products/123 | Opens the app with no chooser once the domain is verified | Opens in the browser | assetlinks.json (Digital Asset Links) plus android:autoVerify in the manifest |
| Deferred deep link | Any of the above | Same as that type | App Store or Google Play first, then the right screen on first launch | Install referrer or a vendor SDK, plus code in the app |
*Behavior as described in Apple Developer Documentation and Android Developers guides, October 2026.*
[Apple Developer Documentation](https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app) warns that when 2 apps register one scheme, the system's choice is undefined, so I would keep custom schemes for links between your own apps.
#### Universal Links on iOS
Apple's [Universal Links documentation](https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content) splits the setup into a file on your server and an Associated Domains entitlement in the app.
apple-app-site-association, served at https://example.com/.well-known/apple-app-site-association
```
{
"applinks": {
"details": [
{
"appIDs": ["ABCDE12345.com.example.app"],
"components": [{ "/": "/products/*" }]
}
]
}
}
```
| Requirement | What Apple specifies |
| --- | --- |
| File name | apple-app-site-association, with no extension |
| Transport | https with a valid certificate and no redirects |
| Subdomains | Each one needs its own file and its own applinks: entry in the Associated Domains entitlement |
| First fetch | Since iOS 14 and macOS 11, devices get the file from Apple's content delivery network, which requests it from your domain within 24 hours |
*From the [Supporting associated domains guide](https://developer.apple.com/documentation/xcode/supporting-associated-domains) in Apple Developer Documentation, October 2026.*
A Universal Link tapped in Safari on its own domain stays in Safari, so test from Apple Notes or Messages.
> **How long an iOS fix takes to land:** Apple says its network requests the file within 24 hours and devices check for updates about once a week. A fix to the apple-app-site-association file made on day 0 can reach the network by day 1 and the last iPhones around day 8. Android 15 and higher is similar, at up to 7 days.
#### App Links on Android
App Links are web links the app has proven it owns through a Digital Asset Links file, so the system opens the app with no chooser. Android Developers' guide to [verifying App Links](https://developer.android.com/training/app-links/verify-android-applinks) says to wait at least 20 seconds after installing a test build before checking the result with adb.
AndroidManifest.xml intent filter
```
```
assetlinks.json, served at https://example.com/.well-known/assetlinks.json
```
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["YOUR_SIGNING_CERTIFICATE_SHA256"]
}
}
]
```
| Android version | What changed for deep links |
| --- | --- |
| Android 6.0 (API level 23) | App Links arrive; installing an app whose filter sets android:autoVerify to true starts domain verification |
| Android 11 (API level 30) and lower | The app becomes the default handler only if a matching assetlinks.json exists for every host in the manifest |
| Android 12 (API level 31) | A web link opens in your app only if the app is approved for that domain; otherwise it opens in the default browser |
| Android 12 (API level 31) and higher, for testing | adb can re-run verification by hand, and an app that targets a lower version can opt in with compat change 175408749 |
| Android 14 (API level 34) and lower | No background re-verification, so file changes are usually picked up at install or update |
| Android 15 (API level 35) | Domains are re-verified in the background, with changes taking up to 7 days to reach devices, and Dynamic App Links let an app adjust URL matching without a new release |
*From the Android Developers deep links and App Links verification guides, both last updated October 1, 2026.*
#### Deferred deep links
A deferred deep link survives the install, landing a new user on the linked screen at first launch. On Android, the [Play Install Referrer API](https://developer.android.com/google/play/installreferrer/library) gives the app the referrer URL of the install, the click timestamp and the install start time. It needs Google Play version 8.3.73 or later on the device. Google's guide, last updated February 26, 2026, says the data stays available for 90 days and the sample uses client library 2.2, and an app should call it once, on its first run after installation. Teams usually carry the destination in the `referrer` parameter of the [Play Store link](https://developer.android.com/distribute/marketing-tools/linking-to-google-play) and read it back through the API.
A Play Store link that carries a destination through the install
```
https://play.google.com/store/apps/details?id=com.example.app&referrer=screen%3Dproducts%2F123
```
Apple's documentation describes no step that carries a link through an App Store install, so on iOS a vendor or your own code does it. Firebase Dynamic Links offered that handoff until Google shut it down on August 25, 2025, after which clicked links return a 404 and calls to its Short Links API return a 400 or 403. Google's [deprecation FAQ](https://firebase.google.com/support/dynamic-links-faq) cites platform changes that made a stable post-install transition hard to deliver. I treat deferred routing as best effort, with a web page behind it.
### Why deep links fail
Test 4 cases besides the installed app: a phone without the app, an Android 11 phone next to an Android 12 one, a desktop browser, and a tap inside Instagram, where [in-app browsers](https://www.trackrev.io/blog/link-tracking-not-working-mobile) can block the handoff.
| Symptom | Likely cause | First check |
| --- | --- | --- |
| A chooser on Android 11, the browser on Android 12 | The app is not verified: assetlinks.json is missing, or the package name or SHA-256 fingerprint is wrong | Run `adb shell pm get-app-links com.example.app` |
| iPhone opens Safari | apple-app-site-association is missing, redirects, or lists the wrong app ID | Confirm the URL returns JSON directly, not a 301 or 302 |
| A fix changes nothing | Association files refresh on a schedule | Allow about 8 days on iOS and up to 7 days on Android 15 and higher, then reinstall the app on a test device |
| The campaign parameter never arrives | iOS 17 Link Tracking Protection can strip known tracking parameters in Messages, Mail and Safari Private Browsing | Put the campaign in the URL path, as the [iOS 17 link tracking post](https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas) explains |
### How tracking works with deep links
A tracked URL on your own domain logs the click on the server, then sends a 302 redirect. A verified Universal Link or Android App Link skips that request, so the app must report the tap.
> **Worked example with made-up numbers:** Suppose 1,000 people tap a campaign link and 600 of them already have the app. The redirect log records only the 400 taps from phones without it. If 3% of those 400 buy, the log shows 12 purchases from 400 clicks, a 3.0% rate. If 12% of the 600 app users also buy, that is 72 more purchases the log never saw, so the campaign really produced 84 purchases from 1,000 taps, or 8.4%. Without the app's side, the channel looks 2.8 times weaker than it is, and at $50 a purchase it never gets credit for $3,600 of revenue.
### Setting up deep links with TrackRev
TrackRev's [mobile deep links](https://www.trackrev.io/products/mobile-deep-links) host the files above. In the Mobile App Links section of the Domains settings you enter your iOS app ID, Android package name and SHA-256 fingerprints, and TrackRev serves apple-app-site-association and assetlinks.json on each verified [custom domain](https://www.trackrev.io/products/custom-tracking-domains). Each link can carry separate iOS, Android and desktop destinations, so a tap without the app reaches the App Store or Google Play (see [device-targeting redirects](https://www.trackrev.io/blog/device-targeting-redirects)).
It syncs revenue from Stripe, Polar, Lemon Squeezy and Paddle, so App Store and Google Play purchases are not included. No SDK goes in your app, so deferred routing or ad-network install measurement belongs with a vendor such as Adjust, AppsFlyer or Branch. The free plan covers 50 links and 1,000 tracked events a month, and revenue figures start on Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)).
### Frequently asked questions
**What are deep links?**
Deep links are URLs that go to one item, such as /products/123, instead of a front page or start screen.
**What is the difference between a deep link, a Universal Link and an App Link?**
Deep link is the general idea. Universal Links are Apple's verified https links, and App Links, available since Android 6.0, are Android's, checked through assetlinks.json.
**Do deep links work if the app is not installed?**
Universal Links and App Links fall back to the URL in a browser. A custom scheme has nothing to open, and reaching the right screen after an App Store or Google Play install takes deferred deep linking.
**What is deferred deep linking?**
Deferred deep linking remembers the tapped link, sends a person without the app to Google Play or the App Store, then opens the intended screen on first launch. Android has the Play Install Referrer API; iOS needs a vendor SDK.
**Do I need an SDK to use deep links?**
Not for Universal Links or App Links, which need an association file and app code that reads the URL. Deferred deep linking usually does need an SDK.
**Are deep links safe?**
Treat every parameter as untrusted input; Apple Developer Documentation calls custom URL schemes a potential attack vector.
---
## Device-targeting redirects: one link for the App Store, Google Play and the web
URL: https://www.trackrev.io/blog/device-targeting-redirects
Published: 2026-09-27
Author: Muzahid Maruf
How device targeting redirects send iPhone, Android and desktop visitors to different URLs with one 302, where User-Agent rules fail, and how to test them.
A device targeting redirect is one short link that reads the User-Agent header on each click and answers with a 302 that sends iPhones to the App Store, Android phones to Google Play and desktops to a web page. Set one destination per device class plus a default. The header separates phones from computers reliably. It can't tell whether the app is installed, and it misreads spoofed strings and iPads, which have sent a Macintosh string by default since Safari 13 in 2019.
> **Key takeaways:**
>
> - A 302 from a device targeting redirect can send iPhones to the App Store, Android phones to Google Play and desktops to a web page from one link.
> - iPads have sent a Macintosh string by default since Safari 13 in 2019, so they take the desktop rule.
> - A tap that opens an app through verified Universal Links or Android App Links never reaches your redirect, so it logs no click.
> - Use a 302 or 307, never a 301 or 308, and key any CDN cache on User-Agent.
### How device targeting redirects work
The browser's GET request carries a User-Agent header. The server sorts it into a device class and replies with a 302 and a Location header, so the visitor sees one hop. [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Browser_detection_using_the_user_agent) prefers feature detection and Client Hints such as Sec-CH-UA-Mobile, but a redirect has no page to run it in. Its shortcut for phones is to look for Mobi anywhere in the string and treat the rest as desktop.
#### User-Agent strings and the rule for each device
| Device | User-Agent string | Send it to |
| --- | --- | --- |
| iPhone, Mobile Safari 26 | `Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1` | Your App Store product page on apps.apple.com |
| Android phone, Google Chrome 143 | `Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Mobile Safari/537.36` | Your [Google Play listing](https://developer.android.com/distribute/marketing-tools/linking-to-google-play), `play.google.com/store/apps/details?id=` plus the package name |
| Android phone, Microsoft Edge 141 | `Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Mobile Safari/537.36 EdgA/141.0.0.0` | The same Google Play listing, because the Mobile token is still there |
| Windows PC, Google Chrome 143 | `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36` | Web sign-up or pricing page, with a QR code that points back at the short link |
| Mac, Safari 26 | `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15` | Web sign-up or pricing page |
| Googlebot 2.1 | `Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)` | The desktop or default page: it should work on any screen and show both store badges |
| curl 7.64.1 | `curl/7.64.1` | The desktop or default page |
*Strings from [MDN's User-Agent reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/User-Agent), last modified October 28, 2025.*
### Opening an installed app with Universal Links or App Links
Universal Links on iOS and Android App Links on Android 6 (API level 23) and later open an installed app straight from the tap. [Apple Developer Documentation](https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content) says the system skips the browser and your website. The [Android App Links guide](https://developer.android.com/training/app-links/about) adds that verified links skip the disambiguation dialog, and Dynamic App Links on Android 15 (API level 35) change the rules without an app release.
| Platform | File | Where it lives | Notes |
| --- | --- | --- | --- |
| iOS Universal Links | `apple-app-site-association` | `https://yourdomain.com/.well-known/` over HTTPS with a valid certificate and no redirects; one file per subdomain | Since iOS 14 and macOS 11 devices fetch it through Apple's CDN, which requests it within 24 hours; devices recheck about weekly ([associated domains documentation](https://developer.apple.com/documentation/xcode/supporting-associated-domains)) |
| Android App Links | `assetlinks.json` | `https://yourdomain.com/.well-known/assetlinks.json` | Android 6 and later; must match the SHA-256 fingerprint of the app's signing certificate |
An app opened from the tap sends your server no request, so it logs no click unless the app reports the open. Both files must sit on a domain you control, so a shared shortener can't open your app and a [custom tracking domain](https://www.trackrev.io/products/custom-tracking-domains) can. For a visitor who installs first, Android's [Play Install Referrer API](https://developer.android.com/google/play/installreferrer/library) gives the app referral data for 90 days through client library 2.2, and the [deep linking guide](https://www.trackrev.io/blog/deep-linking-for-mobile-apps) covers the rest.
### One QR code for every phone
One QR code serves both stores when it points at a device-targeting redirect, and the destinations can change after the print run, as [dynamic versus static QR codes](https://www.trackrev.io/blog/dynamic-qr-codes-vs-static) explains. The free [QR code generator](https://www.trackrev.io/tools/qr-code-generator) recommends printing at least 2 cm (0.8 in) wide with a 4-module margin. I would scan the final artwork with the camera app before printing, since a scanner inside another app can open an in-app browser.
### What changed in device detection: Safari 13 and Chrome 110
| When | Change | Effect on a redirect |
| --- | --- | --- |
| September 19, 2019, Safari 13 with iOS 13 | Safari for iPad shows desktop websites, which [Apple's release notes](https://developer.apple.com/documentation/safari-release-notes/safari-13-release-notes) describe as the same sites as Safari for macOS | An iPad on default settings takes the desktop rule; a Mac string reporting more than 1 from navigator.maxTouchPoints is almost always an iPad |
| Google Chrome 101 | Minor version zeroed: Chrome/101.3.2.1 becomes Chrome/101.0.0.0 | None for device rules |
| Google Chrome 107 | Desktop version and CPU fixed, such as Windows NT 10.0; Win64; x64 | None: desktops stay desktops |
| Google Chrome 110, February 2023 | Android version and model fixed: Android 13; Pixel 7 becomes Android 10; K, per the [Privacy Sandbox blog](https://privacysandbox.google.com/blog/user-agent-reduction-android-model-and-version) | Model rules stop working; Android and Mobile still match |
### In-app browsers and link previews
| Client | Token it sends | What it does |
| --- | --- | --- |
| Instagram, Facebook and LinkedIn in-app browsers | Instagram, FBAN, FBAV, MetaIAB, LinkedIn or LinkedInApp | Mobile rule fires, but each app decides whether a Universal Link or App Link opens your app |
| Slack link preview | `Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)` | Reads oEmbed, Twitter Card and Open Graph tags with HTTP Range headers |
| Facebook link preview | `facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)` | Reads Open Graph properties in the first 1 MB and needs an answer within a few seconds |
*App tokens from the [Matomo Device Detector](https://github.com/matomo-org/device-detector/blob/master/regexes/client/mobile_apps.yml); crawler strings from [Slack](https://api.slack.com/robots) and [Meta](https://developers.facebook.com/docs/sharing/webmasters/web-crawlers/) documentation.*
Preview fetchers take the desktop or default branch, so put Open Graph tags on that page. The post on [bot traffic filtering](https://www.trackrev.io/blog/bot-traffic-filtering-for-links) explains why those clicks are flagged and still redirected, and [link tracking not working on mobile](https://www.trackrev.io/blog/link-tracking-not-working-mobile) covers the rest.
### 301 versus 302: redirect type and caching
| Status | Name | Lifetime | Use it for device rules? |
| --- | --- | --- | --- |
| 301 | Moved Permanently | Meant to last forever | No |
| 308 | Permanent Redirect | Meant to last forever | No |
| 302 | Found | Temporary | Yes |
| 307 | Temporary Redirect | Temporary, method unchanged | Yes |
*Status classes as described in the MDN redirection guide.*
A permanent redirect kept by a browser or CDN pins the first device's answer for everyone behind it, and [MDN's redirection guide](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Redirections) says crawlers replace the original URL after one. [Google Search Central](https://developers.google.com/search/docs/crawling-indexing/mobile/mobile-sites-mobile-first-indexing) names Vary: user-agent for URLs that differ by device, so key any CDN cache the same way or skip caching.
### Routing by country as well
Country routing resolves the click's IP address to a country and picks the destination mapped to it. [MaxMind's accuracy page](https://support.maxmind.com/knowledge-base/articles/maxmind-geolocation-accuracy) estimates 99.8% for country, so route on country and nothing finer. A VPN user appears at the VPN's server, so write a default for every unmatched country, route price by country and language by the Accept-Language header, and keep legal restrictions in the destination.
| Resolution | MaxMind estimate | Safe to route on? |
| --- | --- | --- |
| Country | 99.8% | Yes, for a storefront, currency or legal page |
| US state or region | About 80% | Only as a soft preference |
| US city, within 50 km | 66% | No |
*MaxMind's published estimates for its GeoIP products.*
### Setting up device rules in TrackRev
TrackRev stores the country and city of every click but routes by device only. The Add device targeting option on the link form takes a mobile destination and a desktop destination, and a blank field falls back to the main URL. Phones share the mobile field, tablets take the main URL and an iPad in default mode takes the desktop field.
One mobile field means one phone destination, so split iPhone from Android with a page on your own domain, or use one link per store. This route handler does the first.
OS split on your own domain (Next.js route handler)
```
import { NextRequest, NextResponse } from "next/server";
const IOS = "https://apps.apple.com/app/id0000000000"; // your App Store listing
const ANDROID = "https://play.google.com/store/apps/details?id=com.example.app";
const WEB = "https://example.com/signup";
export function GET(req: NextRequest) {
const ua = req.headers.get("user-agent") ?? "";
if (/iPhone|iPod/.test(ua)) return NextResponse.redirect(IOS, 302);
if (/Android/.test(ua) && /Mobi/.test(ua)) return NextResponse.redirect(ANDROID, 302);
return NextResponse.redirect(WEB, 302);
}
```
Every click row keeps the device class, operating system, browser and country, so counts split by iPhone, Android and desktop on the free plan, which costs $0 and allows 50 links and 1,000 tracked events a month. Paid plans add the revenue those clicks led to, synced from Stripe, Paddle, Polar or Lemon Squeezy: Starter is $39 a month, Growth $99 and Scale $199, as the [pricing page](https://www.trackrev.io/pricing) lists.
To open an installed app, enter its identifiers under domain settings and TrackRev serves both association files on your verified custom domain. It is not a mobile measurement partner, so in-app event attribution needs a tool such as AppsFlyer or Adjust.
### Testing before you publish or print
| Device | Open it from | Should land on |
| --- | --- | --- |
| iPhone, Safari 26 | Safari, then the Camera app scanning a code made from the link | The App Store listing |
| Android phone, Chrome 143 | Chrome, then the camera | The Google Play listing |
| Windows PC, Mac or iPad | Any browser | The web sign-up page |
| Any phone | Instagram, LinkedIn and Mail | The store, the app or a blank page |
| Slack | Paste the link into a channel | A card with your Open Graph title and image |
Running curl with the iPhone string from the table prints the 302 status line and the Location header, so you can confirm the rule before picking up a phone.
Check the redirect an iPhone would get
```
curl -s -o /dev/null -D - \
-A "Mozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1" \
https://go.example.com/app
```
### Frequently asked questions
**Can one link send iPhones to the App Store and Android to Google Play?**
Yes, by matching iPhone, or Android with Mobile. TrackRev's link form has one mobile field, so splitting the App Store from Google Play takes a page of your own or one link per store.
**How does a redirect tell a phone from a laptop?**
It reads the User-Agent header. Chrome also sends Sec-CH-UA-Mobile, which is ?1 on a phone, and Sec-CH-UA-Platform by default.
**Will the link open my app if it is installed?**
Only if the domain serves apple-app-site-association for iOS and assetlinks.json for Android. Otherwise the person lands on the App Store or Google Play page and taps Open.
**Do Android tablets and iPads follow the mobile rule?**
No. Chrome omits Mobile on tablets and default Safari on iPad reads as a Mac, so in TrackRev a tablet takes the main URL and an iPad takes the desktop field.
**Can I route by country with TrackRev?**
No. TrackRev records each click's country but routes by device only, so use another tool or a country selector on your own page.
**Is device targeting on the free plan?**
Yes, within 50 links and 1,000 tracked events a month. Revenue figures and the affiliate or referral program need a paid plan from $39 a month.
---
## Dub.co vs TrackRev: what each one tracks, costs and lets you self-host
URL: https://www.trackrev.io/blog/dub-co-vs-trackrev
Published: 2026-06-10
Author: Muzahid Maruf
Dub.co vs TrackRev in October 2026: Dub tracks Stripe revenue and runs partner programs from $90 a month, TrackRev from $39. Open-source limits explained.
Dub.co vs TrackRev is a closer call than it used to be. Dub has grown from a link shortener into a platform that tracks Stripe and Shopify sales and runs partner programs, but both start on Dub Business at $90 a month, and the code you can self-host for free leaves them out. TrackRev Starter ties Stripe, Paddle, Polar and Lemon Squeezy revenue to the channel that earned it and runs affiliate programs for $39 a month, but TrackRev is closed source and has no self-hosted version.
I run TrackRev, so weigh my read accordingly. Dub's figures come from its [pricing page](https://dub.co/pricing) as of October 2026.
> **Key takeaways:**
>
> - Dub.co now tracks revenue and runs partner programs, but both start on Dub Business at $90 a month. TrackRev Starter includes them at $39.
> - A free Dub self-host gets links and click analytics. Conversion tracking and Dub Partners sit in an Enterprise Edition folder under a commercial license.
> - Dub sends partner payouts for a fee of 5% on ACH. TrackRev gives you a PayPal or Wise CSV to pay from.
> - TrackRev reads Stripe, Paddle, Polar and Lemon Squeezy with a read-only key and adds linear credit, but it is closed source.
### Dub.co vs TrackRev at a glance
| Feature | Dub.co | TrackRev |
| --- | --- | --- |
| Cheapest plan with revenue tracking | Business, $90/mo | Starter, $39/mo |
| Revenue sources | Stripe and Shopify apps, sale API for the rest | Stripe, Paddle, Polar, Lemon Squeezy |
| Attribution models | Last click, first click | Last touch, first touch, linear |
| Attribution window | 90 days by default | 90 days by default, set per program |
| Partner program | Dub Partners, from Business | Every paid plan |
| Paying partners | Dub sends the money, 5% on ACH | PayPal or Wise CSV, you mark paid |
| Commission hold | 0 to 90 days, default 0 | 0 to 180 days, default 0 |
| Source code | AGPLv3 core, commercial Enterprise Edition folder | Closed |
| Self-hosting | Links and click analytics | None |
| Link A/B testing | Business and up | None |
*Prices from each vendor's pricing page, October 2026.*
### What Dub.co is today
Dub describes itself as a link attribution platform. Dub Links makes short links on custom domains, Dub Analytics counts clicks and, from the Business plan, follows them to signups and sales, and Dub Partners runs affiliate and referral programs. The code has been public on [GitHub](https://github.com/dubinc/dub) since 2022 and has about 24,900 stars and 3,300 forks.
### Plans and limits side by side
Dub meters tracked events and new links on every [links plan](https://dub.co/pricing/links), while TrackRev's paid plans meter only partner commission. Yearly billing takes 10% off at Dub and 25% off at TrackRev, which charges nine months for twelve.
| Dub.co plan | Price/mo | Yearly/mo | New links/mo | Events/mo | Retention | Domains | Revenue tracking |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Free | $0 | $0 | 25 | 1,000 | 30 days | 3 | No |
| Pro | $30 | $27 | 1,000 | 50,000 | 1 year | 10 | No |
| Business | $90 | $81 | 10,000 | 250,000 | 3 years | 100 | Yes |
| Advanced | $300 | $270 | 50,000 | 1,000,000 | 5 years | 250 | Yes |
*Prices from each vendor's pricing page, October 2026. Enterprise is custom.*
| TrackRev plan | Price/mo | Yearly/mo | Links | Events/mo | Workspaces | Commission tracked/mo | Revenue tracking |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Free | $0 | $0 | 50 | 1,000 | 1 | None | No |
| Starter | $39 | $29.25 | Unlimited | Unlimited | 1 | $10,000 | Yes |
| Growth | $99 | $74.25 | Unlimited | Unlimited | Unlimited | $100,000 | Yes |
| Scale | $199 | $149.25 | Unlimited | Unlimited | Unlimited | Unlimited | Yes |
*TrackRev's published plans, October 2026.*
### Where Dub.co is stronger
On links, Dub has more tools. Geo targeting, device targeting, link cloaking, expiration, password protection and deep links are in its [links plan table](https://dub.co/pricing/links) from Dub Pro up, and Dub Business adds link A/B testing. Folders grow from 3 on Dub Pro to 20 on Business and 50 on Advanced. TrackRev covers [custom tracking domains](https://www.trackrev.io/products/custom-tracking-domains), bulk import, QR codes, deep links, expiration and password protection, with no A/B testing.
The developer side is wider too: native SDKs, API limits of 600, 1,200 and 3,000 requests a minute on Dub Pro, Business and Advanced, and event webhooks on every paid plan. TrackRev offers a REST API, CSV export and a sale.created webhook.
Partner payouts are where Dub does the most work for you. It sends the money, collects W-9 and W-8 forms, and sends 1099-NEC forms to US partners paid $600 or more in a year, as its [payout documentation](https://dub.co/help/article/partner-payouts) describes. Rewards can pay per sale, per qualified lead or per click, sale rewards can recur, and a refund creates a clawback automatically. Business caps a program at 500 partners and 3 partner groups, and Dub Advanced adds embedded referral dashboards, messaging and risk monitoring. TrackRev's payouts end at a PayPal or Wise CSV that you pay from and mark paid.
### Does Dub.co track revenue?
It does, from Dub Business at $90 a month. Dub Pro tracks clicks only: Dub's docs say conversion tracking, the Stripe integration and direct sale tracking all need Business or above.
Dub records each click on its server and appends a dub_id parameter to the destination URL. Its Dub Analytics script keeps that ID in a first-party cookie for 90 days by default, as [Dub's attribution guide](https://dub.co/docs/concepts/attribution) explains, and a lead event ties the ID to a signup. The Stripe app then listens for customer.created, customer.updated, checkout.session.completed, invoice.paid and charge.refunded and turns payments into sales. Last click wins by default, with first click as the alternative.
Setup takes engineering time. For subscriptions, [Dub's Stripe docs](https://dub.co/docs/integrations/stripe) recommend installing the app, adding the analytics script, calling the server SDK at signup, and passing your own user ID in Stripe Checkout metadata. Stripe Payment Links carry the click in a client_reference_id parameter prefixed with dub_id_ instead.
Stripe Checkout metadata for Dub (Node.js)
```
const session = await stripe.checkout.sessions.create({
mode: "subscription",
customer_email: user.email,
line_items: [{ price: priceId, quantity: 1 }],
success_url: "https://app.example.com/success",
metadata: { dubCustomerExternalId: user.id },
});
```
Dub's [integrations directory](https://dub.co/integrations) lists Stripe and Shopify as payment integrations, Polar as coming soon, and no Paddle or Lemon Squeezy entry, although the [sale tracking API](https://dub.co/docs/api-reference/track/sale) accepts paddle, polar and lemonsqueezy as payment processor values. Teams on those post each sale from their own webhook handler.
### How TrackRev tracks revenue by channel
TrackRev records the click server-side at the redirect, as Dub does, and adds one first-party pixel when you want revenue. For Stripe you paste a restricted read-only key. When a visitor identifies through a signup form, a checkout email field or a magic-link login, TrackRev binds their visitor ID to that email, then matches paid charges to the click by customer email inside the attribution window, which defaults to 90 days. The other three processors connect from their own integration pages.
Nothing in your checkout code changes, and the key also works with Stripe Connect accounts. The cost is that an email join can miss when a customer pays with a different address than the one they gave your site, and revenue arrives on an hourly poll unless you add the optional webhook.
TrackRev computes last-touch, first-touch and linear credit from the same click data. Take a $39 subscription bought after a YouTube link, an email and a Google Ads click, in that order: last-touch gives Google Ads all $39, first-touch gives YouTube all $39, and linear gives each of the three $13. [Last-touch vs first-touch vs linear](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers which model suits which decision. Renewals keep crediting the original click, and refunds net out of channel revenue. Processor wiring is in [attributing Stripe revenue to marketing channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels), and the product is on the [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution).
### What the same job costs
Revenue by channel needs Dub Business or TrackRev Starter. A partner program changes the sums, because Dub meters payouts and charges a fee to send them, while TrackRev meters commission tracked and leaves the sending to you.
| Scenario | Dub.co | TrackRev |
| --- | --- | --- |
| Revenue by channel, billed monthly | Business $90/mo, $1,080/yr | Starter $39/mo, $468/yr |
| Revenue by channel, billed yearly | $81/mo, $972/yr | $29.25/mo, $351/yr |
| Partners earn $2,000 a month | Dub Business $90 + 5% ACH fee $100 = $190/mo | TrackRev Starter $39 plus your own PayPal or Wise fees |
| Partners earn $6,000 a month | Dub Advanced $300 + 5% ACH fee $300 = $600/mo | TrackRev Starter $39 plus your own fees |
| Partners earn $12,000 a month | Dub Advanced $300 + 5% ACH fee $600 = $900/mo | TrackRev Growth $99 plus your own fees |
*Prices from each vendor's pricing page, October 2026. Dub's payout limit is $2,500 a month on Business and $15,000 on Advanced. TrackRev Starter tracks up to $10,000 of commission a month and Growth up to $100,000.*
| Payout route | Fee | Timing |
| --- | --- | --- |
| Dub ACH, Business and Advanced | 5% | Up to 4 business days |
| Dub card, Business and Advanced | 8% | Instant |
| Dub Enterprise | 3% ACH, 6% card | Same as above |
| TrackRev CSV for PayPal or Wise | No TrackRev fee | Weekly, every 2 weeks, monthly or quarterly batches |
*Fees from Dub's payout documentation and TrackRev's pricing FAQ, October 2026.*
Dub's fee pays for the sending, the tax forms and the 1099s. TrackRev collects W-9 and W-8 forms during partner onboarding, and its pages mention no 1099 filing. Whether $300 on a $6,000 month is worth it depends on how much of that work your team would otherwise do by hand, and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) walks through the manual route. To test either, Dub gives a 14-day free trial on every paid plan, and [TrackRev pricing](https://www.trackrev.io/pricing) lists what its free plan holds back.
### Self-hosting Dub.co and what stays open source
Dub's [license file](https://github.com/dubinc/dub/blob/main/LICENSE.md) puts most of the repository under AGPLv3 and the apps/web/app/(ee) folder under a commercial license. That folder's [own README](https://github.com/dubinc/dub/blob/main/apps/web/app/%28ee%29/README.md) names Dub Conversions and Dub Partners among its features and says the code may not be used to host your own copy of Dub's app without a license. Its api folder holds the stripe, track, partners and payouts code. A free self-host therefore covers links and click analytics, while revenue tracking and partner programs need a commercial license or Dub's hosted Business plan.
#### What a self-host needs
[Dub's self-hosting guide](https://dub.co/docs/self-hosting) has 9 steps and starts with six accounts: GitHub, Tinybird for click analytics, Upstash for Redis, PlanetScale for MySQL, Vercel for hosting, and Cloudflare or AWS for file storage, plus a domain. PlanetScale no longer has a free tier, and the guide suggests a $5-a-month Railway database as the cheaper route. The app depends on Vercel Edge Middleware, Docker is unsupported, and AGPLv3 obliges you to publish your changes if you offer a modified copy to users over a network. I have not priced the stack because each service bills on usage.
### When Dub.co is the better pick
Choose Dub for link data that has to sit in cloud accounts you control with no revenue tracking involved, link creation built into your own product on Dub's SDKs and API, a vendor that sends partner payouts and the 1099s, or a free start on 3 custom domains with geo targeting from Dub Pro at $30 a month and A/B tests from Dub Business at $90.
### When TrackRev is the better pick
As a Dub.co alternative, TrackRev makes sense when the job is revenue by channel at the lowest price: $39 a month against $90, with each billing system connected by key instead of through your own webhook code. The same plan adds linear attribution, a commission hold of 0 to 180 days set per program, and unlimited partners.
TrackRev is closed source, hands you a CSV to pay from, has no link A/B testing and relies on an email match. The [Dub comparison page](https://www.trackrev.io/compare/dub) lays the features out row by row, and [best link tracking software for SaaS](https://www.trackrev.io/blog/best-link-tracking-software-saas-2026) covers the wider field.
### Frequently asked questions
**What is Dub.co?**
Dub.co is a link management and attribution platform from Dub Technologies, Inc. Teams use it for branded short links, click counts, signup and sale tracking, and affiliate programs.
**Is Dub.co open source?**
Mostly. Dub calls its model open core: AGPLv3 for most of the repository and a commercial license for an Enterprise Edition folder. Conversion tracking and partner programs live in that folder.
**Can you self-host Dub.co?**
Yes, for the open-source part. Dub documents a 9-step Vercel deployment backed by Tinybird, Upstash and PlanetScale. TrackRev has no self-hosted option.
**Does Dub.co track revenue from Stripe?**
On Business and above, a Stripe app turns paid invoices, completed checkouts and refunds into sales. The Free and Pro plans stop at clicks.
**How much does Dub.co cost?**
Links plans run $0 for Free, $30 for Pro, $90 for Business and $300 for Advanced per month, and Enterprise is quoted individually. Dub Partners ships with Business and Advanced.
**Is TrackRev a Dub.co alternative?**
It is when you want revenue by channel or a partner program and Dub's $90 entry price is the obstacle. It is a poor swap if you need open-source code, link A/B testing, or a vendor that pays your partners.
**Does Dub.co have an affiliate program feature?**
Yes. Dub Partners covers applications, reward rules, partner dashboards, payouts and tax forms.
**Does TrackRev have a free plan like Dub.co?**
It does, with 50 links and 1,000 events a month for link tracking only. Revenue figures and affiliate programs begin on Starter, the same line Dub draws at Business.
---
## What is a dynamic QR code, and when do you need one?
URL: https://www.trackrev.io/blog/dynamic-qr-codes-vs-static
Published: 2026-09-21
Author: Muzahid Maruf
A dynamic QR code encodes a short link you can edit after printing and count scans on. How it differs from static, what it costs in 2026, and when to skip it.
A dynamic QR code encodes a short web address that redirects to your real destination, so you can change where it points after printing and count each scan. A static QR code encodes the destination itself: the pattern never changes and nothing records a scan.
Both look identical on a flyer. A typo in a static code on 10,000 flyers means reprinting all 10,000, while a dynamic code is fixed with an edit but depends on a service that stays paid and online.
> **Key takeaways:**
>
> - A dynamic QR code encodes a short redirect URL, so the destination can change after printing and each scan can be counted.
> - A short link keeps the grid small: at error correction level M an 87-character URL needs a 41 by 41 grid, while a 29-character short link needs 29 by 29.
> - Dynamic codes are a subscription. Uniqode deactivates them on cancellation, and Bitly's Core plan, $10 billed annually, allows 5 destination changes a month.
> - Use a 302 redirect on a domain you own, so edits reach returning visitors and you can switch providers without reprinting.
> - Choose static for engraved or molded codes and for URLs that never move.
### What a dynamic QR code is
A printed QR symbol cannot be edited. Whatever its modules hold on printing day is what every phone reads, under the rules of [ISO/IEC 18004:2024](https://www.iso.org/standard/83389.html), edition 4, published in August 2024. A version-n symbol is 17 + 4n modules wide, so version 3 is 29 by 29. A static code holds the destination URL, such as `https://example.com/spring-sale`. A dynamic code holds a short URL on a redirect server, such as `https://go.example.com/spring`.
When someone scans the dynamic code, the phone opens the short URL. The server looks up the current destination for the slug `spring`, logs the scan and answers with a redirect. Editing the destination changes one database row and leaves the printed symbol alone. A static code that encodes a tracked short link behaves as a dynamic one.
#### Check the redirect type
The Internet Engineering Task Force's [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-redirection-3xx) (June 2022) calls a 301 response heuristically cacheable in section 15.4.2, so a browser can keep sending a returning visitor to the previous destination after you change it. Section 15.4.3 says a client that receives a 302 ought to keep using the original URL. A terminal shows which one a short link returns:
Response from a short link that redirects with a 302 (example domain)
```
$ curl -sI https://go.example.com/spring
HTTP/2 302
location: https://example.com/spring-sale?utm_source=flyer&utm_medium=print&utm_campaign=spring26
```
TrackRev's short links return a 302. Run the same command on a vendor's link before you print.
### Dynamic vs static QR codes compared
| | Static QR code | Dynamic QR code |
| --- | --- | --- |
| Data in the symbol | The destination URL | A short URL on a redirect server |
| Repoint a printed code | No, reprint | Yes, edit the redirect |
| Scan counts | None; only the destination page sees the visit | Per scan: time, device, rough location |
| Data retention | None | 30 days to 2 years on Bitly plans |
| Price | Free | Free tier or a paid subscription |
| If you stop paying | Keeps working | Can stop working |
| Grid at level M for 87 and 29 characters | 41 by 41 modules | 29 by 29 modules |
| Best for | Fixed pages and Wi-Fi logins | Print runs and anything measured |
### How a short link shrinks the code
More data means a bigger grid, and the version number sets how many bytes fit.
| Version | Grid | Level L, 7% | Level M, 15% | Level Q, 25% | Level H, 30% |
| --- | --- | --- | --- | --- | --- |
| 2 | 25 by 25 | 32 | 26 | 20 | 14 |
| 3 | 29 by 29 | 53 | 42 | 32 | 24 |
| 4 | 33 by 33 | 78 | 62 | 46 | 34 |
| 5 | 37 by 37 | 106 | 84 | 60 | 44 |
| 6 | 41 by 41 | 134 | 106 | 74 | 58 |
| 9 | 53 by 53 | 230 | 180 | 130 | 98 |
*Byte-mode capacity per ISO/IEC 18004, confirmed by encoding test strings with the open-source qrcode library. Each level recovers about the percentage shown.*
A static code that carries its own tracking tags, `https://example.com/spring-sale?utm_source=flyer&utm_medium=print&utm_campaign=spring26`, runs to 87 characters. At level M that overflows version 5's 84 bytes and lands on version 6. The 29-character short link `https://go.example.com/spring` overflows version 2's 26 bytes and lands on version 3. Printed 2 cm wide with a 4-module quiet zone on each side, the modules measure:
| Encoded URL | Characters | Level M grid | Level H grid | Module size, M and H |
| --- | --- | --- | --- | --- |
| Static URL with 3 UTM tags | 87 | Version 6, 41 by 41 | Version 9, 53 by 53 | 0.41 mm and 0.33 mm |
| Dynamic short link | 29 | Version 3, 29 by 29 | Version 4, 33 by 33 | 0.54 mm and 0.49 mm |
*Module size is 20 mm divided by the grid width plus 8 quiet-zone modules.*
The short link's modules print 32% larger at level M and 49% larger at level H. Larger modules survive small prints and bad light better, so a short link helps most on packaging and stickers.
### Static codes can be measured too
A static code gets analytics only through the page it opens. [Google's guide](https://support.google.com/analytics/answer/10917952) lists 9 UTM parameters and says to always include 3: `utm_source`, `utm_medium` and `utm_campaign`. Add those to the encoded URL and Google Analytics 4 reports the sessions under Traffic acquisition. Give each placement its own `utm_content` value, such as `door` and `counter`, to compare spots.
That fits one poster that sends people to your own site, and it costs nothing. It counts sessions, so a scan followed by a closed tab leaves no trace. The tags also take 56 of the 87 characters in the example above and freeze into the print, so a moved landing page strands them. The [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming.
### What dynamic QR codes cost in October 2026
Vendors give static codes away and charge for the redirect. [Bitly publishes](https://bitly.com/pages/pricing) the limits that matter most for printed codes:
| Bitly plan | Price per month | QR codes per month | Destination changes per month | Scan history kept |
| --- | --- | --- | --- | --- |
| Bitly Free | $0 | 2 | None | Not listed |
| Bitly Core | $10, annual billing only | 5 | 5 | 30 days |
| Bitly Growth | $29 annual, $35 monthly | 10 | 20 | 120 days |
| Bitly Premium | $199 annual, $300 monthly | 200 | 110 | 1 year |
*Prices from each vendor's pricing page, October 2026.*
Core's 5 changes cover a weekly offer swap on one code (about 4 a month) but not on three codes (about 13). [Uniqode's](https://www.uniqode.com/pricing) dynamic codes start at $9 a month on annual billing only, with a 30-day money-back guarantee, and its FAQ lists a custom domain as a $2,000 per domain per year add-on on the Plus plan. [QR Code Generator Pro](https://www.qr-code-generator.com/pricing/) caps dynamic codes at 2 on Starter, 50 on Advanced and 250 on Professional, and Starter includes 10,000 tracked scans. Its euro prices load by script, so check them on its pricing page. For link-level comparisons beyond QR, the [Bitly alternatives guide](https://www.trackrev.io/blog/best-bitly-alternatives-2026) covers six tools.
> **Cancelling can switch printed codes off:** Uniqode's FAQ says cancelling makes your QR codes inactive, and its dynamic codes stop redirecting when the 14-day trial ends unless you upgrade. Ask every vendor before a print run: the paper outlasts the billing cycle.
### Put the redirect on a domain you own
A code that encodes a vendor's domain works only while your account does. On your own subdomain, such as `go.example.com/spring`, it can move to another provider with a DNS change, if the new provider can recreate the slugs. TrackRev supports [custom tracking domains](https://www.trackrev.io/products/custom-tracking-domains) and encodes the branded URL once one is active; the [branded short link guide](https://www.trackrev.io/blog/what-is-a-branded-short-link) covers the DNS setup. I put anything printed in volume on a dynamic code on my own domain, and anything permanent or offline on a static one.
### When a static QR code is the better choice
A Wi-Fi login has to be static. Android and iOS 11 and later read the network details straight from the image, according to the [ZXing project's barcode contents guide](https://github.com/zxing/zxing/wiki/Barcode-Contents):
Wi-Fi login payload
```
WIFI:T:WPA;S:mynetwork;P:mypass;;
```
That string is not a URL, so a redirect server has nothing to forward. A static code also fits anything that must outlive a subscription, such as an engraved plaque or a molded part, and a URL on your own site that will not move; if the page does move, a server-side redirect keeps that URL alive.
[TrackRev's free QR code generator](https://www.trackrev.io/tools/qr-code-generator) makes static codes in your browser with no signup or watermark, exports PNG or SVG and switches to error correction level H (30%) when you add a logo. The code encodes your link directly, so it never expires.
### Watch for stickers over printed codes
The Federal Trade Commission's [December 6, 2023 consumer alert](https://consumer.ftc.gov/consumer-alerts/2023/12/scammers-hide-harmful-links-qr-codes-steal-your-information) notes scammers covering parking-meter QR codes with their own. A dynamic code is harder to vet at a glance because the scanned address is a short link. In public places, print the short URL as text beside the code and inspect the spot now and then.
### Dynamic QR codes in TrackRev
In TrackRev a campaign has one destination URL and a short link per channel. Each link row has a QR icon that opens the designer with the link's URL filled in, so the printed code encodes the short link and each scan counts like any click, with device and location. Edit the campaign's destination later and every link under it, QR code included, follows. The [QR code designer](https://www.trackrev.io/products/qr-code-designer) has six dot styles, a logo overlay up to 2 MB, and PNG exports at 256, 512, 1024 or 2048 pixels, or SVG.
The redirect is a 302 that adds the link's UTM parameters to the destination, so Google Analytics gets a source and medium without a long URL in the pixels, and device targeting can send iPhone and Android scans to different stores.
The free plan includes QR codes within its 50 links and 1,000 tracked events a month, and hides revenue figures. Paid plans are Starter at $39, Growth at $99 and Scale at $199 a month (see [pricing](https://www.trackrev.io/pricing)), and annual billing pays for 9 months to get 12. On any of them, connect Stripe, Paddle, Polar or Lemon Squeezy and the same scans can be followed to payments; the [QR code tracking to revenue](https://www.trackrev.io/blog/qr-code-tracking-to-revenue) post walks through that setup.
Pick a dedicated QR vendor when you want it to build the page behind the code; QR Code Generator Pro lists 22 QR code types. TrackRev's codes point at a URL you already have. Pick Bitly if you need only a few codes a month and already pay for it.
### Frequently asked questions
**Can you turn a static QR code into a dynamic one?**
No. A printed symbol's data is fixed, and Uniqode's FAQ says a code's type cannot change after creation. Generate a new code that encodes a short link for the next print run.
**Do dynamic QR codes expire?**
Only if someone sets an expiry. Bitly lists QR code expiration scheduling from its Growth plan up. TrackRev links take an expiry date or a click cap, with a fallback URL for late scans.
**Is there a limit on how many times a dynamic QR code can be scanned?**
Some plans cap it. Bitly lists unlimited clicks and scans on every plan, including Free. QR Code Generator Pro includes 10,000 tracked scans on Starter and unlimited scans on Advanced and Professional. Uniqode resets its scan limits annually.
**Does a dynamic QR code work without an internet connection?**
No. The phone needs a connection twice, once for the redirect server and once for the destination. A static code holding plain text or Wi-Fi details needs none, since the image holds all the data.
**What size should I print a QR code?**
TrackRev's generator page recommends at least 2 cm (0.8 in) wide for a code scanned at arm's length, and roughly 1 cm of code per metre of scanning distance for posters. Keep a clear margin of 4 modules on every side, and scan the final artwork with 2 or 3 different phones before the print run.
**What should I look for in a dynamic QR code generator?**
Check five things: a 302 redirect, support for your own domain, what happens to printed codes if you cancel, any monthly limit on destination changes or scans, and SVG export for print.
---
## Everflow alternatives: what to use instead, by type of program
URL: https://www.trackrev.io/blog/everflow-alternative
Published: 2026-07-22
Author: Muzahid Maruf
Everflow lists no price and needs a 6-month commitment. See TUNE, Affise, Trackdesk, Rewardful, Tolt and TrackRev with published prices, and when to stay.
The right Everflow alternative depends on what you run on it. Everflow publishes no price, asks for a 6-month commitment and wants your monthly affiliate payouts, in 5 bands, before it quotes. Networks and agencies that want a posted price look at TUNE ($899 a month), Affise ($499 on a signed contract) and Trackdesk ($299). A SaaS company paying affiliates on subscriptions can start much lower, at $39 to $69 with TrackRev, Rewardful, FirstPromoter or Tolt.
I build TrackRev, which is one of the options below.
> **Key takeaways:**
>
> - Everflow's price comes only from a quote request that asks for 1 of 5 payout bands, its plans carry a 6-month term, and new clients get a one-time onboarding service.
> - Networks and agencies that want a posted price can compare TUNE from $899, Affise from $499 on a contract and Trackdesk from $299.
> - SaaS programs on Stripe start at $39 with TrackRev, $49 with Rewardful or FirstPromoter and $69 with Tolt, but those plans meter commission tracked or affiliate revenue.
> - Everflow does track Stripe subscriptions, so the reasons to leave are the quote-only price, the 6-month term and a feature set wider than one program needs. The reasons to stay are Everflow Pay, 5 app-attribution partners and its marketplace.
### What Everflow publishes about price and terms
Everflow's [pricing page](https://www.everflow.io/pricing) is a quote form. It asks whether you already run an affiliate or referral program, whether you are a brand, network, agency or publisher, and what you pay affiliates monthly, in bands that run from "No payouts yet" up to "$250K to $1M+". The page metadata describes the price as personalized to business needs and payout volume.
| Item | What Everflow publishes |
| --- | --- |
| Price | None; the quote form asks which of 5 payout bands you pay |
| Term | 6 months, required on its plans |
| Onboarding | A one-time service for new clients, with no price given |
| Free plan or trial | Neither listed; the page offers a demo |
| Migration | Free data migration from any platform, including API-based moves from TUNE, CAKE and HitPath |
| Partner payouts | No fee on domestic ACH and wire; USD international payments cost the partner $29 under $10,000 and $40 at $10,000 or more, with a $50 minimum |
| Payout usage fees | Billed to the advertiser by monthly volume; the amounts come from your account manager |
| Security | SOC 2 certified |
*From Everflow's pricing page, [FAQ](https://www.everflow.io/faq) and [Everflow Pay fee guide](https://helpdesk.everflow.io/customer/understanding-everflow-pay-fees-who-pays-them), October 2026.*
### Why teams look for an Everflow alternative
#### The price arrives after a demo
You cannot hold a quote form against a budget until someone has called you, and the 6-month term makes an accepted quote a half-year decision. [Rewardful](https://www.rewardful.com/pricing-schedule) posts 11 tiers, from $49 for $7,500 of monthly revenue up to $5,000 for $2,500,000, so even a large program sees its price before any call.
#### Breadth that a single program rarely uses
Everflow's FAQ names brands, agencies and ad networks as customers, and its [B2B page](https://www.everflow.io/solutions/b2b) adds white-label portals and one account for an agency's several clients. Its [integration page](https://www.everflow.io/partner/integrations) lists 48 connectors, including Invoca, Ringba, HubSpot and Salesforce, and the help center covers 5 app-attribution partners and cost imports from Google Ads, Meta Ads and TikTok Ads. A small SaaS program billed through Stripe uses almost none of it.
#### How Everflow tracks Stripe subscriptions
Everflow's 10-step [Stripe integration guide](https://helpdesk.everflow.io/customer/stripe-integration) has it read the `charge.succeeded` event, attribute each rebill to the partner it matches by email and report refunds. Your site first sends the initial conversion with the customer's email, through the JavaScript SDK or a server postback. The offer needs Email Attribution on, the rebill as its Associated Event and Allow Duplicate Events enabled, and Stripe needs a restricted key with read access to 5 objects plus write access to Webhook Endpoints. I found no Paddle, Polar or Lemon Squeezy integration in Everflow's library, and its FAQ names postbacks and Zapier for anything without a connector. TrackRev's [Stripe connection](https://www.trackrev.io/integrations/stripe) also joins on email, through a first-party pixel and a read-only restricted key.
### Alternatives for SaaS and store programs
| Platform | Per month | Per year | Trial | What the plan meters | Billing and stores |
| --- | --- | --- | --- | --- | --- |
| Everflow | Quote | Quote | None listed | Affiliate payout volume | Stripe, Shopify, WooCommerce, BigCommerce, ClickFunnels, ClickBank |
| [Tapfiliate](https://tapfiliate.com/pricing/) | $89 Launch, $74 billed yearly | $890 | 7 days | 500 conversions and 50 affiliates | 30+ pre-built, including Shopify, BigCommerce and Stripe |
| Rewardful | $49 | $490 | 14 days | $7,500 of revenue | Stripe plus 20+ integrations |
| [FirstPromoter](https://firstpromoter.com/pricing) | $49 | $490 | 14 days, no card | $5,000 of revenue from affiliates | Stripe, Paddle, Chargebee, Recurly, Braintree |
| [Tolt](https://tolt.com/pricing) | $69 | $828 | 14 days, no card | $10,000 earned from affiliates | Stripe, Paddle |
| TrackRev | $39 | $351 | Free plan, link tracking only | $10,000 of commission tracked | Stripe, Paddle, Polar, Lemon Squeezy |
*Prices from each vendor's pricing page, October 2026. Yearly figures use the vendor's annual price where it lists one, and 12 monthly payments where it does not.*
#### What each SaaS plan costs as affiliate revenue grows
The SaaS tools meter different things, so entry prices mislead. Rewardful and FirstPromoter count affiliate revenue, TrackRev counts the commission paid on it (shown here at a 20% rate), and Tolt words its limits of $10,000, $20,000 and $50,000 as money earned from affiliates, so confirm which it means before comparing.
| Affiliate revenue per month | Rewardful | FirstPromoter | TrackRev |
| --- | --- | --- | --- |
| $5,000 | Starter, $49 | Starter, $49 | Starter, $39 ($1,000) |
| $15,000 | Growth, $99 | Business, $99 | Starter, $39 ($3,000) |
| $60,000 | Enterprise 75k, $299 | Enterprise, from $149 | Growth, $99 ($12,000) |
*Plan chosen from each vendor's limits, October 2026. TrackRev's commission is in brackets.*
### Alternatives for networks and agencies
| Platform | Plan | Per month | What the plan includes |
| --- | --- | --- | --- |
| TUNE | Enterprise, for networks | $899, paid annually | Unlimited offers and partners; TUNE Pay is an add-on |
| TUNE | Scale, for advertisers | $1,500, paid annually | 2,500 conversions; onboarding and partner payments cost extra |
| Affise | Beginner | $625, or $499 on contract | 7,000 conversions, 5 million impressions, 50 offers |
| Affise | Core | $888, or $699 on contract | 40,000 conversions, 15 million impressions, 2 custom domains |
| Affise | Expand | $1,239, or $999 on contract | 50,000 conversions, 20 million impressions, 5 custom domains |
| Trackdesk | Business | $299 | 5 seats, 10 active offers, 100 coupons |
| Trackdesk | Enterprise | $499 | Uncapped seats, offers and coupons, white label, custom domain, full API |
*Prices from each vendor's pricing page, October 2026. Affise lists a lower rate for a signed contract.*
[TUNE's network page](https://www.tune.com/solutions/networks/compare-plans/) offers up to 13% off for paying a year upfront, and its [advertiser page](https://www.tune.com/solutions/advertisers/compare-plans/) lists SOC 2 Type II and SOC 1 Type II accreditation. [Affise](https://affise.com/pricing/) asks for 30 days of written notice to cancel and lists a 14-day trial on every plan, while [Trackdesk](https://trackdesk.com/pricing) lists Enterprise PLUS from $1,199. The [TUNE alternatives guide](https://www.trackrev.io/blog/tune-alternative) and [Trackdesk alternatives guide](https://www.trackrev.io/blog/trackdesk-alternative) go further into those two.
### When Everflow is still the better choice
- You pay partners abroad: Everflow Pay verifies them and pays at home and overseas, and its managed tier also collects tax documents and schedules the payments.
- Your partners drive app installs measured in AppsFlyer, Adjust, Branch, Kochava or Singular.
- You buy media and want Google Ads, Meta Ads and TikTok Ads costs beside partner results.
- You run several clients from 1 account, the agency setup its B2B page describes.
- You pay for stages after the first sale, such as a qualified lead or a signed contract.
- You want a curated marketplace to find affiliates you do not know yet.
### Everflow vs TrackRev
| Capability | Everflow | TrackRev |
| --- | --- | --- |
| Attribution choices | First touch or last touch, set per offer | Last, first or linear on the same sales |
| Channels beyond affiliates | Direct links, QR codes, coupon codes and ad-cost imports | Tracked links and QR codes ranked by revenue beside affiliates |
| Partner payments | Everflow Pay, with managed payments and tax paperwork | PayPal or Wise CSV export; you pay, then mark each payout paid |
| Refunds | Stripe refunds appear in a Refund Report | A refund or dispute removes its commission |
| Partner marketplace | Yes | No |
| App-install tracking | 5 mobile measurement partners | None; deep links open the app |
*Everflow facts from its pricing page, FAQ, B2B page and help center; TrackRev facts from its pricing and product pages, October 2026.*
### Where TrackRev fits and where it does not
TrackRev runs [an affiliate program](https://www.trackrev.io/solutions/affiliate-program), link tracking and [revenue attribution](https://www.trackrev.io/solutions/revenue-attribution) on one data model, so a partner's link and an ad link report revenue into the same channel table. Partners sign in to a [portal on your domain](https://www.trackrev.io/products/white-label-branding), recurring commissions follow each renewal, and each program sets its own payout hold from 0 to 180 days, 0 by default.
The [plans](https://www.trackrev.io/pricing) meter commission tracked in a calendar month: $10,000 on Starter (1 workspace), $100,000 on Growth (unlimited workspaces) and no limit on Scale, which adds priority support. Annual billing pays for 9 months and gives 12, so a year costs $351, $891 or $1,791. Past a plan's cap, new commissions stop being written until you upgrade or the month rolls over. The free plan has 50 links and 1,000 tracked events and covers link tracking only, so an affiliate program needs a paid plan.
It has no marketplace of existing affiliates and no app-install integrations, and it never sends the money: you export a PayPal or Wise file, pay from there and mark each payout paid. Webhooks such as `sale.created` exist, and there is no Zapier app.
### Moving a program off Everflow
- Check when your 6-month term ends before picking a cutover date, and send TrackRev support whatever export Everflow gives you, which it maps and loads for you.
- Run both systems through one payout cycle, the staged method in Everflow's FAQ: export data, map IDs, run shadow traffic, cut over.
- Give partners new links and keep the old tracking live for 90 days, since an Everflow first-touch cookie can persist that long.
### Which alternative fits which program
| Your situation | Shortlist |
| --- | --- |
| You run an affiliate or ad network | Affise from $499, Trackdesk from $299, TUNE from $899, or stay on Everflow |
| You are an agency with several clients | Everflow's multi-client account, or Affise, which sells to small and medium agencies |
| Partners drive app installs | Everflow or TUNE |
| You sell on Shopify or WooCommerce | Tapfiliate at $89, or Everflow |
| Subscriptions billed in Stripe | Tolt ($69), FirstPromoter ($49), Rewardful ($49) or TrackRev ($39) |
| Billing on Chargebee, Recurly or Braintree | FirstPromoter, whose pricing page lists all three |
| Billing on Polar or Lemon Squeezy | TrackRev, which reads both |
| Affiliates run beside ads and email, and you want every channel ranked by revenue | TrackRev |
With 1 product and its own partners, I would start with a posted-price tool and ask Everflow for a quote once payouts abroad or app installs enter the picture. TrackRev's paid plans start at $39, and the [Rewardful alternatives comparison](https://www.trackrev.io/blog/best-rewardful-alternatives-2026) covers the SaaS-priced tools in more depth.
### Frequently asked questions
**How much does Everflow cost?**
There is no posted price. Ask for the onboarding cost and the Everflow Pay usage fees in writing, because neither appears on the quote page.
**Does Everflow have a free trial?**
None is listed. Rewardful, FirstPromoter, Tolt and Affise list 14-day trials, Tapfiliate lists 7 to 30 days, and TrackRev has a free plan with 50 links and 1,000 tracked events.
**What is the cheapest Everflow alternative for SaaS?**
TrackRev's entry plan is $39, ahead of Rewardful and FirstPromoter at $49 and Tolt at $69. Compare each plan's limit with your monthly affiliate revenue before choosing.
**Does Everflow work with Stripe subscriptions?**
Yes. Its 10-step guide covers rebills and refunds, but the first conversion must carry the customer's email so later charges can be matched to a partner.
**Does Everflow support first-touch and linear attribution?**
It offers first touch and last touch per offer, with last touch as the default, and a first-touch cookie lasts up to 90 days. Its help center describes no linear option.
**What do Everflow Pay fees cost partners?**
Domestic ACH and wire carry no fee. International payments in USD cost $29 under $10,000 and $40 above, with a $50 minimum, and conversion to a local currency costs only the exchange spread.
**Can TrackRev replace Everflow for a network or agency?**
No. It has no affiliate marketplace, no app-install integrations and no payout processing. Growth ($99) and Scale ($199) give unlimited workspaces, which keep client data apart, but the product is built around one company's own program.
---
## Google Analytics 4 not showing revenue by channel: four checks that find the cause
URL: https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel
Published: 2026-07-11
Author: Muzahid Maruf
Google Analytics 4 shows no revenue by channel when the purchase event lacks a value, UTMs get lost, or Stripe renewals skip the browser. Four checks find it.
If Google Analytics 4 is not showing revenue by channel, one of four things is usually behind it: the purchase event lacks a value or currency, it arrives with no campaign source, the report credits a different scope, or the money never passed through a browser, as with every Stripe renewal.
Configuration fixes clear the Direct, Unassigned and (not set) rows in an afternoon. Renewals, refunds and any trial longer than 7 days need events that Stripe creates and the Google Analytics tag never sees.
> **Key takeaways:**
>
> - Google Analytics 4 counts a purchase toward Total revenue only when the event carries both a value and a currency.
> - Stripe renewals, trial conversions and refunds fire no browser event. A $29 plan paid 12 times leaves Google Analytics 4 holding 1 payment, 8.3% of the year's revenue, unless your server posts the rest.
> - Stripe as a referrer, Unassigned and (not set) rows are configuration problems. The fixes inside Google Analytics 4 are an unwanted-referrals entry, a custom channel group or a Session dimension.
> - Traffic acquisition, User acquisition and Model comparison credit 1 sale to 3 different channels, because their user, session and event scopes differ.
> - A 14-day trial is 336 hours, 7 times Google's 48-hour Measurement Protocol guidance and twice the 7 days Apple Safari keeps a script-written cookie.
> - TrackRev reads revenue from Stripe and joins each charge to the original click by email, from $39 a month, while Google Analytics 4 stays in place for on-site behavior.
### GA4 not showing revenue by channel: match your symptom
| What you see in Google Analytics 4 | Usual cause | Where to look |
| --- | --- | --- |
| Total revenue is $0.00 on every row | Purchase event missing, or sent without a value or currency | Check 1 |
| Revenue appears a day late | Processing runs up to 24 to 48 hours | Check 1 |
| Google Analytics total far below Stripe | Renewals, trial charges and refunds fire no browser event | Check 2 |
| Most revenue under Direct | Cookie lost, UTMs stripped, domains not linked | Check 3 |
| Revenue under stripe.com / referral | checkout.stripe.com missing from unwanted referrals | Check 3 |
| Revenue under Unassigned | utm_medium matches no default channel rule | Check 3 |
| Source and medium read (not set) beside revenue | Event-scoped dimension used on a non-key event | Check 4 |
| 2 reports name different channels for 1 sale | Session, user and event scopes credit differently | Check 4 |
#### Check 1: Does the purchase event carry a value and a currency?
Open DebugView, send 1 test purchase and expand the event. Google's help page for the [Traffic acquisition report](https://support.google.com/analytics/answer/12923437) says a purchase sent without both parameters never reaches Total revenue.
| Field | What Google expects | Example: $39 plan, $3.12 tax |
| --- | --- | --- |
| value | Pre-tax amount, with shipping and tax left out | 39, never 42.12 |
| currency | ISO 4217 code, required whenever value is set | USD |
| transaction_id | Unique per order, because matching IDs are deduplicated | 1 per order, never an empty string |
*From the [purchase event reference](https://developers.google.com/analytics/devguides/collection/ga4/reference/events) and the [transaction ID page](https://support.google.com/analytics/answer/12313109). Deduplication works on web streams only.*
Purchase data lags in reports, and the [data freshness page](https://support.google.com/analytics/answer/11198161) lists 2 to 6 hours for intraday data, 12 hours for daily data on a standard property and 24 to 48 hours for full processing.
##### Stripe Checkout runs on Stripe's page
A Stripe Checkout page cannot run your tag. Stripe's [conversion funnel guide](https://docs.stripe.com/payments/checkout/analyze-conversion-funnel) tags 3 pages (product, success and canceled) and counts begin_checkout events and success views, none with an amount, so build the revenue event on the success page or on your server. End success_url with ?session_id={CHECKOUT_SESSION_ID}, as [Stripe's redirect documentation](https://docs.stripe.com/payments/checkout/custom-success-page) shows, and look up the Checkout Session for its amount.
Success page: a purchase event with revenue
```
// after your server returns the Checkout Session for session_id
gtag("event", "purchase", {
transaction_id: "cs_live_a1B2c3", // Checkout Session ID, unique per order
value: 39.0, // pre-tax amount in major units
currency: "USD",
items: [{ item_id: "starter-monthly", item_name: "Starter plan" }],
});
```
A success page can be reloaded or never reached, so it undercounts and double counts, and transaction_id fixes only the second. A trial subscription counts as paid once its $0 trial invoice is processed, per the [Checkout Session reference](https://docs.stripe.com/api/checkout/sessions/object), so on day 1 the page has no revenue to report.
#### Check 2: Do Stripe's paid invoices match Google Analytics 4?
Export 7 days of paid invoices from the Stripe Dashboard and compare the count and pre-tax total with the Ecommerce purchases report. Stripe reports the smallest currency unit, so 3900 means $39.00.
##### Renewals, refunds and off-session charges
Stripe charges month 2 from a saved card with no browser open, and refunds the same way, so no tag fires for either. Unless your server posts 1 purchase per paid invoice plus a refund event with the original transaction_id, Google Analytics adds a subscription's revenue once and never subtracts it.
> **Worked example: 40 subscribers at $29:** A cohort of 40 customers clicks a Google Ads link and each chooses a $29 monthly plan. The success page reports 40 purchases and $1,160 in month 1. Over 12 months Stripe collects $13,920. Google Analytics holds $1,160 of it, 8.3%, and the other 11 payments per customer sit in Stripe with no channel row to land in.
Google asks that [Measurement Protocol events joined to browser events](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events) arrive within 48 hours of the client-side event, and warns that later ones may not process as expected for conversion attribution. A month 2 renewal lands about 720 hours after the click. UTMs on Measurement Protocol purchases can also override a Google Click ID source, so copy them only for a new campaign interaction. The [6-step build for posting Stripe invoices to GA4](https://www.trackrev.io/blog/connect-google-analytics-stripe-revenue) covers the webhook.
##### Trials longer than a week
Take a $29 plan with a 14-day trial and a Google Ads click on day 0. The hours between the click and each payment decide what Google Analytics can credit.
| Payment | Day | Hours after click | Inside 48 hours | Amount |
| --- | --- | --- | --- | --- |
| Trial starts on the success page | 0 | 0 | Yes | $0 |
| Charge 1 | 14 | 336 | No | $29 |
| Charge 2 | 44 | 1,056 | No | $29 |
| Charge 12 | 344 | 8,256 | No | $29 |
*Hours counted from the click, with 30-day months. The 48-hour limit is Google's Measurement Protocol guidance.*
Session rules still allow credit: a direct return takes the last non-direct source the browser remembers, per Google's [referral exclusion page](https://support.google.com/analytics/answer/10327750), and Google says the [key event lookback window](https://support.google.com/analytics/answer/10597962), 90 days by default for most events, also applies to session attribution. The cookie is the weak link. Google Analytics 4 writes _ga from JavaScript, [Google's cookie documentation](https://developers.google.com/analytics/devguides/collection/ga4/cookie-usage) says Apple Safari limits first-party cookies to 7 days without a return visit (Google Chrome allows 400), and [WebKit's policy](https://webkit.org/tracking-prevention/) says Intelligent Tracking Prevention deletes script-written cookies after 7 days without interaction. A Safari visitor who returns on day 12 arrives as a new user, and the paying session is credited to whatever brought that visit, often Direct. In my view a trial longer than 7 days is where Google Analytics 4 stops working as a revenue tool.
##### Blocked tags and declined consent
A visitor who blocks the tag sends nothing to Google Analytics. A visitor who declines cookies shows up only when consent mode modeling covers the property, and Google's [behavioral modeling page](https://support.google.com/analytics/answer/11161109) sets the bar at 1,000 events a day with analytics_storage denied for 7 days plus 1,000 daily users with it granted on 7 of the previous 28 days. Modeling covers user, session and new-user counts. A site that rarely reaches 1,000 consenting users a day cannot qualify.
#### Check 3: Where does the revenue sit?
Open Traffic acquisition, set the dimension to Session source / medium and read Total revenue to see which row holds the money.
##### Direct
Google Analytics 4 labels a session Direct when the source is exactly (direct) and the medium is (not set) or (none). Google's [page on (direct) / (none) traffic](https://support.google.com/analytics/answer/15258820) lists links without UTMs, [redirects that strip them](https://www.trackrev.io/blog/why-utm-parameters-get-stripped), shorteners such as bit.ly, typed URLs, offline documents and ad blockers, so some Direct revenue is genuine.
Checkout adds one more. Without [cross-domain measurement](https://support.google.com/analytics/answer/10071811) each domain creates its own IDs, so 1 visitor moving from your marketing site to a billing domain becomes 2 users and 2 sessions unless a _gl linker parameter carries the IDs across.
##### Stripe as a referrer
A return from Stripe Checkout can arrive with checkout.stripe.com as the referrer and be filed as a referral. Add the domain to the [unwanted referrals list](https://support.google.com/analytics/answer/10327750) on the web stream, which holds up to 50 entries.
##### Unassigned
Google Analytics 4 files a session under Unassigned when no channel rule matches, and the [default channel group rules](https://support.google.com/analytics/answer/9756891) are literal about spelling. Email needs the word email, or a variant such as e-mail, in the source or medium, Affiliates needs the medium affiliate, and Paid Search, Paid Social and Paid Video need a listed source plus a medium matching cp, ppc, retargeting or a paid prefix.
| utm_source / utm_medium | Channel assigned | Rule that decides it |
| --- | --- | --- |
| weekly-digest / email | Email | Medium is email |
| weekly-digest / newsletter | Unassigned | No rule matches the word newsletter |
| acme-partners / affiliate | Affiliates | Medium is affiliate |
| acme-partners / partner | Unassigned | No rule matches the word partner |
| acmeads / cpc | Paid Other | A cpc medium with a source outside Google's lists |
*Applied from Google's default channel group rules, October 2026. Source names are examples.*
The default group cannot be edited. Tag new links with the mediums in the [free UTM builder](https://www.trackrev.io/tools/utm-builder) and cover live ones with a [custom channel group](https://support.google.com/analytics/answer/13051316). A standard property holds 2 of them, with up to 50 channels each, and they apply retroactively.
#### Check 4: Which report and scope are you reading?
Three reports can credit 1 sale to 3 channels, and each is correct by its own rule.
| Report | Dimension | Scope | What it credits |
| --- | --- | --- | --- |
| Traffic acquisition | Session default channel group | Session | The current session, reset after 30 minutes of inactivity or on a return visit |
| User acquisition | First user default channel group | User | The channel that first brought the user, fixed for good |
| Model comparison | Default channel group | Event | Key events only, by data-driven or last click credit, with a 90-day default lookback |
*Scopes as defined on Google's [traffic-source scopes page](https://support.google.com/analytics/answer/11080067), October 2026.*
User and session scopes use the paid and organic channels last click model and ignore the attribution setting. Event-scoped reports follow it, but since November 2023 the choices are data-driven and last click, so the First user dimensions answer what introduced a customer. A subscriber who first arrived through Organic Search in March, then clicked a Paid Search ad in April and paid in that session, shows as Organic Search in User acquisition and Paid Search in Traffic acquisition.
Unprefixed Source and Medium are event-scoped and read (not set) for non-key events, so use Session source and Session medium, or mark purchase as a key event.
### What you can fix in Google Analytics 4 and what you cannot
| Cause | Fix inside Google Analytics 4 | Google's limit | What it recovers |
| --- | --- | --- | --- |
| Purchase sent without value or currency | Add both parameters to the event | None | Purchases from the day it ships |
| checkout.stripe.com as a referrer | Add it to unwanted referrals | 50 per stream | Referral handling from the change |
| Unassigned channel | Custom channel group | 2 per standard property, 50 channels each | Past and future data |
| (not set) beside revenue | Switch to Session source / medium | None | Past data |
| Domains not linked | Cross-domain measurement with _gl | 100 conditions | New sessions |
| Renewals and refunds | Post purchase and refund events from a webhook | 48 hours after the browser event | Sales inside that 48-hour window |
| Blocked tags, declined consent | Consent mode modeling, for declined consent only | 1,000 events a day | Estimates for users and sessions |
### Reading revenue by channel from Stripe instead
The alternative reverses the order: record the click first on a tracked link, read the payment from Stripe afterward, and join the two, so no browser ID has to survive a 14-day trial. [TrackRev Revenue Attribution](https://www.trackrev.io/solutions/revenue-attribution) works this way, with a read-only restricted Stripe key and a 1-line pixel that binds each visitor to an email at signup or checkout. It [joins each paid charge to a click](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels) through that email, syncs new charges every hour, and [credits every renewal](https://www.trackrev.io/blog/subscription-ltv-attribution) to the channel of the original click, so month 12 of the $29 example lands with month 1. Paddle, Polar and Lemon Squeezy connect as well.
Revenue figures need a paid plan from $39 a month on [Starter](https://www.trackrev.io/pricing), while the free plan covers link tracking only, with 50 links and 1,000 tracked events a month. Credit rules are first click, last click or linear. Because the join runs on email, test the buyer who pays under another address first. TrackRev does not measure page engagement or on-site funnels, so keep Google Analytics 4 for those. For one-time purchases on your own domain, where the first payment is the whole sale, Google Analytics 4 alone is enough.
### Frequently asked questions
**Why does Google Analytics 4 revenue differ from Stripe when every payment is tracked?**
Google Analytics 4 expects the pre-tax amount in major units, while Stripe reports tax-inclusive totals in the smallest currency unit, so 4212 means $42.12. Stripe's balance is also net of processing fees. Compare against pre-tax paid invoices, excluding test mode.
**Can the Measurement Protocol backdate a purchase to the original click?**
Only by 72 hours. Google accepts a timestamp_micros value up to 72 hours old and, under relaxed validation, overwrites an older one with a time 72 hours ago. Strict validation rejects it, so a payment on day 14 of a trial cannot be placed back on day 0.
**Does a Stripe Payment Link work with a Google Analytics 4 purchase event?**
Stripe hosts that page, so no tag runs on it. Your server must send the purchase after Stripe confirms the payment, and the visitor's identifier can ride along in client_reference_id, which accepts up to 200 characters. A Google Analytics 4 client ID contains a period, which that field rejects, so swap it for a dash or Stripe silently drops the value.
**Will a Google Analytics 4 BigQuery export give me the missing revenue by channel?**
No. Google Analytics 4 exports only the events it collected, so the 11 later payments per customer in the worked example stay absent unless your server sent them, and modeled behavioral data is skipped.
**What does (other) mean in a Google Analytics 4 channel report?**
Google Analytics 4 folds the overflow into one (other) row when a dimension has more unique values than a report table can show. Reduce the date range, add a filter or build an Exploration to see the individual channels.
**Do I still need Google Analytics 4 if I attribute revenue from Stripe?**
Yes, for on-site behavior: page views, events and funnels. TrackRev ranks channels by the revenue Stripe records, which needs a paid plan from $39 a month.
---
## How to Set Up a Referral Program for Your SaaS
URL: https://www.trackrev.io/blog/how-to-create-a-referral-program
Published: 2026-10-01
Author: Muzahid Maruf
How to set up a referral program for SaaS in 7 steps: budget the reward, pick cash or credit, write fraud rules, track referrals and review at day 60.
How to set up a referral program for a subscription product comes down to 7 steps: (1) set a reward budget, (2) design the reward, (3) write the eligibility and fraud rules, (4) wire tracking to your billing system, (5) place the invitation, (6) test a full purchase, and (7) review results at day 60.
A referral program pays your own customers for introducing new ones. Outside promoters belong in an affiliate program, covered in [how to create an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program).
> **Key takeaways:**
>
> - Cap the reward at about half of your paid acquisition cost. At $240 that is $120, which a $49 plan at an 80% gross margin earns back in 3.1 months.
> - Reward paid charges. A commission written from a paid invoice (20% of $49 is $9.80) can't be farmed with free accounts, and a refund reverses it.
> - Limit the friend's discount to first-time customers in Stripe, match the hold period to a 30-day refund window, and review results at day 60.
### What a referred customer is worth
Researchers at Goethe University Frankfurt and the Wharton School compared customers a German bank won through its referral program with a random sample from other channels, across almost 10,000 accounts and 33 months. Referred customers had a 25% higher contribution margin, churned 18% more slowly and had a 16% higher 6-year lifetime value. In the [authors' summary](https://faculty.wharton.upenn.edu/wp-content/uploads/2013/05/Schmitt_Skiera_VandenBulte_2013_Referrral_Programs_2.pdf), the bank paid €25 per referral against a €40 lifetime-value gap, a return of roughly 60% ((40 minus 25) divided by 25). It is one company in one industry, so step 7 measures your own numbers.
### How to set up a referral program, step by step
#### Step 1: Set a goal and a reward budget
Pick one number to move: referred customers who pay each month. My rule of thumb caps the reward at half of your paid customer acquisition cost (CAC), which keeps referrals your cheapest channel. A $49 monthly plan at an 80% gross margin earns $39.20 of gross profit a month.
| Blended paid CAC | Reward ceiling at half | Months of gross profit to recover it |
| --- | --- | --- |
| $120 | $60 | 1.5 |
| $240 | $120 | 3.1 |
| $480 | $240 | 6.1 |
| $720 | $360 | 9.2 |
*Worked example: $49 plan, 80% gross margin, $39.20 of gross profit a month.*
To find your paid CAC, divide last quarter's ad and sales spend by the new paying customers it produced: $24,000 and 100 customers gives $240. A ceiling that takes more than about 6 months of gross profit to recover bets on the customer staying that long, so check your churn first.
#### Step 2: Design the reward
A one-sided program rewards only the referrer. A two-sided program also gives the friend a discount on the first purchase, free months or extra trial days, which hands the referrer an offer to pass along.
| Design | Referrer earns | Friend gets | Cost per referred customer |
| --- | --- | --- | --- |
| 20% recurring for 12 months, cash | $117.60 over 12 months | Nothing | $117.60, paid as the friend keeps paying |
| $50 one-time, cash | $50 | Nothing | $50, whether or not the friend stays |
| Free month for the referrer, 20% off the friend's first purchase | $49 credit | $9.80 off | $58.80 of forgone revenue |
| $25 cash for the referrer, 14 extra trial days for the friend | $25 | 14 days | $25 plus 14 days of serving an unpaid account |
| 3 free months for each side | $147 credit | $147 off | $294 of forgone revenue, well over a $120 ceiling |
*Reward designs on a $49 plan. The first row is 20% of $588, the first 12 months of revenue.*
A recurring percentage stops costing you when the customer leaves: a friend who cancels after 3 months costs $29.40 at 20% (3 times $9.80), while the flat $50 is already spent.
##### Cash or credit
Cash suits referrers who are businesses or creators, and it adds payout work: a $100 default minimum, a hold period and W-9 or W-8 forms (see [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates)). Credit suits product-led tools and needs no payout run, but a month credited to a paying customer gives up the full $49, while usage credits cost only what they cost to serve. TrackRev delivers credit into your own backend (Supabase, Postgres, MongoDB, Airtable or a webhook).
#### Step 3: Write the eligibility and fraud rules
- Decide who can refer: any signed-in user, or paying customers only. A TrackRev credit program sets separate amounts for free and paid referrers, such as 50 credits and 200.
- Define a new customer as one with no account, trial or payment on record. In the Stripe Dashboard, limit the friend's promotion code to first-time orders (`first_time_transaction`), which also blocks anyone who canceled a trial, and add `max_redemptions` and `expires_at`. TrackRev doesn't create that discount: set the code program-wide under Tracking, or per referrer in the Partners table's Ref. code column.
- Pay after the friend's first successful payment. TrackRev takes a refunded or disputed charge's commission back out and revokes a credit on a refund. Set the hold to your refund window, so 30-day refunds get a 30-day hold.
- Decide how much one referrer can earn. On the 20% recurring design, 50 customers pay a referrer $5,880 (50 times $117.60), which is either a bug or the partner you want.
- Block self-referral. TrackRev's credit programs run 3 checks (browser marker, device fingerprint, same IP on a different device) and revoke a grant with a recorded reason. Cash programs rely on the hold, refund reversal and marking a commission void or fraud.
[Preventing self-referral fraud](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) covers the cash side. The Federal Trade Commission's [endorsement guidance](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) says a rewarded endorser's connection to the brand should be disclosed clearly, so tell referrers to say they earn a reward. Its [CAN-SPAM guide](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business) says a seller offering coupons or discounts for forwarding a message may be responsible for compliance, with penalties up to $53,088 per email, so invitation emails need your postal address and an unsubscribe link.
#### Step 4: Set up tracking
- Install the pixel on your marketing site and in the app, then connect Stripe, Polar, Lemon Squeezy or Paddle. Stripe takes a read-only key, pulls 30 days of charges on the first sync, then syncs hourly, or within seconds with the webhook scope.
- Set the Stripe Checkout Session's `client_reference_id` to the visitor ID cookie. TrackRev falls back to the customer's email, and custom billing needs the `report-purchase` call with a secret key. [Stripe Checkout attribution tracking](https://www.trackrev.io/blog/stripe-checkout-attribution-tracking) shows the code.
- Create the program (Affiliate program, then New campaign) with the values below and a destination URL on your own domain.
| Program setting | Default | Range or options |
| --- | --- | --- |
| Cookie window | 60 days | 1 to 3,650 days |
| Hold period | 0 days | 0 to 180 days, counted from the close of each payout period |
| Minimum payout | $100 | $0 and up; smaller balances roll over |
| Payout period | Monthly | Weekly, every 2 weeks, monthly, quarterly or manual |
| Commission | 20% of each sale | 1 to 100%, or a flat amount per sale |
| Recurring | One-time | One-time, lifetime or a set number of months |
*Defaults and limits on the TrackRev form for cash programs.*
#### Step 5: Place the invitation and write the launch emails
Ask right after a customer gets value, such as a first good result or a renewal. TrackRev's dashboard embed gives you a refer-a-friend page inside the app with the user's link, rewards and 7 to 90 days of clicks, signups, purchases and conversion rate, and its widget adds a share card for busy pages. Both take a publishable key and the signed-in user's ID, email and plan tier.
Dashboard embed, rendered only for the signed-in user it belongs to
```
```
TrackRev doesn't send your campaign email, so launch messages go out through your own tool, with a link in the receipt email too. On a credit program, the `credit.earned` and `credit.delivered` webhooks can trigger the last row.
| When | Who gets it | What it says |
| --- | --- | --- |
| Day 0 | Customers active in the last 30 days | The offer in one sentence and a link to the referral page |
| Day 7 | Active customers who haven't opened the page | Two lines they can paste into Slack or an email |
| Friend signs up, then reward earned | The referrer | Someone joined, then the amount and the payout or delivery date |
Day 0 announcement
```
Subject: Give a friend 20% off, get a free month
Hi [first name],
You now earn a free month for every friend who becomes a paying
customer, and they get 20% off their first purchase.
Your link is on the Refer a friend page in your account settings:
[page link]
[Your name]
[Company and postal address]
[Unsubscribe link]
```
#### Step 6: Test the whole path before you announce it
| Check | What to do | Expected result |
| --- | --- | --- |
| 1 | Open a test referrer's link in a private window | A click appears in the dashboard |
| 2 | Sign up as the friend with a second email address and the friend's discount code | The signup matches the referrer |
| 3 | Pay with Stripe's [test card](https://docs.stripe.com/testing) 4242 4242 4242 4242, any future expiry and any 3-digit CVC | A pending commission at the right amount, or a credit grant marked earned |
| 4 | Refund the charge | The commission reads refunded and the credit is revoked |
| 5 | Sign up as another friend in the referrer's own browser | The credit is blocked as a self-referral |
TrackRev accepts a restricted key starting with `rk_test_`, so Stripe test mode works. Commission tracking needs a paid plan, so test the money path on one.
#### Step 7: Measure results and review at day 60
Count the referred customers who paid. Day 60 is long enough to see a monthly plan's second invoice.
| Metric | How to calculate it | Example at day 60 |
| --- | --- | --- |
| Participation rate | Customers who copied or shared a link divided by customers active in the last 30 days | 120 / 1,000 = 12% |
| Click to paid conversion | Referred paying customers divided by referral clicks | 18 / 600 = 3% |
| Reward cost per referred customer | Rewards granted divided by referred paying customers | $1,058.40 / 18 = $58.80 |
| Share of new paying customers | Referred customers divided by all new paying customers | 18 / 90 = 20% |
| Months to recover the reward | Reward cost per referred customer divided by monthly gross profit | $58.80 / $39.20 = 1.5 |
| Retention gap | Month-3 retention of referred customers minus everyone else | Your own number |
*Illustrative figures for a product with 1,000 active customers.*
TrackRev's Customers page lists each referred customer with orders and commission. In the example, $58.80 against the $120 ceiling leaves $61.20 of room, so the reward has headroom. If participation is low, move the page or change the timing before you touch the reward. Weak click to paid conversion points at the friend's offer or your landing page. If referred customers churn faster than other channels, the reward may be attracting reward hunters, since the bank's referred customers churned 18% more slowly.
### Where TrackRev fits
TrackRev's [Affiliate Program](https://www.trackrev.io/solutions/affiliate-program) runs referral and affiliate programs on one data model, with cash or credit rewards, two-sided friend rewards, the widget and dashboard embed, and refund reversal. [Referral campaigns](https://www.trackrev.io/products/referral-campaigns) covers the setup.
The Free plan has 50 links and 1,000 tracked events a month, with revenue hidden. Every paid plan includes the affiliate program: Starter is $39 a month ($351 billed yearly) for 1 workspace and $10K of commission tracked a month, Growth is $99 for unlimited workspaces and $100K, and Scale is $199 with priority support ([pricing](https://www.trackrev.io/pricing)). Payouts are a PayPal or Wise CSV export that you mark paid, and TrackRev leaves the emails and the friend's discount code to you. Pick a dedicated referral platform if you want those handled for you.
### Frequently asked questions
**How long does it take to set up a referral program?**
TrackRev's Stripe attribution guide budgets about 15 minutes for tracking. The terms, the friend's discount and the emails take longer.
**What is the difference between a referral program and an affiliate program?**
Referrers are your customers, enrolled automatically and often paid in credit. Affiliates are outside promoters, usually paid cash after review and a W-9 or W-8 form.
**Can I run a referral program with discount codes alone?**
Only with a unique code per referrer, since a shared code credits nobody. In TrackRev a personal code credits its owner without a link click, and Stripe can restrict a promotion code to 1 customer.
**Can the friend's discount stack with other offers?**
Stripe allows up to 20 discounts on a subscription but rejects a coupon and a promotion code made from the same coupon. State in your terms whether the offer combines with sale pricing.
**Can referrers switch from credit to cash?**
Yes. On a credit program, turn on Allow customers to become affiliates and pick the cash campaign to mirror. Only future conversions pay cash, and earned credits stay.
**Does a referral program work for B2B with a long sales cycle?**
Lengthen the cookie window, which accepts up to 3,650 days, and pay on the first charge. At high contract values referrers act like partners, so read the guide on B2B affiliate marketing for high-ACV SaaS.
**How much referral commission can each TrackRev plan track?**
Starter tracks up to $10K of commission a month, which at 20% covers $50,000 of referred sales ($10,000 divided by 0.20). Growth raises the cap to $100K, or $500,000 of sales at 20%, and Scale has no cap. Credit grants don't count toward it.
---
## How to Start an Affiliate Program for Your SaaS
URL: https://www.trackrev.io/blog/how-to-create-an-affiliate-program
Published: 2026-07-09
Author: Muzahid Maruf
How to start an affiliate program for a SaaS product in 8 steps, from commission math and tracking to tax forms, recruiting and first-week onboarding.
How to start an affiliate program for a subscription product comes down to 8 steps, in this order: set the commission you can afford, choose tracking that reads your billing system, write the terms, set up payouts and tax forms, build a sign-up page and starter kit, recruit your first affiliates by hand, onboard them in week 1, and test a full purchase before anyone promotes you. Commission comes first because it depends on your margin and limits every later choice; the median B2B SaaS program pays 20% for 12 months. Published entry-level plans run $39 to $69 a month. The larger costs are commission and your own recruiting time.
> **Key takeaways:**
>
> - Set the commission first. On a $49 plan with an 80% gross margin, 20% recurring for 12 months pays an affiliate $117.60 and leaves you $352.80 of gross profit per customer.
> - Pick tracking that reads billing events and sets its referral cookie from your server, because Safari's Intelligent Tracking Prevention deletes script-written cookies after 7 days without interaction. Aim for an attribution window near the 60-day benchmark median.
> - Write the terms before you recruit: a hold period matched to your refund window, banned tactics and a disclosure rule. Collect a W-9 or W-8BEN before the first payout.
> - Recruit your first 20 affiliates by hand. In the median program, 71% of affiliate revenue comes from the top 10% of affiliates.
> - Onboard in week 1 with a link, a starter kit and a personal check-in. Median 30-day activation is 18%, and top-quartile programs reach 31%.
> - Software runs $39 to $69 a month on published entry plans. Commission is the bigger cost: 22.5% of affiliate revenue in the 40-customer example.
### Is your product ready for an affiliate program?
A program pays off when customers pay on a recurring plan, so one referral earns revenue for months, and when checkout is self-serve, so a click can become a charge without a sales call (for a sales-led product, name the CRM event that counts as the conversion). Your gross margin also has to absorb a 15% to 30% commission for 12 months, and you should be able to name 20 people who write or talk about your category, starting with customers. If you can't, start with a customer referral program and add outside affiliates later.
### How to start an affiliate program, step by step
#### Step 1: Set the commission you can afford
Affiliates promoting subscriptions tend to compare programs by what a referral pays over the customer's life. Across the benchmark dataset, 39% of programs pay recurring commission for a fixed term of 3 to 12 months and 18% pay for life, against 33% that pay once at the sale, so a one-time bounty on a monthly plan loses to a rival's recurring percentage. Take a $49 monthly plan with an 80% gross margin, which leaves $39.20 of gross profit a month.
| Commission | Affiliate earns | Gross profit you keep |
| --- | --- | --- |
| 30% of the first payment only | $14.70 | $455.70 |
| 15% recurring for 6 months | $44.10 | $426.30 |
| 20% recurring for 12 months | $117.60 | $352.80 |
| 30% recurring for 12 months | $176.40 | $294.00 |
*Worked example: $49 a month plan, 80% gross margin ($470.40 of gross profit over 12 months before commission), customer retained all 12 months.*
The one-time row pays an eighth of the 20% recurring row ($14.70 against $117.60), so an affiliate comparing programs will pick the recurring one. Recurring commission also stops when the customer cancels, so someone who leaves after four months costs you $39.20 at 20% (four payments of $9.80).
For a starting rate, the [benchmark tables](https://www.trackrev.io/data/affiliate-program-benchmarks) TrackRev compiled from public Impact, PartnerStack and Awin research put the median B2B SaaS program at 20% for 12 months and B2C SaaS at 15% for 6 months (information products sit at 30%, eCommerce at 8%), and [commission benchmarks by category](https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026) go further. Then test the rate against acquisition cost. If a paid customer costs $300, a $117.60 commission is 39% of that, and it arrives only after the customer pays.
#### Step 2: Choose tracking that reads your billing system
A click only matters once it connects to a charge, so put four questions to every tool.
- Does the conversion come from billing events (paid invoice, renewal, refund) or from a thank-you-page pixel that misses month-2 renewals?
- Which attribution window does it allow? In the benchmark data, 28% of programs use 30 days or less, 41% use 60 and 24% use 90.
- Is the referral cookie written by JavaScript or by your server? WebKit says [Intelligent Tracking Prevention deletes script-created cookies](https://webkit.org/tracking-prevention/) after 7 days of no user interaction with the site, so a 60-day window set by script can shrink to 7 days for Safari visitors who don't return.
- Can it track coupon codes, flag self-referral and reverse commission on refunds and disputes?
On Stripe, tools tie a visit to a purchase through a value passed at Stripe Checkout, such as the Checkout Session's `client_reference_id` or metadata ([how affiliate tracking works](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) shows where that link breaks). Compare limits as well as prices, because entry plans cap different things.
| Tool | Entry plan | Entry limit | Next plan up |
| --- | --- | --- | --- |
| [Rewardful](https://www.rewardful.com/pricing) | Starter, $49/month, 14-day trial | $7,500/month affiliate-attributed revenue, 1 campaign | Growth, $99/month, $15,000/month |
| [FirstPromoter](https://firstpromoter.com/pricing) | Starter, $49/month, 14-day trial | $5,000/month affiliate revenue, 1,000 affiliates | Business, $99/month, $15,000/month |
| [Tolt](https://www.tolt.com/pricing) | Basic, $69/month, 14-day trial | $10,000/month earned from affiliates, manual payouts only | Growth, $99/month, $20,000/month |
| [PartnerStack](https://partnerstack.com/pricing) | Launch, no price on the page | Set in a demo from program size, features and support | Growth, no price on the page |
| TrackRev | Starter, $39/month | $10K commission tracked a month, 1 workspace | Growth, $99/month, $100K commission tracked a month |
*Prices from each vendor's pricing page, October 2026.*
Rewardful and FirstPromoter cap the affiliate-driven revenue they track. TrackRev caps the partner commission it tracks each month, so at a 20% rate its $10K ceiling equals $50,000 of affiliate sales a month ($10,000 divided by 0.20). Tolt charges a 2% processing fee on automatic payouts on its Growth plan and above.
#### Step 3: Write the program terms
Write the terms before recruiting, because they decide every disputed payout. One page should settle five points.
- The rate and term (20% for 12 months, say), and whether upgrades and downgrades change either.
- The attribution window, and which touch earns credit when two affiliates share a customer.
- A hold period before commission becomes payable, matched to your refund policy: a 30-day refund window means a 30-day hold. Refunded or disputed charges reverse the commission.
- Banned tactics: bidding on your brand name in Google Ads, buying through your own link, spam, and coupon or deal-site placement if you don't want it.
- A disclosure rule. The Federal Trade Commission wants a disclosure [hard to miss and placed with the endorsement itself](https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers), so one buried in a profile or behind a "click more" link falls short.
Have a lawyer read the finished page once, and see [FTC, GDPR and consent rules for affiliates](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr).
#### Step 4: Set up payouts and tax
Pick a schedule, a minimum and a method before the first sale. Monthly payouts after the hold period are a sensible default, and I'd set a $50 minimum so you never send a $4 payment. PayPal and Wise both accept bulk payment files, and Wise takes up to 1,000 payments in one batch, so a monthly run can be one upload.
Collect tax forms first. US affiliates send a Form W-9, and non-US individuals send a Form W-8BEN. For tax years beginning after 2025, the [IRS instructions for Forms 1099-MISC and 1099-NEC](https://www.irs.gov/instructions/i1099mec) set the minimum reporting threshold at $2,000, with inflation adjustments possible from 2027, and Form 1099-NEC is due to the IRS on January 31. Ask your accountant how your commissions are classified. [Paying affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) lays out methods and forms.
#### Step 5: Build the sign-up page and starter kit
The sign-up page has to answer what an affiliate earns, how tracking works and when payment arrives. Put a worked example near the top (a $49 plan pays $9.80 a month for 12 months), then the cookie window, payout schedule, $50 minimum and approval rule. Keep the application to three fields: audience URL, audience description and promotion plan. Approve the first cohort by hand.
Assemble the starter kit before the first affiliate arrives, so the day-3 email has something to attach. It needs the tracking link, a product description they can paste as written, one customer result with real numbers, the terms in plain English, three post angles with drafts (a comparison, say), and an email address that reaches a real person.
#### Step 6: Recruit your first affiliates by hand
Open applications tend to fill a roster with affiliates who never produce a sale. In a median program in the benchmark data, the top 10% of affiliates bring in 71% of affiliate revenue and the top 1% bring in 34%, so each hand-picked recruit matters more than the headcount. Three sources produce good candidates.
- Customers who already write, post or speak about your category, since a personal note to them is a warm ask.
- Creators whose audience matches your buyer. A 3,000-subscriber newsletter read by your exact buyer can outsell a 100,000-follower generalist feed.
- Adjacent tools whose users hit your problem next, such as a billing tool and an analytics tool.
Screen each candidate on five signals before you write.
| Signal | Strong | Weak |
| --- | --- | --- |
| Audience match | Readers share your buyer's job title and tools | General business audience |
| Recent publishing | 4 or more posts in the last 30 days | 0 or 1 post in 30 days |
| Monetization | Disclosed affiliate links or a sponsor page | None visible |
| Focus | One niche that overlaps your buyer | Covers anything |
| Relationship | Paying customer who has mentioned you | Has never heard of you |
Write it as a note to one person in under 100 words: a specific piece they published, who in their audience the product fits, the offer with a number, and one easy question.
First email to a creator
```
Subject: Idea for [newsletter name] readers
Hi [first name],
Your issue on [specific recent piece] made me think of your readers who
[what they are trying to do]. That is who we built [product] for.
We pay [rate]% recurring for [N] months on every plan, tracked on your
own link. Want me to send the details and a test account?
[Your name]
[Role], [product]
```
[Backlinko's analysis of 12 million outreach emails](https://backlinko.com/email-outreach-study) found an 8.5% average response rate and a 32.7% better rate for personalized message bodies. The study was last updated in April 2019 and measures outreach such as link-building and guest-post pitches sent through Pitchbox, so treat its numbers as a starting guess for affiliate emails. If half of the people who reply join, 10 new affiliates takes about 235 emails at 8.5% (10 divided by 0.085 divided by 0.5), and a warm list of customers should need fewer. The same study found a single follow-up produced 65.8% more replies, with 3 or more messages giving the best overall rate. Send one on day 4 and one on day 8, and give each a new reason to reply, such as a relevant link or a sharper question.
#### Step 7: Onboard them in the first week
The benchmark median is 18% of new affiliates reaching a paid conversion within 30 days. Top-quartile programs reach 31% and typically run a welcome sequence, ready-made creative and a first-week check-in, while programs that approve people and never contact them again sit near 6%.
| Day | Message | What it carries |
| --- | --- | --- |
| 0 | Approval | The tracking link, large and copyable, and what happens next |
| 1 | Who buys | Who the product is for, the typical buyer and the outcome they get |
| 3 | Starter kit | Description, proof point, terms and three post angles with drafts |
| 5 | One post idea | A specific idea with an editable draft and the link filled in |
| 7 | Check-in | Three sentences from a real person asking whether the link is live and what is blocking them |
Median time to a first commission is 14 days overall, 5 days for top-quartile affiliates, 9 for the second quartile and 27 for the third, so the day-7 check-in lands before most first sales and shows who is stuck.
#### Step 8: Test a purchase end to end, then launch to a pilot
Before announcing anything, create a test affiliate, buy through its link in Safari and in Chrome, and confirm that the click is recorded, the commission shows as pending at the right amount, and refunding the charge removes it. Then buy through your own account's link to check that self-referral is flagged.
Launch to the first cohort only and keep applications closed for 60 days. The benchmark dataset puts an affiliate's lifetime chance of a first conversion at 3.7% once day 60 passes without one, so day 60 is the review point. Check 30-day activation, days to first commission and how much revenue your top 5 affiliates drive. Past the pilot, [scaling an affiliate program to $50K MRR](https://www.trackrev.io/blog/scale-affiliate-program-50k-mrr) covers the next stage.
### What it costs to create an affiliate program
Software is the fixed fee, $39 to $69 a month at entry level, and Rewardful and FirstPromoter both list $490 a year for their $49 plans and $990 for their $99 plans (12 months for the price of 10). Commission scales with sales and comes out of revenue you would not otherwise have. Your own time costs something too: recruiting is outbound sales, and much of month 1 goes to writing emails.
> **Worked example: 40 referred customers:** 40 customers on a $49 plan for 12 months bring in $23,520 (40 x $49 x 12). At 20% recurring, commission is $4,704. A $49-a-month tool adds $588. Together that is $5,292, or 22.5% of the revenue, before your own cost of delivering the product.
### Where TrackRev fits
TrackRev's [Affiliate Program](https://www.trackrev.io/solutions/affiliate-program) handles steps 2 and 4 on the same data as link tracking and revenue attribution, with step 3's settings kept per program. Partners get a portal on your domain. Commissions can be recurring, one-time or tiered, and a refunded or disputed charge takes its commission back out. Each program sets its own hold period, from 0 to 180 days after a payout period closes (the default is 0, so set it to match your refund window), and payout periods can be weekly, every two weeks, monthly or quarterly. W-9 and W-8 upload is part of partner onboarding, and you pay from one PayPal or Wise CSV export, then mark each payout paid. Revenue syncs from Stripe, Polar, Lemon Squeezy and Paddle.
The free plan covers testing link tracking (50 links, 1,000 tracked events a month, revenue figures hidden), and the affiliate program is part of every paid plan. Starter is $39 a month, or $351 billed yearly, for one workspace and up to $10K of commission tracked a month. Growth is $99 and Scale is $199 (see [pricing](https://www.trackrev.io/pricing)). TrackRev doesn't find affiliates for you, and PartnerStack runs a marketplace of existing partners, priced by demo.
### Frequently asked questions
**How much does it cost to start an affiliate program?**
The first two weeks can cost $0, because Rewardful, FirstPromoter and Tolt each offer a 14-day trial. After that, expect a $39 to $69 monthly fee plus commission, which is paid only when a referred customer pays. TrackRev's free plan covers link tracking, and its affiliate program starts with the $39 Starter plan. Add the hours you spend recruiting.
**What commission should I offer if my margins are thin?**
Shorten the term before you cut the rate. Affiliates judge both together, and 15% for 12 months and 30% for 6 months each total 1.8 months of the plan price if the customer stays. At a 60% gross margin, a 20% commission still leaves 40 points of every revenue dollar.
**How many affiliates do I need to start?**
A first cohort of 10 to 20 engaged affiliates is enough to learn from. At the 18% median activation rate, 10 recruits produce about two affiliates who earn anything in month 1, so treat the cohort as a test of your offer and onboarding.
**When does an affiliate earn commission, at signup or at the first payment?**
At the first payment, since a trial start is only a lead. With a 30-day hold counted from the charge, a March 1 payment becomes payable on March 31 and goes out in the next monthly run. TrackRev counts the hold from the close of the payout period, and other tools may count from the charge, so check which.
**Can I run an affiliate program without Stripe?**
Yes, if the tool reads your billing system. TrackRev syncs revenue from Stripe, Polar, Lemon Squeezy and Paddle. A pixel that fires only on the thank-you page sees the first payment, so on a 12-month customer it misses the other 11 and every refund.
**What happens to commission when a customer upgrades or downgrades?**
Settle it in your terms. On a recurring percentage, an upgrade from a $49 plan to a $99 plan raises a 20% commission from $9.80 to $19.80 a month, and a downgrade lowers it the same way. TrackRev accrues each renewal at the new plan amount.
**What is the difference between an affiliate program and a referral program?**
An affiliate program pays outside promoters, usually in cash and as a percentage. A referral program pays your own customers for introducing friends, often as account credit. TrackRev runs both inside one workspace.
---
## How to Pay Affiliates, Including Overseas Partners
URL: https://www.trackrev.io/blog/how-to-pay-affiliates
Published: 2026-07-06
Author: Muzahid Maruf
How to pay affiliates: compare PayPal, Wise and Stripe fees, set a hold period and minimum payout, and collect the right tax forms, including overseas.
How to pay affiliates comes down to six settings chosen before the first commission is due: payout method, schedule, hold period, minimum balance, tax form and payment record. For a small SaaS program I'd start with monthly batches, a hold equal to the refund window and a $50 minimum, paid through PayPal or Wise once the affiliate has sent a W-9 or W-8BEN.
> **Key takeaways:**
>
> - Settle the method, schedule, hold, minimum and paperwork up front. Monthly batches, a 30-day hold, a $50 minimum and a signed tax form make a sensible default.
> - PayPal's fee is 2% up to a $1.00 cap for US recipients and a $20.00 cap abroad. Stripe Connect's fixed $2 monthly and $0.25 per-payout charges take 9.3% of a $25 payout.
> - Cardholders can typically dispute a charge for 120 days, far past a 30-day refund window, so decide whether to hold longer or absorb late chargebacks.
> - US affiliates paid $2,000 or more get a 1099-NEC by January 31, and the old $600 floor ended after 2025. A foreign affiliate's W-8BEN signed in 2026 lasts through December 31, 2029.
> - Overseas payees need a sanctions check, one agreed currency, and reimbursements on separate lines with receipts.
> - TrackRev totals balances and writes the CSV export. You send the money and mark each payout paid.
### How to pay affiliates in five steps
#### Step 1: Choose how the money leaves your account
Pick the method by where your affiliates live and how many you pay each cycle.
| Method | What it charges you | Where it reaches | Good to know |
| --- | --- | --- | --- |
| [PayPal Payouts](https://www.paypal.com/us/webapps/mpp/merchant-fees) | 2% of the payout, capped at $1.00 for US recipients and $20.00 for international ones; $0.25 flat per US payment sent through the API | Recipients holding a PayPal account | One bulk file pays a whole batch |
| [Wise BatchTransfer](https://wise.com/us/business/batch-payments) | Mid-market exchange rate plus a transfer fee that depends on the route | International payments, up to 1,000 in one batch | Spreadsheet upload |
| [Stripe Connect](https://stripe.com/connect/pricing) | $2 per active account per month, plus 0.25% + $0.25 per payout; 1% of payout volume for instant payouts | Cross-border payouts are self-serve only among the US, UK, EEA, Canada and Switzerland | Each affiliate onboards as a connected account |
| ACH or wire transfer | Your bank's fee schedule, with no single published price | ACH within the US; wires cross borders | You store every affiliate's bank details |
*Prices from each vendor's pricing page, October 2026.*
PayPal is the quickest to set up for affiliates who already have an account. Wise suits overseas partners who watch the exchange rate. Connect fits programs that run their own payout code, and its $2 monthly account fee penalizes a long tail of small balances.
#### Step 2: Set the schedule and the hold period
A payout schedule sets how often a period closes: weekly, every two weeks, monthly or quarterly. The hold is the wait after a period closes before its commissions become payable, and it absorbs refunds and chargebacks. Stripe says card networks typically allow cardholders to [dispute a payment within 120 days](https://docs.stripe.com/disputes/how-disputes-work), far longer than a 30-day refund window.
| Hold | What it covers | Longest wait on monthly periods |
| --- | --- | --- |
| 0 days (TrackRev's default) | Nothing; you absorb every refund | About 30 days |
| 30 days | A refund policy of 30 days | About 60 days |
| 120 days | The typical card dispute window | About 150 days |
| 180 days (TrackRev's maximum) | Klarna and PayPal payments, where disputes can run to 180 days | About 210 days |
*The longest wait is a sale on day 1 of a 30-day period: period length plus the hold.*
> **Worked example: monthly periods and a 30-day hold:** A sale on March 1 sits in the March period, which closes March 31. Its commission becomes payable 30 days later, on April 30, so the affiliate waits 60 days from the sale, while a sale on March 31 waits 30. On a monthly subscription, every renewal is a new charge with its own refund and dispute clock.
I'd absorb the occasional late chargeback instead of making every affiliate wait 150 days, and I'd never miss a published payout date. [Affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers refunds that land after payout, and [tracking for recurring subscriptions](https://www.trackrev.io/blog/affiliate-tracking-subscriptions-recurring) covers each renewal.
#### Step 3: Set a minimum payout
The minimum payout is the balance an affiliate must reach before being paid, and anything below it rolls into the next period. What a small payout costs depends on the method.
| Payout | Stripe Connect | PayPal, US recipient | PayPal, international |
| --- | --- | --- | --- |
| $25 | $2.31 (9.3%) | $0.50 (2%) | $0.50 (2%) |
| $50 | $2.38 (4.8%) | $1.00 (2%) | $1.00 (2%) |
| $100 | $2.50 (2.5%) | $1.00 (1%) | $2.00 (2%) |
| $250 | $2.88 (1.2%) | $1.00 (0.4%) | $5.00 (2%) |
| $500 | $3.50 (0.7%) | $1.00 (0.2%) | $10.00 (2%) |
| $1,000 | $4.75 (0.5%) | $1.00 (0.1%) | $20.00 (2%) |
| $2,500 | $8.50 (0.3%) | $1.00 (0.04%) | $20.00 (0.8%) |
*Fee for one payout to one account in a month, from Stripe's Connect price list and PayPal's US merchant fees page, October 2026.*
PayPal charges a percentage until it reaches the cap, so a low minimum costs the same 2% as a high one. Stripe's $2 account fee and $0.25 payout fee are fixed amounts, and a $25 payout gives up more than 9% to them. Paying 40 affiliates $100 each costs $40 through PayPal to US recipients and $100 through Stripe Connect.
The affiliate's side matters as much. At 20% of a $49 plan, one referred customer earns the affiliate $9.80 a month: a $50 minimum takes 6 months of that single customer and a $100 minimum takes 11. TrackRev's payment threshold field defaults to $100. I'd set $50 for PayPal or Wise and keep $100 for Connect. The commission rate itself is covered in [how to start an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program).
#### Step 4: Collect the tax form before the first payout
Ask for the form at approval, because paperwork stalls once payment has gone out.
| Affiliate | Form | How long it lasts | What you do with it |
| --- | --- | --- | --- |
| US individual or business | [Form W-9](https://www.irs.gov/forms-pubs/about-form-w-9) (March 2024 revision) | [No expiry date](https://www.irs.gov/instructions/iw9); replace it if the details change | File a 1099-NEC at $2,000 or more a year |
| Non-US individual | [Form W-8BEN](https://www.irs.gov/instructions/iw8ben) | Through the last day of the third calendar year after signing, so December 31, 2029 if signed in 2026 | Keep it on file; request a new one before it lapses |
| Non-US company | [Form W-8BEN-E](https://www.irs.gov/instructions/iw8bene) | Same third-calendar-year rule as the W-8BEN | Keep it on file; renew it the same way |
A W-9 gives you the affiliate's taxpayer identification number. The [Internal Revenue Service instructions for Forms 1099-MISC and 1099-NEC](https://www.irs.gov/instructions/i1099mec) call for a 1099-NEC for anyone paid at least $2,000 in a year for services, filed by January 31. An affiliate paid $1,999 in 2026 generally needs none, and one paid $2,000 does. The floor was $600 until the change for tax years beginning after 2025, with inflation adjustments possible from 2027. [Backup withholding is a flat 24%](https://www.irs.gov/taxtopics/tc307) when a payee gives no TIN in the required way, so an affiliate who refuses a W-9 leaves you choosing between holding the payout and withholding.
A non-US affiliate sends a W-8BEN, or a W-8BEN-E for a company. Without the form, the IRS instructions say the withholding agent may have to withhold 30%. Whether that rate applies depends on where the income comes from, and [IRS Publication 515](https://www.irs.gov/publications/p515) says the place where personal services are performed decides the source. A commission for promotion done outside the United States is therefore generally foreign-source, so a documented overseas affiliate usually falls outside US withholding. Pay that does count as US-source is reported on Form 1042-S, titled Foreign Person's U.S. Source Income Subject to Withholding. Have your accountant confirm how your commissions are classified, and ask about VAT, which can apply to an affiliate's invoice when you or the affiliate are in the EU or UK. For disclosure and privacy rules, see [affiliate compliance: FTC, GDPR and consent](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr).
#### Step 5: Run each batch and keep the records
- Close the period, such as March 1 to March 31, and total each affiliate's commission after refunds and reversals.
- Set aside balances under the minimum, such as $38 against a $50 minimum; they roll into April.
- Confirm payment details, the tax form and any required invoice for everyone left.
- Pay by uploading the PayPal or Wise file, or by sending the ACH or wire.
- Record each payment reference and email the affiliate the amount and arrival date.
Keep the reference, tax form and invoice for each payout together, so a year-end total takes minutes. In January, file a 1099-NEC for each US affiliate at $2,000 or more and send them a copy. Stripe's Connect price list puts e-filing at $2.99 per 1099 sent to the IRS if payouts run through it.
### Paying overseas affiliates
PayPal's international fee stops at $20, which a $1,000 payment reaches, so a $2,000 payment costs the same $20. Wise's batch tool takes up to 1,000 payments per upload at the mid-market rate. Stripe Connect has limited reach: [self-serve cross-border payouts](https://docs.stripe.com/connect/cross-border-payouts) run only among the US, UK, EEA, Canada and Switzerland. [Stripe Global Payouts](https://docs.stripe.com/global-payouts) covers more than 160 countries, but it is generally available only to businesses in the US and UK and requires Stripe Treasury.
State commissions in one currency and say who bears the conversion cost; TrackRev programs pay in US dollars. Affiliates who run a business often want an invoice for their own books, and a program can require one before a payout is released.
Screen each recipient before the first payment. The Treasury's Office of Foreign Assets Control runs [sanctions programs](https://ofac.treasury.gov/sanctions-programs-and-country-information) that range from country-wide to targeted and publishes a list search tool, which a US payer should run on a new payee's name and country.
If you reimburse an overseas affiliate for something like a paid placement, put it on its own line with an invoice or receipt, apart from commission. The 1099 instructions count a contractor's travel reimbursement as reportable pay when the contractor did not account for it to the payer, so a documented one is easier to explain.
### How TrackRev handles payouts
In [TrackRev's Affiliate Program](https://www.trackrev.io/solutions/affiliate-program), each program sets its own payout rules: which methods partners may pick (PayPal, Payoneer, Wise, wire, ACH, WebMoney or other), a payment threshold, weekly, biweekly, monthly, quarterly or manual periods, a hold of 0 to 180 days that defaults to 0, and an invoice rule of none, optional or required. A refunded or disputed charge reverses its commission.
Partners upload a W-9, W-8BEN or W-8BEN-E in their portal settings, and the partners table flags anyone without one. At payout time you run the batch, pay from a single CSV export for PayPal or Wise, or from the bank details shown for wire and ACH partners, then mark each payout paid with its reference. TrackRev does not move the money, and automatic payouts are not live yet.
The free plan is link tracking only (50 links, 1,000 tracked events a month). The affiliate program needs a paid plan, from $39 a month on Starter; see [pricing](https://www.trackrev.io/pricing).
### Frequently asked questions
**How do I pay an affiliate who lives in another country?**
Ask which payout service the affiliate already holds, collect a W-8BEN, check the name against OFAC's list, and fix one currency for the payment.
**Do I have to send affiliates a 1099-NEC?**
Yes, if you are a US business paying a US affiliate $2,000 or more for services in a calendar year: file with the IRS by January 31 and send the affiliate a copy. The $600 floor ended for payments made after 2025. Non-US affiliates fall under different rules, so ask your accountant.
**What if an affiliate will not send a tax form?**
Hold the payout and say so in your terms. The alternative is 24% backup withholding for a US payee with no TIN, or possibly 30% for a foreign payee with no form, and withholding adds deposits and filings of its own.
**How do I reimburse an overseas affiliate for expenses?**
Pay it separately from commission, against an invoice or receipt, in the agreed currency and under its own reference. Ask your accountant whether it counts toward that affiliate's year-end total.
**How long should the hold period be?**
Start from your refund window: refunds allowed for 30 days call for a hold of 30 days, so nothing is paid on a charge you can still refund. Lengthen it only if chargebacks keep arriving after payout.
**Does TrackRev send the payment?**
No. It totals each balance after the hold and the minimum, writes the CSV export and stores the reference when you mark a payout paid. Automatic payouts are listed as coming soon.
---
## How to track link clicks: 4 methods, their limits, and matching clicks to sales
URL: https://www.trackrev.io/blog/how-to-track-link-clicks
Published: 2026-10-04
Author: Muzahid Maruf
4 ways to track link clicks in 7 steps: shorteners, UTM tags, redirects and your own server, plus where bots and Safari skew counts and how to match sales.
To track link clicks, send each click through something that can count it. A short link or redirect on a domain you control logs the request on the server and forwards the visitor to the destination, while a UTM-tagged URL lets Google Analytics 4 record where the visit came from. The two combine well: the redirect counts per link, and the tags name the campaign.
Bots, email scanners and Safari distort a raw count, and it says nothing about sales until a click is matched to a payment. I build TrackRev, which does that matching, and a plain shortener is enough for some setups.
> **Key takeaways:**
>
> - Clicks get counted in 4 places: a shortener's server, a UTM-reading analytics script, a redirect tracker, or your own server.
> - Answer tracking redirects with a 302 or 307, because a browser may reuse a cached 301 or 308 without contacting your server.
> - Slack previews, Microsoft Safe Links and crawlers add requests that no person made, so filter before comparing tools.
> - A visitor ID passed through checkout, such as Stripe's 200-character client_reference_id, ties a payment back to its click. I wait for a few hundred clicks per link before comparing rates.
### What a tracking link is
A tracking link, also called a tracking URL, carries enough information for a system to record its use. A tagged URL appends query-string parameters such as `?utm_source=weekly-digest`. A redirect URL points at a tracking domain, which logs the request and answers with an HTTP 302, so it works even when the destination, such as an App Store or Google Play listing, runs none of your scripts.
The two builds
```
# Tagged URL: the destination carries the labels
https://example.com/pricing?utm_source=weekly-digest&utm_medium=email&utm_campaign=pricing-update-2026-10&utm_content=footer-link
# Redirect URL: the tracking domain logs the click, then forwards
https://go.example.com/news-footer -> 302 -> the tagged URL above
```
### Four ways to track link clicks
| Method | Where the count happens | Weakest point |
| --- | --- | --- |
| Shortener with stats | The shortener's server | Bot rules differ by vendor |
| UTM tags in Google Analytics 4 | A browser script, then Google | Script blockers and stripped tags |
| Redirect tracker on your domain | The tracker's server | Counts requests, so bots need filtering |
| A handler you build | Your own server | You build the filtering and the reports |
#### Link shorteners with built-in stats
A shortener such as Bitly gives each destination a short URL and counts requests to it, and YOURLS is the free, self-hosted version with [click reports, referrer tracking and visitor geolocation](https://yourls.org/). Counting rules differ by vendor. [Bitly's help article](https://support.bitly.com/hc/en-us/articles/360028512711-How-does-Bitly-handle-traffic-from-bots), updated May 21, 2024, says it filters known bots and large-scale abuse, flags IP addresses with an excessive click rate for a while, does not revise past metrics when it learns of a new bot, and is not built to catch click fraud. [Dub counts](https://dub.co/changelog/deduplicate-clicks-tracking) only the first click from each IP address and user agent pair per 1-hour period, so one campaign can total differently in the two tools.
#### UTM tags read by Google Analytics 4
UTM tags label a visit so Google Analytics 4 can file it, and its script does the counting. [Google's URL builder page](https://support.google.com/analytics/answer/10917952) lists 9 parameters, says to always include `utm_source`, `utm_medium` and `utm_campaign`, and warns that values are case sensitive, so `Google` and `google` become 2 rows. A visitor who leaves before the tag fires, or who runs a blocker, never appears.
With outbound click measurement on, Google Analytics 4 also logs a `click` event, with 5 parameters including `link_url` and `outbound`, each time someone clicks a link that leads away from the current domain ([Google's measurement documentation](https://support.google.com/analytics/answer/9216061)). That covers links on your own pages and cannot see a link placed in an email or a bio. The [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming rules.
#### Redirect trackers on your own domain
A redirect tracker moves the counting to a server. The visitor requests `go.example.com/news-footer`, the server records the request and replies with a 302 pointing at the tagged destination. No script runs in the browser, so extensions that block analytics scripts have none to stop, and a branded domain usually needs a CNAME record at your DNS provider.
[RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html) lists 12 heuristically cacheable codes, including 301 and 308 but not 302 or 307, so a browser or proxy can answer a repeat visit to a 301 without contacting your server, and that click is never logged. A 302 or 307 is reused only when the response carries explicit freshness headers such as `Cache-Control: max-age`.
| Code | Meaning | RFC 9110 section | Heuristically cacheable | For tracking |
| --- | --- | --- | --- | --- |
| 301 | Moved permanently | 15.4.2 | Yes | Avoid |
| 302 | Found, temporary | 15.4.3 | No | Standard choice |
| 303 | See other | 15.4.4 | No | Works, rarely needed |
| 307 | Temporary redirect | 15.4.8 | No | Works, keeps the method |
| 308 | Permanent redirect | 15.4.9 | Yes | Avoid |
#### A click handler on your own server
A route on your own site does the same job: look up the slug, write a row, send a 302. This Express-style sketch is pseudocode, so adapt the database calls before running it.
A logging redirect
```
app.get("/go/:slug", async (req, res) => {
const target = await db.links.findTarget(req.params.slug);
if (!target) return res.redirect(302, "/");
await db.clicks.insert({
slug: req.params.slug,
ts: new Date(),
userAgent: req.get("user-agent"),
referer: req.get("referer"),
});
res.redirect(302, target);
});
```
Your database holds the data and no vendor limit applies, and you write the bot filtering, deduplication, geolocation and dashboards yourself. In the browser, [navigator.sendBeacon()](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon) posts up to 64 KiB without delaying navigation, and the `ping` attribute posts to a URL when a link is followed. [Caniuse](https://caniuse.com/ping) shows ping in Chrome 15, Edge 17 and Safari 6, with Firefox shipping it disabled. The [server-side versus client-side comparison](https://www.trackrev.io/blog/server-side-click-tracking-vs-client-side-pixel) goes deeper.
### Setting up a tracked link in seven steps
#### Step 1: give each placement its own link
One pricing page linked from a newsletter header, a newsletter footer and a podcast description needs 3 links, because the header reaches nearly every reader and the footer reaches only those who read to the end. A single shared URL merges their data at creation. Stripe's docs give the same advice for Payment Links: `utm_content` separates links that point to one payment page.
#### Step 2: tag the destination
Fill in all 4 tags for each slot, in lowercase, with the year and month in the campaign name. The free [UTM builder](https://www.trackrev.io/tools/utm-builder) assembles the URL.
| Slot | utm_source | utm_medium | utm_campaign | utm_content |
| --- | --- | --- | --- | --- |
| Newsletter header | weekly-digest | email | pricing-update-2026-10 | header-banner |
| Newsletter footer | weekly-digest | email | pricing-update-2026-10 | footer-link |
| Podcast notes | devtools-weekly | audio | sponsor-2026-11 | show-notes |
*One pricing page, 3 tagged links.*
#### Step 3: put a redirect in front
Create the short link on a domain you control, point it at the tagged URL, use a 302 and confirm the query string survives. Let one tool own the count, because 2 tools counting the same link will disagree.
#### Step 4: test before you publish
Open the link in a private window and again on a phone over mobile data. The click row should resemble this sample.
| Field | Example value | Where it comes from |
| --- | --- | --- |
| Time | 2026-10-04 09:14:07 UTC | The tracker's server clock |
| Link | news-2026-10-header | The slug in the short URL |
| IP address | 203.0.113.7 | The connection, used for country and city |
| Location | US, Austin | A geolocation lookup on the IP address |
| Device, OS, browser | iPhone, iOS 17, Safari 17 | The user agent string |
| Referrer | linkedin.com | The Referer header, when the sending app provides one |
| Bot flag | false | A user agent and prefetch check |
*Made-up values for one click.*
#### Step 5: separate people from machines
A redirect log counts requests, including those from software that fetches links before a person does, and several other factors push the count up or down.
| Source | What it does | Effect on the count |
| --- | --- | --- |
| [Slack link expanding](https://api.slack.com/robots) | Slackbot-LinkExpanding 1.0 fetches a URL when someone posts it, reads its Open Graph and Twitter Card tags, and caches the response for about 30 minutes | One extra request per URL, repeated at most every 30 minutes |
| [Microsoft Defender for Office 365 Safe Links](https://learn.microsoft.com/en-us/defender-office-365/safe-links-about) | Scans URLs before delivery and detonates links without a valid reputation in the background | Requests from a scanner before the recipient reads the email |
| [Apple Mail Privacy Protection](https://www.apple.com/legal/privacy/data/en/mail-privacy-protection/) | Downloads remote content in the background through 2 relays, whether or not the recipient engages | Open counts become unreliable, so clicks are the safer email metric |
| Script blockers | Stop the analytics tag from loading | Google Analytics 4 undercounts; a server-side redirect log is unaffected |
| [Safari Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) | Deletes script-created cookies after 7 days without a visit and caps them at 24 hours after tracker-style link decoration | A visitor ID written by JavaScript expires early |
| [Safari 17 Private Browsing](https://webkit.org/blog/14445/webkit-features-in-safari-17-0/) | Blocks known tracking query parameters in links | Some tracking parameters are stripped before the page loads |
Here is the cleanup on a send to 8,000 recipients, with invented numbers.
| Stage | Requests | Basis |
| --- | --- | --- |
| Logged by the redirect | 1,150 | Everything the server saw |
| Flagged as bots or prefetch | 310 | Scanner and crawler user agents |
| Repeats within 1 hour | 40 | Same IP address and user agent |
| Counted clicks | 800 | 1,150 minus 310 minus 40 |
| Click rate | 10% | 800 divided by 8,000 recipients |
*The unfiltered log would report 1,150 divided by 8,000, or 14.4%.*
TrackRev flags known crawler user agents, empty user agents and prefetch requests as bots, still redirects them, and leaves them out of its analytics and attribution. The [bot filtering guide](https://www.trackrev.io/blog/bot-traffic-filtering-for-links) covers the signals, and the [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the cookie caps.
#### Step 6: carry the click through to the payment
A click becomes conversion data when something joins its record to the payment record. The usual key is a visitor ID: the redirect sets a first-party cookie, the signup or checkout step passes the ID along, and the payment event returns with it. Stripe Payment Links give you 2 places to carry data, described on [Stripe's URL parameters page](https://docs.stripe.com/payment-links/url-parameters).
| Parameter | Limit | Where it comes back |
| --- | --- | --- |
| `client_reference_id` | 200 characters | The checkout.session.completed event |
| `utm_source` and the other UTM codes | 150 characters | The confirmation redirect URL, when that behavior is set to redirect |
The [Stripe Payment Links walkthrough](https://www.trackrev.io/blog/stripe-payment-links-attribution) shows the setup. The attribution window then decides which clicks get credit, and Stripe notes that bank debits and vouchers can take 2 to 14 days to confirm, which adds to the gap between click and payment. Say a visitor clicks a tracked link on October 1 and pays on October 19.
| Window in days | Days to spare | Credited |
| --- | --- | --- |
| 7 | -11 | No |
| 14 | -4 | No |
| 30 | 12 | Yes |
| 90 | 72 | Yes |
*18 days pass between click and payment.*
If the visitor ID sat in a cookie written by JavaScript and the person stayed away for 7 days, Safari deleted it, so a payment on day 18 has nothing to match. WebKit's 7-day rule covers cookies created in JavaScript, so an ID set in the redirect's response header falls outside it. WebKit also classifies domains that do enough top-frame redirects as cross-site trackers, and deletes a classified domain's data after 30 days of browser use without a first-party visit.
#### Step 7: read the results per link
Per-link figures expose differences that a channel total hides. Take one newsletter edition with 4 links to a $39 a month plan, with invented numbers.
| Link | Clicks | Signups | Conversion | First-month revenue | Revenue per click |
| --- | --- | --- | --- | --- | --- |
| Header banner | 620 | 31 | 5.0% | $1,209 | $1.95 |
| Inline link | 340 | 10 | 2.9% | $390 | $1.15 |
| Footer link | 180 | 2 | 1.1% | $78 | $0.43 |
| PS line | 90 | 4 | 4.4% | $156 | $1.73 |
| Channel total | 1,230 | 47 | 3.8% | $1,833 | $1.49 |
*Hypothetical figures.*
The footer earns $0.43 a click against $1.95 for the header, a gap that the $1.49 channel average hides. Volume limits how far to trust a row: the PS line reads 4.4% on 90 clicks, and one fewer sale would read 3.3%, so a single payment moves the rate by 1.1 points. Until each link has a few hundred clicks, I read the channel total and keep collecting per link, since link rows sum into channel totals.
### Where TrackRev fits
TrackRev is a link click tracker that runs the redirect method with the revenue join built in. Every tracked link resolves through a `/r/slug` redirect on a trackrev.io short domain or on your own domain. The server logs timestamp, referrer, device, browser, OS and city-level location before the 302, and it sets a first-party visitor cookie that lasts 365 days.
Click capture needs no script on your site. Revenue attribution adds one first-party pixel, and on a paid plan it matches each Stripe, Paddle, Polar or Lemon Squeezy charge to the clicks before it, using last-touch, first-touch or linear credit. The [Links and Analytics page](https://www.trackrev.io/solutions/links-and-analytics) has the details.
| Plan | Price a month | Links | Tracked events a month | Revenue figures |
| --- | --- | --- | --- | --- |
| Free | $0 | 50 | 1,000 | Hidden |
| Starter | $39 | Unlimited | Unlimited | Shown |
| Growth | $99 | Unlimited | Unlimited | Shown |
| Scale | $199 | Unlimited | Unlimited | Shown |
*From the pricing page. The 3 paid plans differ on workspaces, commission limits and support.*
A plain shortener fits when you need counts on a few links and sell nothing online, and YOURLS or the handler above fits when you want everything on your own hardware. Otherwise start on [the free plan](https://www.trackrev.io/pricing).
### Frequently asked questions
**What is a tracking URL?**
Any URL built so a system can record its use. One form carries UTM labels in its query string, and the other points at a domain that logs each request before redirecting. Google lists 9 UTM parameters and asks for 3 every time.
**Can I track link clicks for free?**
Yes. A standard Google Analytics 4 property reads UTM-tagged links at no cost, YOURLS is free open-source software you host yourself, and TrackRev's Free plan covers 50 links and 1,000 events monthly. Free setups usually give counts without revenue.
**Why does my shortener show more clicks than Google Analytics 4?**
Each tool deduplicates differently. With a 1-hour window, 5 refreshes in 10 minutes count as 1 click in one tool and 5 in a raw log. Google Analytics 4 records 0 for any visit where its script was blocked, and a shortener also logs scanner and bot requests that never run a script.
**Do tracking redirects affect SEO?**
MDN's status code pages say search engines pass SEO ranking to the new URL after a 301 and transfer none after a 302. For a guest post or partner page where ranking value matters, ask for a direct link instead. Redirect links suit email, social posts, ads and print.
**How long after a click can a sale still be credited?**
As long as the attribution window you set, whatever the cookie lifetime. A visitor cookie can last 365 days while a 30-day window credits only payments inside 30 days of the click, so day 45 goes uncredited.
**How many clicks does a link need before its numbers mean anything?**
No fixed threshold exists, but the arithmetic shows the problem. At 180 clicks one sale shifts conversion by 0.56 points, and at 1,000 clicks by 0.1 points. Hundreds of clicks per link make a fair floor for ranking.
---
## HubSpot partner program alternative for a Stripe-billed SaaS
URL: https://www.trackrev.io/blog/hubspot-partner-program-alternative
Published: 2026-05-04
Author: Muzahid Maruf
HubSpot's partner programs are for agencies, app builders and affiliates. To run your own SaaS partner program on Stripe, compare tools from $39 a month.
The best HubSpot partner program alternative for a SaaS company is a dedicated affiliate or partner tool that reads your billing system. HubSpot's 5 partner programs serve agencies, app builders, accelerators, schools and content creators, and none is software for running your own. HubSpot tracks its own affiliates on Impact, a third-party platform, outside its CRM. For a product billed through Stripe, Rewardful, FirstPromoter, Tolt and TrackRev start between $39 and $69 a month.
I run TrackRev, one of the four, so it is judged on the same terms as the others, including where it loses.
> **Key takeaways:**
>
> - HubSpot runs 5 partner programs for agencies, app builders, accelerators, schools and content affiliates. None is software for running your own SaaS program, and HubSpot manages its own affiliates on Impact.
> - HubSpot affiliates earn 30% recurring commission for up to a year, with a 180-day cookie. Solutions partners earn 20% for 3 years and pay a membership from $400 monthly.
> - HubSpot revenue attribution reads closed-won deals with an Amount, a Create date and a Close date. It is listed on Marketing Hub Enterprise, from $3,600 monthly plus a $7,000 onboarding fee.
> - For a Stripe-billed SaaS, Rewardful, FirstPromoter, Tolt and TrackRev start between $39 and $69 a month. PartnerStack and impact.com add partner marketplaces at higher prices.
> - A $10K commission cap covers $50,000 of partner revenue at a 20% rate and about $33,300 at 30%, so compare plan limits in one unit before comparing prices.
### What HubSpot's 5 partner programs cover
[HubSpot's partner page](https://www.hubspot.com/partners) lists 5 programs, each for a different kind of partner. Commission terms for 2 of them sit on their own pages.
| Program | Built for | What HubSpot publishes |
| --- | --- | --- |
| Solutions Partner | Agencies and consultancies whose clients spend $10K to $500K a year on implementation and services | 20% commission for 3 years on deals the partner brings; Partner Program Membership from $400 monthly |
| Affiliate Partner | Bloggers, review sites and other content creators | 30% recurring commission for 12 months, 180-day cookie, free to join |
| Technology Partner | Developers building apps on HubSpot's open platform | No commission terms on the overview page |
| Startup Partner | Accelerators, incubators and VCs | CRM Suite access at a startup-friendly cost |
| Education Partner | Colleges and universities | No commission terms on the overview page |
*Terms from HubSpot's partner program pages, October 2026.*
None of these helps a SaaS company recruit and pay its own partners. The [Affiliate Partner Program FAQ](https://www.hubspot.com/partners/affiliates) shows where HubSpot does that work: Impact hosts the links, tracks performance and processes commission payments.
### What the HubSpot affiliate program pays
The [affiliate page](https://www.hubspot.com/partners/affiliates) advertises 30% recurring commission for up to 12 months with a 180-day cookie, and says one sale can pay $1,000 or more. Joining is free, applications take 2 to 3 business days, and payouts by direct deposit or PayPal start at a $10 balance.
| Affiliate tier | Signups a month | Commission |
| --- | --- | --- |
| Starter | 0 to 29 | 30% recurring, 12-month cap |
| Sprocket | 30 to 99 | 30% recurring and/or cost per signup |
| Elite | 100 or more | Custom commission |
*Tiers from HubSpot's affiliate page, October 2026. Moving up requires holding the signup level for 3 months, and cost per signup is subject to restrictions.*
The [Solutions Partner Program](https://www.hubspot.com/partners/solutions) pays 20% for 3 years on deals a partner brings. It also pays 20% for 1 year on some upmarket deals HubSpot's own reps originate and co-sell. The package starts at $400 monthly and waives up to $6,000 of onboarding fees per client, and HubSpot waives the membership fee itself when the partner's own HubSpot spend covers it. Partners typically need 2 to 3 months to start serving clients.
> **Rate against duration:** On a $49 plan, 30% for 12 months pays a partner $176.40 per customer who stays the full year. 20% for 36 months pays $352.80 per customer who stays 3 years. A longer window costs more per retained customer even at a lower rate.
Copying HubSpot's 30% for 12 months is a reasonable first draft for a SaaS affiliate program. The [2026 commission benchmarks](https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026) show what other programs pay, and the guide to [creating an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) covers cookie windows and payout rules.
### HubSpot partner program alternatives for Stripe-billed SaaS
| Tool | Monthly plans and limits | Worth knowing |
| --- | --- | --- |
| [Rewardful](https://www.rewardful.com/pricing) | $49 for $7,500 of affiliate-attributed revenue, $99 for $15,000, $149 and up for $30,000 | 14-day trial, 0% transaction fee, 2 months free on yearly billing; the $49 plan has 1 campaign and 2 team members, and a branded portal and custom domain start at $99 |
| [FirstPromoter](https://firstpromoter.com/pricing) | $49 for $5,000 of affiliate revenue, $99 for $15,000, $149 above $15,000 | 14-day trial; billing through Stripe, Paddle, Chargebee, Recurly and Braintree; 1,000 affiliates on the $49 plan; cookie life up to 9,999 days |
| [Tolt](https://tolt.com/pricing) | $69 for $10,000 earned from affiliates, $99 for $20,000, $199 for $50,000 | 14-day trial; Stripe, Paddle and Chargebee; the $69 plan has 2 programs and 3 team members, and W-9 and W-8 collection with 1099 filing starts at $99 |
| [TrackRev](https://www.trackrev.io/pricing) | $39 for $10K of commission tracked, $99 for $100K, $199 unlimited | Stripe, Paddle, Polar and Lemon Squeezy; link tracking and channel revenue on the same data |
| [PartnerStack](https://partnerstack.com/pricing) | No published price; Launch, Growth and Enterprise plans are confirmed in a demo | Launch includes marketplace access to active B2B partners |
| [impact.com](https://impact.com/integrated-platform-prices/) | $30 Starter, $500 Essentials, $2,500 Pro, Enterprise by quote | Starter needs a Shopify, BigCommerce, WooCommerce, Adobe Commerce or Squarespace integration; Essentials adds a 90,000-partner marketplace |
*Prices from each vendor's pricing page, October 2026.*
#### Pick a Stripe-native affiliate tool when you recruit your own partners
With customers, creators and consultants you already know as partners, you do not need a marketplace. The four tools at the top of the table count different things against their plan limits: Rewardful and FirstPromoter meter affiliate revenue, while TrackRev meters the commission tracked on it. At a 20% rate, TrackRev's $10K cap corresponds to $50,000 of partner revenue, and at 30% to about $33,300, against $7,500 on Rewardful's $49 plan.
Pick FirstPromoter or Tolt over TrackRev when you bill through Chargebee; FirstPromoter also lists Recurly and Braintree, and TrackRev reads Stripe, Paddle, Polar and Lemon Squeezy. Rewardful lists itself as a Premier Stripe Partner, but its branded portal and custom domain start at the $99 plan, where Tolt and TrackRev include a branded portal on every plan.
#### Pick a marketplace when recruiting is the bottleneck
impact.com's $500 Essentials tier lists 90,000 partners, and its $2,500 Pro tier adds cross-device tracking. Its $30 Starter tier requires an ecommerce platform integration, so a SaaS billed through Stripe would begin at Essentials, and impact.com notes a one-time setup fee. PartnerStack publishes no price and includes marketplace access plus a choice of affiliate link tracking or lead and deal registration in its Launch plan. The [PartnerStack comparison](https://www.trackrev.io/blog/partnerstack-vs-trackrev) and the [impact.com comparison](https://www.trackrev.io/compare/impact) cover the trade-offs.
#### Where TrackRev fits and where it does not
TrackRev runs the affiliate program and link tracking on one data model, so a partner's revenue sits beside your newsletter, paid and organic channels, ranked by the MRR each pays. Partners earn recurring commission on every renewal, and Partner Accelerator pays partners who recruit partners from one capped pool, 30% by default. A refund or dispute takes commission back out, and a hold period you set per program, from 0 to 180 days with a default of 0, delays payment until your refund window passes. You pay from a PayPal or Wise CSV export and mark each payout paid, and partners upload W-9 or W-8 forms during onboarding.
The free plan tracks links only, 50 of them and 1,000 events a month, with the affiliate program and revenue figures locked. Paid plans include the whole product: Starter is $39 for 1 workspace, Growth is $99 with unlimited workspaces, and Scale is $199 with priority support. Annual billing charges for 9 months and gives 12, which puts Starter at $351 a year, Growth at $891 and Scale at $1,791.
TrackRev is not a partner relationship manager. It has no partner marketplace, deal registration, certification courses or MDF workflow, and its integrations list has no HubSpot entry. The `sale.created` webhook sends up to 10 fields per attributed charge, including order ID, amount and channel, so a small handler can write deals into HubSpot, though you would maintain it yourself. When agencies implement your product and sales reps close the deals, HubSpot's Solutions Partner model or PartnerStack's lead and deal registration fits better. Otherwise the [affiliate program](https://www.trackrev.io/solutions/affiliate-program) starts on the $39 Starter plan.
### What HubSpot attribution does with partner traffic
HubSpot's [attribution reporting](https://knowledge.hubspot.com/reports/understand-attribution-reporting) is its closest answer to channel revenue tracking. The documentation limits deal create and revenue attribution reports to Marketing Hub Enterprise, and the [plan comparison](https://www.hubspot.com/pricing/marketing) lists multi-touch revenue attribution there only.
| Marketing Hub plan | Starts at | Onboarding fee | Core Seats | Revenue attribution |
| --- | --- | --- | --- | --- |
| Professional | $800 monthly | $3,000 | 3 | Not listed |
| Enterprise | $3,600 monthly | $7,000 | 5 | Multi-touch, up to 10,000 logged interactions per contact |
*From HubSpot's Marketing Hub pricing page, October 2026.*
Revenue attribution reads deals. A deal counts only in a closed-won stage with one or more associated contacts and values in the Amount, Create date and Close date properties. Credit then goes to the interactions HubSpot tracked for those contacts, such as ad clicks, form submissions, email clicks and page views, sampled up to 100,000 per deal. Most of the setup work is cleaning that deal data and deciding how Stripe payments become deals.
HubSpot lists 9 attribution models. The W-shaped model gives 30% each to the first interaction, the one that created the contact and the one that created the deal, then spreads the last 10% across the rest. Time decay uses a 7-day half-life, so a touch 8 days before a sale earns half the credit of one 1 day before. TrackRev has 3, last click, first click and linear, so HubSpot wins outright on model variety, and the [attribution model comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers when each fits.
In Marketing Hub Enterprise revenue reports, a Stripe payment appears only after something writes it there as a deal. Give each partner's link its own UTM source, which works because UTM source is a report dimension. Interactions outside HubSpot count only when the link carries UTM parameters and lands on a page with HubSpot's tracking code. The reports assign deal revenue credit; they do not calculate commission, reverse it on a refund or pay a partner. Where reps log won deals, HubSpot also credits calls, meetings and email replies that a billing-based tool never sees.
### How a partner link gets credit for a Stripe charge
Tools in this category carry one identifier from click to charge: they store a visitor or partner ID when the link is clicked, pass it into Stripe Checkout, and read it back from the webhook. Stripe gives you two places for it, the [client_reference_id](https://docs.stripe.com/api/checkout/sessions/object) on a Checkout Session and [metadata](https://docs.stripe.com/metadata), which allows 50 key-value pairs with keys up to 40 characters and values up to 500.
Checkout Session for a subscription, carrying the partner ID
```
curl https://api.stripe.com/v1/checkout/sessions \
-u "$STRIPE_SECRET_KEY:" \
-d mode=subscription \
-d "line_items[0][price]=price_123" \
-d "line_items[0][quantity]=1" \
-d "client_reference_id=vis_8f3k2" \
-d "subscription_data[metadata][partner]=jane-newsletter" \
-d success_url=https://example.com/welcome
```
Placement decides whether renewals stay attributed. Stripe does not copy metadata between related objects by default, so a value left on the Checkout Session stays there, while a Payment Link copies its metadata to each session it creates, once. Values in `subscription_data.metadata` are saved on the Subscription, and each invoice it creates gets a one-time snapshot, which is how a month-6 renewal still names the partner. The tools above handle this wiring, and the [Stripe metadata setup guide](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) covers the manual build.
### Frequently asked questions
**Does HubSpot sell software for running my own affiliate or partner program?**
Not according to its partner pages, which describe 5 programs for partnering with HubSpot. HubSpot manages its own affiliates on Impact, so a SaaS company needs a dedicated affiliate tool such as Rewardful, FirstPromoter, Tolt or TrackRev, or a marketplace such as PartnerStack.
**How much commission does the HubSpot affiliate program pay?**
Affiliates earn 30% recurring commission for up to 12 months, with a 180-day cookie window. Tiers follow monthly signups, 0 to 29, 30 to 99 and 100 or more, and the top tier negotiates custom commission.
**What is the difference between HubSpot's Affiliate Program and Solutions Partner Program?**
Affiliates promote HubSpot to an audience through content and join free. Solutions partners serve clients directly, pay a $400 monthly membership unless their own HubSpot spend covers it, and earn 20% for 3 years.
**Can HubSpot track affiliate referrals?**
Indirectly. Give each partner's link its own UTM source and HubSpot's reports can credit closed-won deals to it, but commission math, refund reversal and payouts need another tool. Revenue attribution also needs Marketing Hub Enterprise, from $3,600 per month.
**What does a SaaS affiliate program cost to start on Stripe?**
Tool fees run from $39 per month for TrackRev to $49 for Rewardful and FirstPromoter and $69 for Tolt. Commission is the larger cost: at 20% for 12 months, a customer on a $99 plan who stays the year earns the partner $237.60. Rewardful, FirstPromoter and Tolt each list a free trial, while TrackRev's free plan covers link tracking only.
**Can I use TrackRev alongside HubSpot?**
Yes. HubSpot keeps the contacts and deals while TrackRev tracks partner links and Stripe revenue. Moving attributed sales across takes a handler or API script that you write, and the sale.created webhook carries up to 10 fields to start from.
---
## How to track influencer conversions from click to payment
URL: https://www.trackrev.io/blog/influencer-attribution-saas
Published: 2026-04-18
Author: Muzahid Maruf
How to track influencer conversions in 6 steps: a link and a promo code per creator, each payment matched to its click, creators ranked by revenue.
To track influencer conversions, give every creator a tracked link and a personal promo code, log each click on your server, and match the payment that follows to the creator who earned it. Platform dashboards report views and link taps, and Google Analytics 4 reports sessions, so neither shows who paid. In the invented example below, a creator with 2,300 clicks sent 3 paying customers and one with 1,400 clicks sent 21.
> **Key takeaways:**
>
> - Give each creator 1 tracked link per placement and 1 personal promo code, so a viewer who clicks and a viewer who types a code credit the same creator.
> - In the invented example, the creator with 2,300 clicks brought 3 paying customers and the creator with 1,400 clicks brought 21, so count a conversion at the first successful charge.
> - Write UTM values in lowercase and always set utm_source, utm_medium and utm_campaign: Google Analytics 4 treats Meta and meta as different values.
> - A 30% commission on a $49 plan costs $14.70 a month per paid customer. TrackRev's commission hold runs from 0 to 180 days and defaults to 0.
> - Revenue per creator and affiliate programs need a paid TrackRev plan from $39/month. The free plan covers 50 links and 1,000 tracked events a month.
### Why creator dashboards stop before the payment
[YouTube Analytics](https://support.google.com/youtube/answer/9314355) reports how viewers reach a video, Google Analytics 4 reports the session on your site, and Stripe reports the charge without knowing which video sent the customer. Under Google's [default channel group rules](https://support.google.com/analytics/answer/9756891), Affiliates needs a medium of exactly affiliate and no rule mentions a medium called influencer, so a link tagged with a creator's name as the source and influencer as the medium lands in Unassigned.
### Which method catches which conversion
| Method | Catches | Misses |
| --- | --- | --- |
| Tracked link, 1 per placement | Every click on your server | Viewers who never click |
| UTM tags in Google Analytics 4 | Sessions by creator | The payment |
| Personal promo code, 1 per creator | Podcast reads, cross-device buyers | Buyers who skip the code box |
| Signup question, 1 dropdown | Viewers who searched your name | Whatever the buyer forgets |
### How to track influencer conversions in 6 steps
#### Step 1: Decide which conversion you pay for
Signups are the cheapest number to inflate: a free trial with no card attracts viewers who never pay. Count a creator's conversion at the first successful charge. With a 14-day trial that charge cannot appear before day 14, so put the trial length in the creator's brief before the contract is signed.
#### Step 2: Create one link per creator and placement
Write every value in lowercase: utm_source for the platform, utm_medium for the deal type, utm_campaign for the creator and utm_content for the placement. [Google Analytics 4 help on campaign URLs](https://support.google.com/analytics/answer/10917952) says to always set the first 3 and treats Meta and meta as different values, so one stray capital splits a creator across 2 rows. The free [UTM builder](https://www.trackrev.io/tools/utm-builder) keeps the spelling consistent.
One creator, two placements
```
https://example.com/pricing?utm_source=youtube&utm_medium=influencer&utm_campaign=nora&utm_content=video-description
https://example.com/pricing?utm_source=youtube&utm_medium=influencer&utm_campaign=nora&utm_content=pinned-comment
```
#### Step 3: Give each creator a personal promo code
In Stripe, a coupon holds the discount and [many promotion codes can point at one coupon](https://docs.stripe.com/billing/subscriptions/coupons), so NORA20 and PRIYA20 can share one 20% coupon and each redemption creates a Discount object. A code credits a creator only when it belongs to that creator alone; a shared one discounts the sale and credits nobody. Stripe's own creator example is a 25% code for new subscribers, with these limits:
| Limit | Stripe's example | What it stops |
| --- | --- | --- |
| Duration | 3 months | A discount on every invoice |
| First-time customers only | On | Existing customers reusing the code |
| Minimum order value | 50 USD | Orders below your floor |
| Redemption cap | 500 | A code that spreads past the audience |
*Limits Stripe lets you set on a promotion code, with the values from its creator example.*
For a Stripe Payment Link, add `prefilled_promo_code` to the creator's URL so the code is waiting in the box after a click. The buyer can still edit it, and promotion codes must be [enabled on the link](https://docs.stripe.com/payment-links/customize). The [coupon code tracking guide](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) shows how to read a code off an invoice.
#### Step 4: Check the link works where the creator will post it
On YouTube, [long-form description links are clickable only when the channel has advanced features enabled](https://support.google.com/youtube/answer/13748639), and Shorts descriptions and comments are non-clickable. Tap the live link from a phone and confirm the click appears before you pay. [YouTube revenue attribution](https://www.trackrev.io/blog/youtube-revenue-attribution-tracking) covers each placement.
#### Step 5: Connect the click to the payment
Join the click log to Stripe Checkout with an ID that survives the redirect: pass the visitor ID as `client_reference_id` and the creator and placement as subscription metadata. Stripe's [metadata limits](https://docs.stripe.com/metadata) are 50 key-value pairs, 40 characters per key and 500 per value. Without checkout code, record the visitor ID at signup and match the signup email to the billing email afterward.
Checkout Session that records the creator (Node.js)
```
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_starter_monthly", quantity: 1 }],
allow_promotion_codes: true,
client_reference_id: visitorId, // read from the click cookie or your session
subscription_data: {
metadata: { creator: "nora", placement: "video-description" },
},
success_url: "https://example.com/welcome",
});
```
#### Step 6: Set the credit rule and the window
Creators introduce buyers who finish elsewhere. Say a buyer clicks a creator's link, then a newsletter link, then a retargeting ad before paying $49. [Last-touch, first-touch and linear attribution](https://www.trackrev.io/blog/attribution-models-saas-comparison) divide that payment differently, and I would report both ends for the first 3 campaigns.
| Credit rule | Creator link | Newsletter link | Retargeting ad |
| --- | --- | --- | --- |
| Last touch | $0 | $0 | $49 |
| First touch | $49 | $0 | $0 |
| Linear | $16.33 | $16.33 | $16.33 |
*One $49 first payment under each credit rule, for an invented 3-click path.*
Match the window to the content: a sponsored post spikes for days and a tutorial keeps getting found for months. TrackRev's default is 90 days. WebKit's [tracking prevention policy](https://webkit.org/tracking-prevention/) deletes script-written cookies after 7 days without a visit and caps them at 24 hours when a landing page was reached through link decoration, so a 30-day cookie window runs shorter on Apple Safari. A click logged on your server does not expire that way.
### What an influencer campaign report should show
Influencer reporting that ranks creators by clicks rewards the wrong one. Three invented creators selling a $49/month plan show the gap, first in the funnel and then in the money.
| Creator | Clicks | Signups | Paid customers | Click to signup | Signup to paid | Paid per 100 clicks |
| --- | --- | --- | --- | --- | --- | --- |
| YouTube tutorial | 1,400 | 126 | 21 | 9.0% | 16.7% | 1.5 |
| Newsletter | 610 | 52 | 4 | 8.5% | 7.7% | 0.7 |
| Instagram Reels | 2,300 | 90 | 3 | 3.9% | 3.3% | 0.1 |
*Funnel for 3 invented creators. Rates are shares of the column before.*
Instagram Reels sent the most clicks (2,300) and the fewest buyers (3), at $400 of fee per customer against $95 for the tutorial. The last column divides the fee by revenue, not margin, so a product with an 80% gross margin recovers it more slowly. TrackRev's [campaign folders](https://www.trackrev.io/products/campaign-folders) roll links up per campaign.
| Creator | Fee | MRR | Fee per paid customer | Months to recover fee |
| --- | --- | --- | --- | --- |
| YouTube tutorial | $2,000 | $1,029 | $95 | 1.9 |
| Newsletter | $800 | $196 | $200 | 4.1 |
| Instagram Reels | $1,200 | $147 | $400 | 8.2 |
*The same 3 creators. MRR is paid customers times $49, before churn and refunds.*
#### When to read the report
A report read too early shows trials and no revenue. For a 14-day trial on a monthly plan, counting from the post:
| Day | What the report can show | What is still missing |
| --- | --- | --- |
| 7 | Clicks, signups and trial starts | Every payment |
| 14 | First charges as trials end | Renewals |
| About 44 | Second charges, so who stays past month 1 | Late refunds and cancellations |
| 90 | Refunds, cancellations and a closed 90-day window | Buyers who convert later |
### Flat fee or 30% commission: the cost over 12 months
A flat fee is paid before any results and a commission only after a sale. At 30%, a $49 plan pays $14.70 a month, or $176.40 over 12 months for each customer who stays that long.
| Creator | Paid customers | 30% commission | Flat fee |
| --- | --- | --- | --- |
| YouTube tutorial | 21 | $3,704.40 | $2,000 |
| Newsletter | 4 | $705.60 | $800 |
| Instagram Reels | 3 | $529.20 | $1,200 |
*Commission over 12 months against the flat fees above, assuming no churn.*
Commission costs more than the fee for the tutorial ($3,704.40 against $2,000) and less for the other 2, and across all 3 it totals $4,939.20 against $4,000 in fees. It also adds a refund rule: a commission paid on day 1 for a customer who refunds on day 20 is money gone. TrackRev's hold is set per program from 0 to 180 days and defaults to 0, so set it to your refund window.
### Disclosure belongs in the post
The Federal Trade Commission's [Disclosures 101 for social media influencers](https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers) says a creator must disclose a brand relationship, including free products and payment, where it is hard to miss: not behind a "more" click or in a pile of hashtags. Put that wording in the brief.
### Where influencer campaign tracking still leaks
Cross-device buyers click on a phone and sign up on a laptop with no visitor ID, and other viewers never click and search your product name later. A promo code catches the first group if they remember it. A signup question, "How did you hear about us?" with each active creator as an option, catches the second, and the gap between those answers and the tracked totals is a rough measure of untracked influence. [Self-reported versus tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data) covers how to weigh the 2.
### What TrackRev does for creator campaigns
TrackRev logs each click on the server during the redirect. Add the first-party pixel and connect Stripe, Paddle, Polar or Lemon Squeezy, and each payment joins back to its click, with last touch as the default credit rule. Channel analytics ranks sources by revenue and revenue per click. A creator on commission becomes a partner in the [affiliate program](https://www.trackrev.io/solutions/affiliate-program), with a personal link, an optional personal code and commission that reverses on a refund.
The free plan is link tracking only. Revenue figures and the affiliate program need a paid plan, and annual billing charges for 9 months and gives 12. Current plans are on the [pricing page](https://www.trackrev.io/pricing).
| Plan | Price | Includes |
| --- | --- | --- |
| Free | $0 | 50 links, 1,000 tracked events a month, 1 workspace, no revenue figures |
| Starter | $39/month | Revenue attribution and affiliate program, 1 workspace, up to $10K commission tracked a month |
| Growth | $99/month | Unlimited workspaces, up to $100K commission tracked a month |
| Scale | $199/month | Unlimited workspaces, unlimited commission tracked and priority support |
*TrackRev plans, October 2026.*
#### When another tool fits better
TrackRev reads revenue from 4 billing systems. If your sales run through another platform, or only through an App Store, confirm the payments can reach it before you plan around revenue per creator; click counts work either way. If you only want clicks per creator, UTM tags in Google Analytics 4 and the free UTM builder are enough.
### Frequently asked questions
**How do I track influencer conversions without a tracking link?**
Use a personal promo code and a signup question. A code unique to one creator credits any payment that carries it even when nobody clicked, which covers podcast reads.
**How do I track creators who only post YouTube Shorts or Instagram Stories?**
Put the weight on the code: ask the creator to say it aloud and show it on screen, and point viewers to a longer video whose description carries your tracked link.
**Should I pay creators a flat fee, a commission, or both?**
Many deals use both. Judge a hybrid by cost per paid customer: the fee plus commission paid so far, divided by customers. A $500 fee plus 30% of a $49 plan on 10 customers costs $500 + 10 x $14.70 = $647 after month 1, or $64.70 each, and it rises as the commission keeps paying.
**What is a good conversion rate for influencer links?**
I know of no published benchmark worth trusting, because price, trial design and audience fit change the answer. Use your first campaign as the baseline and compare later creators on paid customers per 100 clicks.
**What if a creator refuses to use a tracking link?**
Offer a vanity address on your own domain, such as example.com/nora, that redirects to your pricing page with the tags attached.
**Can one creator have more than one promo code?**
Yes. Stripe allows many promotion codes on one coupon, so NORA20YT and NORA20NL can sit side by side and show which platform worked.
---
## iOS 17 Link Tracking Protection: what it strips and what survives
URL: https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas
Published: 2026-07-11
Author: Muzahid Maruf
iOS 17 Link Tracking Protection removes known tracking parameters in Messages, Mail and Private Browsing. What it strips, what survives and how to test it.
iOS 17 Link Tracking Protection removes known tracking parameters from links in Messages, Mail and Safari Private Browsing, and Apple publishes no list of which ones. According to Stape, `gclid` and `fbclid` are removed while `utm_` tags still arrive in Private Browsing. What survives lives outside the query string: a short code in the URL path, a click logged on your server, a cookie your server sets in a response, and a visitor ID stored with the payment.
> **Key takeaways:**
>
> - Apple announced Link Tracking Protection on June 5, 2023 and names no parameters, so every list of what it strips comes from outside Apple.
> - Stape reports gclid and fbclid removed in 3 places while utm_ tags arrive in Private Browsing, so keep a second copy of every source outside the URL.
> - Safari deletes cookies created in JavaScript after 7 days without a visit, and a cookie set in a server response is outside that cap.
> - Mail Privacy Protection, Intelligent Tracking Prevention and Link Tracking Protection restrict different things, so test each hop on an iPhone before blaming one.
### What iOS 17 Link Tracking Protection does
Apple announced the feature on June 5, 2023, under the heading [Link Tracking Protection in Messages, Mail, and Safari Private Browsing](https://www.apple.com/newsroom/2023/06/apple-announces-powerful-new-privacy-and-security-features/). The extra information some websites add to URLs to follow people across other sites is removed from links shared in Messages and Mail, and from links in Private Browsing, and the links keep working. The [WebKit post for Safari 17.0](https://webkit.org/blog/14445/webkit-features-in-safari-17-0/), which reached iOS 17 on September 18, 2023, lists blocking known tracking query parameters in links among the Private Browsing changes. Neither page names a parameter.
Every list of stripped parameters therefore comes from outside Apple. Stape, a server-side tagging vendor, [reports](https://stape.io/news/safari-ios26-advanced-fingerprinting-protection) gclid and fbclid stripped in all 3 places, and the standard UTM tags kept in Private Browsing. I found no Apple commitment to leave them alone.
#### Which parameters it removes
Mozilla's [query stripping documentation](https://firefox-source-docs.mozilla.org/toolkit/components/antitracking/anti-tracking/query-stripping/index.html) names 8 parameters for [Firefox 102 (June 28, 2022)](https://www.firefox.com/en-US/firefox/102.0/releasenotes/) in Strict mode and says no standard yet defines navigational tracking protection. The W3C Privacy Community Group's [March 2025 draft](https://privacycg.github.io/nav-tracking-mitigations/) adds that Brave keeps a list of its own.
| Parameter | Set by | Safari, per Stape (August 2025) | Firefox 102 Strict, per Mozilla |
| --- | --- | --- | --- |
| gclid | Google Ads auto-tagging | Stripped in all 3 places | Not among the 8 |
| fbclid | Meta ads | Stripped in the same 3 places | Stripped |
| utm_source, utm_medium, utm_campaign | Your own tagging | Not stripped in Private Browsing | Not among the 8 |
| mc_eid | Mailchimp emails | Not reported | Stripped |
| mkt_tok | Marketo emails | Not reported | Stripped |
| _hsenc | HubSpot emails | Not reported | Stripped |
*Apple names no parameters, so the Safari column rests on one vendor's notes.*
#### Where it applies
| Where the link opens | In Apple's description? | Evidence |
| --- | --- | --- |
| Messages and Mail | Yes | Apple announcement, June 5, 2023 |
| Safari Private Browsing | Yes | Apple, plus the WebKit post for Safari 17.0 |
| A regular Safari tab | No | Apple lists no such case |
| Slack, LinkedIn or Instagram in-app browsers | No | Not mentioned, so test each one |
Stape's article, updated August 6, 2025, says Safari might extend the protection beyond those places in iOS 26 and that Apple had confirmed only the original three. I found no Apple statement that it did. What Safari 26.0 added, according to [WebKit's September 15, 2025 post](https://webkit.org/blog/17333/webkit-features-in-safari-26-0/), is a separate limit: known fingerprinting scripts can no longer read query parameters or `document.referrer`, and cannot set long-lived cookies or LocalStorage. The post doesn't say which scripts count as known.
### Apple privacy changes that cause similar symptoms
| Feature | Ships in | Announced or released | What it restricts |
| --- | --- | --- | --- |
| [Intelligent Tracking Prevention 2.1](https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/) | Safari 12.1, iOS 12.2 | February 2019 | Cookies created through document.cookie last at most 7 days; cookies set in HTTP responses are not covered |
| [Intelligent Tracking Prevention 2.3](https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/) | Safari 13, iOS 13 | September 23, 2019 | After a navigation from a classified tracker to a URL with a query string, LocalStorage and other non-cookie data are deleted after 7 days without an interaction |
| [Mail Privacy Protection](https://www.apple.com/newsroom/2021/06/apple-advances-its-privacy-leadership-with-ios-15-ipados-15-macos-monterey-and-watchos-8/) | iOS 15 | June 7, 2021 | Stops senders from using invisible pixels to see when an email is opened, and hides the recipient's IP address |
| Link Tracking Protection | Safari 17.0, iOS 17 | June 5, 2023 (announced); September 18, 2023 (shipped) | Removes tracking parameters on Apple's list from links in 3 contexts |
| Fingerprinting script limits | Safari 26.0, iOS 26 | September 15, 2025 | Restricts what fingerprinting scripts can read and store |
[Litmus's July 2026 data](https://www.litmus.com/email-client-market-share/) puts Apple clients at 62.26% of email opens, ahead of Gmail at 27.03% and Outlook at 5.83%, and says Mail Privacy Protection affects roughly 55-60% of all opens, so open rates say little and clicks are the signal worth keeping. Clicks inside Apple Mail are the ones Link Tracking Protection can touch. Our [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the cookie rows from the revenue side.
### What breaks in a SaaS funnel
Exposure follows the channel. Paid search mostly sits outside the 3 listed places: Google Ads adds `gclid` through [auto-tagging](https://support.google.com/google-ads/answer/3095550), and a Google Search click that opens in an ordinary tab is not on Apple's list. Newsletters are the exposed case, since a tap in Apple Mail is on it, and a source ID from Mailchimp or HubSpot, such as `mc_eid` or `_hsenc`, is the kind of parameter Firefox 102 already strips.
The cost shows up as misfiled revenue. Take 40 signups a month from one newsletter on a $39 plan, where every signup who arrives through Apple Mail loses its source ID.
| Share arriving through Apple Mail | Newsletter customers shown | Signups filed as Direct | MRR filed as Direct | 12-month revenue filed as Direct |
| --- | --- | --- | --- | --- |
| 20% | 32 | 8 | $312 | $3,744 |
| 40% | 24 | 16 | $624 | $7,488 |
| 60% | 16 | 24 | $936 | $11,232 |
| 80% | 8 | 32 | $1,248 | $14,976 |
*Invented numbers for the arithmetic: 40 signups a month on a $39 plan, each paying for 12 months.*
### What survives and why
| Mechanism | Survives? | Why |
| --- | --- | --- |
| utm_ tags in the URL | Reported yes | Stape reports them arriving in Private Browsing, and Apple could add them to its list |
| gclid, fbclid and similar click IDs | No, in the 3 listed places | Stape reports them stripped |
| A code in the URL path | Yes | No query string, so nothing for a filter to match |
| A click logged on your server | Yes | Recorded before any script on the page runs |
| A cookie set in an HTTP response | Yes | ITP's 7-day cap targets cookies created in JavaScript |
| A cookie written by JavaScript | Capped | 7 days at most, or 24 hours following a decorated link from a classified tracker |
| A visitor ID on the payment | Yes | Stripe stores it, out of any browser's reach |
#### A redirect that reads the path
A server log cannot recover a parameter that Safari removed before the request, so the click's identity goes in the path of a link you own, such as `go.example.com/spring-launch`. The redirect logs the click, sets the visitor cookie and sends a 302 built from saved UTM tags.
A path-based redirect that logs the click and sets the visitor cookie (Express with cookie-parser)
```
const crypto = require("crypto");
// go.example.com/spring-launch: the click's identity is the path, not a query parameter
app.get("/:code", async (req, res) => {
const link = await db.links.findByCode(req.params.code);
if (!link) return res.redirect(302, "https://www.example.com");
let vid = req.cookies.vid;
if (!vid) {
vid = crypto.randomUUID();
res.cookie("vid", vid, {
maxAge: 365 * 24 * 60 * 60 * 1000, // one year, in milliseconds
domain: ".example.com", // readable by www, app and checkout
secure: true,
sameSite: "lax",
});
}
await db.clicks.insert({
linkId: link.id,
vid,
userAgent: req.get("user-agent"),
referer: req.get("referer"),
});
const destination = new URL(link.destination);
destination.searchParams.set("utm_source", link.utmSource);
destination.searchParams.set("utm_medium", link.utmMedium);
destination.searchParams.set("utm_campaign", link.utmCampaign);
res.redirect(302, destination.toString());
});
```
Setting `Domain=.example.com` lets www.example.com, app.example.com and checkout.example.com read one cookie, which a shared shortener cannot offer. Something must then carry the ID across the hop, usually a destination parameter, and the Privacy Community Group draft says Safari caps JavaScript cookies at 24 hours when that navigation comes from a domain it classifies as a tracker. Apple publishes no classifier, so test your own hop on a phone.
[WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) exempts cookies set in an HTTP response from the 7-day cap unless it detects CNAME or IP-address cloaking on a first-party subresource. A short link is a page navigation, so I read that rule as aimed at pixels on CNAME subdomains.
#### Store the visitor ID on the payment
A visitor who clicks on a Monday and subscribes 9 days later has lost a JavaScript cookie, while an ID stored on the payment cannot expire. Write the visitor ID into the Stripe fields below when you create the [Checkout Session](https://docs.stripe.com/api/checkout/sessions/object). Stripe does not copy the session's metadata to the subscription, so set `subscription_data.metadata` too and each renewal invoice carries a snapshot of the source. The [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post has the field mapping.
| Stripe field | What it holds | Limit |
| --- | --- | --- |
| client_reference_id | A string for reconciling the session with your own systems | One string per session |
| [metadata](https://docs.stripe.com/metadata) | Key-value pairs on the session | 50 pairs, keys up to 40 characters, values up to 500 |
| subscription_data.metadata | Pairs saved on the subscription the session creates | The same 50, 40 and 500 limits |
### Test your own links on an iPhone
Open one URL that carries 6 parameters in each of these places and check which reach your server.
| Step | Where to open it | What to expect |
| --- | --- | --- |
| 1 to 3 | Messages and Apple Mail, tapped from a thread or email to yourself, then a Safari Private Browsing tab | Going by Stape: 2 click IDs missing, 3 UTM tags present, 1 custom code unknown |
| 4 | Any non-private tab, as the control | All 6 present; a gap points at a redirect or script on your side |
| 5 | Slack, LinkedIn and Instagram in-app browsers | Unknown, because Apple does not describe them |
| 6 | Every iOS release after your last test | Repeat steps 1 to 4, since the list can change |
A test URL with click IDs, UTM tags and a custom code
```
https://www.example.com/pricing?gclid=test1&fbclid=test2&utm_source=iostest&utm_medium=manual&utm_campaign=ltp&ref=test3
```
Read the request your server received, not the address bar
```
grep "utm_source=iostest" /var/log/nginx/access.log | tail -n 5
```
A parameter in the log after the Messages tap was not removed before the request. One missing from it was dropped on the device or in a hop, and the [5-step hop test](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) finds which.
### How TrackRev handles the click
A TrackRev link keeps its channel and UTM tags on the saved link, so the shared URL holds only a short code. The [redirect](https://www.trackrev.io/products/first-party-tracking) logs the click on the server, adds the saved tags and a `_vid` visitor parameter to the destination, and answers with a 302. A [custom tracking domain](https://www.trackrev.io/products/custom-tracking-domains) takes one CNAME record pointed at cname.trackrev.io.
The pixel reads `_vid` on the first pageview and writes its own `vid` cookie with JavaScript, so Safari's 7-day cap applies and a visitor who returns later is new to the pixel. When someone identifies, TrackRev binds the visitor ID to their email, and the hourly sync of the [Stripe integration](https://www.trackrev.io/integrations/stripe) matches charges to clicks through it. The pixel also adds the visitor ID as `client_reference_id` to Payment Links and Buy Buttons, and renewals keep crediting the original click.
The redirect forwards only the saved tags and `_vid`, so a gclid added to a short link at send time never reaches your page.
The Free plan covers 50 links and 1,000 tracked events a month for link tracking, with revenue figures hidden. Seeing revenue by channel needs a paid plan, from Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)). If you only need sessions by source in Google Analytics 4, UTM tags that arrive and the naming rules in the [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) go most of the way without another tool.
### Frequently asked questions
**Does iOS 17 strip UTM parameters?**
Apple names no parameters. Stape's notes show the 3 standard UTM tags arriving in Safari Private Browsing while gclid and fbclid do not, so test a tagged link in Messages and Apple Mail after each iOS release.
**Which apps does Link Tracking Protection cover?**
Apple's 2023 announcement lists Messages, Mail and Safari Private Browsing. Safari tabs outside Private Browsing and the embedded browsers inside other apps are absent from it, so check your server log for what arrived.
**Does it affect email open tracking?**
Mail Privacy Protection, in iOS 15 and later, is the feature that hides opens. Link Tracking Protection acts on link URLs, so click data remains the number to build on.
**Can server-side tracking recover a stripped parameter?**
Only if the parameter reaches the server. When Safari removes it first, the access log has nothing to recover, so put what you need in the path.
**Does it break Google Ads conversion tracking?**
It can for clicks from Private Browsing, Mail or Messages, where gclid is removed. Google says auto-tagging is required for offline conversion tracking, so keep capturing gclid on your landing page.
**Has Apple expanded it since iOS 17?**
Apple's announcement still lists 3 places. Safari 26.0 added a separate fingerprinting limit in September 2025, so repeat the iPhone test after each release.
---
## Is Bitly free? What you get at $0 and what costs money
URL: https://www.trackrev.io/blog/is-bitly-free
Published: 2026-10-02
Author: Muzahid Maruf
Is Bitly free? Yes, with caps: an ad on every link, no click analytics and no custom domain. Paid plans start at $10 a month. Alternatives compared.
Is Bitly free? Yes, up to a point. The free plan costs $0, needs no credit card and has no time limit, and it allows 5 short links and 2 QR codes a month. It also routes your links through a preview page with an ad, reports no click counts and takes no custom domain. Counting clicks begins on Core, which costs $10 a month billed as $120 once a year.
I run TrackRev, which competes with Bitly. Every Bitly figure below comes from Bitly's own [pricing](https://bitly.com/pages/pricing), blog and help pages, read in October 2026.
> **Key takeaways:**
>
> - Bitly's free plan is $0 and has no end date, with 5 short links, 2 QR codes and 3 custom back-halves each month.
> - Free links open on a preview page with an ad, and the plan gives no click data, no redirects and no branded domain.
> - Paid plans on yearly billing are Core at $10 a month, Growth at $29 and Premium at $199. Click history starts on Core and your own domain on Growth.
> - Free accounts can connect 5 custom domains on Short.io, 3 on Dub and 1 on Rebrandly.
> - TrackRev starts with 50 links and 1,000 events monthly. Revenue per link arrives with paid plans from $39.
### Is Bitly free? What the free plan includes
According to [Bitly's free-plan article](https://bitly.com/blog/bitly-free-plan/), links made on the free plan do not expire. You do need an account. [Wikipedia](https://en.wikipedia.org/wiki/Bitly) dates the end of guest link creation to November 2023.
| What | Free plan allowance |
| --- | --- |
| Short links | 5 a month |
| QR codes | 2 a month, with limited colors, frames and patterns |
| Custom back-halves | 3 a month |
| Bitly Pages | 2, with Bitly branding |
| Clicks and scans counted | Unlimited |
| Click and scan analytics | None; only Pages views are tracked |
| Custom domain | No |
| Redirects, UTM builder, bulk creation | No |
| API requests | 1,000 a month |
*Bitly's Free plan limits, October 2026.*
### Bitly free plan limits to know before you share a link
#### Free links show an ad
Bitly says it uses ads on free accounts to keep the free plans free. A visitor who taps a free link lands on an interstitial page that shows a preview of the destination and an advertisement. The [help center article](https://support.bitly.com/hc/en-us/articles/32874287800333-Why-are-there-ads-on-my-links), updated January 12, 2026, points anyone who wants links without ads to a paid plan, and the [sign-up page](https://bitly.com/pages/landing/free-plan) for the tier is headed "Free With ads".
Links created with the discontinued no-account shortener keep the ad until you recreate them in a paid account, and Bitly's [anonymous-link FAQ](https://support.bitly.com/hc/en-us/articles/32500359495565-Free-Short-Link-Generator-Anonymous-Link-FAQ) says the fix is a new link to the same destination, because the old ones cannot be managed or redirected. Anything already printed or posted on one of those links stays on the ad page until you replace it.
#### No click or scan analytics
The free-plan article says the plan tracks views of your Pages but includes no click or scan analytics for short links or QR codes. Counting begins on Core, with 30 days of click and scan history. Growth keeps 4 months, Premium 1 year and Enterprise 2 years, which caps how far back a campaign review can reach.
#### The monthly cap and what counts toward it
Per Bitly's help center, [limits reset to zero](https://support.bitly.com/hc/en-us/articles/10796542543373-When-do-my-monthly-limits-reset) at midnight UTC at the end of each calendar month, so 5 links a month tops out at 60 a year. The [monthly limits article](https://support.bitly.com/hc/en-us/articles/11243274022413-What-are-my-monthly-limits) counts QR codes and Pages links toward the short-link limit and says redirects count too. The pricing page lists QR codes on their own line, so confirm how your account counts them on its billing and usage page. Once you reach the cap, you cannot shorten or redirect links until the next month starts.
#### A free link cannot be redirected
Bitly's pricing page lists redirects from Core upward, at 5 a month there, so a free-plan link keeps its destination for good. A mistyped destination, or a page you move later, means a new link and a reprint if the old one is on paper.
### Bitly pricing: what each paid plan adds
| Plan | Per month, billed yearly | Per year | Per month, billed monthly | Click data kept |
| --- | --- | --- | --- | --- |
| Free | $0 | $0 | $0 | None |
| Core | $10 | $120 | Not offered | 30 days |
| Growth | $29 | $348 | $35 | 4 months |
| Premium | $199 | $2,388 | $300 | 1 year |
*Bitly's prices, from its pricing page, October 2026.*
| Plan | Short links | QR codes | Custom back-halves | Redirects | API requests | Pages |
| --- | --- | --- | --- | --- | --- | --- |
| Free | 5 | 2 | 3 | None | 1,000 | 2 |
| Core | 100 | 5 | 100 | 5 | 5,000 | 5 |
| Growth | 500 | 10 | 500 | 20 | 25,000 | 10 |
| Premium | 3,000 | 200 | 3,000 | 110 | 50,000 | 20 |
*Bitly's allowances by plan, per month except Pages.*
Core adds the UTM builder and Bitly Assist, an AI feature for creating links and reading performance. Branded links on one complimentary custom domain arrive with Growth ([what a branded short link is](https://www.trackrev.io/blog/what-is-a-branded-short-link)), along with bulk creation of 100 links per upload. Premium raises that to 3,000 and brings city-level and device data, campaign-level tracking and mobile deep linking. Enterprise is a custom quote with multiple users, SSO, webhooks, 99.99% uptime and 2 years of click data.
Yearly billing takes Growth from $420 over twelve months at the monthly rate to $348, a $72 saving of 17%. Premium falls from $3,600 to $2,388, a $1,212 saving that matches the 34% Bitly advertises as its best case. Core has no monthly option, so the cheapest way in is a $120 charge up front.
Per link at full use, Growth is the cheapest paid tier: $348 for 6,000 links a year is about 6 cents each, against 10 cents on Core ($120 for 1,200) and about 7 cents on Premium ($2,388 for 36,000).
Take a team that tags 4 links for each of 12 campaigns a month, which is 48 short links. The free plan covers 5 of them, about a tenth. Core's 100 leaves 52 spare for $120 a year, and the 500 on Growth only pay off if a branded domain matters.
> **Downgrading with a custom domain:** Bitly's [downgrade article](https://support.bitly.com/hc/en-us/articles/360029870551-What-happens-when-I-downgrade-to-a-lower-subscription-plan) says a complimentary domain is not renewed when you move to a plan without a custom domain, and links on it stop working once the registration expires. Links on a domain you own keep redirecting while DNS points at Bitly, but Bitly stops renewing the SSL certificate, so visitors get a security warning after it lapses. bit.ly links are unaffected. The article was last updated April 15, 2024.
### What Bitly is used for
Bitly is a URL shortener and link management platform, as [Wikipedia](https://en.wikipedia.org/wiki/Bitly) describes it. The company dates to 2008, and bit.ly became Twitter's default shortener on May 6, 2009 before t.co replaced it. Character limits no longer explain why people shorten links: [X's documentation](https://docs.x.com/fundamentals/counting-characters) counts every URL as 23 of a post's 280 characters, whatever its length.
| Job | What Bitly provides | First plan with it |
| --- | --- | --- |
| Shorten a long URL | A bit.ly link | Free |
| Name the link | A custom back-half such as bit.ly/MyOnlinePage | Free |
| Print a QR code | PNG, JPEG or SVG downloads | Free |
| Publish a link page | Bitly Pages, with Bitly branding on Free | Free |
| Connect another app | API access | Free |
| Count clicks and scans | 30 days of history | Core ($10) |
| Tag campaigns | UTM builder | Core ($10) |
| Change a destination | Link and QR code redirects | Core ($10) |
| Brand the link | Your own domain, one included | Growth ($29) |
| Open an app from a link | Mobile deep links | Premium ($199) |
*Bitly jobs and the first plan that allows each, with its monthly price on yearly billing.*
### Free and cheaper Bitly alternatives
Bitly's free plan takes no custom domain, while Short.io's takes up to 5, Dub's 3 and Rebrandly's 1. [6 Bitly alternatives](https://www.trackrev.io/blog/best-bitly-alternatives-2026) ranks the wider field and [Bitly vs TrackRev](https://www.trackrev.io/compare/bitly) sets the two side by side.
| Tool | Free plan | Custom domain from | Click data on Free | Cheapest paid plan, per month |
| --- | --- | --- | --- | --- |
| Bitly | 5 links, 2 QR codes a month | Growth, 1 included | None | Core, $10 (yearly billing only) |
| Short.io | 1,000 branded links in total | Free, up to 5 | Up to 50,000 tracked clicks | Hobby, $5 |
| Rebrandly | 10 links, 10 QR codes a month | Free, 1 | Detail on 100 clicks a month | Essentials, $8 to $11 |
| Dub | 25 new links a month | Free, 3 | 1,000 tracked events a month, 30 days kept | Pro, $30 |
| TrackRev | 50 links, 1,000 tracked events a month | Supported, set up with a CNAME record | Within the 1,000 events | Starter, $39 |
*Prices from each vendor's pricing page, October 2026.*
[Short.io's free plan](https://short.io/pricing) is the nearest swap for someone leaving Bitly over the limits above. Free accounts get 5 custom domains, 1,000 branded links over the account's life and statistics on 50,000 clicks, though registering the domain is on you. The comparison table words the clicks as a monthly figure and an FAQ on the same page says free users see detailed statistics for the first 50,000 clicks, so check which applies. Hobby is $5 a month with 2,500 branded links and 100,000 tracked clicks, and Pro at $18 a month lifts both caps. Every paid plan starts with a 7-day trial.
[Rebrandly's free plan](https://www.rebrandly.com/pricing) gives 10 links and 10 QR codes a month plus one custom domain, with watermarked QR codes and detailed data on 100 clicks. Essentials raises that to 250 links and 10,000 clicks. Its page shows different Essentials prices to different visitors, $8 and $11 a month in what I saw, so confirm the figure at checkout.
[Dub's link plans](https://dub.co/pricing/links) start with a free tier of 25 new links and 1,000 tracked events a month, 3 custom domains, QR codes and 30 days of analytics. Pro is $30 a month for 1,000 new links and 50,000 events, and Business is $90 for 10,000 links and 250,000 events. Dub's default pricing view shows its partner-program plans, so the $90 headline there is not the link-shortener entry price.
#### TrackRev's free plan
The free plan caps a workspace at 50 links in total and tracked events at 1,000 a month, and it includes last-touch attribution, QR codes and the UTM builder. Revenue figures stay hidden until a paid plan. TrackRev puts no ad on your links. Paid plans start at Starter, $39 a month or $351 a year (nine months at $39), and every paid plan includes unlimited links and events, and revenue sync from Stripe, Paddle, Polar and Lemon Squeezy. Growth at $99 and Scale at $199 differ on workspaces and affiliate commission volume ([pricing](https://www.trackrev.io/pricing)).
That revenue sync is the gap Bitly leaves. Its pricing comparison has no revenue or payment row on any plan, and the nearest items are Premium's campaign tracking at $199 a month and Enterprise's advanced performance tracking. A TrackRev link records the click and matches it to the payment that followed, so a report can show what a link earned. If you only need click counts, Bitly Core at $120 a year or Short.io's free plan costs less than Starter at $351.
Two TrackRev tools replace pieces of Bitly's plans without an account. The [UTM builder](https://www.trackrev.io/tools/utm-builder) does what Bitly puts on Core, and the [QR code generator](https://www.trackrev.io/tools/qr-code-generator) makes static codes with no signup, no watermark and no expiry. Bitly's [downgrade article](https://support.bitly.com/hc/en-us/articles/360029870551-What-happens-when-I-downgrade-to-a-lower-subscription-plan) describes a Bitly QR code as a scannable form of a short link, so a downgrade treats it like one, while a static code encodes your URL directly and carries no scan counts. [Dynamic versus static QR codes](https://www.trackrev.io/blog/dynamic-qr-codes-vs-static) covers the trade.
### Frequently asked questions
**Is Bitly free forever?**
Bitly's free-plan article describes the plan as open-ended, with no trial period. Terms can still move: free links gained an ad page, and the help article on it is dated January 12, 2026. Put anything printed on a domain you control, so a change of plan or tool becomes a DNS edit.
**Do I need an account or a credit card to use Bitly?**
An account, yes; a card, no. Bitly ended guest link creation in November 2023, and links made that way cannot be managed or redirected. The free plan asks for no payment details.
**What is the cheapest Bitly plan with click analytics?**
Core. It keeps a 30-day window and bills yearly only, so the first charge is $120. Short.io's free plan reports on up to 50,000 clicks at no cost.
**Can I get my own domain on Bitly for free?**
No. Your own domain starts on Growth, which bundles one at $29 a month on yearly billing. Short.io connects up to 5 you already own on its free plan, with registration extra.
**Is Bitly free for QR codes?**
Two a month, with basic styling. A Bitly code is a scannable short link, so plan changes treat it like one, and a static code from a generator never expires.
**What is Bitly used for?**
Shortening and naming links, printing QR codes, publishing a link page and, from Core upward, counting clicks and tagging campaigns with UTM parameters. Branded domains start at Growth.
**Is there a free Bitly alternative with analytics?**
Short.io, Rebrandly and Dub all include some click data on free plans: 50,000 tracked clicks, detail on 100 clicks a month and 1,000 tracked events a month respectively. TrackRev counts 1,000 events monthly on its free plan, so pick by how much traffic you expect.
---
## LeadDyno alternatives for SaaS: 4 tools compared on price and limits
URL: https://www.trackrev.io/blog/leaddyno-alternative
Published: 2026-04-24
Author: Muzahid Maruf
LeadDyno bills by active affiliates, $49 to $749 a month. Rewardful, FirstPromoter, Tolt and TrackRev compared on price, billing support and attribution.
The best LeadDyno alternative depends on why you are leaving. LeadDyno bills by active affiliates, from $49 for 50 of them to $749 for unlimited, and its tracking cookies are set from LeadDyno's own domain. Rewardful, FirstPromoter and Tolt bill by the revenue your affiliates bring in. TrackRev bills by commission tracked and ranks affiliates against your other channels by the MRR each one pays.
I run TrackRev, one of the four options, so it gets the same scrutiny as the others, including where LeadDyno wins.
> **Key takeaways:**
>
> - LeadDyno prices by headcount ($49 for 50 active affiliates, $129 for 150, $349 for 500, $749 unlimited), so the 151st affiliate adds $220 a month. Rewardful, FirstPromoter and Tolt price by affiliate revenue.
> - LeadDyno's help center says its tracking cookies live under its own domain and can lose attribution when browsers block them. Safari has blocked cross-site cookies by default since March 2020.
> - LeadDyno does track sources beyond affiliates through Tracking Campaigns, one link per source, but I found no MRR-by-channel ranking and no choice among first-touch, last-touch and linear credit in its docs.
> - A program with 180 affiliates referring $18,000 a month costs $349 on LeadDyno, $99 to $149 on Tolt, Rewardful and FirstPromoter, and $39 on TrackRev Starter.
> - LeadDyno stays the better pick for Shopify stores, multi-level commissions up to 10 levels, and payouts through PayPal MassPay.
### What LeadDyno costs and where the limits sit
[LeadDyno's pricing page](https://www.leaddyno.com/pricing) lists four plans and a 30-day free trial, with unlimited clicks and conversions on every plan. Active affiliates decide which plan you need.
| Plan | Monthly price | Yearly, per month | Active affiliates | Commission plans | Added at this tier |
| --- | --- | --- | --- | --- | --- |
| Lite | $49 | $49 | 50 | 1 | Fraud prevention, 18 months of data export |
| Essential | $129 | $110 | 150 | 3 | Multi-level commissions, custom signup form, custom affiliate domain |
| Advanced | $349 | $297 | 500 | Unlimited | Per-product commissions, white-labeled dashboard, custom CSS |
| Unlimited | $749 | $637 | Unlimited | Unlimited | New-customer bounty, account manager, 16 hours of custom setup |
*Prices from each vendor's pricing page, October 2026. Lite shows no yearly discount; the other three take about 15% off when billed once a year.*
[LeadDyno's billing doc](https://support.leaddyno.com/hc/en-us/articles/15151675533213-Account-Plans-Billing) counts every affiliate who is not archived or pending toward the limit. A program with 150 affiliates pays $129, and the 151st moves it to Advanced at $349, $220 more every month, so archive affiliates who never sold before you upgrade. Its pricing page FAQ says all charges are non-refundable under LeadDyno's terms. The billing doc also describes older traffic-based plans that bill extra per unique visitor past a monthly limit, $0.10 on the $49 tier.
### What LeadDyno does well
LeadDyno supports [multi-level commissions](https://support.leaddyno.com/hc/en-us/articles/15171841034781-MLM-Multi-Level-Marketing-Setup) up to 10 levels, with a separate commission plan for each level. Its own example pays 10% to the seller, 5% to the affiliate who recruited them and 3% to the one above, so a $100 sale pays out $18. Affiliates upload [W-9 and W-8BEN forms](https://www.leaddyno.com/features) in their dashboard, and you export totals for 1099 prep. Payouts go through PayPal, one affiliate at a time or in bulk with PayPal MassPay, or you pay by check or wire and mark the commission paid.
Shopify and BigCommerce install in one click, and the [integrations page](https://www.leaddyno.com/integrations) counts more than 25 direct integrations plus a public API and Zapier. Reporting reaches past affiliates too. A [Tracking Campaign](https://support.leaddyno.com/hc/en-us/articles/15171855254813-Intro-to-Tracking-Campaigns) gives an email send or a Google Ads ad group its own visitor, lead, purchase and cancellation counts, and the [purchases screen](https://support.leaddyno.com/hc/en-us/articles/15151764299165-Purchase-Management) splits sales among affiliates, campaigns and other sources.
### Why SaaS teams look for a LeadDyno alternative
#### Tracking cookies come from LeadDyno's domain
LeadDyno's [cookie doc](https://support.leaddyno.com/hc/en-us/articles/32599122061469-How-LeadDyno-Cookie-Tracking-Works-and-Which-Cookies-We-Use) lists seven LD_ cookies, all required and stored under the LeadDyno domain, which a browser treats as third-party on your site. Safari [has blocked cross-site cookies by default](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) since Safari 13.1 and iOS 13.4 in March 2020. With them blocked, the doc says, new visitors may get no tracking ID, returning visitors can look new, and leads and purchases may go uncredited.
The [help center FAQ](https://support.leaddyno.com/hc/en-us/articles/15151646340765-FAQ-s) calls cross-domain tracking best effort, with no support when it fails, though subdomains are covered. That matters if checkout sits on a second domain. The guide to [affiliate tracking without third-party cookies](https://www.trackrev.io/blog/affiliate-tracking-without-third-party-cookies) covers setups that avoid the problem.
#### The Stripe setup has extra steps
The [Stripe doc](https://support.leaddyno.com/hc/en-us/articles/15151687316509-Stripe) says Stripe reports only purchases and cancellations, so LeadDyno's visitor and lead tracking code has to be on your site first. Discount codes need a matching coupon and promotion code in both tools unless automatic coupon sync is on. Per-product commissions, useful when each Stripe product pays its own rate, start at the $349 Advanced plan.
The integrations page names Stripe, Chargebee, Chargify, Recurly, ReCharge and PayPal as payment systems. Paddle, Polar and Lemon Squeezy are absent, which leaves the public API. For tools that read Paddle directly, see the [Paddle affiliate software comparison](https://www.trackrev.io/blog/best-affiliate-software-for-paddle-2026).
#### Source reporting needs a campaign link per channel
LeadDyno's lead and visitor reports sort traffic into affiliate, campaign and direct, and the [customers table](https://support.leaddyno.com/hc/en-us/articles/15151666552989-Customer-Management) shows each customer's lifetime value with a source filter limited to affiliate, direct and other. Every non-affiliate source needs its own Tracking Campaign link, and I found no ranking of channels by MRR and no choice among first-touch, last-touch and linear credit in its docs. The [credit settings](https://support.leaddyno.com/hc/en-us/articles/15151659347741-Affiliate-Settings) decide between affiliates: First Affiliate Wins keeps a customer with the first affiliate who referred them, and First Source Wins locks in whichever source came first, even a direct visit.
### LeadDyno alternatives compared on price and billing support
| Tool | Plan ladder, monthly | Entry plan limit | Free trial or plan | Billing systems named | Attribution credit |
| --- | --- | --- | --- | --- | --- |
| LeadDyno | $49, $129, $349, $749 | 50 active affiliates | 30 days | Stripe, Chargebee, Chargify, Recurly, ReCharge, PayPal | First Affiliate Wins and First Source Wins settings |
| Rewardful | $49, $99, $149+ | $7,500 of affiliate-attributed revenue | 14 days | Stripe, plus 20+ other integrations | First or last touch |
| FirstPromoter | $49, $99, $149 | $5,000 of affiliate revenue, 1,000 affiliates | 14 days | Stripe, Paddle, Chargebee, Recurly, Braintree | First click or last click, cookie life up to 9,999 days |
| Tolt | $69, $99, $199, custom | $10,000 earned from affiliates | 14 days | Stripe, Paddle, Chargebee | Not stated on the pricing page |
| TrackRev | $39, $99, $199 | $10,000 of commission tracked | Free plan, link tracking only | Stripe, Paddle, Polar, Lemon Squeezy | Last-touch, first-touch or linear |
*Prices from each vendor's pricing page, October 2026. Rewardful's attribution credit and integration count come from its integrations page. Limits are per month.*
#### The same two programs on each plan
To see how the meters differ, take a program paying a 25% commission with 40 active affiliates and $6,000 a month in referred revenue, then the same program grown to 180 affiliates and $18,000. That is $1,500 and then $4,500 of commission, against TrackRev's $10,000 Starter limit.
| Tool | 40 affiliates, $6,000 referred | 180 affiliates, $18,000 referred |
| --- | --- | --- |
| LeadDyno | Lite, $49 | Advanced, $349 |
| Rewardful | Starter, $49 | Enterprise, from $149 |
| FirstPromoter | Business, $99 | Enterprise, $149 |
| Tolt | Basic, $69 | Growth, $99 |
| TrackRev | Starter, $39 | Starter, $39 |
*Cheapest plan whose published limit covers the program, at the prices in the table above.*
At 180 affiliates LeadDyno costs $349 and the others $39 to $149, because the revenue-metered tools put no limit on 180 affiliates. The comparison flips for a small roster with big sales: 20 affiliates referring $40,000 a month stay on LeadDyno's $49 Lite plan, while Tolt's matching plan is Pro at $199.
### Which LeadDyno alternative fits your reason for leaving
#### Rewardful, for a Stripe-only program under $7,500 a month
[Rewardful](https://www.rewardful.com/pricing) starts at $49 for up to $7,500 a month of affiliate-attributed revenue, with 1 campaign and 2 team members. Growth is $99 for $15,000 with unlimited campaigns and team members, and Enterprise starts at $149 and covers $30,000 on its entry tier. Every plan has unlimited affiliates, a 14-day trial and a 0% transaction fee, and its [integrations page](https://www.rewardful.com/integrations) lists coupon tracking, two-way Stripe sync and a choice between first and last touch. I found no multi-level option on its pricing page. The [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev) comparison goes further.
#### FirstPromoter, for Paddle and multi-level commissions at a low price
[FirstPromoter](https://firstpromoter.com/pricing) charges $49 for up to $5,000 a month of affiliate revenue and 1,000 affiliates, $99 for $15,000 with no affiliate cap, and $149 above that. Every plan includes multi-tier commissions, W-9 and W-8BEN collection, and billing support that reaches Paddle, Recurly and Braintree. A custom domain and white-labeling start at the $99 plan. Pick it over LeadDyno when you want multi-level commissions without the $129 Essential plan, or when Paddle or Braintree runs your billing. LeadDyno goes to 10 levels and FirstPromoter to 3.
#### Tolt, for a custom domain at the entry price
[Tolt](https://tolt.com/pricing) starts at $69 for up to $10,000 a month earned from affiliates and includes a custom domain, which LeadDyno holds back until Essential at $129. Tolt's page words the limit as earned from affiliates, which I read as referred revenue. Growth is $99 for $20,000 and lists automatic payouts at a 2% fee, W-9 and W-8 collection and 1099 filing. Pro is $199 for $50,000. The [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev) post compares it with TrackRev.
#### TrackRev, for affiliates ranked against every other channel
[TrackRev's pricing](https://www.trackrev.io/pricing) has one rule: every paid plan includes the whole product, meaning the affiliate program, link tracking and revenue attribution. Starter is $39 a month for 1 workspace and up to $10K of commission tracked a month, Growth is $99 with unlimited workspaces and $100K, and Scale is $199 with priority support. Annual billing pays for 9 months and gives 12, so a year of Starter is $351. The free plan covers 50 links and 1,000 tracked events a month for link tracking only. The affiliate program and revenue figures need a paid plan.
Revenue syncs from Stripe, Paddle, Polar and Lemon Squeezy. Commissions can be recurring, one-time or multi-tier, paid as cash or credit, and a refunded or disputed charge takes its commission back out. The hold before payout is set per program from 0 to 180 days and defaults to 0, so set one that covers your refund window. Payouts run from a PayPal or Wise CSV export that you pay and mark paid, and partners upload W-9 or W-8 forms during onboarding.
[Partner Accelerator](https://www.trackrev.io/products/partner-accelerator) is the multi-tier feature. It pays up the referral chain from one capped pool, 30% by default with 10% to the seller, about 6.67% to whoever referred them and about 4.44% to the level above, and it stops once a level's share falls under $1. LeadDyno lets you write a rate for each of 10 levels by hand, which TrackRev does not.
A partner's link shares a data model with every other tracked link, so one [revenue attribution report](https://www.trackrev.io/solutions/revenue-attribution) ranks affiliates, newsletter, YouTube and paid by the MRR each pays, under the credit rule you pick. Channels come from the utm_source and utm_medium already on your links, so existing campaign tags need no rework.
### How one subscriber's credit changes with the rule
A visitor clicks a YouTube link, then a newsletter link, then an affiliate's link, and subscribes at $39 a month. The [three credit rules](https://www.trackrev.io/blog/attribution-models-saas-comparison) split that new MRR differently, and over a month of signups the splits produce different channel rankings.
| Credit rule | YouTube | Newsletter | Affiliate |
| --- | --- | --- | --- |
| Last-touch | $0 | $0 | $39 |
| First-touch | $39 | $0 | $0 |
| Linear | $13 | $13 | $13 |
*New MRR credited to each channel for one $39 subscriber who clicked the three links in this order.*
### When LeadDyno is still the better pick
Stay on LeadDyno for a Shopify or BigCommerce store, since those install in one click and TrackRev has no Shopify app. It goes deeper on multi-level payouts, with 10 levels and a rate for each. It emails newsletters to affiliates, syncs leads to HubSpot, Zoho CRM, Mailchimp, Klaviyo and AWeber, and pays a whole batch through PayPal MassPay, where TrackRev gives you a CSV to pay yourself and mark paid. TrackRev offers webhooks and has no Zapier app.
### Moving a program off LeadDyno
LeadDyno's [data export guide](https://support.leaddyno.com/hc/en-us/articles/15151667664797-Data-Export-Guide) covers four CSV files: leads, purchases, affiliates and commissions. Per its pricing page, every plan below Unlimited exports only the last 18 months of history, so pull everything before canceling. Access continues until the end of the billing cycle you already paid for, and a Shopify user has to uninstall the app from within Shopify to cancel.
TrackRev's migration tool takes the affiliate CSV and brings over affiliates, codes and payout emails on any paid plan, but has no field for the referring affiliate, so a multi-level chain is rebuilt by hand. LeadDyno's ?afmc= links track only while its script runs on your site, so give partners new links before removing it.
### Frequently asked questions
**Does LeadDyno work with Stripe subscriptions?**
Yes. LeadDyno's recurring-commission doc lists Stripe among the integrations that need no separate recurring setting, and Stripe options cover zero-amount purchases such as free trials and proration.
**How long does LeadDyno credit an affiliate for a referred customer?**
A setting called Number of Months the Affiliate Referral Lasts caps how long an affiliate keeps earning after the customer's first visit. Left blank, commissions continue indefinitely, which suits subscription programs that pay for the life of the customer.
**Is there a free LeadDyno alternative?**
LeadDyno gives 30 days to try it, Rewardful, FirstPromoter and Tolt give 14, and none of those four pricing pages shows a permanent free plan with an affiliate program. TrackRev's free plan has no affiliate program, so that starts at the $39 Starter plan.
**Which LeadDyno alternative works with Paddle?**
FirstPromoter, Tolt and TrackRev name Paddle as a billing system. LeadDyno's integrations page does not, so Paddle means its REST API, and I could not confirm Paddle for Rewardful.
**How are refunds handled in LeadDyno and TrackRev?**
LeadDyno cancels pending or due commissions when an integration reports a refund, and a release delay lets refunds surface before payment. TrackRev reverses the commission on a refunded or disputed charge, with a hold of 0 to 180 days per program that defaults to 0.
**Does LeadDyno discount yearly billing?**
Yes, about 15% on Essential, Advanced and Unlimited, which works out to $110, $297 and $637 a month when billed once a year. Lite stays at $49. TrackRev's annual billing pays for 9 months and gives 12.
---
## How to attribute Lemon Squeezy revenue to the channel that earned it
URL: https://www.trackrev.io/blog/lemon-squeezy-revenue-attribution
Published: 2026-06-04
Author: Muzahid Maruf
Tag the Lemon Squeezy checkout with a visitor ID, read it from the order_created webhook, and credit the pre-tax total. 5 steps with code and GA4 limits.
Lemon Squeezy revenue attribution works when you attach the channel to the checkout before the buyer pays and read it back from the webhook after. A Lemon Squeezy order holds the buyer's email, amounts and tax but no UTM, referrer or source field, so an untagged sale looks the same whether a newsletter or an ad sent the buyer. The documented route is `checkout[custom]`, returned as `meta.custom_data` on webhooks, and it takes 5 steps to turn into revenue per channel.
> **Key takeaways:**
>
> - A Lemon Squeezy order has no UTM, referrer or source field, so a channel reaches the order only through checkout[custom].
> - Lemon Squeezy returns custom data in meta.custom_data on 3 webhook object types and omits it from the orders API, so a missed webhook costs you the tag.
> - The Lemon Squeezy total includes tax: its sample order has a subtotal of 999, tax of 200 and a total of 1199 cents, so credit total minus tax.
> - Count a Lemon Squeezy subscription's first payment once, from the order, and take later payments from renewal invoices keyed by subscription ID.
> - TrackRev matches Lemon Squeezy orders to visits by buyer email and needs a paid plan from $39 a month.
### Why a Lemon Squeezy order carries no channel
The checkout lives on a store subdomain of lemonsqueezy.com, so your cookies never arrive and the UTM parameters on your page stay there unless you copy them into the buy link. The [hosted checkout docs](https://docs.lemonsqueezy.com/help/checkout/hosted-checkout) also suggest pasting that link straight into emails, newsletters and social posts. The [order object](https://docs.lemonsqueezy.com/api/orders/the-order-object) then records the buyer, currency, amounts, tax, status and first order item, with no UTM, referrer or source attribute. Its only attribution fields, `affiliate_id` and `referral_amount`, belong to Lemon Squeezy's own affiliate program and are null on every other sale.
### Lemon Squeezy revenue attribution in 5 steps
Steps 1 and 2 run in the browser, step 3 on your server, and steps 4 and 5 set the amount each channel gets.
#### Step 1: Save the source and the buyer's identity on the first visit
Read the UTM parameters on the first pageview, store them against a visitor ID on your server, and add the buyer's email to that ID at signup. [WebKit's tracking prevention policy](https://webkit.org/tracking-prevention/) deletes script-written cookies and storage after 7 days without a visit and caps script-written cookies at 24 hours when it detects link decoration, so a buyer who stays away for 2 weeks between the first visit and checkout can arrive with nothing saved. The [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) has more.
#### Step 2: Tag the checkout
Lemon Squeezy's [custom data guide](https://docs.lemonsqueezy.com/help/checkout/passing-custom-data) accepts any number of `checkout[custom]` fields on the checkout link and asks you to keep them minimal. I'd send 2 values: a visitor ID, which resolves to the full history in your own store, and a short channel label such as `newsletter`, which keeps the sale readable if that lookup fails.
| Checkout route | Where the tag goes | Check before you rely on it |
| --- | --- | --- |
| Hosted link | checkout[custom][vid]=... on the /checkout/buy link | The value arrives as a string |
| Overlay button | The same parameters on the link with the lemonsqueezy-button class | 1 test-mode purchase to confirm |
| API checkout | checkout_data.custom in the POST /v1/checkouts body, then open the returned url | LemonSqueezy.Url.Open takes a URL string only |
*From Lemon Squeezy's custom data guide and Lemon.js methods docs.*
Add `checkout[email]` when you know the address. The [prefill parameters](https://docs.lemonsqueezy.com/help/checkout/prefilled-checkout-fields) also take name, billing country, tax number and discount code. A matching email helps any tool that joins orders to users by address. [Paddle Billing](https://www.trackrev.io/blog/paddle-checkout-attribution-passthrough) uses the same pattern.
Browser: a tagged hosted checkout link
```
const url = new URL("https://yourstore.lemonsqueezy.com/checkout/buy/VARIANT_ID");
url.searchParams.set("checkout[custom][vid]", visitorId);
url.searchParams.set("checkout[custom][src]", firstSource); // for example "newsletter"
if (user?.email) url.searchParams.set("checkout[email]", user.email);
buyButton.href = url.toString();
```
Server: the same tag on a checkout created through the API
```
const res = await fetch("https://api.lemonsqueezy.com/v1/checkouts", {
method: "POST",
headers: {
Accept: "application/vnd.api+json",
"Content-Type": "application/vnd.api+json",
Authorization: "Bearer " + process.env.LS_API_KEY,
},
body: JSON.stringify({
data: {
type: "checkouts",
attributes: { checkout_data: { email: user.email, custom: { vid: visitorId, src: firstSource } } },
relationships: {
store: { data: { type: "stores", id: STORE_ID } },
variant: { data: { type: "variants", id: VARIANT_ID } },
},
},
}),
});
const checkoutUrl = (await res.json()).data.attributes.url;
```
#### Step 3: Read the channel from the webhook
Lemon Squeezy lists 17 [webhook events](https://docs.lemonsqueezy.com/help/webhooks/event-types) and suggests subscribing to at least 4. Of those, 5 matter for attribution.
| Event | Object sent | What to store |
| --- | --- | --- |
| order_created | Order | The sale, its amounts and meta.custom_data |
| subscription_created | Subscription | The channel, keyed by subscription ID |
| subscription_payment_success | Subscription invoice | Each renewal, looked up by subscription_id |
| order_refunded | Order | A full or partial refund |
| subscription_payment_refunded | Subscription invoice | A refunded renewal |
*From Lemon Squeezy's webhook event types.*
You choose the signing secret, typically 6 to 40 characters, and Lemon Squeezy sends an HMAC hex digest of the raw body in an `X-Signature` header, as its [signing guide](https://docs.lemonsqueezy.com/help/webhooks/signing-requests) shows. Verify it, then answer 200. Any other status gets up to 3 more attempts, after waits such as 5, 25 and 125 seconds, before the delivery counts as failed, per the [webhook request docs](https://docs.lemonsqueezy.com/help/webhooks/webhook-requests). The orders API can recover the sale but returns no custom data, so a missed delivery costs you the tag.
Custom values arrive as strings, so 123 becomes "123". Skip orders flagged `test_mode`, key each stored sale on its Lemon Squeezy ID so a retry cannot count twice, and when the custom data is empty, match `user_email` against your step 1 records.
Webhook endpoint (Next.js route handler)
```
import crypto from "node:crypto";
export async function POST(req: Request) {
const raw = await req.text();
const sent = Buffer.from(req.headers.get("x-signature") ?? "");
const want = Buffer.from(
crypto.createHmac("sha256", process.env.LS_SIGNING_SECRET!).update(raw).digest("hex"),
);
if (sent.length !== want.length || !crypto.timingSafeEqual(sent, want)) {
return new Response("bad signature", { status: 401 });
}
const event = JSON.parse(raw);
const name = event.meta.event_name;
const a = event.data.attributes;
const tag = event.meta.custom_data ?? {}; // strings; empty when the checkout was untagged
if (a.test_mode) return new Response("ok");
if (name === "order_created") {
await saveSale({
key: "order_" + event.data.id,
email: a.user_email,
cents: a.total - a.tax, // total includes tax
currency: a.currency,
vid: tag.vid,
src: tag.src,
});
} else if (name === "subscription_created") {
await saveChannel(String(event.data.id), { vid: tag.vid, src: tag.src });
} else if (name === "subscription_payment_success" && a.billing_reason === "renewal") {
const channel = await channelFor(String(a.subscription_id));
await saveSale({
key: "invoice_" + event.data.id,
email: a.user_email,
cents: a.total - a.tax,
currency: a.currency,
...channel,
});
}
return new Response("ok");
}
```
#### Step 4: Credit the pre-tax amount
Amounts are integers in cents and the total includes tax, so credit the total minus the tax. In the sample that is 1199 minus 200, or 999.
| Field | Sample value | Use it for |
| --- | --- | --- |
| subtotal | 999 | The sample's price before tax |
| tax | 200 | Subtract it from the total |
| total | 1199 | What the buyer paid, tax included |
| total_usd | 1199 | The same total in dollars |
| currency_rate | 1.0000 | The USD rate at purchase |
*From the sample order in Lemon Squeezy's webhook request docs.*
On a $19 plan, crediting the total overstates revenue by the buyer's tax rate, and the error compounds across a year.
| Tax rate | Tax | Total | Credit | 12 months at the total | Overstated |
| --- | --- | --- | --- | --- | --- |
| 0% | 0 | 1900 | $19.00 | $228.00 | 0% |
| 19% | 361 | 2261 | $19.00 | $271.32 | 19% |
| 20% | 380 | 2280 | $19.00 | $273.60 | 20% |
| 25% | 475 | 2375 | $19.00 | $285.00 | 25% |
*One $19 plan priced before tax, in cents, at 4 example tax rates.*
`refunded` turns true only for a full refund, so subtract `refunded_amount` to handle partial ones. The sample is tax-exclusive, so spot-check 1 order where `tax_inclusive` is true. The [pricing page](https://www.lemonsqueezy.com/pricing) lists a 5% + 50¢ fee per transaction that the payload omits, so this figure is revenue before tax and fees.
#### Step 5: Carry the channel to every renewal
Lemon Squeezy documents custom data for order, subscription and license key events and names no invoice events, so save the channel against the subscription ID when the subscription is created and look it up on each renewal. A $19 plan held for 12 months pays $228, so crediting only the first payment gives the channel $19, or 8.3%, and hides which channel pays your MRR. For subscribers who bought before you tagged anything, match `user_email` to your step 1 records. The [subscription LTV attribution post](https://www.trackrev.io/blog/subscription-ltv-attribution) covers reporting.
| Moment | Events Lemon Squeezy sends | Credit |
| --- | --- | --- |
| Month 1, signup | order_created, subscription_created, subscription_payment_success (initial) | $19.00 from the order |
| Months 2 to 12, each renewal | subscription_payment_success (renewal), subscription_updated | $19.00 from each invoice |
| Month 3, card declined | subscription_payment_failed, subscription_updated | $0.00 |
| Month 3, a retry works | subscription_payment_success (renewal), subscription_payment_recovered, subscription_updated | $19.00 from the success invoice |
*One $19 monthly subscription, from Lemon Squeezy's event flow examples. The first payment appears as an order and as an initial invoice, so credit it once. A failed renewal gets 4 retries over 2 weeks.*
### What Google Analytics 4 can and cannot show
Lemon Squeezy's [Google Analytics integration](https://docs.lemonsqueezy.com/help/online-store/analytics) takes a Measurement ID in the store's Design settings and tracks 8 storefront and checkout events, including purchase. The overlay needs the Google tag on your own site, and the docs warn that ad blockers can stop it. I'd use GA4 for browser behavior and the webhook for revenue totals.
GA4 can join a purchase to the visit that began on your site through cross-domain measurement. Per Google's [cross-domain guide](https://support.google.com/analytics/answer/10071811), GA4 passes IDs in a `_gl` URL parameter and needs the same G- tag ID on every domain, or a visitor crossing root domains counts as 2 users and 2 sessions. Add your store domain under Configure your domains, run 1 test-mode purchase and check DebugView, since neither vendor documents the pairing.
Buyers who click back from the confirmation modal may appear as a lemonsqueezy.com referral. Google's [list of unwanted referrals](https://support.google.com/analytics/answer/10327750) takes up to 50 domains per data stream and sets `ignore_referrer` to true. That clears the label; carrying the visitor across domains takes cross-domain measurement. The [GA4 revenue by channel post](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) covers the reports.
### How TrackRev reads Lemon Squeezy orders
TrackRev connects with a Lemon Squeezy API key and an optional store ID, polls orders on a schedule, and syncs at once when a signed webhook arrives. Because the orders API carries no custom data, it matches each order to a visit by the buyer's email. Call `window.trk.identify(email)` from the pixel at signup, and the order is credited under your workspace's model of last-touch, first-touch or linear ([how they differ](https://www.trackrev.io/blog/attribution-models-saas-comparison)).
The pixel also adds `checkout[custom][vid]` to Lemon Squeezy buy links. That value reaches your endpoint from step 3, but TrackRev's own Lemon Squeezy attribution ignores it, so a buyer who pays with a different email than the one you identified goes unattributed.
Today the connection reads orders, which cover one-time purchases and each subscription's first payment. It does not read renewal invoices or discount codes, so renewal revenue and promo-code attribution are missing for Lemon Squeezy stores. A fully refunded order flips to refunded on a later sync and its partner commissions are reversed.
Revenue figures need a paid plan, from $39 a month on Starter. The free plan covers link tracking only, with 50 links and 1,000 tracked events a month. Connection steps are on the [Lemon Squeezy integration page](https://www.trackrev.io/integrations/lemon-squeezy) and plans are on [pricing](https://www.trackrev.io/pricing). With a single product, a channel or two and a webhook endpoint already running, the handler in step 3 is the whole job.
### What moving to Stripe Managed Payments changes
On January 28, 2026, Lemon Squeezy's CEO [wrote](https://www.lemonsqueezy.com/blog/2026-update) that Stripe, which acquired Lemon Squeezy in 2024, is building Stripe Managed Payments as its merchant of record product. It then supported merchants in 35+ countries, and the stated aim was an easy migration path for Lemon Squeezy users. After a move, checkout and webhooks would come from Stripe, so the tagging layer above would need rebuilding against Stripe's objects. The [Stripe metadata attribution post](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) covers the Stripe version of this pattern, and Stripe's docs should confirm how Managed Payments exposes metadata first.
### Limits and fixed values at a glance
| Item | Value | Source |
| --- | --- | --- |
| Webhook signing secret | Typically 6 to 40 characters | Lemon Squeezy signing guide |
| Redelivery after a non-200 reply | 3 attempts, after 5, 25 and 125 seconds | Lemon Squeezy webhook requests |
| Object types whose webhooks carry custom data | 3: order, subscription, license key | Lemon Squeezy custom data guide |
| Webhook events listed | 17 | Lemon Squeezy event types |
| Webhook events suggested at minimum | 4 | Lemon Squeezy event types |
| Order statuses | 6 | Lemon Squeezy order object |
| Invoice billing reasons | 3: initial, renewal, updated | Lemon Squeezy invoice object |
| Checkout events sent to Google Analytics | 8 | Lemon Squeezy analytics docs |
| Failed renewal retries | 4 over 2 weeks | Lemon Squeezy subscription object |
| Script-written storage in Safari | Deleted after 7 days without a visit | WebKit tracking prevention |
| Script-written cookie after link decoration | Capped at 24 hours | WebKit tracking prevention |
| Unwanted referral domains | 50 per data stream | Google Analytics help |
| Cross-domain conditions | 100 per stream | Google Analytics help |
| Lemon Squeezy fee | 5% + 50¢ per transaction | Lemon Squeezy pricing |
| Countries Stripe Managed Payments supported on January 28, 2026 | 35+ | Lemon Squeezy 2026 update |
| TrackRev Starter plan | $39 a month | TrackRev pricing |
| TrackRev free plan | 50 links and 1,000 events a month | TrackRev pricing |
*Values as published in October 2026.*
### Frequently asked questions
**Does Lemon Squeezy record UTM parameters on orders?**
No. The order object has no UTM, referrer or source attribute, so your own data reaches an order only through checkout[custom].
**How do I pass UTM parameters to a Lemon Squeezy checkout?**
Append checkout[custom][utm_source]=newsletter to the checkout link, or send checkout_data.custom through the API. One visitor ID resolved on your server is shorter than 3 raw UTM strings.
**Where does Lemon Squeezy custom data show up?**
In meta.custom_data on Lemon Squeezy webhooks for 3 object types: orders, subscriptions and license keys. Every value is a string, and the orders API does not return it.
**Is the Lemon Squeezy order total net of VAT?**
No. In Lemon Squeezy's sample order the total of 1199 is the subtotal of 999 plus tax of 200, so subtract the tax field to get the pre-tax amount.
**Can I attribute sales if I share the checkout link without a landing page?**
Yes, if each link carries its own channel, such as checkout[custom][src]=newsletter in 1 link and checkout[custom][src]=youtube in another. No page view means no visitor ID.
**How do I test the setup without a real sale?**
Use test mode: open a test checkout link with your tag, pay with a Lemon Squeezy test card, then read meta.custom_data in the webhook log.
**Can TrackRev attribute Lemon Squeezy revenue on the free plan?**
No. The free plan covers 50 links and 1,000 tracked events a month but hides revenue figures. Revenue attribution starts on the Starter plan at $39 a month.
---
## URL cloaking explained: redirects, frames and the kind that gets banned
URL: https://www.trackrev.io/blog/link-cloaking-explained
Published: 2026-09-16
Author: Muzahid Maruf
URL cloaking covers 3 practices: branded redirects, frame masking and content cloaking. See which are safe and what Google Ads and Amazon Associates ban.
URL cloaking is any technique that shows a visitor a different address than the one that loads, and the phrase covers 3 practices with 3 verdicts. A redirect from `yourbrand.com/go/tool` (21 characters) to a 76-character affiliate URL is what plugins such as Pretty Links sell, and each program sets its own rules for it. A registrar's frame masking fails on pages that refuse framing. Showing Googlebot or an ad reviewer a different page than visitors get is what [Google Search](https://developers.google.com/search/docs/essentials/spam-policies) and [Google Ads](https://support.google.com/adspolicy/answer/15938075) ban, and Google Ads suspends accounts for it without prior warning.
My rule is a plain redirect on a domain you own, the program's terms read first and a disclosure beside the link. Amazon Associates is where that matters most.
> **Key takeaways:**
>
> - URL cloaking covers 3 practices: a redirect on your own domain, frame masking at a registrar and content cloaking. Only content cloaking is spam under Google Search policy.
> - Amazon Associates sections 6(v), 6(w) and 2(e) restrict cloaking, shorteners that hide Amazon and Redirecting Links, so use direct tagged links there and read each other program's terms.
> - Send a 302 or 307. RFC 9110 lets caches keep a 301 or 308, so an edited destination may never reach a returning visitor.
> - Google Ads suspends accounts for cloaking without prior warning, and 16 CFR 255.5 requires the affiliate disclosure to be clear and conspicuous.
### The three kinds of URL cloaking
Affiliate marketers mean row 1. Namecheap uses "URL cloaking" as another name for the frame feature in row 2. Google means row 3.
| Kind | What the visitor sees | How it works | Verdict |
| --- | --- | --- | --- |
| 1. Redirect cloak | yourbrand.com/go/tool, then the partner's page | HTTP 302 or 307 from your own domain | Each program sets its own rule. Amazon Associates restricts it. |
| 2. Frame masking | Your address in the bar with another site inside it | The registrar's server wraps the target page in an HTML frame | Fails on pages that forbid framing with X-Frame-Options or frame-ancestors |
| 3. Content cloaking | A clean page for crawlers and a different one for people | The server branches on user agent or IP address | Spam under Google Search policy, egregious under Google Ads policy |
*Sources: Google Search spam policies (updated August 28, 2026), the Google Ads circumventing systems policy and Namecheap's article on domain redirect types.*
### How a redirect cloak works
The visitor requests `/go/tool`, the server answers 302 with a `Location` header, and the browser loads that address. Nothing stays secret, since the destination travels in plain view to every client.
What the server sends back (curl, illustrative)
```
$ curl -sI https://yourbrand.com/go/tool
HTTP/2 302
location: https://partner.example/signup?aff_id=48213&sub=blogpost&utm_campaign=review
```
Use 302 or 307 for a cloak. A cached 301 or 308 can let a returning visitor's browser skip your server and keep going to the old destination after you edit it. Pretty Links offers 301, 302 and 307 per link, and TrackRev sends a 302. The [branded short link post](https://www.trackrev.io/blog/what-is-a-branded-short-link) covers how Google reads each code.
| Code | RFC 9110 section | Heuristically cacheable | Use for a cloak |
| --- | --- | --- | --- |
| 301 | 15.4.2 | Yes | No, a cached copy can skip your server |
| 302 | 15.4.3 | No | Yes |
| 307 | 15.4.8 | No | Yes |
| 308 | 15.4.9 | Yes | No, same reason as 301 |
*[RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-overview-of-status-codes) (June 2022), section 15.1 lists the heuristically cacheable codes.*
### Why people cloak affiliate links
Editing in 1 place and shorter links are the strong reasons for affiliate link cloaking, and hiding the ID is the weak one. Pretty Links pitches the single edit on its [WordPress.org listing](https://wordpress.org/plugins/pretty-link/) and hijack protection on its [cloaking page](https://prettylinks.com/feature/link-cloaking/).
| Reason | Worked example | Limit |
| --- | --- | --- |
| Edit a destination once | 120 posts link to a host that changes its tracking URL: 120 edits at 2 minutes is 4 hours, against 1 edit at the redirect | Needs a 302 or 307 |
| Shorter links | 21 characters instead of 76, a 72% cut | Still needs a disclosure |
| ID out of the URL | aff_id=48213 leaves the address bar and copied links | Still readable in the Location header |
| A click count you own | Your server logs every request to /go/tool | Counts bots too, so [filter them](https://www.trackrev.io/blog/bot-traffic-filtering-for-links) |
### Frame-based URL masking and where it breaks
Namecheap defines [URL Frame](https://www.namecheap.com/support/knowledgebase/article.aspx/9604/2237/types-of-domain-redirects-301-302-url-redirects-url-frame-and-cname/) as a redirect type also called URL masking or URL cloaking: its server shows the target page inside a frame and the address bar keeps your domain. It lists 2 drawbacks, duplicate content in search engines and sites that refuse masking.
A page that sends [X-Frame-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Frame-Options) with the value `DENY` or `SAMEORIGIN`, or a CSP `frame-ancestors` directive that leaves out your domain, refuses to render inside your frame, and MDN says sites use these against clickjacking. I use a redirect instead.
### Content cloaking under Google Search and Google Ads policy
Google Search lists moving a site, merging pages and redirecting logged-in users as legitimate redirects. Google Ads allows click trackers and redirects unless they hide something.
| Rule | Policy | What it covers | Consequence |
| --- | --- | --- | --- |
| Cloaking | Google Search | Different content for users and search engines | May rank lower or not appear |
| Sneaky redirects | Google Search | Normal desktop pages and a spam domain for mobile users | May rank lower or not appear |
| Cloaking | Google Ads | Different content for Google or reviewers than for people | Suspended on detection, no prior warning |
| Section 6(v) | Amazon Associates Participation Requirements | Obscuring the URL of your site that carries Special Links, including through Redirecting Links, so Amazon cannot tell where a click came from | Material breach of the Operating Agreement |
| Section 6(w) | Amazon Associates Participation Requirements | A link shortening service used in a way that makes it unclear you are linking to Amazon | Material breach of the Operating Agreement |
| Section 2(e) | Amazon Associates Commission Income Statement | Purchases through a Redirecting Link, which sends users via an intermediate site with no click or other action on it | Commission disqualified |
*From the Google Search spam policies, the Google Ads circumventing systems policy and the [Amazon Associates Program Policies](https://affiliate-program.amazon.com/help/operating/policies) (updated April 14, 2026).*
Device splits such as App Store versus Google Play show the same app to everyone, so I read them as outside the ban. That is my reading of the policy. [Device-targeting redirects](https://www.trackrev.io/blog/device-targeting-redirects) covers the setup.
### What Amazon Associates and other programs allow
Whether a plain redirect on your own domain breaks any Amazon Associates clause is Amazon's call. ThirstyAffiliates ships Smart Uncloaking for Amazon Associates compatibility, and its [pricing page](https://thirstyaffiliates.com/plans/pricing/) says it keeps Amazon links compliant with Amazon's terms while other programs stay cloaked. Use the direct tagged links Amazon's tools generate, since the [Operating Agreement](https://affiliate-program.amazon.com/help/operating/agreement) (updated October 15, 2025) requires Special Links to use its tagged formats. Of the affiliate programs, I checked only Amazon's wording, so search any other publisher agreement for cloak, mask and redirect.
### Affiliate de-cloaking: how to see where a link goes
Affiliate de-cloaking can mean 2 things: switching a cloak off for a program that forbids it, as Smart Uncloaking does for Amazon Associates, and reading the destination behind a cloak. A redirect cloak is a header, so any client can read it.
Read a cloak's destination without following it
```
$ curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" https://yourbrand.com/go/tool
302 https://partner.example/signup?aff_id=48213&sub=blogpost&utm_campaign=review
```
The [curl manual](https://curl.se/docs/manpage.html) documents `redirect_url`, and `curl -sIL` prints every hop's headers instead. Google Chrome (Preserve log) and Mozilla Firefox (Persist Logs) show the chain on the Network tab. A check may register as a click, so run it on your own links after each destination change and confirm the status is 302.
### Disclosure and link attributes still apply
A cloak hides the affiliate parameters, so the disclosure carries the whole job. [16 CFR 255.5](https://www.law.cornell.edu/cfr/text/16/255.5) requires an unexpected material connection to be disclosed clearly and conspicuously, and the FTC's [guide for social media influencers](https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers) says to place it with the endorsement, rather than burying it on a profile page or in a hashtag group. See the [affiliate compliance post](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) for FTC and GDPR rules.
A cloaked link also looks like an internal link to a crawler until it follows the redirect, so mark it in your page. Google's September 10, 2019 [announcement](https://developers.google.com/search/blog/2019/09/evolving-nofollow-new-ways-to-identify) added `rel="sponsored"` for links created as part of advertisements, sponsorships or other compensation agreements, and an affiliate commission fits that description.
### Link cloaker tools compared
| Tool | Where it runs | Redirect types | Price | Worth knowing |
| --- | --- | --- | --- | --- |
| Pretty Links | WordPress 6.0+ plugin, 200,000+ active installs | 301, 302 and 307 free. Pro adds 4: Cloaked, JavaScript, Meta-Refresh and Tracking Pixel. | Free core. Pro from $99.60 a year for 1 site, $149.60 for 2, $199.60 for 5. | Higher Pro tiers list QR codes and geographic redirects, with UTM Builder and Splash Pages as add-ons. |
| ThirstyAffiliates | WordPress 6.0+ plugin, 30,000+ active installs | Server-side or JavaScript | Free core. Paid $99.60 a year for 1 site, $149.60 for 5, $199.60 for 10. | Smart Uncloaking for Amazon Associates and a 14-day refund guarantee. |
| TrackRev | Hosted, on a subdomain you own through 1 CNAME record | 302 | Free: 50 links and 1,000 tracked events a month. Paid from $39 a month. | Joins each link's clicks to Stripe, Paddle, Polar or Lemon Squeezy revenue on paid plans. |
*Prices from each vendor's pricing page, October 2026. Pretty Links and ThirstyAffiliates show those prices as discounts from list prices of $249, $374 and $499. See the Pretty Links [plans page](https://prettylinks.com/pricing/plans/).*
Pick a plugin when your whole site runs on WordPress and you earn from Amazon Associates and a few networks, since $99.60 a year costs less than Starter at $39 a month. Pick a hosted tool when the redirect has to count revenue, or when partners other than you share the links.
### Moving cloaked links off Pretty Links
- Step 1: export from Pretty Links at Dashboard, Pretty Links, Options, Tools, Export Links to CSV, which the free version (4.0.15 at the time of writing) includes. The file has 16 columns, including slug, url, redirect_type and clicks ([Pretty Links CSV docs](https://prettylinks.com/docs/importing-and-exporting-your-links/)).
- Step 2: add a channel to each row. TrackRev's import needs a destination URL and a channel per row, keeps your slugs exactly, flags duplicate slugs before creating anything and takes 500 rows per upload.
- Step 3: point a CNAME for a subdomain such as go.yourbrand.com at cname.trackrev.io, verify it and import the CSV.
- Step 4: a subdomain cannot take over a path on your main domain, and published links point at `yourbrand.com/go/slug`. Leave the plugin active while they still get traffic, or add a server rule that redirects `/go/*` to the subdomain, and compare click counts for 7 days before removing it.
- Step 5: use the new links in new content and check each with the curl command above.
### Cloaked links that count revenue in TrackRev
TrackRev serves links from a subdomain you own through 1 CNAME record and an automatic certificate, and the [custom tracking domain](https://www.trackrev.io/products/custom-tracking-domains) page puts setup at about 5 minutes. Each click hits a server-side redirect that logs country, device and referrer, flags bots and answers 302. [Bulk link import](https://www.trackrev.io/products/bulk-links) handles the CSV above.
On paid plans from $39 a month, the click log joins Stripe, Paddle, Polar and Lemon Squeezy payments, and [link tracking](https://www.trackrev.io/solutions/links-and-analytics) shows the revenue each link earned. The free plan has 50 links and 1,000 tracked events a month and hides revenue. Partner links in an affiliate program, a paid-plan feature, use your branded domain by default. TrackRev's acceptable-use terms bar cloaking a destination with intent to deceive. Plans and limits are on the [pricing page](https://www.trackrev.io/pricing).
### Frequently asked questions
**Is URL cloaking the same as URL masking?**
Sometimes. Namecheap uses both names for 1 frame feature, while affiliate tools call a branded redirect a cloak. Ask a vendor which one it means before you compare 2 products.
**Is URL cloaking legal?**
I found no rule against a plain redirect on your own domain. The obligations attached to it are 16 CFR 255.5 on disclosure and each affiliate program's contract. Ask a lawyer about your own case.
**Does Google penalize cloaked affiliate links?**
Google Search asks whether a redirect is meant to deceive users or search engines, and a plain redirect that sends everyone to the same page is not. The bigger risk to an affiliate site is thin affiliation, meaning copied merchant descriptions with no original value.
**Is link cloaking allowed on Amazon Associates?**
Treat it as not allowed unless Amazon confirms otherwise in writing, and use the direct tagged link.
**What is the difference between a URL shortener and a link cloaker?**
They run the same redirect. A shortener shortens the address, and a cloaker hides long affiliate parameters, usually on your own domain. Amazon Associates Section 6(w) targets shorteners that hide an Amazon destination.
**Do cloaked links get more clicks?**
I found no independent data for affiliate links. The branded short link post covers a vendor survey on branded domains that states how it was run.
---
## Link retargeting explained: how it works and where it breaks
URL: https://www.trackrev.io/blog/link-retargeting-explained
Published: 2026-09-22
Author: Muzahid Maruf
Link retargeting runs a Meta, Google Ads or LinkedIn pixel on a redirect page. See how it works in 2026, which browsers block it and what EU rules require.
Link retargeting adds an ad platform's pixel to a short link, such as the Meta Pixel, a Google Ads tag or the LinkedIn Insight Tag. Each click runs the pixel on the redirect page, and the platform can add the visitor to an audience even when the link points to a page you do not own. In [StatCounter's September 2026 data](https://gs.statcounter.com/browser-market-share), Chrome holds 66.36% of browser share, Safari 18.27% and Firefox 2.80%. Chrome leaves third-party cookies to user choice, Safari blocks them and Firefox confines them to the site that set them. EU and UK rules add a consent step that a redirect page cannot show.
> **Key takeaways:**
>
> - Chrome has 66.36% of browser share in September 2026 and leaves third-party cookies to user choice, so link retargeting can still match consenting visitors there.
> - Safari (18.27%) and Firefox (2.80%) block or isolate third-party cookies by default, which leaves about 1 clicker in 5 unmatched before consent is counted.
> - EDPB Guidelines 2/2023, Google's EU User Consent Policy and Meta's Business Tools Terms all expect consent before ad cookies are set, and a redirect page has no room to ask.
> - Replug includes retargeting pixels from $9 a month and Rebrandly from its Professional plan. TrackRev fires Meta Pixel, Google Ads and LinkedIn Insight Tag IDs per campaign.
### How link retargeting works
Rebrandly's [guide to retargeting links](https://www.rebrandly.com/blog/retargeting-links), last updated December 16, 2025, lists 5 steps: create a branded link, attach a retargeting script from Meta, Google Ads, LinkedIn, TikTok or X, a user clicks, the pixel fires during the redirect, and the platform adds that person to an audience. Replug's [retargeting page](https://replug.io/retargeting-pixels) says its pixels fire on the short link, so the owner of the destination installs nothing. A Meta Pixel on your own site sees which pages people view; on a link it sees only the click.
### Tools that include link retargeting
| Tool | Pixels it supports | Availability |
| --- | --- | --- |
| Replug | Meta Pixel, Google Ads, Google Analytics 4, Google Tag Manager, X, LinkedIn, Pinterest, TikTok, Quora and custom code | Billed annually, per month: Essentials $9 (1 pixel, 10,000 clicks), Scale $23 (unlimited pixels, 50,000 clicks), Agency $79 (unlimited pixels, 250,000 clicks); none on Free. Past the click limit, links redirect but pixels stop firing |
| Rebrandly | Meta Pixel, Google Ads, LinkedIn, TikTok and X | Professional, Growth and Enterprise, with a pixel per workspace or per link; none on Free or Essentials |
| Short.io | Meta Pixel and AdRoll | Pro, according to its Meta Pixel guide |
| TrackRev | Meta Pixel, Google Ads and LinkedIn Insight Tag, by ID only | Switched on per campaign in the link form |
*Prices from each vendor's pricing page, October 2026 ([Replug](https://replug.io/pricing), [Rebrandly](https://www.rebrandly.com/pricing)). Short.io's plan comes from its [Meta Pixel help article](https://docs.short.io/articles/integrations-and-extensions/retargeting/how-to-integrate-short.io-with-meta-pixel-formerly-facebook-pixel-retargetingremarketing).*
### Which browsers let the pixel match a visitor
When the Meta Pixel uses first-party cookies, it saves an `_fbp` cookie for the redirect page's domain, according to [Meta's documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc), updated January 9, 2026. Linking that browser to an account typically needs cookies Meta keeps on its own domain, and a browser sends those only if it allows third-party cookies. I found no published match rate from Meta, Rebrandly, Replug or Short.io.
| Browser | Share, September 2026 | Third-party cookie default | Effect on a pixel on a redirect page |
| --- | --- | --- | --- |
| Google Chrome | 66.36% | Left to the user in Settings; Incognito blocks them ([Google, April 22, 2025](https://privacysandbox.google.com/blog/privacy-sandbox-next-steps)) | Can match visitors who have not blocked them; on October 17, 2025 Google [announced the retirement of 10 Privacy Sandbox technologies](https://privacysandbox.google.com/blog/update-on-plans-for-privacy-sandbox-technologies) |
| Apple Safari | 18.27% | Intelligent Tracking Prevention blocks them with no exceptions since Safari 13.1 and iOS 13.4 ([WebKit](https://webkit.org/tracking-prevention/), [March 24, 2020](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/)) | Platform cookies are not sent; script-written cookies are deleted after 7 days without interaction |
| Microsoft Edge | 6.04% | Balanced, the default of 3 levels, blocks storage for advertising trackers unless the user has a site engagement score of 4.1 or more with that organization ([Microsoft](https://learn.microsoft.com/en-us/microsoft-edge/web-platform/tracking-prevention)) | Partial |
| Mozilla Firefox | 2.80% | Total Cookie Protection confines cookies to the site that created them ([Mozilla](https://blog.mozilla.org/en/products/firefox/firefox-rolls-out-total-cookie-protection-by-default-to-all-users-worldwide/), rollout June 14, 2022) | A cookie set on the redirect page stays in that page's jar |
| Brave | Outside the top 6 | Shields block trackers and cross-site cookie tracking ([Brave](https://brave.com/privacy-features/)) | Blocked |
*Shares are StatCounter's worldwide figures. Samsung Internet (2.31%) and Opera (1.77%) are left out because I did not check their defaults.*
Apple's [App Store Review Guidelines](https://developer.apple.com/app-store/review/guidelines/), rule 2.5.6, require apps that browse the web to use WebKit, with engine entitlements for the EU and Japan. Chrome and Firefox on an iPhone are built on it, so the Chrome row probably includes some iPhone traffic running on WebKit. See [Safari ITP](https://www.trackrev.io/blog/safari-itp-attribution-saas) and [iOS 17 Link Tracking Protection](https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas) for what else Apple's browser removes.
> **Worked example with 5,000 clicks:** Split 5,000 clicks like StatCounter's global mix. Chrome brings 3,318, Edge 302, Safari and Firefox together 1,054 (21.07%), and other browsers 326. Those 1,054 cannot be matched by default. Of the 3,620 in Chrome and Edge, anyone who declines ad cookies drops out too. If half accept, which is an assumption because banners and countries vary, 1,810 remain, or 36.2% of the 5,000. At the 10,000 monthly clicks of Replug's Essentials plan, the same split puts 2,107 Safari and Firefox visitors out of reach every month. Your analytics browser report will differ from the global mix, so rerun the arithmetic with your numbers.
### Why consent is the harder problem
| Source | Date | What it asks |
| --- | --- | --- |
| EDPB [Guidelines 2/2023](https://www.edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-22023-technical-scope-art-53-eprivacy-directive_en), version 2.0 | October 7, 2024 | Paragraphs 47 to 51 put tracking pixels and tracking links under Article 5(3) of the ePrivacy Directive, even when storage is temporary |
| Google [EU User Consent Policy](https://www.google.com/about/company/user-consent-policy/) | No date shown | Legally valid consent, where legally required, for cookies and for personal data used in ad personalization, from users in the EEA, the UK and Switzerland, on properties you control |
| Meta [Business Tools Terms](https://www.facebook.com/legal/terms/businesstools) | November 3, 2025 | Verifiable consent where law requires it before Meta cookies are stored; no pixels on websites you do not own |
A redirect page is on screen for a fraction of a second and has nowhere to collect consent, and neither Rebrandly's guide nor Replug's page explains how a visitor gives it. The Business Tools Terms also bar pixels tied to your Business Manager or ad account on websites you do not own, which turns on whose domain serves the redirect. A branded domain you control is arguably yours and a shared vendor domain is not. That is my reading, and the terms never mention link shorteners, so ask Meta or a lawyer first.
### How to test your own match rate
Create a test campaign with a Meta Pixel, send 100 clicks from Chrome and 100 from Safari, and look in Events Manager and Pixel Helper for a PageView from the redirect domain. After 7 days, compare the audience size the platform reports with the clicks in your link report. Audience sizes are estimates. When the destination is your own site, a pixel there behind a consent banner reaches the same visitors on firmer legal ground.
### What to build instead
A server-side click log counts every visit in every browser, and joined to payments it shows which links produced revenue; see [link tracking without cookies](https://www.trackrev.io/blog/link-tracking-without-cookies-first-party) and [server-side versus client-side click tracking](https://www.trackrev.io/blog/server-side-click-tracking-vs-client-side-pixel). For audiences, Google [Customer Match](https://support.google.com/google-ads/answer/6379332) matches uploaded emails and phone numbers against signed-in Google accounts. Memberships last at most 540 days, and a list needs 100 members added or refreshed in that window. Neither reaches readers of content you do not own, which is what link retargeting uniquely offered.
### Link retargeting in TrackRev
TrackRev stores a Meta Pixel ID, Google Ads tag ID or LinkedIn Insight Tag ID once per workspace under Settings and Integrations, and you tick "Enable link retargeting" on each campaign. Visitors pass through a page that loads each script, waits 800 milliseconds and continues. Bots and link-preview crawlers get a plain redirect, and a human click is logged once.
It takes IDs only, for 3 platforms, with no custom code. Replug, with 9 platforms plus custom code, fits better if you need TikTok, Pinterest, X or Quora. The pass-through page shows no consent prompt, so for visitors in the EEA, the UK or Switzerland I would leave it off unless you collect consent before the click.
On paid plans the same link ties the visit to the Stripe, Paddle, Polar or Lemon Squeezy payment it produced; see [Links and Analytics](https://www.trackrev.io/solutions/links-and-analytics), [first-party tracking](https://www.trackrev.io/products/first-party-tracking) and the [PixelMe comparison](https://www.trackrev.io/compare/pixelme). The free plan covers link tracking with 50 links and 1,000 tracked events a month, and revenue figures start on [Starter at $39 a month](https://www.trackrev.io/pricing).
### Frequently asked questions
**What is link retargeting?**
It builds ad audiences from link clicks. A Meta Pixel, Google Ads tag or LinkedIn Insight Tag sits on a short link's redirect page, so each click can add the visitor to an audience for later ads. The link can lead to your site or anyone else's.
**Does link retargeting still work?**
For some visitors. Chrome and Edge hold 72.40% of share and allow some cross-site cookie matching, while Safari and Firefox (21.07%) do not, so measure the match rate on your own traffic.
**Can you retarget people who click a link to someone else's site?**
Yes, because the pixel fires on the redirect page and the destination installs nothing. Consent rules, Meta's Business Tools Terms and the EDPB's Guidelines 2/2023 still apply, including the limit on pixels placed on websites you do not own.
**Is link retargeting allowed under GDPR?**
Only with a legal basis under the GDPR (Regulation 2016/679) for the data the pixel sends, plus consent where the ePrivacy Directive (2002/58/EC) requires it, which for advertising pixels generally means before the pixel fires. This is general information and not legal advice, so check your own setup with a lawyer.
**Does TrackRev support link retargeting?**
Yes, per campaign, for Meta Pixel, Google Ads and LinkedIn Insight Tag IDs. Its pass-through page shows no consent prompt, and it records the click on its own server whether or not a pixel fires.
**Does link retargeting work on iPhone?**
Mostly not for matching. Safari has blocked all third-party cookies since March 24, 2020, and Chrome and Firefox on an iPhone generally run on WebKit under App Store rule 2.5.6.
**How much does link retargeting cost?**
Replug starts at $9 a month billed annually for 1 pixel and 10,000 clicks, and its $23 Scale plan removes the pixel limit at 50,000 clicks. Rebrandly includes it from Professional, and Short.io's Meta Pixel guide says Pro.
---
## Link tracking not working on mobile: where iOS 17, Safari and in-app browsers lose the click
URL: https://www.trackrev.io/blog/link-tracking-not-working-mobile
Published: 2026-07-11
Author: Muzahid Maruf
Mobile clicks missing from reports? Check in-app browsers, Safari's 7-day cookie cap, iOS 17 parameter stripping and blank referrers, then fix each one.
Link tracking not working on mobile usually traces to one of 5 causes: an in-app browser such as Instagram or Facebook, a Safari cookie capped at 7 days, a parameter that iOS 17 Link Tracking Protection removed, an app that sent no referrer, or an Android App Link or iOS universal link that opened your app instead of your page. Each leaves the same trace: mobile clicks climb while signups stay flat or arrive as Direct.
> **Key takeaways:**
>
> - Mobile attribution breaks in 5 places: in-app browsers, Safari's 7-day cookie cap, iOS 17 parameter removal, blank referrers and app links that open your app.
> - Safari ITP caps cookies written by JavaScript at 7 days, or 1 day after a classified tracker links to a URL with a query string, and a click logged on your own server escapes both.
> - Apple named no parameters when it announced the iOS 17 feature on June 5, 2023, so test which tags reach your server from an iPhone.
> - Safari 26.0, released September 15, 2025, hides query parameters and document.referrer from scripts it classifies as fingerprinting.
> - If iPhone clicks on a link convert far below Android clicks, such as 2.0% against 5.0%, the gap points at loss on the Apple side.
> - TrackRev logs each click on the server, and its pixel cookie lasts 7 days on Safari, so link a visitor to an email or a Stripe payment ID within a week.
### Why link tracking is not working on mobile
| What you see | Likely cause | What fixes it |
| --- | --- | --- |
| Many clicks, few signups from Instagram or Facebook | An in-app browser with separate storage | Log the click at a redirect |
| Direct signups 8 or more days after a click | Safari's 7-day cookie cap | Keep the visitor ID on the server |
| No UTM tags or gclid on iPhone | iOS 17 Link Tracking Protection in Safari 17.0 | Put the source in the link path |
| Social clicks with no Referer | App browsers that send none | 1 link per channel |
| A click, then no page view | Universal link or Android App Link | Pass the click ID into the app |
| iPhone converts far below Android, such as 2.0% against 5.0% | Loss on the Apple side | Fix the Apple-side rows above |
| Clicks that no person made | Link previews and prefetches | Flag bots, still redirect |
### In-app browsers keep their own storage
| Browser | What is documented | Source |
| --- | --- | --- |
| SFSafariViewController on iOS | Apple says an app cannot access its website data and points to ASWebAuthenticationSession for sharing data with Safari | [Apple Developer Documentation](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller) |
| Instagram and Facebook on iOS | Custom in-app browsers, not SFSafariViewController | [Felix Krause, August 10, 2022](https://krausefx.com/blog/ios-privacy-instagram-and-facebook-can-track-anything-you-do-on-any-website-in-their-in-app-browser) |
| WebView on Android | Does not share state with the browser | [Chrome Custom Tabs documentation](https://developer.chrome.com/docs/android/custom-tabs) |
| Chrome Custom Tabs on Android | Shares the browser's cookie jar | Chrome Custom Tabs documentation |
I would not trust a published list of which apps keep cookies, since each app can change its browser in any release, so run the test below. The open-source [Matomo Device Detector](https://github.com/matomo-org/device-detector/blob/master/regexes/client/mobile_apps.yml) lists the User-Agent patterns apps use, and this regex applies them at the redirect.
Flag in-app browsers at the redirect (Node)
```
// Tokens from Matomo Device Detector. Apps change them between releases, so confirm with a click from your own phone.
// Facebook: FBAN/, FBAV or MetaIAB | Instagram: Instagram + version | LinkedIn: LinkedIn, LinkedInApp
// TikTok: TikTok, musical_ly_, com.zhiliaoapp.musically | Snapchat: Snapchat/ + version
const IN_APP = /FBAN|FBAV|MetaIAB|Instagram|LinkedIn|TikTok|musical_ly|Snapchat/i;
app.get("/:code", async (req, res) => {
const inApp = IN_APP.test(req.get("user-agent") || "");
// store inApp on the click row so reports can split in-app traffic from Safari and Chrome
// ...then log the click and redirect as usual
});
```
### Safari deletes cookies that JavaScript writes
| Rule | Date | What it limits | What it leaves alone |
| --- | --- | --- | --- |
| [Intelligent Tracking Prevention 2.1](https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/) | February 21, 2019 (Safari 12.1 and iOS 12.2 betas) | Cookies from document.cookie expire in 7 days | Cookies set in an HTTP response |
| [Intelligent Tracking Prevention 2.2](https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/) | April 24, 2019 (iOS 12.3 and macOS 10.14.5 betas) | The same cookies expire in 1 day after a classified tracker links to a URL with a query string or fragment | Cookies set in an HTTP response |
| [Script-writeable storage cap](https://webkit.org/tracking-prevention/) | Current WebKit page | IndexedDB, LocalStorage, SessionStorage and Service Worker data deleted after 7 days without interaction | Home Screen web apps |
| [Advanced Fingerprinting Protection](https://webkit.org/blog/17333/webkit-features-in-safari-26-0/) | September 15, 2025 (Safari 26.0) | Known fingerprinting scripts cannot set long-lived cookies or LocalStorage, or read query parameters and document.referrer | Scripts Safari does not classify as fingerprinting |
| CNAME and IP cloaking defense | Current WebKit page | Response cookies capped at 7 days when cloaking is detected | Other response cookies |
| Signs up | Days after click | Script cookie | After a tracker link | Click row |
| --- | --- | --- | --- | --- |
| Wednesday, October 7 | 2 | Present | Gone | Present |
| Sunday, October 11 | 6 | Present | Gone | Present |
| Tuesday, October 13 | 8 | Gone | Gone | Present |
| Monday, October 19 | 14 | Gone | Gone | Present |
| Monday, November 2 | 28 | Gone | Gone | Present |
| Monday, December 7 | 63 | Gone | Gone | Present |
*An invented visitor who clicks on Monday, October 5, 2026 and visits once. Tracker column: a classified tracker sent the click.*
A signup on October 13 traces back only if an ID in the URL, an email captured earlier or a visitor ID on the payment connects it to the click row. A script that rewrites its cookie on each page view restarts the 7 days. ITP is a WebKit feature, so Google Chrome on Android applies none of it, and [Google's update of April 22, 2025](https://privacysandbox.google.com/blog/privacy-sandbox-next-steps) kept third-party cookies a choice in Chrome's settings.
### iOS 17 removes some parameters before your server sees them
Apple [announced Link Tracking Protection on June 5, 2023](https://www.apple.com/newsroom/2023/06/apple-announces-powerful-new-privacy-and-security-features/) for links in Messages, Mail and Safari Private Browsing, and shipped it in Safari 17.0 on September 18, 2023. Apple names no parameters. [Stape's update of August 6, 2025](https://stape.io/news/safari-ios26-advanced-fingerprinting-protection) says gclid and fbclid may be stripped in Private Browsing, Mail and Messages, while Private Browsing keeps utm_ tags. The click still arrives, and a source in the path of a link you own, such as `go.example.com/spring-launch`, reaches your server whatever happens to the query string. The [iOS 17 Link Tracking Protection post](https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas) tests each place a link opens.
### Blank referrers, app links and preview fetches
Google Analytics 4 files a visit under (direct) / (none) when a redirect or URL shortener strips its source, [Google's help page](https://support.google.com/analytics/answer/15258820) says. Many app browsers send no Referer either, so TrackRev's Smart Links, which infer a channel from it, record such clicks as Direct. A link per channel with `utm_source` and `utm_medium` set at the redirect avoids that, and the post on [GA4 not showing revenue by channel](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) covers the reporting.
A link whose domain is tied to your app can skip the browser. Apple [universal links](https://developer.apple.com/documentation/xcode/supporting-universal-links-in-your-app) launch the app, [Android App Links](https://developer.android.com/training/app-links) open it without a disambiguation dialog, and no pixel loads. The [Google Play Install Referrer API](https://developer.android.com/google/play/installreferrer) returns an installed package's referrer URL. The [deep linking guide](https://www.trackrev.io/blog/deep-linking-for-mobile-apps) covers the app side.
Link previews inflate clicks, so TrackRev flags bots and still redirects them. The [bot filtering guide](https://www.trackrev.io/blog/bot-traffic-filtering-for-links) has the signals.
### Test your own links on real phones
A test page that prints what the browser sends and whether its cookie survived
```
```
| Step | Open the link in | Record |
| --- | --- | --- |
| 1 | Facebook Messenger or Instagram on an iPhone, from a message to yourself | App name, referrer, and whether the cookie reads kept after the app closes |
| 2 | LinkedIn on an iPhone | The same 3 readings |
| 3 | Messages and Apple Mail, with a fake gclid on the destination | Whether the utm_ tags and the gclid arrive |
| 4 | A Safari Private Browsing tab | Whether the utm_ tags and the gclid arrive |
| 5 | Google Chrome on an Android phone | The control, where every tag arrives and the cookie reads kept |
| 6 | Mobile Safari, 8 days after its first visit to the page, with no visit in between | Whether the script-written cookie is gone |
| 7 | Every new iOS release, such as iOS 26 in September 2025 | Repeat steps 3 and 4, since Apple names no parameters |
*Open each link 2 times: once straight away and once after fully closing the app.*
### Size the gap before you rebuild anything
Android is a fair control because none of Apple's rules apply to it. Post 1 link in 1 campaign, then compare conversion rates by platform.
| Platform | Clicks | Signups | Conversion rate |
| --- | --- | --- | --- |
| iPhone | 1,200 | 24 | 2.0% |
| Android | 800 | 40 | 5.0% |
| iPhone at Android's rate | 1,200 | 60 | 5.0% |
| Difference | None | 36 | 3.0 points |
*Invented numbers. About 36 signups are filed as Direct or missing, which is $1,404 a month on a $39 plan if all of them paid. Treat 36 as an upper bound, since iPhone and Android audiences differ.*
### Write the visitor ID onto the payment
An ID stored on the payment cannot expire with a cookie: Stripe Payment Links take client_reference_id as a URL parameter, and Stripe Checkout Sessions take both fields below. A "How did you hear about us?" signup field backs it up, as in [self-reported versus tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data).
| Stripe field | Holds | Limit |
| --- | --- | --- |
| [client_reference_id](https://docs.stripe.com/payment-links/url-parameters) | A string you choose, returned in checkout.session.completed | 200 characters of letters, digits, dashes and the _ sign |
| [metadata](https://docs.stripe.com/metadata) | Key-value pairs on a Stripe object | 50 pairs, keys to 40 characters, values to 500 |
*A visitor ID in UUID form is 36 characters, so it fits both.*
### What TrackRev does about this
A TrackRev link redirects with a 302 and logs the click on the server before your page loads: time, country, city, device, browser, operating system and referrer. The redirect adds the saved UTM tags and a `_vid` parameter to the destination. The pixel reads `_vid` on the first page view and writes a `vid` cookie with JavaScript, so Safari's 7-day limit applies to that copy. The [first-party tracking](https://www.trackrev.io/products/first-party-tracking) page lists what a link records.
A Stripe charge joins to its click through `metadata.vid`, then Stripe Checkout's `client_reference_id`, then the customer's email. The browser breakdown has no in-app bucket, and an in-app visitor who returns in Safari without `_vid` joins a payment to the click only through an email identified earlier or a visitor ID already on the payment.
A link can also send iOS, Android and desktop visitors to different destinations, such as an App Store listing for iPhone taps. If you only want sessions by source, tagged links and Google Analytics 4 are free.
| Plan | Price | Links | Tracked events | Revenue by channel |
| --- | --- | --- | --- | --- |
| Free | $0 | 50 | 1,000 a month | Hidden |
| Starter, Growth and Scale | $39, $99 and $199 a month | Unlimited | Unlimited | Shown |
*TrackRev plans for link tracking, October 2026. See [pricing](https://www.trackrev.io/pricing).*
### Frequently asked questions
**Why do mobile clicks show up but conversions do not?**
Preview fetches inflate clicks, buyers return in another browser, or they sign up more than 7 days after the click.
**How can I tell a click came from an in-app browser?**
Read the User-Agent. Matomo Device Detector matches Instagram, FBAN, FBAV, MetaIAB, LinkedIn, TikTok and Snapchat.
**Do UTM parameters survive on an iPhone?**
Usually. Stape says utm_ tags are not stripped in Safari Private Browsing, while gclid and fbclid may be.
**What does the Google Play Install Referrer API return?**
5 items: the referrer URL, the referrer click timestamp, the install start timestamp, the app version at first install, and whether the user opened the app's instant experience in the past 7 days. It needs Google Play app 8.3.73 or later.
**Can a consent banner cause missing mobile data?**
Yes, when the tag waits for consent. TrackRev's pixel with data-requires-consent set to true sends nothing until your banner calls window.trk.grantConsent(), while the redirect still logs the click.
**Does the 24-hour Safari limit apply to every iPhone visitor?**
No. Intelligent Tracking Prevention 2.2 applies it only when a domain Safari classifies as a cross-site tracker sends the visitor to a URL with a query string or fragment.
---
## Cookieless link tracking in 2026: what Safari, Chrome and Brave allow
URL: https://www.trackrev.io/blog/link-tracking-without-cookies-first-party
Published: 2026-07-11
Author: Muzahid Maruf
Link tracking without cookies: record each click at the redirect, pass its ID along in the URL and into Stripe, and keep attribution past Safari's 7-day cap.
Link tracking without cookies means logging each click on your own server at the redirect, then carrying a random visitor ID through the URL, your database and the Stripe payment. The request already says which link was hit, from where, by which browser and when, so counting needs no cookie. Cookies matter only for recognizing the visitor later and tying them to a charge 14 days on, a week past the 7-day limit Safari has put on script cookies since Intelligent Tracking Prevention 2.1 in February 2019.
> **Key takeaways:**
>
> - A redirect logs a click with no cookie, because the request itself names the link and the visitor's browser before the 302 fires.
> - Safari deletes a site's script-written cookies after 7 idle days, and Chrome keeps third-party cookies after Google's April 22, 2025 decision.
> - An ID on the user record and on the Stripe payment has no expiry date, so it outlasts a 14-day trial.
> - A 2024 EDPB guideline brings tracking links within Article 5(3) of the ePrivacy Directive, so dropping cookies does not settle consent.
### What browsers restrict
Chrome still allows third-party cookies. On [April 22, 2025](https://privacysandbox.google.com/blog/privacy-sandbox-next-steps) Google kept its current approach, where users choose, and dropped the standalone prompt, and on [October 17, 2025](https://privacysandbox.google.com/blog/update-on-plans-for-privacy-sandbox-technologies) it retired the Attribution Reporting API and Topics.
| Rule | Source | What it reaches | What it leaves alone |
| --- | --- | --- | --- |
| Script cookie limits | WebKit [ITP 2.1](https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/), February 21, 2019; [ITP 2.2](https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/), April 24, 2019; [tracking prevention page](https://webkit.org/tracking-prevention/) | Cookies created in JavaScript are deleted after 7 days without interaction (a 7-day cap since Safari 12.1, iOS 12.2), or capped at 24 hours after a classified domain sends the visitor to a URL with a query string | Cookies set in an HTTP response |
| Third-party cookie block | [WebKit, March 24, 2020](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) | Cross-site cookies, blocked by default in Safari 13.1 and iOS 13.4 | Cookies on the site the visitor is on |
| CNAME cloaking cap | [WebKit, November 12, 2020](https://webkit.org/blog/11338/cname-cloaking-and-bounce-tracking-defense/) | Response cookies from a subresource that resolves through a third party's CNAME: 7 days in Safari 14 | Subdomains that resolve inside your own site |
| Bounce-tracking defense | WebKit, November 12, 2020 post and the tracking prevention page | At 10 unique redirect destinations a domain's cookies become SameSite=Strict; a classified domain with no first-party interaction in 30 days loses all its website data | Domains that redirect to fewer sites or that visitors use directly |
| Link Tracking Protection | [Apple, June 2023](https://www.apple.com/newsroom/2023/06/apple-announces-powerful-new-privacy-and-security-features/) (iOS 17) | Tracking parameters in Messages, Mail and Safari Private Browsing; Apple names none | A short code in the URL path |
| Query stripping | [Mozilla Firefox docs](https://firefox-source-docs.mozilla.org/toolkit/components/antitracking/anti-tracking/query-stripping/index.html); [Firefox 102](https://www.firefox.com/en-US/firefox/102.0/releasenotes/), June 28, 2022 | 8 parameters in Strict mode, including fbclid, mc_eid and mkt_tok | utm_ tags and other unlisted names |
| Debouncing | [Brave](https://brave.com/privacy-updates/11-debouncing/) desktop 1.32 | Known tracking domains are skipped and the visitor goes straight to the destination | Domains off Brave's list |
| Hostname filters | [uBlock Origin wiki](https://github.com/gorhill/uBlock/wiki/Static-filter-syntax) | A hostname filter blocks the site and its subdomains, main document included | Hostnames on no enabled list |
Redirect through your own subdomain: a shared short domain sending traffic to hundreds of sites looks like the 10-destination bounce pattern, and a subdomain that redirects to your own pages looks less like it, though I have measured neither. WebKit offers no list of classified domains, so check the cookie's expiry in Safari Web Inspector after a click. A click that a blocker stops never reaches your database.
Take a 14-day trial with a click on day 0 and a payment on day 14. A page that rewrites the cookie moves these dates, as the [Safari ITP guide](https://www.trackrev.io/blog/safari-itp-attribution-saas) shows.
| Copy of the ID written on day 0 | Deleted on | State at the day-14 payment |
| --- | --- | --- |
| Script cookie under the 24-hour cap | Day 1 | Gone for 13 days |
| Script cookie under the 7-day rule | Day 7 | Gone for 7 days |
| Cookie your server sets with a 365-day Max-Age | Day 365 | 351 days left |
| Row in your database or on the Stripe charge | Never | Intact on day 14 |
### Link tracking without cookies, from click to charge
Follow someone who taps a tracked link in Apple Mail on an iPhone, starts the trial and pays on day 14 from a laptop. The ID can sit in 5 places, and 2 of them belong to the browser.
| Step | Where the ID lives | Safari's reach | On day 14? |
| --- | --- | --- | --- |
| Day 0, tap | Click row written at the redirect | None, no script has run | Yes |
| Day 0, landing | _vid in the URL, then a pixel cookie written by JavaScript | The parameter if Apple lists it; the cookie after 7 days idle | Cookie probably not |
| Day 0, signup | Visitor ID column on the user record | None | Yes |
| Day 14, checkout | Stripe fields written from the user record | None | Yes |
| Day 14, payment | The charge, joined to the click by the stored ID | None | Yes |
The redirect writes a row with the timestamp, link, referrer, user agent, IP address and visitor ID, then answers with an HTTP 302 before any JavaScript runs. Its Set-Cookie header makes a server-set cookie, which WebKit exempts from the 7-day deletion unless the response comes through third-party CNAME or IP address cloaking. Max-Age=31536000 is 365 days, inside the 400-day ceiling [Chrome has applied since M104 in August 2022](https://developer.chrome.com/blog/cookie-max-age-expires).
Check what a redirect sends (example output)
```
$ curl -sI https://go.example.com/spring-launch
HTTP/2 302
location: https://www.example.com/pricing?utm_source=newsletter&utm_medium=email&_vid=3f0c9b1e-5d2a-4c7e-9a41-0b6e8d1f2c34
set-cookie: vid=3f0c9b1e-5d2a-4c7e-9a41-0b6e8d1f2c34; Max-Age=31536000; Path=/; SameSite=Lax; Secure
```
The redirect adds the ID to the destination URL, and the landing page saves it on the first page view. Apple publishes no parameter list, so put what you cannot lose in the link path, as the [iOS 17 guide](https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas) explains. At signup, save the ID on the user record in the same request as the email, before the 7-day ITP 2.1 cookie dies.
At checkout, copy the ID from the user record into the 3 Stripe Checkout fields below. The [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post maps them.
| Stripe field | Holds | Limit |
| --- | --- | --- |
| [client_reference_id](https://github.com/stripe/openapi) | One string on the Checkout Session | 200 characters |
| [metadata](https://docs.stripe.com/metadata) | Key-value pairs on the session | 50 pairs, keys up to 40 characters, values up to 500 |
| subscription_data.metadata | Pairs saved on the Subscription, since session metadata does not copy there | The same 50, 40 and 500 |
### Ways to carry an ID
[Plausible's data policy](https://plausible.io/data-policy) counts visitors with a daily hash of salt, domain, IP address and user agent, and deletes the salt every 24 hours. That suits traffic counts and cannot join a click to a later payment.
| Method | How long the ID lasts | Joins a day-1 click to a day-14 payment? |
| --- | --- | --- |
| Daily hash, as in Plausible | 24 hours | No |
| ID in the URL | 1 page view | Only if saved at once |
| Server-set cookie | 365 days | Yes, unless deleted or never sent |
| Account ID in your database | Until you delete it | Yes |
| Payment record | Permanent | Yes |
### Consent after the cookie is gone
The EDPB's [Guidelines 2/2023](https://www.edpb.europa.eu/documents/guideline/guidelines-22023-on-technical-scope-of-art-53-of-eprivacy-directive_en) (Version 2.0, adopted 7 October 2024) put tracking links under Article 5(3) of the ePrivacy Directive. An identifier appended to a web address is collected when the URL is visited, which the Board treats as gaining access to the visitor's device, and its example is a store giving partners tracked links to pay commissions.
Section 3.1 says that holds even when the storage is brief, paragraph 56 leaves consent or an exemption to a case-by-case assessment, and paragraphs 54 and 55 say IP-only tracking can fall under the same article. I'm not a lawyer, so check your own case with counsel; the [affiliate compliance guide](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers partner programs.
### What a cookieless setup misses
A buyer who signs up with one email and pays with another breaks an email join, so the ID goes onto the payment. A phone click and a laptop payment with no login look like 2 visitors. A podcast mention never reaches your server, so ask "How did you hear about us?" at signup.
A missing ID shows up in the report: a $1,500 newsletter placement brings 12 customers at $49 a month, and 5 of them arrive in Safari with no source and land in Direct.
| Customers with a source | Cost per customer | 12-month revenue | Revenue per $1 spent |
| --- | --- | --- | --- |
| 12 of 12 | $125.00 | $7,056 | $4.70 |
| 7 of 12 | $214.29 | $4,116 | $2.74 |
*Illustrative numbers: a $1,500 placement, 12 customers paying $49 a month for 12 months.*
The placement now looks 71% more expensive per customer ($214.29 against $125.00), and a team with a return threshold may cut a channel that works.
### What TrackRev does at each step
| Step | Behavior |
| --- | --- |
| Redirect | Needs no script on your site. Logs channel, referrer, device, browser, OS, country and city, flags bot traffic and sends a 302 from the shared short domain or a [custom tracking domain](https://www.trackrev.io/products/custom-tracking-domains) (one CNAME to cname.trackrev.io, SSL through Let's Encrypt) |
| Cookie and handoff | Shared short domain: a random vid cookie in the 302, 365 days, SameSite=Lax. Every redirect adds UTM tags and a _vid parameter |
| Pixel | One script tag reads _vid, accepts only a UUID and writes its own copy as a cookie with JavaScript, so Safari's 7-day rule applies to it |
| Binding | trk.identify(email) ties the visitor to an email, and the pixel stamps the visitor ID onto Stripe Payment Links and Buy Buttons |
| Sync | Hourly, with an optional webhook; matches on charge metadata, then Checkout Session reference or metadata, then customer email ([Stripe integration](https://www.trackrev.io/integrations/stripe)) |
| Window | 30 days by default, adjustable from 1 to 365; renewals credit the original click |
The Free plan covers 50 links and 1,000 tracked events a month for link tracking, with revenue figures hidden. Revenue by channel needs a paid plan, from Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)). A daily-hash analytics tool is simpler if you only want traffic counts, and a link that ends on an App Store listing logs the click but has no pixel or checkout of yours to carry the ID onward. The [first-party tracking page](https://www.trackrev.io/products/first-party-tracking) shows the product.
### Frequently asked questions
**Can I track link clicks with no cookie at all?**
Yes, for counting. A redirect already knows which link was hit and by which browser, so one database row per click needs no cookie.
**Is cookie-free tracking GDPR compliant?**
Not by default. Compliance depends on what you collect, why and on what legal basis, and in the EU Article 5(3) of the ePrivacy Directive can apply without any cookie.
**How do I test whether blockers stop my redirect?**
Open one link in Brave 1.32 or later and in Chrome with uBlock Origin switched on, then look for a new row in your click log. No row means the request never arrived.
**Will iOS 17 strip the ID from my short link?**
A short code in the path has no query string for Apple's protection to remove. Apple says nothing about parameters a redirect adds, so test that hop from Messages, Mail and a Private tab.
**Does localStorage get around Safari's cookie limit?**
No. WebKit applies the same 7-day deletion to LocalStorage, IndexedDB, SessionStorage, media keys and service worker registrations, so only a value kept on your server avoids it.
**Does TrackRev need a cookie banner?**
That varies with what you switch on. TrackRev's pixel sets a first-party cookie and can wait for your consent tool through the data-requires-consent attribute, while click capture adds no script.
---
## LTV to CAC Ratio: How to Calculate It and What Counts as Good
URL: https://www.trackrev.io/blog/ltv-to-cac-ratio
Published: 2026-10-02
Author: Muzahid Maruf
LTV to CAC ratio explained: the formulas, a worked example, where the 3:1 rule comes from, CAC payback, and how to measure the ratio for each channel.
LTV to CAC divides the gross profit a customer is expected to generate over their lifetime by what it cost to win them. A customer worth $2,107 who cost $600 gives a ratio of 3.5 to 1. The usual target, 3:1, is investor guidance. David Skok introduced it in his SaaS Metrics article, and Bessemer Venture Partners repeats it in its 2021 benchmarks. Both sources attach caveats to the number.
A single company-wide ratio also hides the decision that matters most. The same product can have one channel at 8.4:1 and another at 1.8:1, and telling them apart depends on attributing each customer, and every renewal they pay, to the channel that found them.
> **Key takeaways:**
>
> - LTV to CAC divides a customer's lifetime gross profit by what it cost to win them. At $79 a month, an 80% gross margin, 3% monthly churn and a $600 CAC, LTV is $2,107 and the ratio is 3.5:1.
> - The 3:1 target is investor guidance from David Skok's SaaS Metrics 2.0 and Bessemer's 2021 benchmarks, not a measured median. Skok later said a discounted LTV would need a lower target.
> - Read the ratio beside CAC payback. Skok recommends 12 months or less, and Bessemer's targets run under 12 months for SMB-focused companies, under 18 for mid-market and under 24 for enterprise.
> - Churn moves the result furthest: 5% monthly churn instead of 3% takes the example from 3.5:1 to 2.1:1 with no change in spend.
> - A blended 3.5:1 can hide one channel at 1.8:1 and another at 8.4:1. Splitting it by channel needs attribution that survives Safari's cookie limits and carries renewals back to the first source.
### What LTV and CAC measure
Customer lifetime value (LTV) is the profit a customer generates between their first payment and their last. Andreessen Horowitz defines it as the present value of the future net profit from the customer, and lists LTV built on revenue, or even on gross margin, as a common mistake. The classic formula, which [Skok describes](https://www.forentrepreneurs.com/ltv/) as average gross profit per customer divided by churn, is the gross-margin version a16z warns about. Skok's gross margin does include customer support and the account management time spent retaining customers, so part of the cost of serving a customer is already inside it.
Customer acquisition cost (CAC) is what you spend to win new customers in a period divided by the number of new customers in that period. The same [a16z metrics guide](https://a16z.com/16-startup-metrics/) says CAC should be the full cost, with referral fees, credits and discounts included, and that investors like to see it twice: blended across every channel, and for paid channels only.
You will also see the pair written as CAC to LTV, or CAC:LTV. That is the same relationship turned over: a CAC:LTV of 1:3.5 is an LTV:CAC of 3.5:1, and it can also be stated as a percentage, with CAC at 28% of LTV. Check which way a benchmark is written before comparing your number with it.
### How to calculate the LTV to CAC ratio
Five formulas cover the arithmetic. ARPA is average revenue per account per month, and churn is the share of customers who cancel in a month.
Formulas
```
Gross profit per customer per month = ARPA x gross margin
LTV = gross profit per customer per month / monthly churn
CAC = acquisition spend in a period / new customers in that period
LTV to CAC = LTV / CAC
CAC payback (months) = CAC / gross profit per customer per month
```
#### A worked example
Take a SaaS product that charges $79 a month at an 80% gross margin and loses 3% of its customers each month. Last month it spent $18,000 on acquisition and signed 30 new customers. Every figure here is hypothetical.
| Step | Calculation | Result |
| --- | --- | --- |
| Gross profit per customer per month | $79 x 0.80 | $63.20 |
| Expected customer lifetime | 1 / 0.03 | 33.3 months |
| LTV | $63.20 / 0.03 | $2,107 |
| CAC | $18,000 / 30 | $600 |
| LTV to CAC | $2,107 / $600 | 3.5:1 |
| CAC payback | $600 / $63.20 | 9.5 months |
*Worked example: $79 a month plan, 80% gross margin, 3% monthly churn, $18,000 of spend for 30 new customers.*
#### What churn does to the same product
Churn is hard to estimate early on, and of all the inputs it moves the answer furthest.
| Monthly churn | Average lifetime | LTV | LTV to CAC at $600 |
| --- | --- | --- | --- |
| 2% | 50.0 months | $3,160 | 5.3:1 |
| 3% | 33.3 months | $2,107 | 3.5:1 |
| 5% | 20.0 months | $1,264 | 2.1:1 |
| 7% | 14.3 months | $903 | 1.5:1 |
*Same $63.20 of monthly gross profit and $600 CAC; only churn changes.*
Moving from 3% to 5% turns a comfortable 3.5:1 into 2.1:1 without a dollar of extra spend. Gross margin deserves the same suspicion. Bessemer's cloud portfolio averages 70% between $1 million and $10 million of ARR, and at 70% this product earns $55.30 a month per customer, which gives an LTV of $1,843 and a ratio of 3.1:1.
#### Which LTV to divide by
The simple formula assumes churn stays at 3% for as long as customers last, which implies an average life of 33 months. Cap the horizon at 24 months, a window a16z prefers to measure when data is thin, and the same customer is worth $1,092, a ratio of 1.8:1. The other $1,014 of the simple LTV arrives after month 24.
Skok's later article on [discounted cash flow](https://www.forentrepreneurs.com/ltv/) goes further. It applies a 10% discount rate to revenue far in the future, and it handles customers who expand their spend, a case where the simple formula returns an infinite LTV. Pick one method and use it for every comparison.
### What is a good LTV to CAC ratio
Three to one is the figure everyone quotes. [Skok wrote](https://www.forentrepreneurs.com/saas-metrics-2/) that the best SaaS businesses have a ratio higher than 3, sometimes 7 or 8. He presented it as one of two guidelines, the other being months to recover CAC, that began as early guesses and held up when he checked them against SaaS businesses over two years. [Bessemer's Scaling to $100 Million](https://www.bvp.com/atlas/scaling-to-100-million), published in September 2021, recommends investing in acquisition when CLTV to CAC is 3x or better, and says a company well under that should keep experimenting until its unit economics improve. It adds that customers only turn profitable beyond 1x, and that when CAC exceeds lifetime value you should stop acquiring more of them.
| Ratio | What the published guidance implies | What I would do |
| --- | --- | --- |
| Below 1:1 | Each customer returns less gross profit than it cost to win | Fix retention, price or channel before spending more |
| 1:1 to 3:1 | Customers are profitable, but Bessemer says to keep experimenting | Test cheaper channels and work on churn |
| 3:1 to 5:1 | Meets the usual threshold for investing in growth | Add budget where payback is short |
| Above 5:1 | Skok saw 7 or 8 in the best SaaS businesses | Test more spend and watch whether the ratio holds |
*Thresholds come from Skok and Bessemer. The right-hand column is my reading of them.*
Read the 3:1 target with its caveats. Both sources are venture investors, and neither publishes a measured median across SaaS companies. The 3 was also set against the simple formula. In the discounted-LTV article, Skok wrote that discounting produces a lower LTV, that the target would need to move to a lower number, and that an updated recommendation would come in a later post. He also warned that these formulas only give meaningful results once your sales and marketing costs are predictable and scalable, which rules out plenty of early-stage companies.
Before comparing yourself with any benchmark, check three things: which LTV method produced your number, whether CAC includes salaries and commissions, and which customer segment the benchmark describes.
### CAC payback period
The ratio says how much a customer returns eventually. Payback says how long you wait to get your money back. Skok recommends recovering CAC in 12 months or less, allows 18 months or longer if you can raise capital cheaply, and reported that many of the best SaaS businesses manage 5 to 7 months. Bessemer measures payback against gross-margin-adjusted revenue and reports an average of 15 months across its portfolio for companies at $1 million to $10 million of ARR. Its targets depend on who you sell to.
| Customer segment | Bessemer payback target | Why it differs |
| --- | --- | --- |
| SMB-focused accounts | Under 12 months | Smallest contracts and the highest churn |
| Mid-market-focused accounts | Under 18 months | Middle ground on both |
| Enterprise-focused accounts | Under 24 months | Largest contracts and the lowest churn |
*Targets from Bessemer's Scaling to $100 Million, September 2021.*
The example product pays back in 9.5 months by the standard formula, which assumes nobody cancels before then. With 3% monthly churn, a cohort of customers has repaid $600 of gross profit per head only in month 12: $599.77 after 11 months and $644.97 after 12. A $79 plan sold to small teams falls in the SMB bucket, so the 12-month target is a close call.
### LTV to CAC by channel
A company-level 3.5:1 can sit on top of channels that fall well short of 3:1. Skok suggests using his guidelines to evaluate different lead sources, [Bill Gurley](https://abovethecrowd.com/2012/09/04/the-dangerous-seduction-of-the-lifetime-value-ltv-formula/), a critic of leaning on the formula, concedes that used correctly it is a good tactical tool for comparing marketing programs across channels, and a16z says investors want CAC broken out by paid channel, using Facebook as its example. The same hypothetical company looks different when split by where its customers came from.
| Channel | Spend | New customers | CAC | Monthly churn | LTV to CAC | Payback |
| --- | --- | --- | --- | --- | --- | --- |
| Google Ads | $9,000 | 10 | $900 | 4.0% | 1.8:1 | 14.2 months |
| SEO content | $3,000 | 12 | $250 | 3.0% | 8.4:1 | 4.0 months |
| Newsletter sponsorships | $6,000 | 8 | $750 | 1.75% | 4.8:1 | 11.9 months |
| All channels | $18,000 | 30 | $600 | 3.0% | 3.5:1 | 9.5 months |
*Hypothetical company: $79 a month, 80% gross margin, $63.20 of gross profit per customer per month. Spend and churn by channel are illustrative.*
Blended, the company clears the bar. Google Ads, at 1.8:1 with a 14.2-month payback, does not. SEO content pays back in 4 months and returns 8.4 times its cost over a customer's life. The sponsorships show why both numbers belong on the page: 4.8:1 is the second-best ratio, yet the cash takes almost 12 months to come back, which matters if you fund growth from your own bank balance.
Moving all the budget from ads to content is the wrong reading. The 12 content customers are the cheap ones. Gurley and a16z both point out that acquisition cost climbs as you buy more of a limited audience, so each ratio describes the average for what you have spent so far. Raise a channel's budget in small steps and recalculate. Keep organic signups out of a paid channel's denominator as well: dividing the $9,000 of ad spend by all 30 customers would show a CAC of $300 and flatter the ads.
### Why channel-level LTV needs attribution
The table above assumes you know which channel every customer came from and can follow that customer's payments for years. Each assumption breaks in its own way.
#### Customers land in the wrong channel
WebKit's [Intelligent Tracking Prevention documentation](https://webkit.org/tracking-prevention/) says Safari treats click IDs in link URLs as link decoration and caps cookies created by JavaScript on the landing page at 24 hours. It also deletes all script-written cookies and storage after 7 days without user interaction with the site. A visitor who clicks an ad in Safari, leaves, and subscribes 10 days later has lost the cookie that held the ad source, and the signup can be filed under direct. What survives is covered in [Safari ITP and SaaS conversions](https://www.trackrev.io/blog/safari-itp-attribution-saas).
Ad platforms add the opposite error. Each one claims the conversions it influenced, so the customers credited to channels can add up to more than the customers you have, and every channel's CAC looks lower than it is. The post on [self-reported against tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data) compares the two.
> **Worked example: misfiled customers:** Suppose 4 of the 10 customers Google Ads brought in are recorded as direct. Ads now shows 6 customers, a CAC of $1,500 instead of $900 and a ratio of 1.1:1 instead of 1.8:1, while direct collects customers it never earned.
#### Renewals happen where no browser is watching
Most of a subscription's LTV is renewals. A charge in month 8 is Stripe billing a card with nobody on your site, so a browser-side analytics tag never sees it. Lifetime value by channel needs the billing system to carry the original source forward on every renewal. [Subscription LTV attribution by channel](https://www.trackrev.io/blog/subscription-ltv-attribution) covers how renewals get credited to the original channel.
#### Pick the credit rule before you compare
Since November 2023, the [attribution reports in Google Analytics](https://support.google.com/analytics/answer/10596866) offer 3 models: data-driven, paid and organic last click, and Google paid channels last click. First click, linear, time decay and position-based were removed, and every remaining model withholds credit from direct visits unless the whole path was direct. A channel that introduces buyers but rarely gets the last click, such as a newsletter or a podcast, then looks more expensive per customer than it is. The credit rule changes the denominator of every channel's ratio, so choose it once and keep it. The post on [last-touch, first-touch and linear attribution](https://www.trackrev.io/blog/attribution-models-saas-comparison) compares the three models TrackRev offers.
### How to improve LTV to CAC
Each lever changes one input. The table moves one at a time from the worked example, so the effects are comparable.
| Lever | Change | LTV | CAC | LTV to CAC |
| --- | --- | --- | --- | --- |
| Baseline | None | $2,107 | $600 | 3.5:1 |
| Lower churn | 3% to 2% monthly | $3,160 | $600 | 5.3:1 |
| Raise price | $79 to $89 a month | $2,373 | $600 | 4.0:1 |
| Raise gross margin | 80% to 85% | $2,238 | $600 | 3.7:1 |
| Lower CAC | $600 to $450 | $2,107 | $450 | 4.7:1 |
*One input changes per row; real changes move several at once.*
Gurley's point that the formula's variables depend on one another applies here. A higher price tends to raise churn, and more spend raises CAC, so test each change on real cohorts before trusting the table.
#### Lower churn first
Churn has the largest effect in the sensitivity table. Skok says getting paid more up front usually lowers it, because a customer who has committed more is likelier to spend the time getting the product running. Annual plans also pull cash forward, which shortens payback. His cohort analysis compares churn in the first months across signup groups, which shows whether changes to onboarding and training helped.
#### Move spend between channels
The channel table is the quickest source of CAC improvement, since it needs no product change. Shift budget toward the channels with short payback and a ratio above 3, and trim the ones under 2. Channels that pay per customer change the mix further. An affiliate or referral program turns part of acquisition cost into a share of revenue paid after the customer pays, which is why [starting an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) is a CAC decision as well as a marketing one.
#### Raise price or margin with a churn check
A $10 price rise lifts the ratio from 3.5:1 to 4.0:1 only if churn holds at 3%. If churn climbs to 3.5%, LTV is $2,034 ($71.20 / 0.035) and the ratio 3.4:1, slightly worse than where you started. Margin work, such as cheaper hosting, avoids that particular trade-off, though it moves the ratio less.
### Mistakes that distort the ratio
Each of these input errors flatters the result.
| Mistake | Effect on the worked example | Ratio shown | True ratio |
| --- | --- | --- | --- |
| LTV built on revenue instead of gross profit | $79 / 0.03 = $2,633 instead of $2,107 | 4.4:1 | 3.5:1 |
| Leaving a $4,000 marketing salary out of CAC | $14,000 / 30 = $467 instead of $600 | 4.5:1 | 3.5:1 |
| Dividing $9,000 of ad spend by all 30 customers | CAC of $300 instead of $900, against Google Ads' $1,580 LTV | 5.3:1 | 1.8:1 |
*Each row changes one input of the worked example.*
A fourth mistake has no tidy number: calculating the ratio from two months of data. Churn estimated from so little history is unreliable, which is why Skok cautions that the formulas mean little until acquisition is repeatable.
### Where TrackRev fits
TrackRev's [Revenue Attribution](https://www.trackrev.io/solutions/revenue-attribution) supplies the LTV half of the channel table. It matches charges from Stripe, Paddle, Polar and Lemon Squeezy to the tracked click that produced them and carries that source across every renewal, so a customer's month-14 payment credits the same channel as month 1. The Channels page has a lifetime value table with customers, orders including renewals, lifetime revenue and average LTV per customer for each channel, and credit can be switched between last-touch (the default), first-touch and linear without re-tagging links.
Two limits apply. The table shows all-time revenue rather than gross profit, so apply your margin, and it mixes customers of different ages, so a channel you started last quarter looks worse than it is. Compare channels of similar age, or use the formula with each channel's churn from billing data. Spend is also yours to bring: take what you paid each channel, with affiliate commission included, and divide by that channel's new customers. At 20% recurring for 12 months, a referred customer on a $79 plan costs $189.60 in commission ($79 x 0.20 x 12) before software and your own time.
Revenue and LTV figures are hidden on the free plan, which tracks up to 50 links and 1,000 events a month. Starter is $39 a month; see [pricing](https://www.trackrev.io/pricing) for Growth and Scale.
### Frequently asked questions
**What is a good LTV to CAC ratio for SaaS?**
Most guidance names 3:1 as the floor, but where you should sit depends on how you fund growth. A company paying for acquisition out of revenue needs a shorter payback than one with cheap capital, so a 2.5:1 ratio with a 6-month payback can be healthier than 5:1 with a 20-month payback.
**Is a higher LTV to CAC ratio always better?**
No. A ratio of 10:1 on one channel usually means you are spending little relative to what its customers return, and the next customer will cost more than the average so far. Raise the budget in small steps and see where the ratio settles. A very high ratio built on a few months of churn data is more likely an estimating error.
**What is the difference between LTV to CAC and CAC payback?**
The ratio is a multiple and payback is a length of time, and the same ratio can hide very different cash timing. Customer A pays $100 of gross profit a month for 12 months and customer B pays $20 a month for 60 months. Each has a $1,200 LTV, so each is 4:1 against a $300 CAC, but A pays back in 3 months and B in 15.
**Should LTV use revenue or gross profit?**
Use gross profit at a minimum, with support and account management costs inside the margin. Andreessen Horowitz goes further and uses net profit after the variable cost of serving the customer. At an 80% gross margin, an LTV built on revenue overstates the figure by 25%.
**How do I calculate LTV when customers upgrade over time?**
The simple formula assumes a flat revenue per account and breaks when expansion outpaces cancellations, because it produces an infinite LTV. Two workarounds exist: Skok's discounted cash flow model with a 10% discount rate, or measuring what a real cohort has paid at 12 and 24 months.
**What is the CAC to LTV ratio?**
It is LTV to CAC read the other way around. A CAC:LTV of 1:3 equals an LTV:CAC of 3:1, and some teams express it as CAC being 33% of LTV. Lower is better when CAC sits first, so check the label before using a benchmark.
**Does affiliate commission count toward CAC?**
Yes. Referral fees, credits and discounts all belong in CAC. For a recurring commission, add the amount your terms promise over the whole term rather than only what has been paid so far, because otherwise young cohorts look cheaper than they are.
**How do I measure LTV to CAC by channel from Stripe?**
Stripe records the charge and has no record of the click that preceded it, so you need each customer's first source stored before checkout and tied to the Stripe customer. Then total the charges per source, divide by customers for LTV, and divide each channel's spend by its new customers for CAC. TrackRev does this join for you and shows the totals on paid plans.
---
## How to measure marketing ROI for SaaS, channel by channel
URL: https://www.trackrev.io/blog/measure-marketing-roi-saas
Published: 2026-07-11
Author: Muzahid Maruf
Measure SaaS marketing ROI in 6 steps: loaded channel cost, billing-verified revenue, a 12-month window and gross margin, with a worked table for 4 channels.
To measure marketing ROI for SaaS, take a channel's gross profit from billing-verified subscription revenue over a fixed window, subtract the channel's fully loaded cost, and divide by that cost. The revenue comes from Stripe, Paddle, Polar or Lemon Squeezy, because an ad dashboard only counts the conversions it claims. A customer who cost $250 to acquire and pays $49/month at an 80% gross margin repays that cost in 6.4 months, and the same arithmetic works for every channel once the inputs are right.
> **Key takeaways:**
>
> - Return on marketing is a channel's gross profit over a fixed window such as 12 months, taken from billing revenue after refunds, minus its fully loaded cost, divided by that cost.
> - In the worked example four channels blend to 10.3%, yet they range from 84.9% for newsletter sponsorships to a 40.0% loss for paid social, which needs 20 months to repay against a 12-month SMB target.
> - An ad dashboard that claims 55 conversions where billing shows 40 paying customers moves CAC from $182 to $250, so the customer count has to come from the billing system.
> - The marketing source must reach the invoice: Stripe metadata holds up to 50 pairs with values up to 500 characters, and Safari deletes script-written cookies after 7 days without a visit.
> - TrackRev supplies revenue per channel from $39/month but does not import ad spend, so cost, CAC and payback stay in your own sheet.
### The SaaS marketing ROI formula
A subscription keeps paying for months, shrinks through refunds and cancellations and grows through upgrades, so retail ROI math needs a window and a margin.
The numbers to compute for each channel
```
loaded cost = media + fees + creative + tools + commissions + salary share
CAC = loaded cost / new paying customers
gross profit = billing revenue in window, after refunds x gross margin
ROI = (gross profit - loaded cost) / loaded cost
ROAS = billing revenue in window / loaded cost
payback = CAC / (monthly revenue per customer x gross margin)
```
ROAS stops at revenue. ROI and payback apply gross margin as well, which is how [Bessemer Venture Partners measures CAC payback](https://www.bvp.com/atlas/scaling-to-100-million).
The window matters as much as the margin. On a $49/month plan the first invoice is $49, while a customer who stays 12 months pays $588, so dividing by first-payment revenue undercounts every channel that brings customers who stay. A lifetime window overshoots, since nobody knows yet what this quarter's customers will pay in year 3. A fixed 12 months sits between the two.
### How to measure marketing ROI for SaaS in 6 steps
#### Step 1: Total the full cost of each channel
For each channel add media spend, agency or freelancer fees, creative production, tools used only for that channel, affiliate commissions paid, and the share of salary spent on it. A marketer on a $90,000 salary who gives 8 of 40 weekly hours to one channel costs it $18,000 a year, or $1,500 monthly.
Check the grand total against a published median. The [SaaS Capital 2026 spending benchmarks](https://www.saas-capital.com/blog-posts/spending-benchmarks-for-private-b2b-saas-companies/), from a survey of more than 1,000 private B2B SaaS companies, put median spending at 8% of annual recurring revenue on marketing and 15% on sales. At $500,000 of ARR, 8% is $40,000 a year, and channel costs that sum to far less deserve a second look for missing lines such as salaries.
#### Step 2: Count paying customers and revenue from billing
In Stripe a customer is paying when `invoice.paid` fires and the subscription status is active, as the [subscription webhook guide](https://docs.stripe.com/billing/subscriptions/webhooks) advises. Refunds and disputes arrive as `charge.refunded` and `charge.dispute.created`. Stripe retries a failing webhook for up to 3 days in live mode, so check the stream against the invoice list each month.
Leave the customer count out of the ad platform's report. Google Ads, for example, credits a conversion for [30 days after a click and 1 day after a view](https://support.google.com/google-ads/answer/3123169) by default, and the click window can stretch to 90 days. Every platform counts on its own, so 2 platforms can claim the same buyer. In the step 5 example the paid search dashboard reports 55 conversions against 40 paying customers in billing, which moves CAC from $182 to $250.
#### Step 3: Carry the source from the first click to the invoice
Without a source on the billing record there is nothing to attribute revenue with. Tag every campaign link with UTM parameters (the free [UTM builder](https://www.trackrev.io/tools/utm-builder) keeps the spelling consistent), then store them and any click ID from your own server when the visitor lands. A script-written cookie is the weak point: Safari's Intelligent Tracking Prevention [deletes cookies created in JavaScript after 7 days without a visit](https://webkit.org/tracking-prevention/) and caps them at 24 hours when the landing link carries click IDs as URL parameters, so one can vanish before a 21-day trial converts.
At checkout, write the source onto the Stripe objects. [Stripe metadata](https://docs.stripe.com/metadata) holds up to 50 key-value pairs per object, with keys up to 40 characters and values up to 500, enough for `utm_source`, `utm_medium`, `utm_campaign` and a click ID. It does not copy between objects by itself. Pass `subscription_data.metadata` when you create the Checkout Session and it lands on the Subscription, which Stripe snapshots onto each invoice at `parent.subscription_details.metadata`. The [Stripe metadata attribution guide](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) has the full setup.
#### Step 4: Choose the revenue window and the attribution model
Set the revenue window to the payback you can afford. Bessemer's target is under 12 months for SMB-focused cloud companies, so a self-serve product at $49/month should read 12 months of revenue per customer. Label the figure "to date" until every customer in the cohort reaches month 12. Keep the click-to-payment window longer than the median days from first click to first payment in billing. Google Ads defaults to 30 days, which cuts off a sales-led deal that takes 90.
The model decides which channel gets the customer. Last-touch credits the final click, first-touch the first, and linear splits the payment evenly. A channel that ranks first under last-touch and last under first-touch is harvesting demand others created, and the [attribution model comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) shows how rankings shift. Run all 3 on the same customers.
| Model | Podcast link | Newsletter link | Google ad |
| --- | --- | --- | --- |
| Last-touch | $0.00 | $0.00 | $49.00 |
| First-touch | $49.00 | $0.00 | $0.00 |
| Linear | $16.33 | $16.33 | $16.33 |
*Credit for one $49 first payment from a buyer whose path was a podcast link, a newsletter link and a Google ad, in that order. Linear shares are rounded.*
Google Analytics 4 cannot run that comparison. Its attribution reports offer [3 models](https://support.google.com/analytics/answer/10596866): data-driven, paid and organic last click, and Google paid channels last click. First click, linear, time decay and position-based were removed in November 2023, and every remaining model leaves direct visits without credit unless the whole path was direct. First-touch or linear credit has to be computed outside those reports.
#### Step 5: Calculate ROI, CAC and payback for each channel
Take a hypothetical product at $49/month with an 80% gross margin, so each active customer yields $39.20 of gross profit monthly. One quarter of costs and billing results looks like this.
| Channel | Loaded cost | Paying customers | CAC | 12-month revenue per customer | 12-month ROI | Payback |
| --- | --- | --- | --- | --- | --- | --- |
| Paid search | $10,000 | 40 | $250 | $360 | 15.2% | 10.4 months |
| Newsletter sponsorships | $2,700 | 12 | $225 | $520 | 84.9% | 6.5 months |
| Content and SEO | $5,400 | 18 | $300 | $450 | 20.0% | 10.0 months |
| Paid social | $6,000 | 15 | $400 | $300 | -40.0% | 20.0 months |
| All four channels | $24,100 | 85 | $284 | $391 | 10.3% | 10.9 months |
*A hypothetical quarter for a $49/month product at an 80% gross margin. Revenue per customer is billing revenue over 12 months, net of refunds, cancellations and upgrades.*
The blended row looks acceptable: a 10.3% return and a payback inside 12 months. The channel rows disagree. Newsletter sponsorships return 84.9% and repay in 6.5 months, while paid social loses 40.0% and would need 20.0 months. Paid search shows a ROAS of 1.44, or $14,400 of revenue on $10,000, yet its return on gross profit is 15.2%, because 20% of every dollar goes to delivering the product.
#### Step 6: Reconcile to billing and set decision rules
Sum the revenue credited to every channel and compare it with all new-customer revenue in billing for the same period. If billing shows $12,000 and channels explain $9,000, the other $3,000 (25%) has no source. Direct visits and word of mouth fill part of that bucket, and my rule is to fix capture before comparing channels whenever it passes 20%. Set the payback and lifetime value thresholds before looking at results.
| Source | Benchmark | Figure |
| --- | --- | --- |
| Bessemer Venture Partners | CAC payback targets: SMB-focused, mid-market and enterprise cloud companies | Under 12, 18 and 24 months |
| David Skok | Months to recover CAC at many of the best SaaS businesses | 5 to 7 months |
| David Skok | Lifetime value to CAC at the best SaaS businesses | Above 3 |
*Published guidelines for CAC payback and lifetime value. Skok adds that profitability gets thin once recovering CAC takes longer than 12 months.*
Against the 12-month SMB line, newsletter sponsorships (6.5 months) and content (10.0) pass, paid search at 10.4 is close, and paid social misses by 8 months, so its budget is the first to cut or rebuild. Lifetime value needs more than 12 months of data, because it estimates revenue you have not seen. Compute it per channel, as in [subscription LTV attribution](https://www.trackrev.io/blog/subscription-ltv-attribution), before applying the 3-to-1 rule from [Skok's SaaS metrics guidelines](https://www.forentrepreneurs.com/saas-metrics-2/).
### Channels that need a different cost column
#### Affiliate and referral programs
The cost is the commission, and a recurring commission keeps adding cost for as long as the customer pays. A 20% recurring commission on a $49/month plan is $9.80 monthly, or $117.60 over a 12-month window, per customer. Refunds reverse the commission along with the revenue, so the 2 numbers should move together; [affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers the mechanics.
#### Content and SEO
Customers arrive months after the writing is paid for, so group the 18 customers in the example by the month of their first tracked click and read each cohort after its 12 months. First-touch credit suits this channel, since an article seldom closes a sale on the same visit.
#### Newsletter, podcast and video sponsorships
A flat fee buys one placement, so give each placement its own tracked link. A $2,700 sponsorship that produced 12 paying customers has a CAC of $225. [Tracking newsletter links to revenue](https://www.trackrev.io/blog/track-links-in-newsletters-revenue) covers the setup.
### Why Google Analytics alone cannot close the loop
Google Analytics 4 records browser sessions and whatever events a tag or the [Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events) sends it, while Stripe files payments under customer and invoice IDs. Closing the loop means carrying the GA4 client ID into Stripe metadata and posting a purchase event from a webhook. Google says such events should arrive within 48 hours of the browser event, or they may not be processed as expected for conversion attribution. A first payment after a 14-day trial lands 336 hours after the click and a month-2 renewal about 720, so neither can reliably credit the campaign. The [GA4 and Stripe build](https://www.trackrev.io/blog/connect-google-analytics-stripe-revenue) shows where each piece breaks.
### What TrackRev covers and what stays in your sheet
TrackRev Revenue Attribution handles the revenue half of the sheet. It connects to Stripe (with a restricted, read-only key), Paddle, Polar and Lemon Squeezy, and it matches each payment to the tracked click that preceded it by customer email, so there is no checkout code to change. The Channels page ranks every channel by clicks, conversions and attributed revenue with refunds and chargebacks netted out, and a second table shows all-time revenue per channel, renewals included. Last-touch is the default, and first-touch or linear is one setting away.
It does not read ad spend. TrackRev has no ad-account connection, so cost, CAC and payback stay in your spreadsheet, divided into the revenue column TrackRev supplies. Revenue figures need a paid plan from $39/month; the free plan tracks 50 links and 1,000 events per month and hides revenue. The [Revenue Attribution page](https://www.trackrev.io/solutions/revenue-attribution) lists the details.
Pick something else if you need ad-account spend pulled in for campaign-level ROAS, or if your billing runs through a processor TrackRev does not connect to.
### Frequently asked questions
**What is a good return on marketing spend for a SaaS company?**
There is no single percentage, because ROI changes with the window and the margin you choose. A result below 0% means the channel did not return its cost in gross profit by the end of the window. Above 0%, speed matters more than size: a 40% ROI that takes 20 months to arrive can strain cash more than a 15% ROI that arrives in 10. Compare payback with the published target for your segment instead of comparing percentages between companies.
**What is the difference between ROI and ROAS for SaaS?**
ROAS divides revenue by cost and ignores margin, so it flatters a product that costs money to deliver. ROI subtracts cost from gross profit before dividing. Take $1 of spend that returns $1.50 of revenue at an 80% gross margin: ROAS is 1.5, gross profit is $1.20, and ROI is 20%.
**How long should the measurement window be?**
Start from the payback you can afford, which is 12 months for most self-serve products, then test it against your own data. A median gap of 21 days between first click and first payment means half your customers pay within 21 days, so a 30-day click window covers more than half of them, and the 90th percentile shows how many it misses. For deals that take 90 days, a 30-day window credits whichever channel touched the buyer last and misses the one that started the conversation.
**Should expansion revenue and downgrades count toward channel ROI?**
Yes. Credit later upgrades to the channel that acquired the account, and subtract downgrades, refunds and cancellations. A $49/month customer who upgrades to $99 in month 4 pays 3 x $49 plus 9 x $99, or $1,038 over 12 months against $588 with no upgrade. A channel whose customers expand can beat one with a cheaper first sale, and only billing data shows it.
**How do I count free trials in CAC?**
Count the customer at the first paid invoice and keep the trial start date on the same row. Group by the month of the first click: with a 14-day trial, a visitor who clicks on March 28 pays in April, so March spend set against March payments understates March. Wait one trial length after a month ends before reading its cohort.
**Does TrackRev calculate CAC and ROI for me?**
No. TrackRev reports revenue per channel from your billing system and never sees ad spend, so you divide its revenue by your own cost figures. Revenue needs a paid plan from $39/month, and the free plan covers link tracking only.
---
## Multi-touch attribution: what it is and how to build it in 5 steps
URL: https://www.trackrev.io/blog/multi-touch-attribution-setup-guide
Published: 2026-08-21
Author: Muzahid Maruf
Multi-touch attribution splits a sale's revenue across every click that led to it. See how 4 rules split credit, what they miss and how to build it in 5 steps.
Multi-touch attribution divides the revenue from one sale among every recorded touchpoint before it, where single-touch rules give the whole amount to the first or last click. A SaaS buyer who clicks a podcast link on day 1, a LinkedIn post on day 9, a newsletter on day 16 and an affiliate's review link on day 24, then pays $1,200 for an annual plan on day 28, produces 4 credits that add back up to $1,200.
Setting it up takes 5 steps in a fixed order: capture each click on your own server, give the visitor an ID, link it to a person at signup, store every touch as its own row, and join the payment. Pick the credit rule last, since any rule can be read from the same stored touches.
> **Key takeaways:**
>
> - Multi-touch attribution divides one sale's revenue across every recorded touch, and the shares add back up to the sale. A $1,200 plan with 4 touches gives each $300 under linear and $480, $120, $120 and $480 under U-shaped.
> - The build is 5 steps in a fixed order: server-side click capture, a visitor ID, an identity link at signup, one stored row per touch, and a payment join. The credit rule comes last.
> - Safari deletes cookies created in JavaScript after 7 days without a visit to the site, so set the visitor ID from your own server and carry it into checkout.
> - TrackRev offers last touch (the default), first touch and linear on paid plans from $39 a month, with a lookback window of 1 to 365 days that defaults to 30.
### How multi-touch attribution works
Every rule takes 2 inputs: one buyer's touches in order, with timestamps, and a conversion with a dollar value. For a subscription, use the first paid charge as the conversion, since a free signup has no revenue to divide. [Google Analytics Help](https://support.google.com/analytics/answer/10596866) defines an attribution model as "a rule, a set of rules, or a data-driven algorithm" for assigning credit along the path. The shares sum to the charge, so the report ties back to what your processor collected.
#### One $1,200 sale under 4 rules
| Touch | Day | First touch | Last touch | Linear | U-shaped |
| --- | --- | --- | --- | --- | --- |
| Podcast link | 1 | $1,200 | $0 | $300 | $480 |
| LinkedIn post | 9 | $0 | $0 | $300 | $120 |
| Newsletter | 16 | $0 | $0 | $300 | $120 |
| Affiliate review link | 24 | $0 | $1,200 | $300 | $480 |
| Total | 28 | $1,200 | $1,200 | $1,200 | $1,200 |
*Illustrative journey for an annual plan paid on day 28. U-shaped gives 40% to each end and shares the other 20% between the 2 middle touches.*
First touch and last touch put $1,200 on 1 row, so the podcast is the whole story under one rule and worthless under the other. Linear gives every row $300.
#### How credit thins from 3 to 10 touches
The same $1,200 sale spread over 3 to 10 touches. Linear slices shrink in proportion, and U-shaped middle slices shrink faster because the 2 ends keep $480 each.
| Touches | Linear, each touch | U-shaped, each end | U-shaped, each middle touch |
| --- | --- | --- | --- |
| 3 | $400 | $480 | $240 |
| 4 | $300 | $480 | $120 |
| 5 | $240 | $480 | $80 |
| 6 | $200 | $480 | $60 |
| 8 | $150 | $480 | $40 |
| 10 | $120 | $480 | $30 |
### Which multi-touch attribution model to use
Pick the rule by the decision it feeds. First touch shows where buyers first met you, last touch shows what closed, and linear gives every channel that appeared a share.
| Rule | Credit split | Where it is offered |
| --- | --- | --- |
| First touch | 100% to the first touch | TrackRev, HubSpot |
| Last touch | 100% to the last touch | TrackRev, HubSpot, Google Analytics 4 (as last click) |
| Linear | Equal shares across all touches | TrackRev, HubSpot |
| U-shaped | 40% first, 40% lead conversion, 20% between | HubSpot |
| W-shaped | 30% each to first, contact-creating and deal-creating, 10% between | HubSpot |
| Data-driven | Estimated from your conversion paths | Google Analytics 4 |
*As documented by [HubSpot](https://knowledge.hubspot.com/reports/understand-attribution-reporting) and Google, October 2026. Google removed first click, linear, time decay and position-based from Google Analytics 4 in November 2023.*
At 20 paid conversions a month, 1 customer is 5% of the month's revenue, so position weights are fitted to a handful of journeys. I would read first touch and last touch side by side first, then add linear once most journeys have 3 or more touches. The [attribution models comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers time decay and data-driven credit.
### Benefits of multi-touch attribution
Journey openers become visible. In the $1,200 example the podcast earns $0 under last touch, so a team reading only last touch would cut it, while first touch gives it $1,200 and linear $300. Two rules side by side sort channels: high under first touch and low under last touch marks an opener, and the reverse marks a closer.
The model also matches how long SaaS buyers take. In TrackRev's [Q2 2026 attribution benchmarks](https://www.trackrev.io/data/saas-attribution-benchmarks), the median time from first tracked click to first paid charge is 6.3 days across 4,217 workspaces. The 75th percentile is 21.0 days and the 90th is 48.2, so 1 buyer in 10 takes longer than about 7 weeks, with room for many touches a last-click report never sees.
Commission rules get an explicit basis. On the sale above, an affiliate program paying 20% of credited revenue owes these amounts, so the rule belongs in the partner terms:
| Rule | Affiliate's credit | Payout at 20% |
| --- | --- | --- |
| First touch | $0 | $0 |
| Linear | $300 | $60 |
| U-shaped | $480 | $96 |
| Last touch | $1,200 | $240 |
### What multi-touch attribution can't tell you
Credit follows a fixed rule, so it can't show whether a channel caused a sale. Google Ads describes [Conversion Lift](https://support.google.com/google-ads/answer/12003020) as an incrementality experiment: 1 audience sees your ads, a control group does not, and the gap in conversions is the lift the ads caused. A multi-touch report has no control group, so test large budget moves with a holdout.
It also sees only recorded touches. A private recommendation, a conference conversation or an unlinked podcast mention leaves nothing to credit and lands under Direct. Asking buyers directly catches some, and the [self-reported versus tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data) guide covers weighing the answers.
### How to set up multi-touch attribution in 5 steps
#### 1. Capture every click on your own server
Send every link you control through a 302 redirect on a domain you own: newsletters, ads, partner links, QR codes. The redirect writes the click before it forwards the visitor, so a blocked script can't lose it. Store the visitor ID, link, channel, timestamp, user agent and a bot flag.
The first click mints the visitor ID, a random UUID set as a 365-day cookie in the redirect's response and appended to the destination URL as a parameter such as _vid. A pixel on your site reads it, so the click and later page views share 1 identity. Accept only values shaped like your own IDs, or a crafted link can plant someone else's.
TrackRev pixel tag
```
```
#### 2. Link the visitor to a person at signup
Anonymous clicks become usable once the visitor ID sits beside something a payment carries, usually an email. With the TrackRev pixel that is 1 call on the signup success page, after the pixel's trk:ready event fires. Every earlier click from that browser then belongs to a named account.
Run on the signup success page
```
window.trk.identify("buyer@example.com");
```
#### 3. Keep every touch as its own row
Store 1 row per click and never update one. A source field on the user, rewritten at each visit, is last-touch data under a multi-touch label. Flag bot clicks when you write them and filter on the flag, or link-preview crawlers and email security scanners collect credit as if they were buyers.
#### 4. Join the payment to the visitor
A log tied to signups ranks channels by signups, and joining the payment ranks them by revenue. Carry the visitor ID into checkout, and fall back to the customer's email. Each processor has its own field.
| Checkout | Field that carries the ID | What the docs say |
| --- | --- | --- |
| [Stripe Payment Links](https://docs.stripe.com/payment-links/url-parameters) | client_reference_id URL parameter | Up to 200 characters; sent in the checkout.session.completed webhook |
| [Stripe Checkout Sessions](https://docs.stripe.com/api/checkout/sessions/object) | client_reference_id field | A unique string, such as a customer ID or cart ID, for reconciling the session |
| [Paddle Billing](https://developer.paddle.com/build/transactions/custom-data) | customData in Paddle.Checkout.open() | Copied to the subscription and its later transactions |
| [Lemon Squeezy](https://docs.lemonsqueezy.com/help/checkout/passing-custom-data) | checkout[custom] URL parameters | Returned in the webhook's meta.custom_data |
| [Polar](https://polar.sh/docs/features/checkout/links) | reference_id query parameter | Attached to the checkout session's metadata |
*Fields as each processor documents them, October 2026.*
Decide here how renewals inherit credit and make refunds reverse their credit. The [Stripe Payment Links attribution guide](https://www.trackrev.io/blog/stripe-payment-links-attribution) shows the wiring.
#### 5. Choose the credit rule and the lookback window
The window decides which touches are eligible, because a click older than it earns nothing. Set it past the 90th percentile of your own days from first tracked click to first charge. [Google Analytics 4 attribution settings](https://support.google.com/analytics/answer/10597962) default to 90 days for most key events and offer 30, 60 or 90.
| Window | Workspaces using it | Buyers who pay inside it |
| --- | --- | --- |
| 7 days | 22% | Just over 50% (median is 6.3 days) |
| 14 days | 18% | 50% to 75% (75th percentile is 21.0 days) |
| 30 days | 41% | 75% to 90% (90th percentile is 48.2 days) |
| 60 days | 12% | 90% to 95% (95th percentile is 73.5 days) |
| 90 days or longer | 7% | Over 95% |
*From TrackRev's Q2 2026 benchmarks across 4,217 workspaces, where the median window is 27 days. Percentiles are bounded by each workspace's own window, so the real tail is longer.*
### Multi-touch attribution without cookies
Safari's Intelligent Tracking Prevention is the best-documented source of cookie loss. WebKit's [tracking prevention policy](https://webkit.org/tracking-prevention/) includes 3 caps that touch attribution.
| What is capped | Cap | Trigger |
| --- | --- | --- |
| JavaScript cookies, LocalStorage and IndexedDB | Deleted after 7 days | No interaction with the site in that time |
| JavaScript cookies on a landing page | Expire after 24 hours | ITP detects link decoration, such as click IDs in the landing URL's parameters |
| Cookies in third-party HTTP responses | Expire after 7 days | The request uses CNAME or IP address cloaking |
*Intelligent Tracking Prevention as WebKit documents it, October 2026.*
The click log needs no cookie, because the redirect records the click on your server before the destination loads. A cookie only links that click to a later purchase, and 3 carriers outlast the caps:
- A cookie your own server sets in an HTTP response. The caps name script-written cookies and cloaked third-party requests, and a redirect on your domain is neither.
- The ID in the URL, appended by the redirect, read by the pixel and carried into the payment by the checkout field from step 4. Apple's Link Tracking Protection strips some known parameters, and the [iOS 17 link tracking guide](https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas) covers which.
- The buyer's email or login, which no browser setting clears.
Probabilistic matching on IP address and browser fingerprints breaks on shared office networks and mobile data, so I would not pay commissions on it. A first-party ID is still a persistent identifier, so for EU or UK visitors ask a legal adviser whether it needs consent. The TrackRev pixel waits for window.trk.grantConsent() when its script tag carries data-requires-consent="true", and the [affiliate compliance guide](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers the rest.
#### Buyers who switch devices
A cookie lives in 1 browser, so a phone click and a desktop payment look like 2 strangers. Only a shared identity joins them: the email from a signup form, or a login. Store the visitor ID with the email at signup, and credit that ID's clicks when a charge arrives with the same email.
The join fails when the signup email and the card email differ. Key on your own user ID instead, passed as client_reference_id when you create the Stripe Checkout Session, or collect the work email before the upgrade.
TrackRev's email fallback reads only the most recently active visitor with that email, so 2 identified journeys, one on a phone and one on a laptop, are not merged.
### Test the pipeline with a known journey
Click 2 tagged links in 1 browser 1 day apart, sign up, then pay a small charge and refund it, once in Safari and once in Chrome. Each symptom points at 1 step:
- Safari loses early clicks and Chrome keeps them: the ID is written only by JavaScript, so Safari's 7-day cap applies.
- No earlier clicks on the signup: identify ran before the pixel loaded, or never ran.
- Only the last click appears: a source field is overwritten at each visit.
- A charge with no credit: checkout carried no ID and the card email differs from the signup email.
### Multi-touch attribution in TrackRev
TrackRev covers the 5 steps on 1 data model. Tracked links redirect on your domain and log each click server-side with a visitor ID, partner links included. A one-line pixel hands the ID to your site, window.trk.identify(email) ties it to a person, and charges from Stripe, Paddle, Polar and Lemon Squeezy match by the checkout's ID or, failing that, by email.
The rules are last touch (the default), first touch and linear, with a lookback window of 1 to 365 days that defaults to 30. A rule applies as each charge arrives, so changing it affects later charges only. Renewals reuse the first charge's split, and refunds drop out of channel revenue. A visit that skips your tracked links counts as a page view, not a touch.
| Plan | Price | What it covers here |
| --- | --- | --- |
| Free | $0 | Link tracking for 50 links and 1,000 events a month; no revenue figures |
| Starter | $39 a month | Revenue by channel, 3 credit rules, 1 workspace |
| Growth | $99 a month | The same, with unlimited workspaces |
| Scale | $199 a month | The same, with priority support |
*Plans from the TrackRev [pricing page](https://www.trackrev.io/pricing), October 2026.*
The [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows the channel report. Pick another tool for position-based, time-decay or data-driven credit, or when the decisive touches happen in meetings and email threads.
### Frequently asked questions
**What is multi-touch attribution in marketing?**
It reports revenue by channel with every recorded touch before a sale receiving a share, where single-touch rules give 1 touch everything. The shares total the sale, so the report ties back to your processor's payout.
**What is the difference between single-touch and multi-touch attribution?**
Single-touch rules give 1 row the full amount and every other row $0, while multi-touch rules spread it. A buyer with exactly 1 touch gets the same answer from every rule, so they diverge from the 2nd touch onward.
**Which multi-touch attribution model should a SaaS team start with?**
Linear is a sensible first multi-touch rule. It needs no tuning and you can audit it by hand: 4 touches on a $1,200 sale get $300 each. Its gap from last touch shows which channels you were under-crediting. HubSpot's U-shaped rule keys on the interaction that created the contact, and its W-shaped rule also on the one that created the deal.
**Do I need cookies for multi-touch attribution?**
You need an identifier that survives from first click to payment, and a cookie is only 1 option. A server-set cookie, an ID in the URL carried into checkout, or the buyer's email or login can each do it, while Safari clears script-written cookies after 7 days without a visit.
**Can I try multi-touch attribution for free?**
Partly. The TrackRev free plan tracks 50 links and 1,000 events a month, and revenue by channel starts at $39 a month. Google Analytics 4 is free, but it dropped its first click, linear, time decay and position-based models in November 2023.
**Does multi-touch attribution show which channel caused a sale?**
No. It shows which channels were present and divides the revenue by a fixed rule. To estimate cause, run a holdout test, such as Google Ads Conversion Lift where your account has it: hold 1 channel back from a region or audience for a few weeks and compare conversions.
---
## Northbeam vs TrackRev: what each costs and what each measures
URL: https://www.trackrev.io/blog/northbeam-vs-trackrev
Published: 2026-07-31
Author: Muzahid Maruf
Northbeam vs TrackRev in October 2026: Northbeam's non-Shopify plans start at $3,500 a month, TrackRev at $39. What each attributes, and for whom.
Northbeam vs TrackRev comes down to what your revenue looks like. Northbeam attributes ecommerce orders to the ads that produced them, and its docs reserve setup for stores outside Shopify to plans from $3,500 a month. TrackRev attributes subscription revenue from Stripe, Paddle, Polar and Lemon Squeezy to the channel that earned it, from $39 a month, and it has no ad-spend import. A SaaS company with modest paid spend gets more from TrackRev, and a direct-to-consumer brand spending $100,000 or more a month on ads gets more from Northbeam.
I run TrackRev, so weigh my read accordingly. Every figure here is as of October 2026.
> **Key takeaways:**
>
> - Northbeam lists Starter at $1,500 and Professional at $3,500 a month, and its docs put non-Shopify setup on Professional and above. TrackRev's paid plans cost $39, $99 and $199 a month.
> - Northbeam pulls spend from 13 ad platforms and sells media-mix modeling and incrementality testing. TrackRev imports no ad spend and has neither.
> - Northbeam's subscription metrics rely on order tags, and its integration matrix lists 15 platforms and no payment processor.
> - TrackRev joins each Stripe, Paddle, Polar or Lemon Squeezy charge to the link click behind it, and renewals keep crediting the original channel.
### Northbeam vs TrackRev at a glance
| Feature | Northbeam | TrackRev |
| --- | --- | --- |
| Built for | Ecommerce brands that buy ads, Shopify first | SaaS and subscription businesses |
| Listed price | Starter $1,500, Professional $3,500 a month, Growth and Enterprise by quote | Starter $39, Growth $99, Scale $199 a month |
| Free plan | None listed | Link tracking only: 50 links, 1,000 events a month |
| What moves the price | Pageview volume, per its FAQ | Partner commission tracked: $10,000 on Starter, $100,000 on Growth, unlimited on Scale |
| Contract | Starter month-to-month, Professional and Enterprise on annual terms | Monthly, or yearly at the price of 9 months for 12 |
| Revenue comes from | Shopify orders, or orders sent through its Orders API | Read-only Stripe, Paddle, Polar and Lemon Squeezy connections |
| Ad platforms | Spend pulled from 13 platforms, including Facebook, Google and TikTok | No spend or reporting import |
| Attribution models | 7, including 3 proprietary multi-touch models | 3: last touch (default), first touch, linear |
| Windows | 1 to 90 days or lifetime, plus an optional lookback cap | Any whole number from 1 to 365 days, 30 by default |
| Media-mix modeling and incrementality | MMM+ optional on Enterprise, incrementality optional on Professional and Enterprise | Neither |
| Affiliate programs | Affiliate clicks count as a channel, no partner management listed | Included on paid plans, paid out by PayPal or Wise CSV |
*Prices from each vendor's pricing page, October 2026.*
### What Northbeam costs
Northbeam's [pricing page](https://www.northbeam.io/pricing) lists four plans, each pitched by ad spend, and its FAQ says every rate is a starting point because pageview volume sets the monthly price.
| Plan | Who the page says it is for | Listed price |
| --- | --- | --- |
| Growth | Seven-figure brands spending under $200,000 a month on ads, bundled with agency support | Custom quote |
| Starter | Brands spending under $1.5M a year on ads | $1,500, with the unit unclear on the page |
| Professional | Growth marketers spending up to $500,000 a month on ads | $3,500 a month |
| Enterprise | Teams spending more than $500,000 a month on ads | Custom quote |
*Northbeam's published plans, October 2026.*
Per its FAQ, Starter is month-to-month and aimed at Shopify brands. Professional adds other ecommerce platforms, and Northbeam's [custom setup guide](https://docs.northbeam.io/docs/non-shopify-installation) limits tracking for sites without Shopify's checkout to Pro and Enterprise. Both run on annual terms, so a Stripe-billed SaaS starts at Professional: $3,500 × 12 = $42,000 a year, before any traffic adjustment.
The pricing page reports that ad accounts gain 3.5% in return on ad spend on average 180 days after activation, a vendor figure I cannot check. At face value, a 3.5% lift covers $42,000 only when ad-attributed revenue reaches about $1.2 million a year ($42,000 ÷ 0.035), before margin. A SaaS whose paid channels bring in $20,000 a month makes $240,000 a year, one fifth of that.
### What Northbeam is built to measure
Northbeam's pitch rests on double counting: Meta Ads Manager, Google Ads and TikTok Ads Manager each claim the same conversion, so summed platform revenue exceeds what the store collected. Its [overview docs](https://docs.northbeam.io/docs/what-is-northbeam) say it splits credit over the whole journey, so its figures read lower than in-platform reports by design.
Its [integration matrix](https://docs.northbeam.io/docs/integration-matrix) lists 15 platforms with direct connections, 13 of which supply ad spend, including Facebook, Google, TikTok and Amazon. That feeds return on ad spend and acquisition cost per campaign. Reddit, Criteo, AWIN and Impact are tracked through UTM parameters only.
Around the models sit a Sales Attribution dashboard, Profit Benchmarks for per-channel targets, Creative Analytics for ad assets, Product Analytics for product-level results, [MMM+](https://docs.northbeam.io/docs/mixed-media-modeling) for pixel-free media-mix modeling, and Northbeam Apex, which sends Northbeam's conversion data back to ad platforms such as Meta.
#### Models, windows and accounting modes
The [attribution models page](https://docs.northbeam.io/docs/attribution-models) lists 7 models: first touch, last touch, last non-direct touch, linear, and 3 proprietary ones, Clicks-Only, Clicks + Modeled Views and Clicks + Deterministic Views. Windows run 1, 3, 7, 14, 30, 60 and 90 days or lifetime, with a separate lookback cap. Of the two [accounting modes](https://docs.northbeam.io/docs/accounting-modes), Cash Snapshot credits the day of the transaction, while Accrual Performance credits the day of the touchpoint, and the overview docs say windows work only in that mode.
### One journey, credited by each tool
Take a buyer who clicks a Facebook ad on day 1, a TikTok ad on day 2 and an email on day 3, then places a $90 order through TrackRev links. Northbeam's default, Clicks-Only, gives lower-funnel email nothing while an upper-funnel click exists, and TrackRev's default gives the last click everything.
| Credit rule | Facebook click, day 1 | TikTok click, day 2 | Email click, day 3 |
| --- | --- | --- | --- |
| Northbeam Clicks-Only | $45 | $45 | $0 |
| TrackRev last touch | $0 | $0 | $90 |
| TrackRev first touch | $90 | $0 | $0 |
| TrackRev linear | $30 | $30 | $30 |
*One $90 order, credited under four rules.*
### Can Northbeam attribute SaaS subscriptions?
Partly, with engineering work. Northbeam's [subscription analytics guide](https://docs.northbeam.io/docs/subscription-analytics) builds its First Time, Recurring and Other categories from order tags, which many Shopify subscription apps, such as Recharge, apply automatically. Custom stores send an `order_tags` field and an `is_recurring_order` flag through the Orders API.
The [Orders API](https://docs.northbeam.io/docs/order-definition) requires 8 fields, among them a customer ID, product list and shipping cost, and no payment processor appears in the integration matrix. Each Stripe invoice needs your own code to reshape it into an order, shipping field included.
Under Northbeam's [lookback docs](https://docs.northbeam.io/docs/lookback-windows), a 90-day lookback lets only touchpoints from the 90 days before an order earn credit. A customer who clicks an ad and starts a $49 monthly plan places 12 orders worth $588 in a year.
| Order | Days after the click | Amount | Click eligible, Northbeam 90-day lookback | Channel credited, TrackRev |
| --- | --- | --- | --- | --- |
| Signup | 0 | $49 | Yes | Yes |
| Renewal 2 | 60 | $49 | Yes | Yes |
| Renewal 4 | 120 | $49 | No | Yes |
| Renewal 11 | 330 | $49 | No | Yes |
*A $49 plan renewing every 30 days. TrackRev renewals inherit the original sale's channel, and an infinite Northbeam lookback keeps the click eligible at the cost of harder-to-read journeys.*
### How TrackRev tracks revenue by channel
Setup takes 3 moves, against 5 in Northbeam's [quickstart](https://docs.northbeam.io/docs/quickstart): install the pixel, connect a read-only key for Stripe, Paddle, Polar or Lemon Squeezy, and pass the visitor ID at checkout. TrackRev records each click server-side at your tracking link, ties later pageviews to a first-party visitor ID, and joins each pulled charge to the visitor who paid. The Stripe connection asks for read scopes on charges, checkout sessions, customers and payment intents.
The join is exact when the checkout carries the visitor ID and falls back to the customer's email when it does not. Stripe Payment Links, pricing tables and Buy Buttons pick the ID up from the pixel on their own. A Stripe Checkout Session created through the API takes one extra line.
Stripe Checkout Session with the visitor ID (Node.js)
```
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: priceId, quantity: 1 }],
success_url: "https://app.example.com/thanks",
client_reference_id: vid, // the value of the vid cookie
});
```
Each charge becomes an order. The lifetime value table ranks channels by the all-time revenue of the customers they brought, renewals included, and a refunded charge is recorded but earns no credit. Sync runs hourly, and the optional webhook scope on the Stripe key brings new sales in within seconds.
Choosing among the 3 rules is covered in [last-touch vs first-touch vs linear](https://www.trackrev.io/blog/attribution-models-saas-comparison), and the per-processor wiring is in [attributing Stripe revenue to marketing channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels). Links, revenue attribution and [the affiliate program](https://www.trackrev.io/solutions/affiliate-program) run on the same orders, so partners earn commission on the sale that also feeds the channel table, and Starter at $39 includes all three.
### What TrackRev does not do
- It imports no spend or reporting from ad platforms, so it shows no return on ad spend or acquisition cost from platform data.
- Credit starts with a click on a TrackRev link. An ad someone watched and never clicked earns nothing, and there is no view-through credit.
- It has no media-mix modeling, incrementality testing or creative-level ad analytics, and only 3 models: last touch, first touch and linear, with no position-based or time-decay option.
- Revenue and lifetime value are hidden on the free plan, so attribution against real charges needs a paid plan from $39 a month.
### Which one fits
| Your situation | Better fit | Reason |
| --- | --- | --- |
| Shopify brand on Meta Ads and Google Ads | Northbeam | Spend and clicks arrive from the ad platforms |
| You need media-mix modeling or incrementality tests | Northbeam | TrackRev has neither |
| Stripe SaaS earning from newsletters, SEO and affiliates | TrackRev | Channels rank by revenue and lifetime value |
| Tool budget under $200 a month | TrackRev | Scale is $199 a month, and Northbeam's lowest listed price is $1,500 |
| SaaS with a large paid budget | Depends on the question | Northbeam reads the ad side, TrackRev follows renewals |
The comparison pages for [Triple Whale](https://www.trackrev.io/compare/triple-whale) and [HYROS](https://www.trackrev.io/compare/hyros) take up the same SaaS-fit question for two other ad-attribution suites.
### What a year costs
| Plan | Per month | Over 12 months | Billed yearly |
| --- | --- | --- | --- |
| TrackRev Starter | $39 | $468 | $351, or $29.25 a month |
| TrackRev Growth | $99 | $1,188 | $891, or $74.25 a month |
| TrackRev Scale | $199 | $2,388 | $1,791, or $149.25 a month |
| Northbeam Professional | $3,500 | $42,000 | Annual or semi-annual terms, per its FAQ |
*Prices from each vendor's pricing page, October 2026. Northbeam Growth and Enterprise are quoted individually.*
At the listed rate, a year of Northbeam Professional costs about 90 times a year of TrackRev Starter ($42,000 against $468) and more than 17 times a year of Scale ($2,388). Professional includes a media strategist and ad-platform integrations that a SaaS without ad-platform data would not use, and pageview volume can move the quote.
TrackRev's free plan covers link tracking, so you can install the pixel before paying, and revenue by channel starts on a paid plan. See the [pricing page](https://www.trackrev.io/pricing), the [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) and [subscription LTV attribution by channel](https://www.trackrev.io/blog/subscription-ltv-attribution).
### Frequently asked questions
**Is TrackRev a Northbeam alternative?**
For a SaaS or subscription company, yes: from $39 a month it ranks the channels behind recurring revenue, which Northbeam's order-based setup serves least well. For an ecommerce brand that needs spend-based ROAS, creative analytics or media-mix modeling it is no replacement.
**How much does Northbeam cost?**
Northbeam publishes Starter at $1,500 and Professional at $3,500 a month, and quotes Growth and Enterprise individually. Its FAQ says pageview volume moves the quote.
**Does Northbeam work for SaaS subscriptions?**
It can ingest subscription orders if you send them through its Orders API with first-time and recurring tags. Its integration matrix lists no Stripe, Paddle, Polar or Lemon Squeezy connector, and its subscription guide leads with Shopify apps, so a SaaS also needs Professional at $3,500 a month.
**Do I need ad spend to use TrackRev?**
No. TrackRev starts at $39 a month, its plans differ by workspaces and commission tracked, and ad budget never enters the price. Once ads point at tracking links, paid traffic, newsletters and affiliates sit in one channel table.
**Does TrackRev connect to Meta Ads or Google Ads?**
Not for spend or reporting. Each click is recorded when someone lands on a tracking link, so credit is counted per link and nothing is read from Meta Ads Manager or Google Ads.
**Is there a free plan for each?**
Northbeam lists no free plan, and every plan on its pricing page leads to a demo request. TrackRev's free plan tracks 50 links and 1,000 events a month, with revenue figures and affiliate programs unlocked from Starter at $39.
---
## How to Set Up an Affiliate or Referral Program With Paddle
URL: https://www.trackrev.io/blog/paddle-affiliate-program-setup
Published: 2026-10-03
Author: Muzahid Maruf
Set up an affiliate or referral program on Paddle Billing: pass the partner in custom data, commission on transaction.completed, and reverse refunds.
To set up an affiliate program with Paddle, store the partner's ID at the click, pass it into Paddle Checkout as custom data, and write a commission when a signed transaction.completed webhook arrives. Where Stripe Checkout takes a client_reference_id, Paddle Checkout takes customData. Paddle is also the merchant of record, so its totals include tax and a refund never edits the original transaction.
> **Key takeaways:**
>
> - Commission on transaction.completed, and on the pre-tax subtotal: in Paddle's own API example, 20% of the $599.00 subtotal is $119.80, against $130.43 on the $652.15 total.
> - Refunds arrive as adjustments, and Paddle Billing can approve live refunds of 400 USD or less automatically, so reverse commissions on adjustment events.
> - Use Paddle Billing, which accounts opened since August 8, 2023 get. Rewardful's own page says it supports Paddle Classic only.
### How Paddle affiliate tracking works
Paddle Billing opens checkout from a page on your approved domain that [loads Paddle.js](https://developer.paddle.com/build/transactions/default-payment-link). Your script there can read the first-party cookie, and Paddle's overlay or inline form never sees it, so the partner ID goes into `customData` in `Paddle.Checkout.open()`. Paddle Billing then copies it to the subscription and every renewal. Its [fee](https://www.paddle.com/pricing) is 5% + 50¢ per checkout transaction.
| Stage | What happens | Paddle field or event |
| --- | --- | --- |
| 1. Click | Your script stores the partner's ID in a cookie | None |
| 2. Checkout | Your page opens Paddle Checkout with the ID attached | customData |
| 3. Payment | Paddle charges the buyer and creates the subscription | transaction.paid, then transaction.completed |
| 4. Commission | Your server verifies the webhook and writes a commission | Paddle-Signature, custom_data |
| 5. Renewal | Paddle copies the custom data onto each renewal | transaction.completed again |
| 6. Refund | Paddle records an adjustment and leaves the transaction alone | adjustment.created, adjustment.updated |
### How to set up an affiliate program with Paddle, step by step
Do steps 1 to 7 in a Paddle sandbox, which has its own data and charges no real cards, and step 8 on your live account.
#### Step 1: Check your Paddle version and open a sandbox
Per Paddle's [migration guide](https://developer.paddle.com/migrate/learn), accounts opened before August 8, 2023 start on Paddle Classic and later ones on Paddle Billing, with separate data, APIs and webhooks. This post covers Billing. Classic passes data in a `passthrough` string of up to 1,000 characters ([checkout parameters](https://classic.paddle.com/reference/paddle-js/parameters)) and added [structured custom data](https://classic.paddle.com/changelog/2022-08-12-custom-data/) in August 2022.
Open a Paddle Billing sandbox at sandbox-vendors.paddle.com, where [API keys](https://developer.paddle.com/sdks/sandbox) contain `_sdbx` and client-side tokens start with `test_`.
#### Step 2: Set the commission rules
| Rule | Example setting | Paddle detail |
| --- | --- | --- |
| Rate and term | 25% for 6 months | Each renewal is its own transaction.completed ([how to pick a rate](https://www.trackrev.io/blog/how-to-create-an-affiliate-program)) |
| Commission base | Subtotal minus discount | Totals include tax (step 6) |
| Attribution window | 30 to 90 days | Safari clears script cookies after 7 idle days (step 3) |
| Hold period | 30 days, your refund window | A refund can be approved after Paddle's review |
| Payout | Monthly, $100 minimum | Paddle pays you, so paying partners is a separate run |
On a $29 monthly plan, 25% recurring for 6 months pays $7.25 per renewal and $43.50 per customer who stays the whole term (29 x 0.25 x 6). A customer who cancels after 2 payments costs $14.50.
#### Step 3: Save the partner ID at the click
A script writes the partner's ID into a first-party cookie on arrival, ready for step 4. Safari's [Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) deletes cookies created in JavaScript after 7 days without interaction, so a Monday click and a purchase 10 days later, with no visit in between, reach checkout with no ID. Keep a second match key, such as an email captured at signup or a coupon code (step 6).
#### Step 4: Pass the partner ID into Paddle Checkout
Paddle Billing's [custom data guide](https://developer.paddle.com/build/transactions/custom-data) asks for a JSON object with at least one key and advises against nesting.
Paddle.js (Paddle Billing)
```
// "ref" is the first-party cookie your affiliate tracking wrote at the click
const partner = document.cookie.match(/(?:^|; )ref=([^;]+)/)?.[1] ?? null;
Paddle.Checkout.open({
items: [{ priceId: "pri_01gs59hve0hrz6nyybj56z04eq", quantity: 1 }],
customData: { partner_id: partner },
});
```
A server-created transaction takes the same object as `custom_data` in `POST /transactions`, before billing. Paddle Billing copies a transaction's custom data to its subscription, and a subscription's to every later transaction, so one ID covers every renewal. The [Paddle checkout attribution guide](https://www.trackrev.io/blog/paddle-checkout-attribution-passthrough) goes deeper.
#### Step 5: Receive transaction.completed webhooks
In the Paddle dashboard, open Events, then Notifications, and subscribe a webhook destination to `transaction.completed`, `adjustment.created` and `adjustment.updated`. Commission on [completed](https://developer.paddle.com/webhooks/transactions/transaction-completed): a [paid transaction](https://developer.paddle.com/webhooks/transactions/transaction-paid) may still lack payout totals, a subscription ID and an invoice number.
| Webhook rule | Paddle's value |
| --- | --- |
| Signature | The Paddle-Signature header holds ts and h1, an HMAC SHA-256 of ts, a colon and the raw body |
| Replay check | Paddle's SDKs reject a ts more than 5 seconds old by default |
| Response deadline | 200 within 5 seconds, then process from a queue |
| Live retries | Up to 60 over 3 days, 20 of them in the first hour and 47 in the first day |
| Sandbox retries | 3 over 15 minutes |
| Allowlist | 6 live and 6 sandbox source IP addresses, listed in Paddle's delivery docs |
| Active destinations | 10 at once, each with its own pdl_ntfset_ secret |
| Deduplication | event_id, prefixed evt_ |
| Ordering | Not guaranteed, so compare occurred_at |
*From Paddle's [signature verification](https://developer.paddle.com/webhooks/about/signature-verification), [delivery](https://developer.paddle.com/webhooks/about/respond-to-webhooks) and [notification destination](https://developer.paddle.com/webhooks/about/notification-destinations) docs.*
Webhook endpoint (Next.js route handler)
```
import { createHmac, timingSafeEqual } from "node:crypto";
export async function POST(req: Request) {
const raw = await req.text(); // the raw body, exactly as Paddle sent it
const header = req.headers.get("paddle-signature") ?? "";
const ts = /ts=(\d+)/.exec(header)?.[1];
const sigs = [...header.matchAll(/h1=([0-9a-f]+)/g)].map((m) => m[1]);
if (!ts || sigs.length === 0) return new Response("bad request", { status: 400 });
const expected = createHmac("sha256", process.env.PADDLE_WEBHOOK_SECRET!)
.update(ts + ":" + raw)
.digest("hex");
const valid = sigs.some(
(s) => s.length === expected.length && timingSafeEqual(Buffer.from(s), Buffer.from(expected)),
);
if (!valid) return new Response("invalid signature", { status: 401 });
// 300 seconds is wider than the SDK default of 5, to tolerate clock skew
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return new Response("stale", { status: 400 });
const event = JSON.parse(raw);
if (await alreadySeen(event.event_id)) return new Response("ok"); // your dedupe store
await enqueue(event); // your queue; commission logic runs after the 200
return new Response("ok");
}
```
#### Step 6: Calculate and record the commission
In the verified event from step 5, read `data.custom_data` for the partner, `data.subscription_id` for the subscription and `data.details.totals` for the money. Paddle Billing sends amounts as strings in the currency's smallest unit, so the "59900" subtotal in its [API reference example](https://developer.paddle.com/api-reference/transactions/get-transaction) is $599.00. Store `currency_code` on every commission row. That example has $53.15 of tax at 8.875%, a $652.15 total, a $33.11 fee and $565.89 of earnings.
| Base | Paddle field | Amount | 20% commission |
| --- | --- | --- | --- |
| What the buyer paid | details.totals.total | $652.15 | $130.43 |
| Price before tax | details.totals.subtotal | $599.00 | $119.80 |
| Price before tax and fee | details.totals.earnings | $565.89 | $113.18 |
*Amounts from the example transaction in Paddle's API reference. The 20% rate is only for the arithmetic.*
In that example the $33.11 fee is 5% of the $652.15 total plus 50¢, so Paddle charged it on the tax-inclusive amount. The earnings field is described as the total minus the fee, yet the example shows the subtotal minus the fee ($599.00 minus $33.11), so check a sandbox payload in step 8 before relying on it. Use the subtotal minus any discount, the base from step 2, which partners can verify against your price list. On a $29 plan priced before 20% VAT the total is $34.80, so 25% of the total pays $8.70 against $7.25, which is $1.45 too much on every renewal.
Each renewal from step 5 is its own transaction.completed with the same custom data, so write one commission per transaction up to your term. To credit partners who send no clicks, give each a Paddle discount code and match `discount_id`; a [discount](https://developer.paddle.com/build/products/offer-discounts-promotions-coupons) covers only the first transaction unless it is recurring.
#### Step 7: Reverse commissions on refunds and chargebacks
Paddle Billing's [adjustments guide](https://developer.paddle.com/build/transactions/create-transaction-adjustments) says billed and completed transactions can't change, so a refund is an adjustment and the transaction stays completed, which a tool reading only transaction status misses. Most live refunds start as `pending_approval` and become `approved` or `rejected`; Paddle approves a live refund itself at 400 USD or less, if the account is verified, the amount is under your balance and the buyer didn't pay by bank transfer.
Reverse the step 6 commission once an adjustment is approved. A partial refund takes back the same share: $10 refunded on a $40 sale at 20% returns $2 of the $8 commission. Chargebacks arrive as adjustments with the actions `chargeback_warning`, `chargeback` and `chargeback_reverse`; reverse on the first two and restore on the third. The [refund clawback guide](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers commissions already paid.
#### Step 8: Test in the sandbox, then go live
Paddle Billing's [webhook simulator](https://developer.paddle.com/webhooks/simulator/test-webhooks) can replay a renewal, but only to destinations whose usage type is Platform and simulation or Simulation. Buy through a partner link, simulate a renewal, refund the payment (the sandbox approves refunds every 10 minutes) and check the commissions from steps 6 and 7. To go live, swap in live credentials and recreate the catalog and notification destination, as the [go-live checklist](https://developer.paddle.com/build/go-live-checklist) lists.
### Setting up a referral program on Paddle
A referral program rewards customers for bringing in new ones, and steps 3 to 8 carry over: the referrer's ID travels in custom data and the reward fires on the friend's first transaction.completed. Paddle Billing's [credits](https://developer.paddle.com/build/transactions/create-transaction-adjustments) aren't promotional credits, so pay cash or put a Paddle discount on the referrer's subscription, which can [recur for up to 999 billing periods](https://developer.paddle.com/errors/discounts/discount_maximum_recurring_intervals_greater_than_maximum). A discount's usage limit is one total across all customers, so a one-use-per-friend rule is yours to write. TrackRev's [referral campaigns](https://www.trackrev.io/products/referral-campaigns) add cash or credit rewards on paid plans.
### Tool options for a Paddle affiliate program
Prices are in the [comparison of affiliate software for Paddle](https://www.trackrev.io/blog/best-affiliate-software-for-paddle-2026). Ask every vendor which total it commissions on and whether it reads adjustment events.
| Option | What its page says about Paddle |
| --- | --- |
| Build it yourself | Steps 3 to 7, plus a partner portal, payout run and tax forms |
| [Rewardful](https://rewardful.com/paddle) | Integrates with Paddle Classic only, and not with Paddle Billing |
| [Tolt](https://tolt.com/paddle-affiliate-program) | Two-way sync, with commission deducted on issued refunds; no version named |
| [Affonso](https://affonso.io/changelog/paddle-integration) | Added in 2025, covering refunds, discount codes and referral links; no version named |
| TrackRev | Paddle Billing API key, hourly sync and an optional instant webhook; no Paddle Classic |
*Paddle support as each vendor describes it, October 2026.*
### What TrackRev does for a Paddle program
| Setting | Value |
| --- | --- |
| Plans | Starter $39 a month, Growth $99 and Scale $199, capped at $10K, $100K and unlimited commission tracked monthly; annual billing pays for 9 months and gives 12; the free plan has 50 links and 1,000 events a month, for link tracking only |
| Connection | Read-only Paddle Billing key with Customer, Product, Subscription, Transaction and Discount access |
| Sync | Hourly, 30 days back on the first run, instant with an optional webhook on transaction.completed |
| Join key | customData: { vid: window.trk.vid } in the step 4 call, falling back to the buyer's email |
| Renewals and codes | Renewals inherit the first visitor; a Paddle discount code assigned to a partner credits them without a click |
| Cookie window | 60 days by default, 1 to 3,650 allowed |
| Hold period | 0 to 180 days, default 0 |
| Payouts | PayPal or Wise CSV export, then mark each paid |
TrackRev's [Paddle integration](https://www.trackrev.io/integrations/paddle) verifies the webhook signature, then reads the transaction from the Paddle API. Choose another route on Paddle Classic, or for a managed marketplace of partners, which [PartnerStack vs TrackRev](https://www.trackrev.io/blog/partnerstack-vs-trackrev) compares. [Pricing](https://www.trackrev.io/pricing) lists the plans.
### Frequently asked questions
**How do I track affiliate sales in Paddle?**
On Paddle Billing, attach the partner's ID as custom data in the checkout call or on a server-created transaction. The webhook returns it, renewals included.
**Which Paddle webhook should trigger a commission?**
transaction.completed. Unlike transaction.paid, it arrives after Paddle Billing adds the fee, earnings and subscription ID.
**Should I commission on the total, the subtotal or earnings?**
On the subtotal minus any discount, which is $599.00 in Paddle's example against a $652.15 total and $565.89 of earnings.
**What happens to a commission when Paddle refunds the buyer?**
On Paddle Billing the transaction stays completed and an adjustment records the refund. Reverse the commission when it is approved; live refunds of 400 USD or less can approve automatically.
**Does TrackRev work with Paddle Classic?**
No. Its connect form asks for a Paddle Billing API key and warns against a Classic one.
**Can I run a TrackRev affiliate program on the free plan?**
No. The free plan covers link tracking, with 50 links and 1,000 tracked events a month. The affiliate program starts on the $39 Starter plan.
---
## Paddle checkout attribution: carry the channel in custom_data
URL: https://www.trackrev.io/blog/paddle-checkout-attribution-passthrough
Published: 2026-07-11
Author: Muzahid Maruf
Pass the marketing channel into a Paddle Billing checkout with customData, then read it from transaction.completed on every renewal. 7 steps, code and limits.
To get Paddle checkout attribution, put the marketing source into the checkout's custom data before the buyer pays. On Paddle Billing that is a `customData` object in `Paddle.Checkout.open()`, or `custom_data` on a transaction your server creates. Paddle Billing copies it to the subscription and returns it in the `transaction.completed` webhook, so the channel is still attached on payment 12. Paddle Classic calls the same field `passthrough`.
> **Key takeaways:**
>
> - Attach the marketing source as custom data when the checkout opens or when your server creates the transaction, and Paddle Billing copies it to the subscription and every renewal.
> - On Paddle Billing, overlay and inline checkouts run on your own page, so UTM parameters stay readable at purchase. Hosted checkout has 14 URL parameters and none takes custom data.
> - Custom data in Paddle Billing needs at least 1 key and has no published size cap. A transaction freezes once it is billed, canceled or completed, and refunds arrive as adjustments with no custom data.
### Where Paddle checkout attribution gets lost
The usual explanation is a redirect that strips UTM parameters. On Paddle Billing the [overlay checkout guide](https://developer.paddle.com/build/checkout/build-overlay-checkout) has the overlay opening as a modal on your page, while an inline checkout sits in the page layout, so your script can still read the query string and cookies. The gap is the hand-off: a Paddle Billing transaction records the buyer, price, tax and payment method, and nothing about the ad that sent them.
| Checkout type | Runs on | Where the source goes |
| --- | --- | --- |
| Overlay | Your page, as a modal | customData in Paddle.Checkout.open() |
| Inline | Your page, embedded | The same call |
| Payment link | Your approved page, opened with ?_ptxn= | custom_data on a server-created transaction |
| Hosted checkout | A Paddle-hosted page built for mobile apps | Nowhere: its 14 URL parameters include none for custom data |
*From the [default payment link](https://developer.paddle.com/build/transactions/default-payment-link) and [hosted checkout](https://developer.paddle.com/paddle-js/about/hosted-checkout) docs for Paddle Billing.*
### How to pass the channel into a Paddle checkout
Steps 1 and 2 cover an overlay or inline checkout. Step 3 replaces them when your server builds the transaction.
#### Step 1: Save the first source on the landing page
By the time someone clicks Subscribe, a page or two of navigation has usually dropped the query string. Read the 4 UTM keys you use on the first pageview and keep the first source for each visitor.
Browser, every landing page
```
const KEYS = ["utm_source", "utm_medium", "utm_campaign", "utm_content"];
const params = new URLSearchParams(location.search);
if (params.get("utm_source") && !localStorage.getItem("first_touch")) {
const touch = {};
for (const key of KEYS) if (params.get(key)) touch[key] = params.get(key);
localStorage.setItem("first_touch", JSON.stringify(touch));
}
```
#### Step 2: Pass it to Paddle.Checkout.open()
The [custom data guide](https://developer.paddle.com/build/transactions/custom-data) uses `utm_medium`, `utm_source` and `utm_content` as its own example, next to an `integration_id`. Keep the object flat, because Paddle Billing warns that nested values may display incorrectly in the dashboard. When nothing was saved, send a marker such as `none`, since an object needs at least 1 key.
Browser, Paddle Billing (Paddle.js v2)
```
function openCheckout() {
const saved = JSON.parse(localStorage.getItem("first_touch") || "null");
Paddle.Checkout.open({
items: [{ priceId: "pri_01gs59hve0hrz6nyybj56z04eq", quantity: 1 }],
customData: saved || { utm_source: "none" }, // an empty object is invalid
});
}
```
#### Step 3: Or create the transaction on your server
Put `custom_data` in the `POST /transactions` body, then pass the returned ID to `Paddle.Checkout.open({ transactionId })` or send the buyer to `checkout.url`. I'd set anything you act on, such as discounts or plan access, here, since a browser can send anything.
Server, Paddle Billing API (sandbox-api.paddle.com while testing)
```
const res = await fetch("https://api.paddle.com/transactions", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.PADDLE_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
items: [{ price_id: "pri_01gs59hve0hrz6nyybj56z04eq", quantity: 1 }],
custom_data: { utm_source: "newsletter", utm_medium: "email", utm_campaign: "oct-launch" },
}),
});
const { data } = await res.json();
// data.id is the txn_... ID for Paddle.Checkout.open({ transactionId }).
// data.checkout.url is the payment link for the same transaction.
```
#### Step 4: Read it from transaction.completed
The [transaction.completed](https://developer.paddle.com/webhooks/transactions/transaction-completed) event fires once a transaction is fully paid and processed, carrying `custom_data`, `subscription_id`, `currency_code` and the totals, so write one row per payment. The `checkout.completed` event in Paddle.js carries the same object for on-page tracking such as a Google Analytics 4 purchase hit.
Webhook endpoint (Next.js route handler)
```
export async function POST(req: Request) {
const raw = await req.text(); // verify Paddle-Signature against this raw body first
const event = JSON.parse(raw);
if (event.event_type !== "transaction.completed") return new Response("ok");
const t = event.data;
await saveSale({
eventId: event.event_id, // unique per event: skip repeats
transactionId: t.id,
subscriptionId: t.subscription_id, // null for one-time prices
currency: t.currency_code,
subtotalMinor: t.details.totals.subtotal, // string in minor units
source: t.custom_data?.utm_source ?? "missing",
});
return new Response("ok");
}
```
Verify the `Paddle-Signature` header first, as the [signature verification guide](https://developer.paddle.com/webhooks/about/signature-verification) lays out, then answer within 5 seconds. A handler that stores the sale but replies late gets the event again, and 3 deliveries would count a $49 payment 3 times and credit its channel with $147. Dedupe on `event_id`.
##### Why the subscription needs the value too
Paddle Billing copies a transaction's custom data to the subscription it creates, and a subscription's to every transaction created from it: renewals, upgrades, downgrades and one-time charges. Take a $49 monthly plan sold through one newsletter link. Over 12 payments that adds up to $588.
| Where the source is stored | Payments credited | Newsletter revenue | Share of the year |
| --- | --- | --- | --- |
| First transaction only | 1 | $49 | 8.3% |
| Subscription as well | 12 | $588 | 100% |
*One $49 monthly plan across 12 payments.*
That carry-forward is what makes [lifetime value by channel](https://www.trackrev.io/blog/subscription-ltv-attribution) possible. Credit the pre-tax amount, because the total includes tax. The transaction in the custom data guide has a 20% rate:
| Paddle Billing field | Minor units | Amount in GBP | Against the subtotal |
| --- | --- | --- | --- |
| details.totals.subtotal | 30000 | 300.00 | 100% |
| details.totals.tax | 6000 | 60.00 | 20% |
| details.totals.total | 36000 | 360.00 | 120% |
*The totals in the Paddle Billing custom data guide example.*
#### Step 5: Subtract refunds from the channel
A refund never edits the sale. The [adjustments guide](https://developer.paddle.com/build/transactions/create-transaction-adjustments) records it as an adjustment against the completed transaction, announced by `adjustment.created` and later by `adjustment.updated`. The payload carries `transaction_id` and `subscription_id` but no `custom_data`, so join on the transaction ID to the row you saved in step 4. Live refunds start as `pending_approval`, and Paddle Billing approves some itself, such as 400 USD or less on a verified account. Subtract a refund once it is `approved`.
| Sale | Payment | Source | Approved refund | Net for the channel |
| --- | --- | --- | --- | --- |
| Sale 1 | $49 | newsletter | none | $49 |
| Sale 2 | $49 | newsletter | $10 | $39 |
| Sale 3 | $99 | affiliate | none | $99 |
| Sale 4 | $29 | youtube | $29 | $0 |
*A worked example with 4 sales.*
| Channel | Sales | Gross | Refunds | Net | Share of net |
| --- | --- | --- | --- | --- | --- |
| newsletter | 2 | $98 | $10 | $88 | 47.1% |
| affiliate | 1 | $99 | $0 | $99 | 52.9% |
| youtube | 1 | $29 | $29 | $0 | 0% |
| Total | 4 | $226 | $39 | $187 | 100% |
*The same 4 sales grouped by the source saved at checkout.*
#### Step 6: Fix subscribers who already paid
A billed, canceled or completed transaction cannot be edited, but a subscription can. Send `PATCH /subscriptions/{subscription_id}` with a `custom_data` object and every later transaction created from it carries the value. Match existing subscribers to your own click records by email and write the source onto each one. Payments already taken stay blank. For 1,000 subscribers that is 5 list calls plus 1,000 updates, about 4.2 minutes at 240 requests a minute. If your handler was down, Paddle Billing can replay a failed notification through its API.
#### Step 7: Test in the sandbox
Buy once in the sandbox with `utm_source=newsletter` in the landing URL and look for it in 3 places: the `checkout.completed` callback, the `transaction.completed` body and the `subscription.created` body. Absent from all 3 means the call never sent it. Present in the webhook but absent from your database means the handler reads the wrong field.
### The Paddle Billing numbers that shape the setup
| What | Value | Why it matters |
| --- | --- | --- |
| Keys in a custom data object | At least 1 | An empty object is invalid, so send a marker |
| Published size cap on custom data | None | Store an ID and a few short keys |
| Kinds of entity that accept custom data | 8 | Only transactions and subscriptions are documented as copying to each other |
| Transaction statuses | 7 | Edits stop once a transaction is billed, canceled or completed |
| API rate limit | 240 requests a minute per IP address | After a 429, that address waits 60 seconds |
| Rows per page in list calls | Transactions 30, the default and the maximum; subscriptions 50 by default and 200 at most; adjustments 10 by default and 50 at most | 1,000 rows take 34, 5 and 20 pages |
| Chargeback adjustment actions | 3 | chargeback_warning, chargeback and chargeback_reverse |
| Webhook response deadline | 5 seconds | A 200 inside the window stops retries |
| Live webhook retries | Up to 60 over 3 days | 20 in the first hour and 47 in the first day |
| Sandbox webhook retries | 3 within 15 minutes | Same deadline, far fewer attempts |
| Active notification destinations | 10 | Deactivate one before you add an 11th |
| Paddle Classic passthrough cap | 1,000 characters | A string, so JSON you encode yourself |
| Accounts created before August 8, 2023 | Paddle Classic | Later accounts get Paddle Billing |
*From the [custom data](https://developer.paddle.com/api-reference/about/custom-data), [rate limiting](https://developer.paddle.com/api-reference/about/rate-limiting), [pagination](https://developer.paddle.com/api-reference/about/pagination), [webhook delivery](https://developer.paddle.com/webhooks/about/respond-to-webhooks) and [migration](https://developer.paddle.com/migrate/learn) docs for Paddle Billing and the [Paddle Classic checkout parameters](https://classic.paddle.com/reference/paddle-js/parameters), read in October 2026.*
### Paddle Classic and passthrough
On Paddle Classic the field is `passthrough`, a string sent with every webhook for the order, so the habit is JSON inside it, parsed on the way back. The [data mapping](https://developer.paddle.com/migrate/plan/data-mapping) turns it into both `transaction.custom_data` and `subscription.custom_data` on Paddle Billing, so keep your key names when you migrate.
### Keep the source alive until the buyer pays
Step 1 keeps the source in `localStorage`, and Safari Intelligent Tracking Prevention limits it.
| Storage | Safari rule |
| --- | --- |
| Cookies created in JavaScript, plus localStorage, IndexedDB and sessionStorage | Deleted after 7 days without user interaction |
| Script-written cookies on a landing page with link decoration | Capped at 24 hours |
*From [WebKit's tracking prevention policy](https://webkit.org/tracking-prevention/).*
Someone who clicks a newsletter link on Monday and returns directly 9 days later arrives with nothing saved and sends the marker. Set the visitor ID from your server's response header, since the 7-day rule is written about script-created storage, and pass the buyer's email into checkout as a second match key. [The Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) goes deeper, and Stripe users do the same job with [checkout metadata](https://www.trackrev.io/blog/stripe-metadata-attribution-setup).
### How TrackRev reads Paddle custom data
TrackRev's pixel keeps a visitor ID in a first-party cookie named `vid` and exposes it as `window.trk.vid`. Passing it to Paddle Billing is the whole page-side integration.
Browser, Paddle Billing with the TrackRev pixel
```
Paddle.Checkout.open({
items: [{ priceId: "pri_01gs59hve0hrz6nyybj56z04eq", quantity: 1 }],
customer: { email: user.email },
customData: { vid: window.trk.vid },
});
```
| Setting | What TrackRev does |
| --- | --- |
| Visitor ID | Cookie vid lasts 365 days and is written by JavaScript, so Safari's 7-day rule applies |
| Join key | custom_data.vid on each transaction, with the buyer's email as the fallback |
| API key | Read-only, with Customer, Product, Subscription, Transaction and Discount access |
| Sync | Every hour, or within seconds with a notification destination on transaction.completed and transaction.refunded |
| Partner codes | A Paddle discount code assigned to an affiliate credits that partner without a click |
| Paddle version | Paddle Billing only |
| Plans | Revenue attribution starts at $39 a month on Starter, with Growth at $99 and Scale at $199 |
*How TrackRev handles Paddle Billing sales.*
If all you need is the channel in your own database, the handler above does it with 1 webhook and 1 table. Sellers on Paddle Classic need another route. The [Paddle integration page](https://www.trackrev.io/integrations/paddle), [pricing](https://www.trackrev.io/pricing) and [Paddle revenue attribution by marketing channel](https://www.trackrev.io/blog/paddle-revenue-attribution-marketing-channels) have the setup screens, plans and reporting.
### Frequently asked questions
**What is the difference between passthrough and custom_data in Paddle?**
Passthrough is the Paddle Classic field, a string of up to 1,000 characters. Custom_data is the Paddle Billing JSON object, accepted by 8 kinds of entity, and the Paddle Billing migration mapping turns the first into the second.
**Is there a size limit on Paddle custom_data?**
Paddle Billing publishes none for keys or total size. It requires at least 1 key and rejects a number above an unstated maximum with a 400 error.
**Which Paddle event should I read the channel from?**
Use transaction.completed. The earlier transaction.paid event fires before Paddle Billing finishes processing the transaction.
**Does custom_data on a transaction copy to the customer in Paddle Billing?**
Paddle Billing documents copying only between transactions and subscriptions. Customers have a custom_data field of their own.
**Does TrackRev work with Paddle Classic?**
No. The connect screen asks for a Paddle Billing API key and warns against a Classic key.
**Can I use TrackRev's Paddle attribution on the free plan?**
No. The free plan has 50 links and 1,000 tracked events a month, covers link tracking only and hides revenue figures.
---
## How to attribute Paddle revenue to the marketing channel behind each sale
URL: https://www.trackrev.io/blog/paddle-revenue-attribution-marketing-channels
Published: 2026-06-04
Author: Muzahid Maruf
Paddle revenue attribution: carry UTMs in customData, book transaction.completed, credit total minus tax, and net out refunds and the 5% + 50¢ fee.
Paddle revenue attribution means putting the visitor's source into the custom data of the Paddle transaction when checkout opens, then reading it back from the transaction.completed webhook and grouping sales by that source. Paddle Billing records no campaign on its own: its [custom data guide](https://developer.paddle.com/build/transactions/custom-data/) names capturing UTM information as one use for fields you fill in yourself, and Paddle copies them from the transaction to the subscription and on to each renewal.
| Month on a $29 plan | Revenue so far | Share earned by the first payment |
| --- | --- | --- |
| 1 | $29 | 100% |
| 3 | $87 | 33.3% |
| 6 | $174 | 16.7% |
| 12 | $348 | 8.3% |
| 24 | $696 | 4.2% |
| 36 | $1,044 | 2.8% |
*The first checkout earns every later month's credit, so by month 24 the first payment is 4.2% of the revenue.*
> **Key takeaways:**
>
> - Paddle Billing keeps a campaign only if you send it: put 3 UTM values in customData when checkout opens, and Paddle copies them to the subscription and to every renewal.
> - Paddle Billing sends 10 transaction events. Book revenue on transaction.completed, because transaction.created fires when checkout opens and transaction.paid can arrive before the fee exists.
> - Credit a channel with the total minus tax. Paddle's 5% + 50¢ fee takes 10% of a $10 sale and 5.5% of a $99 sale, so keep earnings beside revenue.
> - Refunds and chargebacks arrive as adjustments with a transaction_id. Paddle approves many live refunds of 400 USD or less on creation, so subtract each approved one from the original channel.
### What Paddle records about each sale
As merchant of record, Paddle Billing creates a transaction for every sale, holding the customer, line items, tax, totals, any discount and the subscription it started. The [pay-as-you-go plan](https://www.paddle.com/pricing) costs 5% + 50¢ per checkout transaction. None of those fields holds a campaign. The [Checkouts report](https://developer.paddle.com/build/reports/checkouts/) adds source_domain and referrer columns for each session and has no UTM column, while the [Transactions report](https://developer.paddle.com/build/reports/transactions/) exports whatever you stored in custom_data.
### How Paddle revenue attribution works end to end
On Paddle Billing, checkout opens from a page on your own approved website. [Overlay checkout](https://developer.paddle.com/concepts/sell/overlay-checkout/) lets customers pay without leaving your site, and the [default payment link](https://developer.paddle.com/build/transactions/default-payment-link/) should be a page on an approved website that includes Paddle.js. A script on that page can read your first-party cookie when it calls Paddle.js and pass the values along.
| How the sale starts | Where the source goes | What Paddle does with it |
| --- | --- | --- |
| Overlay or inline checkout | customData in Paddle.Checkout.open() | Holds it on the transaction, copies it to the subscription |
| Transaction your server creates | custom_data in POST /transactions | Same as overlay checkout |
| Renewal or upgrade | Nothing to send | Copies the subscription's custom data to each new transaction |
*From Paddle's custom data, overlay checkout and default payment link guides, October 2026.*
Paddle's [migration guide](https://developer.paddle.com/migrate/learn/) says accounts opened before August 8, 2023 are on Paddle Classic and later ones are on Paddle Billing. Classic used a passthrough parameter for this job, which, per Paddle's [data mapping guide](https://developer.paddle.com/migrate/plan/data-mapping/), maps to custom_data. Every field name here is a Paddle Billing name.
#### Getting the source into custom_data
Save the UTM values in a first-party cookie on landing, lowercased: the [Analytics Help page](https://support.google.com/analytics/answer/10917952) on campaign URLs says values are case sensitive, so "Newsletter" and "newsletter" report as 2 sources. At checkout, read the cookie and pass it as `customData`, which the [Paddle.Checkout.open reference](https://developer.paddle.com/paddle-js/methods/paddle-checkout-open/) says must be valid JSON with at least 1 key, so send it only when a source exists. If your server creates the transaction, put `custom_data` in the `POST /transactions` body, because Paddle can't edit a transaction once it is billed, canceled or completed.
The [passthrough walkthrough](https://www.trackrev.io/blog/paddle-checkout-attribution-passthrough) has the code for both paths, and the [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming rules.
### Which events count as a sale
Paddle's webhook reference lists 10 transaction events. Of those, transaction.created, transaction.paid and transaction.completed decide when a sale counts, and the adjustment events cover money going back out.
| Event | When it fires | Book revenue here? |
| --- | --- | --- |
| transaction.created | A customer opens checkout, or a renewal is created before its charge | No, nothing is paid |
| transaction.paid | Payment is captured, before processing ends | No, fee and subscription_id may be missing |
| transaction.completed | Payment logged, fee and earnings added, subscription and invoice number created | Yes, once per payment |
| adjustment.created | A refund, credit or chargeback is recorded | Subtract it |
| adjustment.updated | A refund moves from pending_approval to approved or rejected | Apply it once approved |
*From Paddle's webhook reference, October 2026.*
Paddle Billing has no payment.created event. [transaction.created](https://developer.paddle.com/webhooks/transactions/transaction-created/) precedes any payment, so a writer subscribed to it credits channels for every abandoned checkout. subscription.created fires once per subscription, so a handler on it never sees renewal 2 or later. [transaction.completed](https://developer.paddle.com/webhooks/transactions/transaction-completed/) arrives last, with the fee and earnings filled in.
Paddle Billing signs each webhook, so verify `Paddle-Signature` before parsing. Per Paddle's [signature guide](https://developer.paddle.com/webhooks/about/signature-verification/), the header carries ts and h1, and h1 is an HMAC-SHA256 of the timestamp, a colon and the raw body, keyed with your notification destination's secret. Paddle's [delivery guide](https://developer.paddle.com/webhooks/about/respond-to-webhooks/) promises at-least-once delivery, so store event_id under a unique index, and says order isn't guaranteed, so compare occurred_at before overwriting a row.
| Rule | Live account | Sandbox account |
| --- | --- | --- |
| Reply deadline | 200 within 5 seconds | 200 within 5 seconds |
| Retries | 60 over 3 days: 20 in hour 1, 47 by day 1 | 3 within 15 minutes |
| Refund approval | Automatic at 400 USD or less, otherwise Paddle reviews it | Every 10 minutes |
| Signature timestamp tolerance | 5 seconds in the SDK helpers | 5 seconds in the SDK helpers |
| Source IPs to allowlist | 6 addresses | 6 addresses |
*From Paddle's delivery, signature and refund guides, October 2026.*
Webhook endpoint: verify, then store sales and adjustments
```
// app/api/paddle/route.ts (saveSale and saveAdjustment write to your own database)
import { createHmac, timingSafeEqual } from "node:crypto";
const TOLERANCE_SECONDS = 5; // the default in Paddle's SDK helpers
function isValid(header: string, rawBody: string): boolean {
const parts = Object.fromEntries(header.split(";").map((p) => p.split("=")));
const { ts, h1 } = parts as { ts?: string; h1?: string };
if (!ts || !h1) return false;
if (Math.abs(Date.now() / 1000 - Number(ts)) > TOLERANCE_SECONDS) return false;
const expected = createHmac("sha256", process.env.PADDLE_WEBHOOK_SECRET!)
.update(ts + ":" + rawBody)
.digest("hex");
return (
h1.length === expected.length &&
timingSafeEqual(Buffer.from(h1), Buffer.from(expected))
);
}
export async function POST(req: Request) {
const rawBody = await req.text(); // the unmodified bytes
if (!isValid(req.headers.get("paddle-signature") ?? "", rawBody)) {
return new Response("invalid signature", { status: 400 });
}
const event = JSON.parse(rawBody);
const data = event.data;
if (event.event_type === "transaction.completed") {
const totals = data.details.totals;
await saveSale({
event_id: event.event_id, // unique index: Paddle delivers at least once
transaction_id: data.id,
subscription_id: data.subscription_id,
origin: data.origin,
custom_data: data.custom_data,
currency: data.currency_code,
total_minor: Number(totals.total),
tax_minor: Number(totals.tax),
fee_minor: Number(totals.fee),
occurred_at: event.occurred_at,
});
}
if (
event.event_type === "adjustment.created" ||
event.event_type === "adjustment.updated"
) {
await saveAdjustment({
adjustment_id: data.id, // upsert, and skip rows with an older occurred_at
transaction_id: data.transaction_id,
action: data.action,
status: data.status,
subtotal_minor: Number(data.totals.subtotal),
occurred_at: event.occurred_at,
});
}
return new Response("ok");
}
```
### Which amount to credit to a channel
Paddle returns money as strings in the currency's lowest denomination, so 65215 in USD is $652.15, as in the example payload in the [transaction.completed reference](https://developer.paddle.com/webhooks/transactions/transaction-completed/).
| Field in details.totals | Payload value | In dollars | Meaning |
| --- | --- | --- | --- |
| subtotal | 59900 | $599.00 | Price before discount and tax |
| tax | 5315 | $53.15 | Tax charged on top |
| total | 65215 | $652.15 | What the buyer paid |
| fee | 3311 | $33.11 | Paddle's fee, null until completed |
| earnings | 56589 | $565.89 | Earnings after the fee, null until completed |
*From the example payload in Paddle's transaction.completed reference, October 2026.*
For a channel report I credit total minus tax, here $599.00. Tax isn't revenue and it varies by buyer location: with tax added on top, a $29 plan sold at 20% VAT arrives as a $34.80 total, so a UK newsletter list looks 20% richer in a totals report than an identical audience in a state with no sales tax.
In that example the fee equals 5% of the $652.15 total plus 50 cents, which points to a charge on the tax-inclusive figure, and the earnings equal the $599.00 subtotal minus the $33.11 fee. The fixed 50 cents weighs most on small plans.
| Price before tax | Fee at 5% + 50¢ | Fee as a share of price | Left after fee |
| --- | --- | --- | --- |
| $10 | $1.00 | 10.0% | $9.00 |
| $19 | $1.45 | 7.6% | $17.55 |
| $29 | $1.95 | 6.7% | $27.05 |
| $49 | $2.95 | 6.0% | $46.05 |
| $99 | $5.45 | 5.5% | $93.55 |
| $199 | $10.45 | 5.3% | $188.55 |
| $499 | $25.45 | 5.1% | $473.55 |
*Prices from Paddle's pricing page, October 2026. Fees are arithmetic on the 5% + 50¢ rate for a buyer who pays no tax.*
A channel that sends buyers of the $10 plan looks worse after fees than before them, so keep earnings in the report next to revenue. Totals arrive in the transaction's currency, and 29.00 USD plus 29.00 EUR is a meaningless number. `details.payout_totals` repeats the figures in your payout currency with the `exchange_rate` Paddle applied, which is 1.0 when the currencies match.
### Renewals carry the first source
Each transaction has 1 of 6 origins. `web` is a Paddle.js checkout and `api` is a transaction your server created, so both carry only what you sent. The other 4 come from a subscription and inherit its custom data, which means the original source: `subscription_recurring` for a renewal, `subscription_update` for a plan change, `subscription_charge` for a one-time charge, and `subscription_payment_method_change`, which can be a zero-value transaction. Store origin to split first purchases from renewals and expansion, as [LTV by channel](https://www.trackrev.io/blog/subscription-ltv-attribution) needs, and skip totals of 0 when you count sales.
### Refunds and chargebacks reduce a channel
Paddle never edits a completed transaction. A refund is an adjustment with `action: "refund"` and a `transaction_id` pointing at the sale. In Paddle's [refund guide](https://developer.paddle.com/build/transactions/create-transaction-adjustments/), most live refunds start as pending_approval and become approved or rejected. Paddle approves one on creation when the account is verified, the amount is 400 USD or less and below your balance, and the buyer didn't pay by bank transfer.
Listen for both adjustment events, because adjustment.updated fires only for refunds that needed approval. Once an adjustment is approved, subtract its `totals.subtotal` from the channel of its transaction. In the [adjustment.created example](https://developer.paddle.com/webhooks/adjustments/adjustment-created/), a partial refund of $1.00 has a $0.92 subtotal and $0.08 of tax, so the subtotal removes the same tax-free amount you credited. Key the row on the adjustment id so created followed by updated doesn't subtract twice. Chargebacks use the same record with action chargeback or chargeback_warning, and chargeback_reverse returns the money. Report them in their own column.
### A worked example: five sales grouped by channel
Take 5 completed transactions from one week. Two buyers paid 20% VAT, one sale arrived with no custom data, and Paddle later approved a $29.00 refund on sale 2.
| Sale | Origin | utm_source | Total | Tax | Revenue | Fee | Earnings |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1 | web | newsletter | $34.80 | $5.80 | $29.00 | $2.24 | $26.76 |
| 2 | web | youtube | $29.00 | $0.00 | $29.00 | $1.95 | $27.05 |
| 3 | subscription_recurring | newsletter | $34.80 | $5.80 | $29.00 | $2.24 | $26.76 |
| 4 | subscription_recurring | youtube | $29.00 | $0.00 | $29.00 | $1.95 | $27.05 |
| 5 | web | none | $99.00 | $0.00 | $99.00 | $5.45 | $93.55 |
*Made-up sales. Revenue is total minus tax, and fee is 5% of the total plus 50¢.*
| Channel | Sales | Sum of totals | Revenue | Approved refunds | Net revenue | Share of net |
| --- | --- | --- | --- | --- | --- | --- |
| newsletter | 2 | $69.60 | $58.00 | $0.00 | $58.00 | 31% |
| youtube | 2 | $58.00 | $58.00 | $29.00 | $29.00 | 16% |
| unattributed | 1 | $99.00 | $99.00 | $0.00 | $99.00 | 53% |
*The same 5 sales, grouped by utm_source, with the refund subtracted from its channel.*
By total, newsletter beats YouTube $69.60 to $58.00. By revenue they tie at $58.00 from 2 payments each, and after the refund YouTube nets $29.00, half of newsletter's $58.00. The unattributed sale is 53% of the $186.00 net, and shrinking that row is the first job, since a channel can only be judged on sales that carry a source. Once adjustments are stored, one query reports revenue and refunds per channel.
Postgres: revenue and approved refunds per channel
```
with refunds as (
select transaction_id, sum(subtotal_minor) as refunded_minor
from paddle_adjustments
where status = 'approved' and action = 'refund'
group by 1
)
select
coalesce(s.custom_data->>'utm_source', 'unattributed') as channel,
count(*) filter (where s.origin = 'web') as first_purchases,
count(*) filter (where s.origin = 'subscription_recurring') as renewals,
sum(s.total_minor - s.tax_minor) / 100.0 as revenue,
coalesce(sum(r.refunded_minor), 0) / 100.0 as refunded
from paddle_sales s
left join refunds r using (transaction_id)
where s.currency = 'USD' -- run once per currency
group by 1
order by revenue desc;
```
### When a sale arrives without a source
Declined cookies and transactions created without custom data, such as invoices, arrive with it empty. Fall back to email: the webhook carries `customer_id` and no address, so 1 extra call to `GET /customers/{id}` returns the email to match against signups. A second address slips through, so the visitor ID stays the primary key. Pass `customer.email` to `Paddle.Checkout.open()` when you know it.
For existing subscribers, send `PATCH /subscriptions/{id}` with a `custom_data` object, and Paddle copies it onto every transaction that subscription creates afterward. Completed transactions stay as they were, so payments already made remain unattributed.
### What TrackRev does with a Paddle connection
I run TrackRev, so weigh this section like any vendor's claims. You connect Paddle Billing with a read-only API key created under Developer tools, then Authentication, with Customer, Product, Subscription, Transaction and Discount read permissions. A key containing `_sdbx` points TrackRev at the sandbox, and Paddle Classic isn't supported.
Pass `window.trk.vid` as `vid` in `customData`. TrackRev joins completed transactions on that ID and falls back to the buyer's email. Renewals inherit the visitor from the first transaction, a discount code assigned to a partner credits the partner without a click, and the first sync reaches back 30 days. Sales arrive on a scheduled sync, or within seconds once a Paddle notification destination for transaction.completed is added and its secret saved.
Two gaps matter for a channel report today. TrackRev reads each transaction's grand total, which includes tax, so a $120.00 sale at 20% VAT counts as $144.00, and it doesn't read Paddle adjustments, so an approved refund stays in the channel. If you need tax-free, refund-adjusted figures now, the pipeline above does that and TrackRev doesn't. Choose TrackRev when the same sales also need splitting by link and partner next to your Stripe or Polar revenue, with [last-touch, first-touch and linear credit](https://www.trackrev.io/blog/attribution-models-saas-comparison) to compare.
Revenue figures need a paid plan from $39 a month. The free plan covers link tracking, 50 links and 1,000 tracked events a month, and hides revenue. The [Paddle integration page](https://www.trackrev.io/integrations/paddle) has the setup steps, [pricing](https://www.trackrev.io/pricing) lists the plans, and the [Stripe version of this guide](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels) uses Stripe's field names.
### Frequently asked questions
**Why don't my channel totals match the revenue in Paddle?**
Paddle's totals include tax, and in the five-sale example they add up to $226.60 against $215.00 of revenue, an $11.60 gap that is all VAT. Refunds sit in separate adjustments, so they reduce a channel only after you subtract them. Sales with no custom data land in the unattributed row, and mixed currencies need converting before any sum.
**Can I report Paddle revenue by channel without writing code?**
Partly. The Transactions report exports custom_data next to subtotal, discount, tax and total, so you can filter to completed transactions, pull utm_source out of custom_data and pivot on it. Export the Adjustments report too and subtract approved refunds by transaction ID. The pivot is a snapshot, so rerun it each month.
**Why does my Paddle webhook show custom_data as null?**
A null means the transaction was created without any, and Paddle's own transaction.completed example payload shows exactly that. Check that customData had at least 1 key when checkout opened, that the sale didn't start from a payment link for a transaction created without it, and that the account is on Paddle Billing. The Paddle dashboard also shows a transaction's custom data, so compare it with the webhook body.
**Can I use the Paddle.js checkout.completed event instead of the webhook?**
It runs in the visitor's browser, so a closed tab loses it, and for deferred capture payment methods Paddle says it only means payment was authorized. Use it for on-page messages and analytics tags, and let the webhook define revenue.
**Should a Paddle subscription carry first-touch or last-touch source?**
Whichever value you saved before checkout, because renewals copy it and nobody revisits it. Comparing models needs the visitor's whole click history stored separately and joined to the sale by an ID, which is how TrackRev's paid plans calculate all 3 models.
**What should I do about buyers who declined cookies?**
Leave those sales unattributed and report them as their own row, without fingerprinting. TrackRev's pixel supports data-requires-consent, which holds the cookie until window.trk.grantConsent() is called.
**Do I need a paid TrackRev plan to see Paddle revenue by channel?**
Yes. The free plan is link tracking only, with 50 links and 1,000 tracked events a month, and revenue figures stay hidden. Starter is $39 a month, and annual billing pays for 9 months and gives 12.
---
## Partner relationship management software: what a PRM does and which one to pick
URL: https://www.trackrev.io/blog/partner-relationship-management-software
Published: 2026-10-02
Author: Muzahid Maruf
Partner relationship management software explained: what a PRM does, how it differs from CRM and affiliate tools, and nine vendors with October 2026 prices.
Partner relationship management software, shortened to PRM, is the system a company uses to recruit, onboard, equip and pay the resellers, referral partners and alliances that sell for it. Partners get a portal to register deals and see earnings, and the vendor sees pipeline and payouts in one place. In October 2026 entry prices run from $0 to $25,000 a year, Channelscaler cites $50,000 per module, and PartnerStack's page shows no price.
I build TrackRev, which sits at the affiliate end of this category; the last section says where the line falls.
> **Key takeaways:**
>
> - PRM software manages partners who help close a sale, affiliate software tracks links and pays commission, and a CRM holds your own customers.
> - Entry prices across 9 vendors run from $0 to $25,000 a year, Channelscaler cites $50,000 per module, and PartnerStack's page shows no price.
> - TrackRev covers the affiliate and referral end from $39 a month, with no deal registration, co-sell, MDF or CRM sync.
### What partner relationship management software does
A PRM covers seven jobs between signing a partner and paying one.
| Job | What it does | Example from a vendor page |
| --- | --- | --- |
| Portal and onboarding | Partners apply, accept terms and check numbers | PartnerPortal.io launches a free portal in 60 seconds; Kiflo Core ($399 a month) adds lead registration |
| Deal registration | A partner claims a prospect so your reps skip it | Impartner ties registration to CPQ quotes and AWS and Microsoft marketplace transactions |
| Co-sell and account mapping | Finds accounts you share with a partner | Crossbeam's Account Mapping and Deal Navigator |
| Enablement | Courses, certifications and co-branded content | Introw Scale has unlimited certificates; Channelscaler lists Training and Enablement |
| Incentives | Commissions, rebates, SPIFFs and market development funds (MDF) | Channelscaler lists SPIFFs, rebates, commissions and MDF under Incentives and Rewards |
| Tiers and business plans | Moves a partner up a level and sets a yearly plan | Kiflo Plus adds tier qualification and business plans |
| Reporting and CRM sync | Partner-sourced pipeline, pushed into your CRM | Salesforce's $25 PRM edition includes Channel Analytics; Kiflo Core syncs HubSpot and Salesforce |
The label covers two products. [Salesforce](https://www.salesforce.com/sales/partner-relationship-management/) defines PRM around resellers, distributors and agents. [PartnerStack's glossary](https://partnerstack.com/glossary/prm-partner-relationship-management) calls that view outdated and adds affiliate, referral, technology, alliance and influencer partners. A distributor needs deal registration and rebates, while a newsletter author with a tracking link needs a commission ledger.
### PRM compared with CRM and affiliate software
The three differ in who deals with the buyer.
| Question | CRM | Affiliate software | PRM |
| --- | --- | --- | --- |
| What it manages | Your customers and pipeline | Links, attributed sales, commissions | Partners, their deals, training, incentives |
| Partner's role in the sale | None | Sends traffic; the buyer checks out alone | Sells or co-sells and registers the deal |
| Typical partner | Not applicable | Creator, newsletter, customer, consultant | Reseller, distributor, integrator, alliance |
| Price basis | Per seat | Tracked commission; $39 a month at TrackRev | Active partners or modules; $0 to $25,000 a year here |
A PRM works alongside the CRM. Magentrix's [PRM versus CRM explainer](https://www.magentrix.com/blog/prm-vs-crm-whats-the-difference) says partners see only their slice of CRM data through the portal, so test the HubSpot and Salesforce sync first. Affiliate software matches a click to a Stripe sale and calculates the commission; [how affiliate tracking works](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) covers the mechanics.
### Who needs a PRM and who can skip one
| What your partners do | What fits |
| --- | --- |
| Quote, bundle or negotiate with the buyer | A PRM such as Impartner Emerge ($25,000 a year) |
| Could chase a prospect your own sales reps already work | A PRM with deal registration, such as Kiflo Core at $399 a month |
| Claim rebates, SPIFFs or MDF beyond a flat percentage | A PRM with incentive modules, such as Magentrix Advanced |
| Share a link while the buyer checks out alone | Affiliate software, from $39 a month at TrackRev |
| Mix agency resellers with creators | PartnerStack or Introw, which both include affiliate links, or a PRM beside an affiliate tool |
A link-sharing program needs attribution, a ledger and payouts, and [affiliate commission benchmarks 2026](https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026) shows what such programs pay. For long sales cycles, see [B2B affiliate marketing for high-ACV SaaS](https://www.trackrev.io/blog/b2b-affiliate-marketing-high-acv).
### Nine vendors and the prices they publish
| Vendor | Entry price | Limits | Best for |
| --- | --- | --- | --- |
| Salesforce PRM | $25 per member a month, billed annually; $50 for Partner Ecosystem Management | Per member | Teams on Sales Cloud |
| Impartner | Emerge $25,000 a year; 3 other plans unpriced | Not stated | Large channel programs |
| Channelscaler, formerly Allbound | Quoted per program; page cites $50,000 per module a year | No user or usage limits | Enterprise channels |
| Magentrix | Essentials from $1,500 a month; Advanced from $3,000 a month | 100 partner users or 10 partner accounts | Portal-first mid-market |
| PartnerStack | None shown; page metadata lists Launch at $1,000 a month | No partner or user limit | B2B SaaS with mixed partners |
| Kiflo | Core $399 a month; Plus and Premier quoted | 25 partners, capped at 50 | SaaS partner teams |
| Introw | Starter free; 3 plans by demo | Starter covers 1 partner | HubSpot and Salesforce teams |
| PartnerPortal.io | Free, $249 or $399 a month | 5, 100 or unlimited partners | Small programs |
| Crossbeam | Free; Connector $4,800 a year; 2 plans quoted | 3 free seats; 1 on Connector | Account overlap |
*Prices from each vendor's pricing page, October 2026, except Impartner's, which comes from its HubSpot Marketplace listing updated September 25, 2026.*
#### Salesforce PRM, for teams on Sales Cloud
[Salesforce](https://www.salesforce.com/sales/partner-relationship-management/) sells PRM as an edition chosen after a Sales Cloud edition. The $25 edition includes Experience Cloud, Deal Management and Channel Analytics. The $50 edition adds partner enablement, loyalty management, account plans and extra custom objects. A 30-day Sales Cloud trial is offered, and Salesforce calls the page informational, so confirm what counts as a member before multiplying.
#### Impartner, for large channel programs
Impartner's [HubSpot Marketplace listing](https://ecosystem.hubspot.com/marketplace/listing/impartner-prm) shows 4 plans, Emerge, Ignite, Pro and Enterprise, each with a 30-day trial. Emerge covers Pipeline Management, an Asset Library, Training and Certification and Partner Analytics. The listing also describes partner self-quoting, automated MDF and co-branded content, and syncs partners, contacts, deals and leads with HubSpot.
#### Channelscaler (formerly Allbound), for per-program pricing
Allbound now trades as [Channelscaler](https://channelscaler.com/pricing/), which describes itself as formerly Allbound and Channel Mechanics. It fixes the price per program for the whole contract, with implementation, a customer success manager and unlimited users included. One line says pricing starts at $50,000 per module a year, but it sits under a Typical Partner Program Pricing heading, so ask whether that is Channelscaler's own figure. It runs on Microsoft Azure and integrates with Dynamics 365.
#### Magentrix, for portal-first mid-market programs
[Magentrix](https://www.magentrix.com/pricing/partner-portal) bills on an annual contract by partner organization or partner user: Essentials starts at 100 users or 10 accounts, Advanced at 150 users or 20 accounts. Month-to-month adds a 10% surcharge. Essentials has self-registration, an LMS and partner attribution, while Advanced adds MDF, payouts, business planning and a REST API.
#### PartnerStack, for B2B SaaS with mixed partner types
[PartnerStack](https://partnerstack.com/pricing) names Launch, Growth and Enterprise plans and shows no price and sends you to a demo; its page metadata lists Launch at $1,000 a month and Growth at $1,520, which I could not confirm on the visible page. Launch lets you pick affiliate link tracking or lead and deal registration, and Enterprise includes both. Growth adds a learning management system and MDF payments. See [PartnerStack vs TrackRev](https://www.trackrev.io/blog/partnerstack-vs-trackrev) for the affiliate-side comparison.
#### Kiflo, for a first partner team at a SaaS company
[Kiflo](https://www.kiflo.com/pricing) Core allows 3 partner managers and 1,000 GB of asset storage, and counts a partner as active once one of its users has portal access. It includes Account Mapping, co-sell collaborations and automatic commission calculation, with payouts triggered manually. Plus triggers them automatically, and Premier adds SSO. Annual billing takes 10% off.
#### Introw, for teams that live in HubSpot
[Introw](https://www.introw.io/pricing) Starter has 1 seat and deal and lead registration. Pro adds multi-partner portals, unlimited commission plans, 20 custom reports and 3 seats, and Scale adds Salesforce, 50 custom reports, 5 seats and a Crossbeam integration. The feature list includes affiliate campaigns with trackable links.
#### PartnerPortal.io, for small programs priced by usage
[PartnerPortal.io](https://www.partnerportal.io/pricing) gives every plan its 100+ features and meters partners and leads. Free allows 5 partners, 10 leads and 1 team member, Professional 100 partners and 1,000 leads, and Enterprise is unlimited. It integrates with HubSpot, Salesforce, Pipedrive, Stripe and PayPal.
#### Crossbeam, for account overlap with partners
[Crossbeam](https://www.crossbeam.com/pricing) Connector includes 500 AI credits a year and 5,000 record exports, and extra seats cost $1,800 each a year. Supernode and Enterprise buyers can add credit packs from $1,000 for 10,000 credits. Its pricing page lists account mapping, co-sell workflows and shared lists, and shows no partner portal, commission or payout feature. Introw and PartnerPortal.io both list a Crossbeam integration.
### What the entry plans cost over a year
| Entry plan | Arithmetic | First-year cost |
| --- | --- | --- |
| Salesforce PRM, 1 member | $25 x 12 | $300 |
| PartnerPortal.io Professional | $249 x 12 | $2,988 |
| Salesforce PRM, 10 members | $25 x 10 x 12 | $3,000 |
| Kiflo Core, annual billing | $4,788 less 10% | About $4,309 |
| Kiflo Core, monthly billing | $399 x 12 | $4,788 |
| Crossbeam Connector, 1 seat | Listed per year | $4,800 |
| Salesforce Partner Ecosystem Management, 10 members | $50 x 10 x 12 | $6,000 |
| Crossbeam Connector, 3 seats | $4,800 + 2 x $1,800 | $8,400 |
| Magentrix Essentials, annual contract | $1,500 x 12 | $18,000 |
| Magentrix Essentials, month-to-month | $1,500 + 10%, x 12 | $19,800 |
| Impartner Emerge | Listed per year | $25,000 |
*Entry plans only, before add-ons, taxes and implementation. Prices from each vendor's pricing page, October 2026.*
Of the non-Salesforce plans in that table, the dearest costs more than 8 times the cheapest. A program with 100 partners fits PartnerPortal.io Professional at $2,988, while Kiflo Core would pass its 50-partner cap and move you to the quoted Plus plan. Salesforce prices per member, and its page starts from a Sales Cloud edition.
### Where TrackRev fits
TrackRev is an affiliate and referral platform. A partner shares a link, a customer pays through Stripe, Paddle, Polar or Lemon Squeezy, and the commission is calculated and paid. Partners are invited by email or approved from applications, then get a portal on your domain with links and earnings and upload a W-9 or W-8 at onboarding. Commissions can be recurring, one-time or tiered, a refund or dispute reverses them, and [Partner Accelerator](https://www.trackrev.io/products/partner-accelerator) pays a recruiter from one capped pool.
Each program sets a commission hold of 0 to 180 days, defaulting to 0. Payout periods close weekly, every 2 weeks, monthly or quarterly. You pay from one PayPal or Wise CSV export and mark each payout paid, because TrackRev does not send money itself.
It has no deal or lead registration, co-sell, account mapping, MDF, courses or CRM sync, and it has webhooks and no Zapier app.
The program needs a paid plan: [Starter is $39 a month](https://www.trackrev.io/pricing) for up to $10K of partner commission tracked a month, Growth is $99 and Scale is $199, and annual billing pays for 9 months and gives 12. The free plan is link tracking only, with 50 links and 1,000 tracked events a month.
Pick a PRM when partners register deals, claim rebates or co-sell into your accounts. Pick TrackRev when they are creators, customers or consultants paid a share of billing revenue. The [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) and the [PartnerStack comparison](https://www.trackrev.io/compare/partnerstack) show the feature set.
### Frequently asked questions
**What does PRM stand for?**
Partner relationship management: the software and process for handling resellers, distributors, referral partners and others who sell on your behalf.
**What is the difference between PRM and CRM?**
A CRM tracks your own customers and pipeline. A PRM tracks partners and gives them a portal, and most vendors here sync deals with HubSpot or Salesforce.
**Is there a free PRM?**
Partly. Introw Starter and PartnerPortal.io Free include a portal for 1 and 5 partners, and Crossbeam Free maps shared accounts. TrackRev's free plan runs no partner programs.
**Do I need a PRM to run an affiliate program?**
No. Link tracking, billing-based attribution, a commission ledger and a payout method are enough until partners quote or claim marketing funds.
**Which PRM suits an early-stage SaaS company?**
PartnerPortal.io at $249 a month, Kiflo Core at $399 and Introw Starter at $0 all publish prices and suit a small team.
**Can TrackRev replace a PRM?**
Only for affiliate and referral programs, from $39 a month. It lacks deal registration, co-sell, MDF, certifications and CRM sync.
---
## PartnerStack vs TrackRev: a demo-sold PRM against a self-serve affiliate platform
URL: https://www.trackrev.io/blog/partnerstack-vs-trackrev
Published: 2026-05-04
Author: Muzahid Maruf
PartnerStack sells by demo with no price shown. TrackRev's affiliate program starts at $39 a month. Compare cost, setup, payouts and who each one fits.
PartnerStack vs TrackRev comes down to who runs the program. PartnerStack is a partner relationship platform for B2B companies: a marketplace of 118,000+ partners, deal registration, co-selling and managed payouts, sold through a demo with no price on the page. TrackRev is a self-serve affiliate and referral platform that also credits revenue from every other channel, from $39 a month on Starter.
Full disclosure: I run TrackRev, so check my read against the sources linked here. PartnerStack's details come from its own [pricing page](https://partnerstack.com/pricing), documentation and help center in October 2026, and its cost from the plan prices in that page's structured data and from Vendr's contract data, because the visible page shows no figure.
> **Key takeaways:**
>
> - PartnerStack's pricing page shows no figures. Its structured data lists Launch at $1,000 a month, and Vendr puts the median buyer at $19,616 a year, against $468 for TrackRev Starter paid monthly.
> - PartnerStack's marketplace of 118,000+ partners, deal registration and CRM sync for 3 systems have no TrackRev equivalent.
> - PartnerStack's docs capture only partner-referred customers, while TrackRev credits every channel under 3 credit rules.
> - The affiliate and referral program needs a paid TrackRev plan from $39 a month. The free plan has 50 links and 1,000 events for link tracking.
### PartnerStack vs TrackRev at a glance
| Feature | PartnerStack | TrackRev |
| --- | --- | --- |
| Published price | None on the page; structured data lists Launch $1,000 and Growth $1,520 a month; Enterprise custom | $0, $39, $99 or $199 a month |
| Annual cost | $12,000 (Launch) and $18,240 (Growth) from structured data; Vendr median $19,616, range $9,186 to $37,770 (62 purchases) | $351 (Starter, yearly billing) to $2,388 (Scale, monthly billing) |
| Free plan | None listed | Link tracking only: 50 links, 1,000 events a month |
| Partner marketplace | 118,000+ partners | None |
| Time to start | Guided onboarding, weeks for most teams | Self-serve: 1 pixel, 1 read-only key |
| Billing systems | 5: Stripe, Chargebee, Recurly, Maxio, Paddle Classic | 4: Stripe, Paddle, Polar, Lemon Squeezy |
| CRM sync for deals and leads | 3: Salesforce, HubSpot, Pipedrive | None |
| Commission models | 5: flat, percentage, milestone, DRIP, multi-step revenue share | Percentage or flat, recurring for N months, plus a multi-tier pool in Partner Accelerator (30% cap, 10% to the seller by default) |
| Revenue credited to | Partner-referred customers only | Every channel, with 3 credit rules |
| Partner payout methods | 3: direct deposit, PayPal, Stripe | 6: PayPal, Payoneer, Wise, wire, ACH, WebMoney |
| Paying partners | 1 invoice a month in USD or EUR; PartnerStack pays partners | PayPal or Wise CSV; you pay and mark it paid |
| Review and hold | 7 days to review each monthly invoice | Hold of 0 to 180 days per program, default 0 |
| Tax forms | W-8 and W-9 for direct deposit, 1099-K when applicable | W-9 and W-8 upload at onboarding, no 1099 filing described |
*Prices from each vendor's pricing page, October 2026. PartnerStack's visible page shows none, so its cost comes from the page's structured data and Vendr's median.*
### What PartnerStack is built for
PartnerStack sells 3 plans, and none caps partners or internal users. Launch covers link tracking or deal registration (you choose one), the marketplace, partner payments, training and CRM integrations. Growth adds a learning management system and marketing development funds. Enterprise adds full link tracking with deal registration, custom workflows and a designated customer success manager.
The marketplace is the piece TrackRev cannot match. PartnerStack's [recruitment page](https://partnerstack.com/platform/partner-recruitment) counts 118,000+ active partners, filters them by industry, audience and channel, and bulk-invites up to 200 at a time. TrackRev has no marketplace, so partners arrive by invite, application form or your own outreach. Sift scores partner signups and transactions on every program, per its [fraud documentation](https://docs.partnerstack.com/docs/fraud-monitoring).
### PartnerStack pricing without a price list
The pricing page names 3 plans and shows no figures. Its FAQ says cost follows program size, feature needs and support level, confirmed on the demo call. The page's structured data does carry numbers: Launch at $1,000 a month, Growth at $1,520 a month and Enterprise as custom pricing, on 1-year terms. That is $12,000 and $18,240 a year, a starting point for the demo. [Vendr's PartnerStack page](https://www.vendr.com/marketplace/partnerstack), last updated February 2026, reports a median buyer paying $19,616 a year across 62 purchases, and says those buyers saved 21% on average. Vendr only sees contracts it handled, so read the range as a guide to scale and expect your own quote to differ.
| PartnerStack contract (Vendr) | Per year | Per month |
| --- | --- | --- |
| Low | $9,186 | $766 |
| Median | $19,616 | $1,635 |
| High | $37,770 | $3,148 |
*Vendr's PartnerStack figures, February 2026.*
| TrackRev plan | Per month | Per month, yearly billing | Per year, monthly billing | Workspaces | Commission tracked a month |
| --- | --- | --- | --- | --- | --- |
| Free | $0 | $0 | $0 | 1 | No program |
| Starter | $39 | $29.25 | $468 | 1 | $10,000 |
| Growth | $99 | $74.25 | $1,188 | Unlimited | $100,000 |
| Scale | $199 | $149.25 | $2,388 | Unlimited | Unlimited |
*TrackRev's published plans, October 2026. Yearly billing pays for 9 months and gives 12.*
The platform fee matters most when commissions are small. A program paying $2,000 in commission a month moves $24,000 a year, and PartnerStack's median contract equals 81.7% of that. At $9,000 a month the median is 18.2% of $108,000, and at $60,000 a month it falls to 2.7% of $720,000. TrackRev's share stays under 2% in all 3 cases.
| Commission paid a month | Per year | PartnerStack median as a share | TrackRev plan, cost per year | TrackRev share |
| --- | --- | --- | --- | --- |
| $2,000 | $24,000 | 81.7% | Starter, $468 | 1.95% |
| $9,000 | $108,000 | 18.2% | Starter, $468 | 0.43% |
| $60,000 | $720,000 | 2.7% | Growth, $1,188 | 0.17% |
*List prices and Vendr's median, monthly billing.*
PartnerStack adds a second cost: its invoice export has a "Fee % applied" column, and total owed is commission plus fee. The [help center](https://support.partnerstack.com/hc/en-us/articles/360022372354-Partner-commission-invoices) publishes no rate, so ask for it on the demo call. TrackRev's catch is a meter on commission: past $10,000 in a month, new commissions stop accruing until you upgrade or the month rolls over. Sale revenue is never capped.
### Setup: a signup call and a Stripe app, or a pixel and a key
PartnerStack's JavaScript route has 3 parts. You paste a snippet into the site header, which the [install guide](https://docs.partnerstack.com/docs/step-1-install-partnerstackjs) sizes at 15 to 30 minutes. Partner links append up to 4 query parameters, and the snippet stores the partner's key in 2 first-party cookies. Your developers then call createSignup() from the signup flow with the customer's name, email and a customer key.
PartnerStack signup call (JavaScript)
```
growsumo.data.name = "Ada Lovelace";
growsumo.data.email = "ada@example.com";
growsumo.data.customer_key = "user_4821";
growsumo.createSignup();
```
Payments come in through a Stripe app. The [Stripe tracking guide](https://docs.partnerstack.com/docs/stripe-payment-tracking) says it reads charge events by default and invoice.payment_succeeded events on request. A full refund deletes the original transaction, and a partial refund replaces it with the reduced amount. Paddle takes more work: the [Paddle guide](https://docs.partnerstack.com/docs/paddle-checkout) covers Paddle Classic, routes you through an integration specialist, and warns that Paddle Billing uses different webhooks.
TrackRev needs 1 pixel and 1 restricted Stripe key with read access to charges, customers, subscriptions and payment intents, and the key also works with Stripe Connect accounts. Paddle, Polar and Lemon Squeezy connect from their own integration pages. Revenue syncs hourly, or sooner with the optional webhook for 4 Stripe events, and each program sets its own cookie window from 1 to 3,650 days. Both tools match a Stripe charge to a customer by email, PartnerStack's app by default and TrackRev's sync always, so a buyer who pays with a different address than the one they gave your site can slip through either.
PartnerStack's docs say only customers referred through a partner link are captured, so a signup from your newsletter or Google Ads never reaches it. TrackRev records those channels from the same click data and [ranks them by revenue](https://www.trackrev.io/solutions/revenue-attribution). Take a customer who clicks a partner link, returns through a newsletter link and pays $99. Last-touch credits the newsletter $99, first-touch credits the partner $99, and linear gives each $49.50. A partner-only view cannot show that split, and [last-touch vs first-touch vs linear](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers how to choose.
### How each one pays partners
PartnerStack runs payouts on a fixed monthly cycle, and its invoice article gives a dated example.
| Date | What happens at PartnerStack |
| --- | --- |
| May 1 to 31 | Partner activity generates commissions |
| June 1 | Invoice for May commissions is generated |
| June 1 to 7 | 7 days to review and adjust the invoice |
| June 7 | Invoice is charged to your card or ACH account |
| June 7 evening | Card payers: commissions become withdrawable |
| June 13 | ACH payers: commissions become withdrawable, after about 5 days |
*Timeline from PartnerStack's commission invoice article.*
You fund the invoice in USD or EUR, and partners withdraw in their own currency by direct deposit, PayPal or Stripe, per PartnerStack's [commissions page](https://partnerstack.com/platform/partner-commissions). Partners who take direct deposit submit a W-8 or W-9, and PartnerStack issues 1099-K forms when applicable, as its [tax article](https://support.partnerstack.com/hc/en-us/articles/360048158113-Managing-tax-information) explains.
TrackRev closes a payout period weekly, every 2 weeks, monthly, quarterly or when you say so. Each program sets a refund-buffer hold of 0 to 180 days and a minimum balance below which payouts roll over. When a batch is ready you export a CSV, pay from PayPal or Wise, and mark each payout paid. All 6 partner payout methods are manual today, and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) walks through that route.
### What TrackRev leaves out
TrackRev has no marketplace, deal registration, lead routing, CRM sync, learning management or co-sell tooling, and it does not send partner money. The code is closed and Stripe attribution rests on an email match. A program that relies on any of those pieces belongs on PartnerStack or a similar PRM.
### Is TrackRev a PartnerStack alternative?
For a creator, customer or consultant program, yes. A program paying a few hundred dollars in commission a month cannot justify a contract that starts near $9,186 a year at Vendr's low and $12,000 on the Launch list price, and it will not use reseller tiers, co-selling or deal registration. TrackRev Starter runs the same affiliate loop of links, recurring commission, refund reversal and a white-label partner portal for $39 a month, with partner links on your own tracking domain after 1 CNAME record.
Speed is a second reason to look elsewhere. PartnerStack means a quote, a demo and weeks of onboarding, and TrackRev means a signup page and a Stripe key. [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev) and [best affiliate software for Stripe](https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026) cover the lighter tools in between, and the [PartnerStack comparison page](https://www.trackrev.io/compare/partnerstack) has the row-by-row version.
### Which one fits your program
#### When PartnerStack is the better pick
A full-time partnerships manager with agencies, resellers and affiliates on the roster needs the tooling PartnerStack sells. Choose it when partners register deals that your sales team works in Salesforce, HubSpot or Pipedrive, when you want inbound recruiting from a 118,000-partner marketplace, or when 1 vendor should invoice you monthly and pay partners locally.
#### When TrackRev is the better pick
A founder or growth lead running the program beside everything else needs something to configure in an afternoon. Choose TrackRev when the program is affiliates and referrals on Stripe, Paddle, Polar or Lemon Squeezy, partners earn under $100,000 in commission a month, and you want to know which channel pays your MRR. The [pricing page](https://www.trackrev.io/pricing) lists the free plan, and the [affiliate program](https://www.trackrev.io/solutions/affiliate-program) begins on Starter at $39 a month.
### Frequently asked questions
**How much does PartnerStack cost?**
PartnerStack's page shows no price list, though its structured data lists Launch at $1,000 a month and Growth at $1,520 a month. Vendr's data shows buyers paying between $9,186 and $37,770 a year, with a median of $19,616. Your quote moves with program size, features and support level.
**Does PartnerStack have a free plan?**
No. The pricing page lists 3 plans, Launch, Growth and Enterprise, each booked through 1 demo call.
**Can I run an affiliate program on TrackRev's free plan?**
No. The free plan has 50 links and 1,000 tracked events a month for link tracking. Affiliate and referral programs and revenue figures start on Starter at $39 a month.
**Does PartnerStack work with Stripe?**
Yes, through a Stripe app that reads charge or invoice events. Its payment guides also cover Chargebee, Recurly, Maxio and Paddle Classic. Anything else goes through the API or a CSV import.
**Which TrackRev plan does a growing program need?**
Starter at $39 a month tracks up to $10,000 of commission for 1 workspace. Growth at $99 raises that to $100,000 with unlimited workspaces, and Scale at $199 has no commission cap.
**How long does PartnerStack take to set up?**
Its pricing FAQ says most teams are running within weeks. The tracking snippet alone is a 15 to 30 minute job, but the signup call, billing connection and CRM sync add developer time.
---
## How to track Polar.sh revenue by marketing channel
URL: https://www.trackrev.io/blog/polar-sh-revenue-tracking-setup
Published: 2026-07-11
Author: Muzahid Maruf
Set up Polar.sh revenue tracking: tag checkout links, write metadata from your server, book revenue on order.paid, and credit renewals to the first channel.
Polar.sh revenue tracking works by writing the visitor's source into the checkout's metadata before they leave your site, then reading it back from the order once it is paid. Polar copies up to 50 pairs of that metadata onto the order and the subscription, so the source rides along on every webhook and API response.
Subscriptions make the loss bigger: a $29 plan kept for 22 months pays $638, so a channel credited only for the first order gets 4.5% of what it earned.
> **Key takeaways:**
>
> - Polar's checkout runs on its own origin, so the source must travel in checkout metadata of up to 50 pairs.
> - Checkout Links have saved 5 UTM parameters plus reference_id as metadata since May 19, 2025.
> - Count order.paid for revenue: a renewal sends 5 events, and its order is still pending at the third.
> - Store the source against subscription_id at the first paid order, because renewals are not documented to repeat the metadata.
### Where Polar.sh sales lose their source
Polar is the Merchant of Record and hosts the checkout: the buyer pays on a Polar page, reached by redirect or inside an iframe from Polar's origin when you use [Embedded Checkout](https://polar.sh/docs/features/checkout/embed). Your first-party cookie cannot follow, and a Google Analytics 4 tag on your pages sees the click but not what happens inside Polar's checkout.
| Signal | Reaches the order? | Detail |
| --- | --- | --- |
| Visitor cookie on your domain | No | Polar's origin cannot read it |
| UTMs on your landing page | No | They stay on your URL unless your code forwards them |
| UTMs on a Polar checkout link | Yes | 5 parameters, saved since May 19, 2025 |
| reference_id on a checkout link | Yes | Saved with the UTMs |
| metadata on a created checkout | Yes | Up to 50 pairs, copied to the order and subscription |
| customer_metadata | On the customer | Read it from customer.metadata |
*From Polar's Checkout Links documentation and Create Checkout Session reference, October 2026.*
### Step 1: Tag your Polar checkout links
A Polar Checkout Link accepts 5 UTM parameters and reference_id as query parameters, and Polar saves them in the metadata of each session the link creates. Polar's [changelog](https://polar.sh/docs/changelog/recent) dates the feature to May 19, 2025, and the [Checkout Links documentation](https://polar.sh/docs/features/checkout/links) says link and session metadata propagate to the order and subscription. Keep 1 link per product and vary the query string by placement, and use the free [UTM builder](https://www.trackrev.io/tools/utm-builder) so "newsletter" and "Newsletter" never become 2 sources. If a tagged ad lands on a page whose Buy button uses the plain link, the tags are lost, so append saved UTMs to each checkout link, or use step 2.
A tagged checkout link
```
CHECKOUT_LINK_URL?utm_source=newsletter&utm_medium=email&utm_campaign=oct-launch&reference_id=issue-42
```
### Step 2: Create the checkout on your server
When your own code starts the purchase, call `POST /v1/checkouts/` with a checkouts:write token and put the source in metadata.
Server: create a Polar checkout with attribution metadata
```
// app/api/checkout/route.ts (Next.js route handler)
import { cookies } from "next/headers";
const KEYS = ["vid", "utm_source", "utm_medium", "utm_campaign", "landing_path"];
export async function POST(req: Request) {
const { productId } = await req.json();
const jar = await cookies();
// Polar rejects empty strings, so leave missing keys out
const metadata: Record = {};
for (const key of KEYS) {
const value = jar.get(key)?.value;
if (value) metadata[key] = value.slice(0, 500);
}
const res = await fetch("https://api.polar.sh/v1/checkouts/", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.POLAR_ACCESS_TOKEN,
"Content-Type": "application/json",
},
body: JSON.stringify({
products: [productId],
success_url: "https://example.com/welcome?checkout_id={CHECKOUT_ID}",
metadata,
}),
});
const checkout = await res.json();
return Response.json({ url: checkout.url });
}
```
The [Create Checkout Session reference](https://polar.sh/docs/api-reference/checkouts/create-checkout-session) sets these limits, so store a visitor ID and a few parsed UTM values, since a long landing URL can overrun 500 characters.
| Rule | Limit | What it means |
| --- | --- | --- |
| Pairs per object | 50 | A visitor ID, 3 UTM fields and a landing path use 5 |
| Key length | 40 characters | utm_campaign takes 12 |
| String value | 1 to 500 characters | An empty string gets the whole request rejected |
| Nested objects | None | Values are strings, integers, numbers or booleans |
| Field name | metadata or customer_metadata | The first lands on the order and subscription, the second on the customer |
*Limits from Polar's API reference, October 2026.*
### Step 3: Subscribe to the events that carry money
Add an endpoint under Webhooks in your organization's settings, with the Raw format and a secret. Of the 30-plus events in Polar's [webhook events documentation](https://polar.sh/docs/integrate/webhooks/events), attribution needs order.paid and order.refunded, plus subscription.created and subscription.canceled if you report churn by channel. Skip order.created and subscription.cycled: a renewal sends 5 events in the order below, its order is still pending at event 3, and event 5 is the one to book. A failed charge moves the subscription to past_due instead.
| # | Event | Order status | Book revenue? |
| --- | --- | --- | --- |
| 1 | subscription.cycled | n/a | No |
| 2 | subscription.updated | n/a | No |
| 3 | order.created | pending | No |
| 4 | order.updated | paid | No, order.paid follows |
| 5 | order.paid | paid | Yes |
*A renewal, as sequenced in Polar's webhook events documentation. Counting order.paid alone books each payment once.*
The handler below uses API version 2026-10 and version 1.0.2 of the @polar-sh/sdk package.
Webhook handler: verify, then record paid and refunded orders
```
// app/api/webhooks/polar/route.ts
import { webhooks } from "@polar-sh/sdk/2026-10";
export async function POST(req: Request) {
const body = await req.text();
let event: Awaited>;
try {
event = await webhooks.validateEvent(
body,
{
"webhook-id": req.headers.get("webhook-id") ?? "",
"webhook-timestamp": req.headers.get("webhook-timestamp") ?? "",
"webhook-signature": req.headers.get("webhook-signature") ?? "",
},
process.env.POLAR_WEBHOOK_SECRET!,
);
} catch (error) {
// An event type this SDK version does not know is not a bad signature
if (error instanceof webhooks.PolarWebhookUnknownTypeError) {
return new Response(null, { status: 202 });
}
return new Response(null, { status: 403 });
}
if (event.type === "order.paid") {
const o = event.data;
await upsertRevenue({
orderId: o.id, // unique key, so redeliveries do not duplicate
subscriptionId: o.subscription_id,
billingReason: o.billing_reason,
netCents: o.net_amount,
currency: o.currency,
email: o.customer.email,
source: o.metadata.utm_source ?? null,
visitorId: o.metadata.vid ?? null,
});
}
if (event.type === "order.refunded") {
await recordRefund(event.data.id, event.data.refunded_amount);
}
return new Response(null, { status: 202 });
}
```
### Step 4: Verify signatures and respect delivery limits
Per Polar's [webhook delivery guide](https://polar.sh/docs/integrate/webhooks/delivery), each delivery is signed with the [Standard Webhooks](https://www.standardwebhooks.com) headers. Secrets generated on or after September 8, 2026 at 00:00 UTC follow that spec, and older secrets use Polar's original HMAC scheme with the full whsec_ string as the key. Polar's SDK tries both keys, while a generic library needs an older secret base64-encoded first.
| Rule | Value | Plan for it by |
| --- | --- | --- |
| Retries per failed delivery | 10, with exponential backoff | Making the handler idempotent on order ID |
| Request timeout | 10 seconds | Answering within 2 seconds and queuing the work |
| Endpoint disabled after | 10 consecutive non-2xx responses | Alerting yourself, since Polar emails members only after disabling |
| Responses | 202 accepted, 403 bad signature | Returning 202 for event types you skip, as in the handler |
| Recovery | Re-enable, then redeliver | Using the delivery page, plus the step 7 comparison |
*Delivery behavior from Polar's webhook delivery guide, October 2026.*
### Step 5: Store an amount that excludes tax
Polar collects tax as Merchant of Record, so total_amount holds money that was never yours. For channel reports I'd store net_amount, which reflects a discount a campaign gave away and leaves tax out. Polar's [fees documentation](https://polar.sh/docs/merchant-of-record/fees) works through a $30 purchase from Sweden, and the table gives the same amounts as order fields.
| Order field | Amount | Contents |
| --- | --- | --- |
| subtotal_amount | $30.00 | Price before discounts and tax |
| net_amount | $30.00 | After discounts, before tax |
| tax_amount | $7.50 | 25% Swedish VAT |
| total_amount | $37.50 | What the buyer paid |
| Starter plan fee | $2.94 | 5% + 50¢ |
| Pro plan fee | $2.39 | 3.8% + 40¢ |
| Growth plan fee | $2.26 | 3.6% + 35¢ |
| Scale plan fee | $2.14 | 3.4% + 30¢ |
*Fees apply to the $37.50 total and include the 1.5% international-card surcharge, which adds $0.56. On Starter, 5% of $37.50 plus 50¢ is $2.38. Organizations created before May 27, 2026 can still be on the Early Member rate of 4% + 40¢, plus 0.5% on subscription payments. Fees leave net_amount unchanged.*
### Step 6: Credit renewals and reverse refunds
Polar's documentation says checkout metadata is copied to the order and the subscription and does not say renewal orders repeat it, so save the source against subscription_id at the first paid order and credit every order with that ID to it. Skip that and the $29 plan earns its channel $29 of $638, leaving $609 with no source (see [subscription LTV attribution](https://www.trackrev.io/blog/subscription-ltv-attribution)).
| billing_reason | Happens when | Credit it to |
| --- | --- | --- |
| purchase or subscription_create | A one-time sale or a subscription's first payment | The order's own metadata, saved with subscription_id |
| subscription_cycle or subscription_update | A renewal or a prorated plan change | The source saved for that subscription_id |
*2 groups among the 4 billing reasons in Polar's orders documentation.*
`order.refunded` covers full and partial refunds, moving the order to refunded or partially_refunded with refunded_amount recording how much, so a $10 refund on a $29 order stores 1,000 and the channel keeps $19. Per Polar's [refund documentation](https://polar.sh/docs/features/refunds) the refundable maximum is the net amount, and Polar may refund a lower-value order itself within 60 days of purchase to head off a chargeback. Refunding a subscription's order leaves the subscription running, so handle cancellations separately.
### Choose which touch gets the credit
Whatever you write at checkout is a fixed answer. UTMs from a first visit give you first-touch attribution, and UTMs from the visit that clicked Buy give you last-touch, and you can store both under separate keys. A split across several touches needs a visitor ID joined to a click log you keep, and the [comparison of last-touch, first-touch and linear models](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers when each fits. In this example a buyer clicks a YouTube link, then a Hacker News post, then returns directly to buy the $29 plan and keeps it 22 months.
| Model | YouTube link | Hacker News post | Direct visit |
| --- | --- | --- | --- |
| First-touch | $638.00 | $0 | $0 |
| Last-touch | $0 | $0 | $638.00 |
| Linear | $212.67 | $212.67 | $212.67 |
*Credit for $638 of lifetime revenue. Linear splits it 3 ways.*
### Step 7: Reconcile nightly and test in the sandbox
Handlers break after deploys, so compare orders nightly. [List Orders](https://polar.sh/docs/api-reference/orders/list-orders) needs the orders:read scope, returns 10 orders per page by default, up to 100, and filters by metadata, so 1 call per source value, summing net_amount for orders whose status is paid, gives a channel report with no extra tooling. Amounts are in cents, so 40 newsletter orders of 2,900 sum to 116,000, or $1,160.
Orders tagged with one source
```
curl -G "https://api.polar.sh/v1/orders/" \
-H "Authorization: Bearer $POLAR_ACCESS_TOKEN" \
--data-urlencode "metadata[utm_source]=newsletter" \
--data-urlencode "limit=100"
```
Polar's [sandbox](https://polar.sh/docs/integrate/sandbox) is a separate environment with its own account, organization and token, served from sandbox-api.polar.sh, and production tokens fail there. Pay with Stripe's test card 4242 4242 4242 4242 and a future expiry, then check 3 things.
- The order.paid delivery in the sandbox webhook settings holds your metadata keys, spelled exactly as you wrote them.
- The net_amount and tax_amount match the checkout page.
- A refund produces order.refunded, and redelivering order.paid leaves 1 row for that order.
### Polar.sh revenue tracking with TrackRev
TrackRev's [Revenue Attribution](https://www.trackrev.io/solutions/revenue-attribution) does the join and the renewal bookkeeping. You connect Polar with a read-only Organization Access Token with 3 scopes plus your Organization Identifier, and TrackRev asks for order.paid and order.refunded webhooks. It joins an order to a click through a visitor ID: API checkouts take it as metadata.vid, as in step 2, and its pixel adds a vid parameter to links that point at buy.polar.sh. Without a vid it falls back to the buyer's email. TrackRev pulls orders over the read-only API after verifying a webhook, so replays cannot double count, and an hourly sync covers workspaces with no webhook.
| Plan | Monthly price | Revenue figures | Limits |
| --- | --- | --- | --- |
| Free | $0 | Hidden | 50 links and 1,000 events a month |
| Starter | $39 | Shown | 1 workspace |
| Growth | $99 | Shown | Unlimited workspaces |
| Scale | $199 | Shown | Everything in Growth, plus priority support |
*Plans from TrackRev's pricing page, October 2026. Polar revenue sync is part of every paid plan.*
With 1 or 2 channels and a few orders a week, tagged links and a script over the Orders API are enough. TrackRev earns its price when you want click-level journeys with several touches per buyer, or affiliate commissions from the same orders ([pricing](https://www.trackrev.io/pricing)).
### Frequently asked questions
**Does Polar track UTM parameters?**
Yes, on checkout links since May 19, 2025: 5 UTM parameters plus reference_id. For server-created checkouts you copy the values into metadata yourself.
**Why is the metadata on my Polar order empty?**
Usually the Buy button used an untagged link, the code wrote customer_metadata, or a key was misspelled. A renewal order may also lack it.
**Should I count revenue on order.created or order.paid?**
Use order.paid, because a renewal order starts as pending and a failed charge never pays it.
**How many metadata pairs can a Polar checkout hold?**
Up to 50 pairs, with keys of 40 characters or fewer and string values of 1 to 500 characters.
**Can Polar's dashboard show revenue by channel?**
Not as documented: its analytics page lists no channel split, but List Orders accepts a metadata filter.
**Can TrackRev connect a Polar sandbox account?**
Yes. Tick the sandbox option and use a token from sandbox.polar.sh with the sandbox organization's identifier, since the sandbox host rejects a live token.
---
## Post Affiliate Pro alternatives: what each plan costs and where five tools fit
URL: https://www.trackrev.io/blog/postaffiliatepro-alternative
Published: 2026-07-20
Author: Muzahid Maruf
Post Affiliate Pro costs $89 to $649 a month and keeps recurring commissions for Ultimate and up. See what each plan gates and how five alternatives compare.
A Post Affiliate Pro alternative makes sense when you sell a subscription through Stripe or Paddle and are paying for a suite that also covers store platforms and affiliate networks. Post Affiliate Pro charges $89, $139, $269 or $649 a month, and recurring commissions only arrive on the $269 Ultimate plan. Rewardful, FirstPromoter and Tolt start at $49 to $69 and meter the revenue partners bring in, Tapfiliate suits store platforms, and TrackRev starts at $39 and adds channel attribution. Staying put is the better call if you run Shopify or WooCommerce, pay per click, or operate an affiliate network.
I run TrackRev, so it is one of the five tools below and gets the same checks as the rest, including the places where Post Affiliate Pro beats it.
> **Key takeaways:**
>
> - Post Affiliate Pro costs $89, $139, $269 or $649 a month and meters tracking requests, from 10,000 on Starter to 1,000,000 on Pro.
> - Recurring commissions are listed for Ultimate and Network only, and its simpler recurring mode keeps creating commissions until someone deletes the rule.
> - Rewardful, FirstPromoter, Tolt and TrackRev start between $39 and $69 and meter revenue or commission, while Tapfiliate meters clicks and conversions.
> - Post Affiliate Pro stays the better pick for Shopify and WooCommerce stores, per-click or CPM commissions and affiliate networks.
> - When you leave, delete its recurring rules on the cutover day so one renewal is not paid out by two systems.
### Post Affiliate Pro pricing in October 2026
Quality Unit's Post Affiliate Pro has four plans on [its pricing page](https://www.postaffiliatepro.com/pricing/), each with a 30-day trial that its [home page](https://www.postaffiliatepro.com/) says needs no credit card. Billing annually takes $10 to $50 a month off the monthly rate. Affiliates are unlimited on every plan, so the plan decides tracking volume, campaign count and which features you get.
| Plan | Monthly | Billed annually, per month | Tracking requests a month | Campaigns | Overage per 10,000 requests |
| --- | --- | --- | --- | --- | --- |
| Starter | $89 | $79 | 10,000 | 1 | $5 |
| Pro | $139 | $129 | 1,000,000 | Unlimited | $1 |
| Ultimate | $269 | $249 | 6,000,000 | Unlimited | $0.40 |
| Network | $649 | $599 | 20,000,000 | Unlimited | $0.20 |
*Prices from Post Affiliate Pro's pricing page, October 2026.*
Tracking requests count impressions, events, clicks and sales together. Starter allows 1 campaign, so a second offer with its own commission rules means moving to Pro. Starter also keeps 2 years of tracking history, while the other three plans list unlimited history.
### What sits on which plan
A SaaS program finds its real price in the feature rows, because the things it needs sit on different plans.
| Feature | Starter | Pro | Ultimate | Network |
| --- | --- | --- | --- | --- |
| Recurring commissions | No | No | Yes | Yes |
| Split commissions | No | No | Yes | Yes |
| Performance rewards | No | No | Yes | Yes |
| Coupon codes | No | Yes | Yes | Yes |
| Product-specific commissions | No | Yes | Yes | Yes |
| Commission groups | $19 | Yes | Yes | Yes |
| Multiple currencies | $19 | Yes | Yes | Yes |
| Lifetime referrals manager | No | $9 | Yes | Yes |
| Audit log | $17 | $17 | $17 | Yes |
| Smartlinks | $19 | $19 | $19 | Yes |
| Branding-free option | No | No | $27 | Yes |
*Plan availability from Post Affiliate Pro's pricing page, October 2026. Dollar amounts are monthly add-ons on top of the plan.*
#### Recurring commissions start on Ultimate
Subscription products care most about this row. [Its recurring commissions page](https://www.postaffiliatepro.com/features/recurring-commissions/) says the feature is available in Ultimate and Network, and [the support article behind it](https://support.qualityunit.com/980100-Recurring-commissions) describes two modes. In the "dumb" mode a commission is created every period (the choices run from every 15 minutes to yearly) once the first payment is tracked, with no check that a payment happened, and it continues until you delete the rule under Transactions. In the "accurate" mode a commission is created only when something tells Post Affiliate Pro about each payment, which usually takes a plugin listening to your gateway's webhooks and a subscription ID that ties the payments together.
On Stripe I would use accurate mode, since a churned customer keeps earning for the partner in dumb mode until someone removes the rule. [The integrations page](https://www.postaffiliatepro.com/features/integrations/) lists Stripe with webhook-based tracking, subscription support and automatic refunds. Every plan lists lifetime commissions, which pay on a referred customer's later purchases, so ask support during the trial whether that covers your renewals before you pay for Ultimate.
#### Tracking requests and the overage meter
Starter's 10,000 requests disappear quickly if you track impressions. Say partners send 25,000 clicks and 400 sales in a month, and a banner is shown 200,000 times. That is 225,400 requests, 215,400 over the allowance, which at $5 per 10,000 comes to about $107.70 on top of the $89 plan. Pro at $139 would cost less, and its 1,000,000 requests would cover it. A link-based SaaS program with no banners stays far below that: the same 25,400 requests cost about $7.70 in overage.
#### Add-ons raise the monthly total
Several features carry a monthly add-on. The audit log is $17 on every plan below Network, Smartlinks (destination rules by visitor country and device) are $19, and removing Post Affiliate Pro's own branding is $27 on Ultimate and unavailable on the two plans beneath it. A program that wants recurring commissions and no vendor branding pays $269 plus $27, or $296 a month, and $249 plus $27, or $276 a month, on annual billing. That is $3,312 over a year.
### Where Post Affiliate Pro is still the better pick
Reach is its strongest argument. The integrations page lists Shopify, WooCommerce, BigCommerce, Magento and PrestaShop, subscription billing through Chargebee, Recurly and Chargify, checkout tools such as ThriveCart and SamCart, and course platforms such as Kajabi and Teachable, with webhook, API and JavaScript options for anything else. Every plan includes more than 125 plugins. Rewardful, FirstPromoter and Tolt name subscription billing systems on their pricing pages and no store platform, so a Shopify store belongs on Post Affiliate Pro or Tapfiliate.
Its commission models go further too. The pricing page lists per-click, CPM, lifetime and multi-tier commissions (up to 99 tiers) on all four plans, with action commissions (per registration or per download) from Pro and a forced matrix from Ultimate. Those suit media buyers and network operators more than a subscription program.
Network, at $649, is the one plan with separate merchant accounts, a merchant signup page and prepaid balances, which is what running a program for other companies' offers takes. Support comes with every plan: setup done for you on every plan (2 hours at most on Starter), 24/7 contact by chat, email and phone, and mobile apps for iOS and Android. The trial runs 30 days against 14 at Rewardful, FirstPromoter and Tolt, and the home page says brands have trusted it for over 20 years.
### Post Affiliate Pro alternatives compared
The meter on each entry plan decides what the bill becomes as a program grows, so the table lists it next to the price.
| Tool | Entry plan | Entry plan for 12 months | What it meters | Own-domain portal from | Billing and store integrations | Trial |
| --- | --- | --- | --- | --- | --- | --- |
| Post Affiliate Pro | Starter, $89 | $1,068 | 10,000 tracking requests, 1 campaign | Every plan (domain parking) | Stripe, PayPal, Chargebee, Recurly and 200+ more | 30 days, no card |
| Rewardful | Starter, $49 | $588 | $7,500 a month of affiliate-attributed revenue | Growth, $99 | Stripe, Paddle | 14 days |
| FirstPromoter | Starter, $49 | $588 | $5,000 a month of affiliate revenue, 1,000 affiliates | Business, $99 | Stripe, Paddle, Chargebee, Recurly, Braintree | 14 days, no card |
| Tolt | Basic, $69 | $828 | $10,000 a month earned from affiliates | Basic, $69 | Stripe, Paddle, Chargebee | 14 days, no card |
| Tapfiliate | Launch, $89 | $1,068 | 5,000 clicks, 500 conversions, 50 affiliates | Scale, $179 | Stripe, Chargebee, Recurly, Shopify, WooCommerce | 7 days |
| TrackRev | Starter, $39 | $468 | $10,000 of commission tracked a month | Every paid plan | Stripe, Paddle, Polar, Lemon Squeezy | Free plan, link tracking only |
*Prices from each vendor's pricing page, October 2026.*
#### Rewardful, FirstPromoter and Tolt for SaaS billing
All three meter the revenue partners generate instead of clicks, so a traffic spike costs nothing. [Rewardful](https://www.rewardful.com/pricing)'s $49 Starter stops at $7,500 a month and puts the branded portal and custom domain on Growth at $99, which covers $15,000 a month. [FirstPromoter](https://firstpromoter.com/pricing) stops its $49 Starter at $5,000 a month and 1,000 affiliates, lists recurring and lifetime commissions on every plan, and supports multi-tier commissions across up to 3 levels, with $99 Business reaching $15,000 a month. [Tolt](https://tolt.com/pricing)'s $69 Basic is the only one of the three whose entry plan includes a custom domain, though payouts stay manual until the $99 Growth plan, which covers $20,000 a month and adds automatic payouts at a 2% processing fee. The [Rewardful alternatives guide](https://www.trackrev.io/blog/best-rewardful-alternatives-2026), the [FirstPromoter alternatives guide](https://www.trackrev.io/blog/best-firstpromoter-alternatives-2026) and the [Tolt alternatives post](https://www.trackrev.io/blog/tolt-alternative) go deeper on each.
#### Tapfiliate for store platforms
[Tapfiliate](https://tapfiliate.com/pricing/) Launch costs the same $89 as Post Affiliate Pro Starter and meters 5,000 clicks, 500 conversions and 50 affiliates a month. Scale is $179 for 100,000 clicks and 10,000 conversions, and per [its add-on article](https://support.tapfiliate.com/en/articles/13235077-can-i-mix-match-features-from-different-plans) it is the plan with custom domains. [Its integrations docs](https://tapfiliate.com/docs/integrations/) list 28 pre-made integrations, among them Stripe, Chargebee, Recurly, Shopify and WooCommerce, which makes it the nearest swap when a store platform is what keeps you on Post Affiliate Pro. The [Tapfiliate alternatives post](https://www.trackrev.io/blog/tapfiliate-alternative) prices its overage.
### TrackRev as a Post Affiliate Pro alternative
TrackRev's Starter plan is $39 a month, and every paid plan includes the whole product: unlimited partners and programs, unlimited tracking links and events, and revenue attribution. Starter covers 1 workspace and meters up to $10,000 of partner commission a month. Growth is $99 for $100,000 across unlimited workspaces, and Scale is $199. Paying for a year gets 12 months for the price of 9, which puts Starter at $351. The recurring-commission setup with no vendor branding that costs $3,312 a year on Post Affiliate Pro costs $468 on Starter billed monthly. The [pricing page](https://www.trackrev.io/pricing) lists the rest.
Commissions can be a percentage or a flat amount, paid once, for a set number of months or for life. Multi-tier commissions run through [Partner Accelerator](https://www.trackrev.io/products/partner-accelerator), which pays up a referral chain from one capped pool (30% by default, with the seller at 10%) and stops a level once its share falls under $1. Revenue syncs from Stripe, Paddle, Polar and Lemon Squeezy. On [Stripe](https://www.trackrev.io/integrations/stripe) the sync reads paid charges hourly through a restricted read-only key, with an optional webhook for real-time updates, and a refunded or disputed charge takes its commission out. A renewal earns a commission only after a paid charge appears, so a churned customer stops earning without anyone deleting a rule.
Each program holds commission for 0 to 180 days before it can be paid, and 0 is the default. Partners get a [white-label portal](https://www.trackrev.io/products/white-label-branding) and upload W-9 or W-8 forms while onboarding. Payouts are manual: you export a PayPal or Wise CSV, pay from your own account and mark each payout paid with its payment reference.
A partner link sits on the same data model as every other tracked link, so one [channel report](https://www.trackrev.io/solutions/revenue-attribution) ranks affiliates, newsletter, YouTube and paid ads by the MRR each one pays, under last-touch, first-touch or linear credit. Post Affiliate Pro's reports are organized around affiliates, campaigns, banners and referring URLs, and its pricing page lists no report that compares other channels.
Post Affiliate Pro wins wherever reach and commission models matter. TrackRev has no Shopify, WooCommerce, Chargebee or Recurly connection, no network mode with merchant signup and prepaid balances, no automatic payouts, and no CPM, per-click, action or split commissions on its pages. Pick Post Affiliate Pro for any of those, and TrackRev when the billing system is Stripe, Paddle, Polar or Lemon Squeezy and partners are one channel among several.
### Moving a program off Post Affiliate Pro
- Pick the cutover date and delete the recurring rules that day. Rules in "dumb" mode keep creating commissions until they are removed under Transactions, Recurring commission rules, so a rule left running pays a partner for a renewal that TrackRev also credits.
- Ask for the transfer. On a paid TrackRev plan, open Migration in settings, choose Post Affiliate Pro and send your export with a note on partner count, commission terms and whether referral codes must survive. TrackRev maps campaigns to programs, and the confirmation promises a reply within one business day. A file you export yourself can go through "Any other platform" instead, up to 1,000 rows and 900 KB per upload with an email on every row, and an unpaid-balance column is written as one carried-over commission.
- Swap the tracking. Add the pixel below to your site and connect billing. For Stripe that means a read-only restricted key from the Stripe Dashboard, and the hourly sync pairs each paid charge with the click that earned it. Keep Post Affiliate Pro's sale tracking running until your cookie window has expired, and pay each commission from one system.
- Hand partners their new links. TrackRev partner links sit on a branded trackrev.io subdomain, on your custom domain or on trackrev.io itself, so every partner swaps the URLs they have posted.
- Run one test sale before you cancel anything. Click a test partner's link, pay with the 4242 4242 4242 4242 card from [Stripe's testing guide](https://docs.stripe.com/testing), check that the commission appears after the next sync, then refund the charge and confirm it leaves. Set the hold period to match your refund window.
- Cancel last. Pay the commissions Post Affiliate Pro still owes, export what you want to keep, and end the plan once the last tracked sale has been paid out.
TrackRev pixel
```
```
The [affiliate payments guide](https://www.trackrev.io/blog/how-to-pay-affiliates) covers PayPal and Wise batches, and the [refunds and upgrades post](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) covers the awkward cases once the first partners are live. TrackRev's free plan (50 links, 1,000 tracked events a month) lets you test the redirects, while the affiliate program and revenue figures start on a paid plan at $39.
### Frequently asked questions
**What is the cheapest Post Affiliate Pro alternative?**
TrackRev has the lowest entry price of the five at $39 a month, followed by Rewardful and FirstPromoter at $49 and Tolt at $69. Tapfiliate and Post Affiliate Pro count traffic and the rest count revenue or commission, so price each plan at your own volume before you compare.
**Does Post Affiliate Pro have a free plan?**
No. It offers a 30-day free trial that needs no credit card. TrackRev's free plan stops at link tracking, so partner programs need Starter, and Tolt and FirstPromoter run 14-day trials without a card.
**Which Post Affiliate Pro plan includes recurring commissions?**
Ultimate, at $269 a month or $249 on annual billing, and Network. Starter and Pro list lifetime commissions instead, which pay on a referred customer's later purchases.
**Does Post Affiliate Pro work with Paddle, Lemon Squeezy or Polar?**
Its integrations page names none of the three. It lists Stripe, PayPal, Braintree, Authorize.Net, Square, Chargebee, Recurly, Chargify and FastSpring, plus webhooks, a REST API and server-to-server tracking for custom setups. FirstPromoter and Tolt list Paddle, and TrackRev syncs Paddle, Polar and Lemon Squeezy.
**When should I stay on Post Affiliate Pro?**
Stay when sales run through Shopify, WooCommerce or another store platform, when you pay per click or per action, or when you run an affiliate network with merchants of your own, since Network is the only plan with multiple merchant accounts. A subscription business on Stripe rarely needs any of those.
**Can I migrate my affiliates from Post Affiliate Pro to TrackRev?**
Yes, on a paid plan. Post Affiliate Pro is a listed source on TrackRev's Migration page, where you send your export and TrackRev maps campaigns to programs. Mention in the note if partners must keep their referral codes.
**Does TrackRev pay affiliates automatically?**
No. You export a PayPal or Wise CSV, pay from your own account and mark each payout paid. Tolt's $99 plan offers automatic payouts for a 2% processing fee, and Tapfiliate adds Trolley on Scale.
**Does Post Affiliate Pro support multi-tier commissions?**
Yes, up to 99 tiers on all four plans, plus a forced matrix from Ultimate to limit sub-affiliates. TrackRev's version is Partner Accelerator, where a capped pool decides the most a chain can ever pay.
---
## Postback URL explained: how it differs from a pixel and a webhook
URL: https://www.trackrev.io/blog/postback-url-vs-pixel-tracking-affiliate
Published: 2026-05-20
Author: Muzahid Maruf
A postback URL is the address your server calls to report a sale with its click ID. How it differs from pixels and webhooks, with a 6-step Stripe setup.
A postback URL is an address on the platform that sent you a click, such as an affiliate network or a tracker like Voluum. After a sale, your server requests it with the click ID and order value filled in, and the platform records the conversion with no browser involved. A conversion pixel instead fires from the thank-you page and relies on a cookie to find the click.
> **Key takeaways:**
>
> - A postback URL is an address on the platform that issued the click. After a sale, your server makes a request to it with the click ID and order value, with no browser involved.
> - A thank-you page pixel sees only the first payment of a 12-payment subscription, and Safari can expire its script-written cookie within 24 hours.
> - TrackRev has no postback URL setting. It reads Stripe, Paddle, Polar and Lemon Squeezy charges, and sends signed sale.created webhooks.
### What a postback URL looks like
Voluum's documentation [describes server-to-server (S2S) tracking](https://doc.voluum.com/article/track-conversions-using-s2s-postback-url) as a server on the offer owner's side passing conversion data back to the platform the visitor came from. In Voluum's version, `cid` is the only required parameter, and 9 optional ones follow: `payout`, `txid`, `et`, `currency` and `param1` to `param5`. The `txid` value is a unique ID per conversion, so 1 visitor can produce several.
A postback round trip: the platform appends a unique click ID to the visitor's link, and your server returns that ID after the sale
```
1. The platform sends the visitor to your site with a click ID
https://yoursite.com/pricing?clickid=7f3a91c2
2. Your server reports the paid order
https://tracker.example.com/postback?cid=7f3a91c2&payout=49.00¤cy=usd&txid=cs_live_a1B2c3
```
### How pixel tracking works and where it loses sales
A conversion pixel is an image tag or script on the post-payment page. Voluum's [pixel documentation](https://doc.voluum.com/article/track-conversions-using-a-conversion-tracking-pixel) says the click ID sits in a browser cookie that the thank-you page reads and sends back, that the pixel stops working when cookies are disabled, and that it is the fallback for platforms without S2S postbacks. More on the browser side in [server-side vs client-side click tracking](https://www.trackrev.io/blog/server-side-click-tracking-vs-client-side-pixel).
| Browser or blocker | Default behavior | Source |
| --- | --- | --- |
| Apple Safari | Intelligent Tracking Prevention blocks all third-party cookies, deletes script-written cookies after 7 days without interaction, and caps them at 24 hours when it detects link decoration such as a click ID in the URL | [WebKit](https://webkit.org/tracking-prevention/) |
| Mozilla Firefox | Tracking protection has been on by default since 2019, and Total Cookie Protection keeps cookies in a separate jar per site for all desktop users since June 14, 2022 | [Mozilla](https://blog.mozilla.org/en/mozilla/firefox-rolls-out-total-cookie-protection-by-default-to-all-users-worldwide/) |
| Brave Browser | Blocks tracking cookies by default | [MDN](https://developer.mozilla.org/en-US/docs/Web/Privacy/Guides/Third-party_cookies) |
| Microsoft Edge | Blocks trackers from unvisited sites and known harmful trackers by default | [MDN](https://developer.mozilla.org/en-US/docs/Web/Privacy/Guides/Third-party_cookies) |
| Google Chrome | Allows third-party cookies by default, and on April 22, 2025 Google kept that approach with no standalone prompt | [Google](https://privacysandbox.google.com/blog/privacy-sandbox-next-steps) |
| Ad blockers | EasyList's EasyPrivacy list targets web bugs and tracking scripts, and EasyList's filter lists work with Adblock Plus, AdBlock, uBlock Origin and AdGuard | [EasyList](https://easylist.to/) |
*What browsers and blockers do to a cookie-based pixel match. Your loss depends on your browser mix.*
#### What a thank-you page pixel misses on renewals
A monthly subscriber loads the thank-you page once, so a pixel on it fires for the first payment only. Take a program that pays a 20% recurring commission.
| Plan price | Pixel records | Postback records over 12 months |
| --- | --- | --- |
| $19 | $3.80 | $45.60 |
| $39 | $7.80 | $93.60 |
| $49 | $9.80 | $117.60 |
| $99 | $19.80 | $237.60 |
| $199 | $39.80 | $477.60 |
*An illustration with made-up inputs: 12 monthly payments and a 20% recurring commission.*
#### Measuring your own loss
Count the paid, non-refunded Stripe checkouts from the last 30 days that carried a click ID, then count what the platform logged. Suppose 120 checkouts earn a $9.80 commission each.
| Undercount | Sales missed | Commission uncredited |
| --- | --- | --- |
| 5% | 6 | $58.80 |
| 10% | 12 | $117.60 |
| 15% | 18 | $176.40 |
| 20% | 24 | $235.20 |
| 30% | 36 | $352.80 |
| 40% | 48 | $470.40 |
*Also made-up inputs, not a benchmark.*
### Postback URL vs pixel tracking in 6 scenarios
| Scenario | Pixel | Postback URL |
| --- | --- | --- |
| Safari buyer pays 2 days after clicking a link with a click ID | The script-written cookie can already be gone, capped at 24 hours | Click ID found in your database, $49.00 reported |
| Buyer closes the tab before the thank-you page loads | Nothing fires | $49.00 reported from the Stripe event |
| Buyer with uBlock Origin pays $49.00 | The script or request can be blocked | No browser request to block |
| ACH Direct Debit payment that fails after Stripe Checkout completes | Fires for $49.00 anyway | Waits for the async success event, so a failure reports nothing |
| Payment 7 of 12 on a monthly plan | No page view, $0 | The invoice event reports $9.80 commission |
| Refund of $49.00 after 20 days | Nothing fires | Needs its own call, as in [affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) |
*Rows 2 and 4 follow [Stripe's fulfillment guide](https://docs.stripe.com/checkout/fulfillment).*
For a sale that a processor confirms, I treat the postback as the record and the pixel as optional.
### Postback URL vs webhook
Both are HTTP requests with event data. Ownership differs. Stripe picks the payload, signs it and retries failures (see [Stripe's webhook documentation](https://docs.stripe.com/webhooks)). A postback is the receiver's endpoint, so the platform fixes the URL and parameters and you own the retries.
| Aspect | Webhook | Postback URL |
| --- | --- | --- |
| Direction | Platform to your server | Your server to the platform |
| Format set by | The sender, usually a JSON body | The receiver, usually query parameters |
| Verification | Signature header, 5 minute default tolerance in Stripe's libraries | Set by the platform, sometimes a secret token or IP allowlist |
| Retries | Sender retries: up to 3 days at Stripe, 3 attempts inside a 10 second budget at TrackRev | You retry, because the platform never learns the call failed |
| Duplicates | Dedupe on the event ID | Dedupe on the transaction ID |
### How to send a postback from a Stripe sale
The steps use Stripe Checkout. Paddle's is custom data and Polar's is checkout metadata (see [Paddle checkout attribution with custom_data](https://www.trackrev.io/blog/paddle-checkout-attribution-passthrough)).
| Step | What to do | Limit to design around |
| --- | --- | --- |
| 1 | Save the click ID in your database when the visitor lands | Safari caps script-written cookies at 24 hours when it detects a click ID in the URL, and deletes them after 7 days idle |
| 2 | Pass it to Checkout in `client_reference_id` | 200 characters, while metadata allows 50 keys with names up to 40 characters and values up to 500 |
| 3 | Fire when `payment_status` is `paid` on `checkout.session.completed` or `checkout.session.async_payment_succeeded` | A free trial reports `paid` with a $0 invoice, so require an amount above 0 |
| 4 | Verify `Stripe-Signature`, skip repeated event IDs, skip events where `livemode` is false, return a 2xx first | 5 minute tolerance, a 10 second redirect wait in hosted Checkout, 16 endpoints per account, TLS 1.2 or 1.3 |
| 5 | Send the click ID, amount, currency and a transaction ID such as the Session ID, with a 5 second timeout. Retry timeouts, 429 and 5xx answers | Over 135 currencies, and most use 2 decimals |
| 6 | If the platform was down, resend the event and reuse the transaction ID | 15 days in the Stripe Dashboard, 30 days with the Stripe CLI |
*Limits from Stripe's [webhook](https://docs.stripe.com/webhooks), [Checkout Session](https://docs.stripe.com/api/checkout/sessions/object), [session creation](https://docs.stripe.com/api/checkout/sessions/create) and [metadata](https://docs.stripe.com/api/metadata) documentation.*
For subscriptions, save the Stripe customer ID next to the click ID after the first sale, because renewals arrive as `invoice.paid` events without the session's reference. Alternatives are in [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup).
| Stripe amount | Currency | Real value |
| --- | --- | --- |
| 50 | USD | $0.50, the minimum charge |
| 4900 | USD | $49.00 |
| 1099 | USD | $10.99 |
| 2000 | EUR | 20.00 EUR |
| 500 | JPY | 500 yen |
| 5000 | KRW | 5000 won |
| 2500 | GBP | 25.00 GBP |
| 500 | ISK | 5 ISK |
| 500 | UGX | 5 UGX |
| 17500 | HUF | 175.00 HUF, the minimum charge |
| 50 | JPY | 50 yen, the minimum charge |
*From [Stripe's currency guide](https://docs.stripe.com/currencies): amounts use the smallest unit. JPY and KRW have no minor unit, and ISK and UGX are zero-decimal but still sent in a two-decimal form, so dividing every amount by 100 is wrong for yen and won.*
Webhook handler that fires the postback (Next.js route, Stripe Node library)
```
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
const ZERO_DECIMAL = new Set(["jpy", "krw"]); // check Stripe's currency list for the rest
export async function POST(req: Request) {
const raw = await req.text(); // raw body, required for the signature check
const event = stripe.webhooks.constructEvent(
raw,
req.headers.get("stripe-signature")!,
process.env.STRIPE_WEBHOOK_SECRET!,
);
if (!event.livemode) return new Response("ignored test event");
if (await alreadyProcessed(event.id)) return new Response("duplicate");
if (
event.type === "checkout.session.completed" ||
event.type === "checkout.session.async_payment_succeeded"
) {
const s = event.data.object;
const clickId = s.client_reference_id;
// For delayed methods, "completed" arrives unpaid and is skipped here.
if (s.payment_status === "paid" && clickId && (s.amount_total ?? 0) > 0) {
const cur = s.currency ?? "usd";
const amount = ZERO_DECIMAL.has(cur) ? s.amount_total! : s.amount_total! / 100;
await firePostback({ clickId, amount, currency: cur, txid: s.id });
}
}
await markProcessed(event.id);
return new Response("ok");
}
async function firePostback(p: { clickId: string; amount: number; currency: string; txid: string }) {
const url = new URL("https://tracker.example.com/postback");
url.search = new URLSearchParams({
cid: p.clickId,
payout: p.amount.toFixed(2),
currency: p.currency,
txid: p.txid,
}).toString();
const res = await fetch(url, { signal: AbortSignal.timeout(5000) });
if (!res.ok) throw new Error("postback failed with " + res.status); // Stripe retries the event
}
```
### When a pixel is still the better tool
Some platforms accept only pixels, as Voluum notes for networks without S2S postbacks. Ad platforms run both: Meta recommends the Meta Pixel plus the Conversions API, matched on `event_id` and deduplicated only when the second event arrives within 48 hours of the first ([Meta's deduplication guide](https://developers.facebook.com/documentation/ads-commerce/conversions-api/deduplicate-pixel-and-server-events)). If an affiliate sale fires both, send the same transaction ID in each, or a $49 sale can show up as 2 conversions and $98 of revenue.
### How TrackRev records the conversion
TrackRev needs no postback from you. It reads the paid charge from Stripe, Paddle, Polar or Lemon Squeezy and joins it to the click that came before.
| Stage | What TrackRev does | Detail |
| --- | --- | --- |
| Click | Records it on the server at the redirect | 0 scripts on your destination page |
| Visitor ID | Keeps one in a first-party vid cookie | One pixel script, cookie lasts 1 year |
| Checkout | Carries the ID in client_reference_id or metadata | Hosted links such as Stripe Payment Links get it automatically |
| Charge sync | Reads paid charges with a read-only Stripe key | 4 read scopes. 1 optional webhook scope for 3 events attributes sales in seconds, and charges sync hourly without it. The first sync pulls 30 days |
| Join | Looks in 4 places, ending with the buyer's email | Charge metadata, session reference, session metadata, email |
| Outbound | Sends signed webhooks for 7 event types, including sale.created | 5 second timeout, 3 attempts inside a 10 second budget |
On [TrackRev's affiliate program](https://www.trackrev.io/solutions/affiliate-program), the commission row is written when an attributed sale lands, once per order and partner, and reverses on a refund. The pixel writes its cookie with JavaScript, so Safari's caps on script-written cookies apply to it. The redirect re-sends the visitor ID on every link click, and email matching, after an identify call, covers purchases with no ID. There is no postback URL setting: subscribe a webhook to `sale.created` and map the order or email to your stored click ID. If a network owns your click tracking, use its conversion setup instead.
| Plan | Price | What it covers here |
| --- | --- | --- |
| Free | $0 | Link tracking only: 50 links and 1,000 tracked events a month |
| Starter | $39 a month | The affiliate program, up to $10,000 of commission tracked a month |
| Growth | $99 a month | Unlimited workspaces, up to $100,000 of commission tracked a month |
| Scale | $199 a month | Unlimited commission tracked and priority support |
*TrackRev plans, October 2026. Annual billing pays for 9 months and covers 12, so Starter works out to $29.25 a month. See [pricing](https://www.trackrev.io/pricing) for the full list and the [first-party tracking](https://www.trackrev.io/products/first-party-tracking) page for the pixel.*
### Frequently asked questions
**What is a postback URL?**
A callback address issued by an affiliate network, ad tracker or partner platform such as Voluum, also called an S2S URL. Your server requests it with the click ID and order value after a sale.
**Is postback tracking more accurate than pixel tracking?**
For payments a processor confirms, usually yes, since nothing depends on cookies or the buyer reaching a page. On a $49 plan, a pixel records payment 1 of 12 and a postback records all 12.
**How do I test a postback URL?**
Substitute a real click ID, call the URL with curl, and check that the platform logged 1 conversion. Then resend a Stripe test event and confirm the count stays at 1.
**How long does Stripe retry a failed webhook?**
Up to 3 days in live mode, with exponential backoff, and 3 times over a few hours in a sandbox. You can resend an event for 15 days from the Dashboard or 30 days with the CLI.
**Can someone fake a postback?**
Yes, if the URL carries no secret. The platform should accept only click IDs it issued, and 1 conversion per transaction ID. Keep the URL out of browser JavaScript.
**Does TrackRev use postback URLs?**
No. TrackRev credits the click behind each charge it reads from Stripe, Paddle, Polar or Lemon Squeezy. It can send a signed sale.created webhook to your own endpoint.
---
## How to prevent affiliate self-referral fraud on Stripe
URL: https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud
Published: 2026-07-11
Author: Muzahid Maruf
Self-referral lets a partner earn commission on their own subscription. Compare buyer and partner by email, Stripe card fingerprint and IP, then hold payouts.
Affiliate self-referral fraud is a partner earning commission on their own purchase, through their own link or coupon code. You prevent it by comparing partner and buyer on email, Stripe card fingerprint, IP and device, then holding flagged commission until the dispute window closes. At 25% commission on a $99 monthly plan, the partner pays $99 and earns $24.75, so the plan costs them $74.25 a month.
| Self-referred accounts | Commission each month | Commission over 12 months |
| --- | --- | --- |
| 1 | $24.75 | $297 |
| 10 | $247.50 | $2,970 |
| 50 | $1,237.50 | $14,850 |
| 100 | $2,475 | $29,700 |
*Commission paid at 25% of a $99 plan, if every account stays subscribed for 12 months.*
> **Key takeaways:**
>
> - A self-referral leaves a real click, cookie and payment, so compare partner and buyer on 4 signals: email, card fingerprint, IP and device.
> - Card networks typically allow disputes for 120 days, and one lost $99 dispute costs $138.75 with the $24.75 commission and $15.00 fee.
> - Stripe's Charge has no IP address, so log it yourself, and use a match to start a review.
The click, the cookie and the Stripe payment are all real, so the tracking looks clean. Cookie stuffing and bot clicks distort the click data ([attribution fraud detection](https://www.trackrev.io/blog/affiliate-attribution-fraud-prevention)), and a self-referral shows up only when you compare partner and buyer.
### Three kinds of self-referral, and only one is fraud
The Rewardful Help Center sorts self-referrals into [legitimate, accidental and fraudulent](https://help.rewardful.com/en/articles/5989704-dealing-with-self-referrals) cases. Only the third deserves a penalty, and a first offense with no hiding signals gets a conversation.
| Kind | What it looks like | What to do |
| --- | --- | --- |
| Legitimate | An agency resells through its own link | Allow it in the partner terms |
| Accidental | A partner tests their own link, then buys with the cookie still set | Reverse the commission, no penalty |
| Fraudulent | Someone joins to buy at a discount: 30% commission on a $100 plan makes it $70 a month | Reverse it and remove the partner |
*Categories from Rewardful's article on self-referrals. The actions are my recommendations.*
### What affiliate self-referral fraud leaves in your Stripe data
A click is easier to fake than a payment, so the identity evidence sits on the Stripe side. Read these 5 signals together, because each can be beaten. A partner paid on a coupon code leaves no click, so [coupon code tracking](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) leans on the first 3 rows.
| Signal | Where to read it | Strength | Caveat |
| --- | --- | --- | --- |
| Email | `customer_details.email` on the Checkout Session | Strong on a match | Lowercase both, strip any +tag, and drop the dots in Gmail addresses |
| Card fingerprint | `payment_method_details.card.fingerprint` on the Charge | Strong on a match | Apple Pay and Google Pay may return a tokenized number |
| Name and ZIP | `billing_details.name` and `billing_details.address.postal_code` | Soft | A different name or ZIP beats it |
| IP address | Your own server log | Soft | A match can be 2 strangers behind one NAT |
| Device | Your own cookie and fingerprint | Strong for the cookie, soft for the fingerprint | Set the cookie from your server, because Safari Intelligent Tracking Prevention deletes script-written storage after 7 days of no user interaction |
*Field names are from Stripe's [Charge](https://docs.stripe.com/api/charges/object) and [PaymentMethod](https://docs.stripe.com/api/payment_methods/object) references. The Safari limit is from WebKit's [tracking prevention page](https://webkit.org/tracking-prevention/).*
#### IP address: log it yourself and never reject on it alone
The Charge has no IP field, and the [Radar Review object](https://docs.stripe.com/api/radar/reviews/object) keeps its `ip_address` on the review. Log the buyer's IP when you create the Stripe Checkout Session and store a salted hash, because IP addresses can count as personal data ([affiliate compliance for FTC and GDPR](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr)).
| Address type | What to hash | Why |
| --- | --- | --- |
| IPv4 | The whole address | Carrier-grade NAT, a Best Current Practice in [RFC 6888](https://www.rfc-editor.org/rfc/rfc6888) (April 2013), lets an ISP share one address among many subscribers |
| IPv6 | The first 64 bits | [RFC 4941](https://www.rfc-editor.org/rfc/rfc4941) temporary addresses (September 2007) change the last 64 bits over time |
### How to prevent affiliate self-referral fraud, step by step
#### Step 1: Write the rule into the partner terms and vet applicants
Write the 3 kinds into your affiliate terms: which you allow, which you reverse, and that a partner who hides a self-referral loses the account and unpaid earnings. Be wary of an applicant with no site or audience whose first sale arrives within days, and use TrackRev's "Review each application" mode to decide each one.
#### Step 2: Record identity at the click and at checkout
Store 4 values with every click: the partner ID, a click ID, a hashed IP and a device ID. At Stripe Checkout, pass the click ID as `client_reference_id` and the partner as subscription metadata ([Stripe metadata attribution](https://www.trackrev.io/blog/stripe-metadata-attribution-setup)).
TypeScript, creating the Checkout Session
```
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: PRICE_ID, quantity: 1 }],
client_reference_id: clickId,
subscription_data: { metadata: { partner_id: partnerId, click_id: clickId } },
success_url: SUCCESS_URL,
cancel_url: CANCEL_URL,
});
// Stripe does not give you the checkout IP, so keep your own record.
// hashIp, clientIp and saveCheckoutContext are your helpers.
await saveCheckoutContext(session.id, { ipHash: hashIp(clientIp(req)), deviceId });
```
#### Step 3: Compare the partner with the buyer when the charge succeeds
On `charge.succeeded`, match the card fingerprint against the partner's own customer record and their other referrals. Hold the commission on a normalized email, card fingerprint or device cookie match. Hold any 2 of IP, device fingerprint, name and ZIP for review, and pay a single soft match after logging it.
| Example | Plan price | Commission at 25% | What matched | Action |
| --- | --- | --- | --- | --- |
| 1 | $99 | $24.75 | Normalized email and card fingerprint | Hold and flag it |
| 2 | $99 | $24.75 | IP only, a coworking space | Pay and keep the log |
| 3 | $49 | $12.25 | IP and billing ZIP | Hold for review |
| 4 | $199 | $49.75 | Nothing | Pay |
| 5 | $99 | $24.75 | The partner's own device cookie | Hold, probably their own purchase |
| 6 | $199 | $49.75 | A card that 3 other referrals from the same partner also used | Hold, likely one person |
| 7 | $39 | $9.75 | Apple Pay, no other signal | Pay |
| 8 | $49 | $12.25 | Name and device fingerprint | Hold for review |
| 9 | $99 | $24.75 | An agency partner the terms allow | Pay |
| 10 | $39 | $9.75 | Cardholder name and ZIP | Hold for review |
*Ten example conversions run through the rule above. Example 7 is the wallet blind spot.*
TypeScript, the comparison
```
function normalizeEmail(email: string): string {
const [local, domain] = email.trim().toLowerCase().split("@");
const base = local.split("+")[0];
return domain === "gmail.com" ? base.replaceAll(".", "") + "@" + domain : base + "@" + domain;
}
type Party = {
email: string;
ipHash?: string;
deviceId?: string;
postalCode?: string;
cardFingerprints: string[];
};
export function selfReferralSignals(partner: Party, buyer: Party): string[] {
const hits: string[] = [];
if (normalizeEmail(partner.email) === normalizeEmail(buyer.email)) hits.push("email");
if (partner.cardFingerprints.some((f) => buyer.cardFingerprints.includes(f))) hits.push("card");
if (partner.deviceId && partner.deviceId === buyer.deviceId) hits.push("device");
if (partner.ipHash && partner.ipHash === buyer.ipHash) hits.push("ip");
if (partner.postalCode && partner.postalCode === buyer.postalCode) hits.push("zip");
return hits;
}
```
#### Step 4: Hold commission past the refund and dispute window
Detection misses someone with a second card and browser, and a hold catches the rest because unpaid commission can still be reversed. A 30-day hold pays commission on sales that cardholders can still dispute.
| Stripe dispute fact | Value |
| --- | --- |
| Cardholder may file a dispute | Typically within 120 days of the payment |
| Local payment methods such as Klarna and PayPal | Typically up to 180 days |
| You respond to the issuer | Usually within 7 to 21 days |
| Issuer decides | Usually 60 to 75 days later |
| Latest final result | About day 216 (120 + 21 + 75) |
| Fee for each dispute received | $15.00, about 15% of a $99 payment, plus a further $15.00 if you counter, returned when you win |
*From Stripe's [dispute documentation](https://docs.stripe.com/disputes/how-disputes-work) and [US pricing page](https://stripe.com/us/pricing). The 216 is my arithmetic.*
A partner can buy on a stolen card, get paid, and leave you holding the dispute. The hold decides whether commission is part of the loss, and a refund after payout leaves the $24.75 to recover from the partner ([refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling)).
| A $99 payment is disputed | Payment | Stripe fee | Commission | You lose |
| --- | --- | --- | --- | --- |
| Lost after the partner was paid | $99 | $15.00 | $24.75 | $138.75 |
| Lost while the commission was held | $99 | $15.00 | $0 | $114.00 |
| Won after the partner was paid | $0 | $15.00 | $24.75 | $39.75 |
| Won while the commission was held | $0 | $15.00 | $0 | $15.00 |
*Lost rows assume you do not counter. A won dispute means you countered, and Stripe returns the $15.00 countered fee but keeps the $15.00 received fee.*
The cost of a long hold is partner patience. At $24.75 a month and a 120-day hold, a new partner has $99 pending by the time the first $24.75 clears. My compromise is 30 to 60 days once a program has a clean history, and 120 days while it is new.
#### Step 5: Review flagged commissions and reverse the bad ones
Show a person the matched signals and both emails. Allow a legitimate case, reverse an accidental one without penalty, and for a fraudulent one reverse the commission, remove the partner and check their other commissions. Tell the partner why, or a silent reversal costs you an honest one who tripped an IP rule.
### What your affiliate tool already checks
On Rewardful or FirstPromoter, the card comparison from step 3 is yours to add, because neither help article lists a card check.
| Tool | Automatic self-referral check | What happens next | Source date |
| --- | --- | --- | --- |
| Rewardful | Several methods it does not disclose | An email asks you to choose Looks good or Looks suspicious | February 2022 |
| FirstPromoter | Same email or same IP, plus referrals from 11 paid ad sources | A warning icon, a Fraud check filter and a cap above which approval is manual | May 21, 2026 |
| TrackRev, credit programs | 3 checks: same-browser marker, device fingerprint, same IP on a different device | The grant is written as revoked with a reason, and an admin can override it | October 2026 |
| TrackRev, cash commissions | None automatic | You review, then mark a commission void or fraud before it joins a payout batch | October 2026 |
*Self-referral handling as each vendor documents it. Sources: [Rewardful](https://help.rewardful.com/en/articles/5989704-dealing-with-self-referrals), [FirstPromoter](https://help.firstpromoter.com/en/articles/13772161-fraud-protection-settings-in-firstpromoter) and TrackRev's own documentation.*
#### What TrackRev does and does not do
Cash commissions run none of those 3 checks. The controls act before money moves: the approval mode from step 1, a Customers page showing each referred customer beside the partner who referred them, 6 commission statuses including void and fraud, and automatic reversal on refunds. A program's Hold period runs from 0 to 180 days and defaults to 0, and payouts are batches you run yourself, so run one only when its commissions are older than your window. A commission already on a batch cannot be changed, so review first.
TrackRev CLI, reviewing and marking a commission
```
trackrev commissions list --status pending --partner
trackrev commissions void --status fraud --yes
```
| Plan | Price a month | Annual billing | Commission tracked a month |
| --- | --- | --- | --- |
| Free | $0 | $0 | Affiliate program not included |
| Starter | $39 | $351 | Up to $10,000 |
| Growth | $99 | $891 | Up to $100,000 |
| Scale | $199 | $1,791 | Unlimited |
*Annual billing charges for 9 months and gives 12. Pending, eligible and paid commission counts against the allowance, so marking a fraudulent one void or fraud frees the room.*
FirstPromoter documents an automatic email and IP self-referral flag, and TrackRev has none for cash commissions. For commissions and channel revenue on one data model, see the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program).
### Frequently asked questions
**What is affiliate self-referral fraud?**
A partner buying through their own link or coupon so the program pays them a share. Some programs allow agencies to resell that way, so not every case is fraud.
**Is blocking matching emails enough?**
No, because a second address defeats an exact match. Compare email domains too, since a buyer on the partner's company domain is a coworker or the partner, and add the card fingerprint.
**What should I do when a legitimate partner trips a flag?**
Release the commission, record which signal fired, tell the partner, and write any agency exception into your terms.
**How do I catch self-referral on a signup reward?**
A signup reward has no payment to fingerprint, so compare email, IP, device and a same-browser marker at signup. TrackRev's credit programs run 3 such checks automatically.
**Does a refund reverse an affiliate's commission?**
In TrackRev it does, automatically. Commission already paid, such as $24.75 on a $99 sale, has to be recovered from the partner, for example by deducting it from a later payout.
**Can TrackRev flag self-referrals on cash commissions automatically?**
No. Its documentation says cash commissions skip the 3 checks that credit programs use, so you review them and mark a bad one void or fraud.
---
## QR code tracking: follow a scan through to the sale
URL: https://www.trackrev.io/blog/qr-code-tracking-to-revenue
Published: 2026-07-11
Author: Muzahid Maruf
QR code tracking in 6 steps: encode a short link, tag the UTMs, add a pixel and tie each scan to the Stripe charge it produced. Includes a worked example.
QR code tracking means printing a code that points at a short link you control, so each scan passes through a redirect that logs it before the visitor reaches your page. That yields counts, device types and rough locations. Tying a scan to the Stripe charge it produced 3 weeks later takes more.
> **Key takeaways:**
>
> - A QR code stores only a URL, so tracking means encoding a link on your own domain and logging each HTTP 302 redirect it triggers.
> - A scan carries no referrer, so the 3 UTM parameters Google Analytics 4 expects (source, medium, campaign) are what name the campaign in reports.
> - In the invented worked example the 95-scan table tent earned $354 a month and the 420-scan booth banner earned $295, so rank placements by revenue, not scans.
> - Safari's Intelligent Tracking Prevention deletes script-written cookies after 7 days without interaction, so capture an email at signup to keep a scan joined to its Stripe charge.
### How QR code tracking works
A tracked code holds a URL on your domain, such as `go.yourbrand.com/booth-banner`. The phone requests it, your server logs the request, and an HTTP 302 response sends the visitor to the real page.
The iPhone Camera app shows the link at the bottom of the screen and opens it only on a tap, per [Apple Support](https://support.apple.com/guide/iphone/scan-a-qr-code-iphe8bda8762/ios), so every counted scan is a tap.
#### What a static code can still tell you
A static code has no server in the middle, so it can be measured only where it lands. Add UTM parameters to the encoded URL and Google Analytics 4 tags each arriving session; [Google Analytics Help](https://support.google.com/analytics/answer/10917952) says to always include 3 of them: `utm_source`, `utm_medium` and `utm_campaign`. Scans that stop before the page loads leave no trace, and the destination can't change after printing (see [dynamic versus static](https://www.trackrev.io/blog/dynamic-qr-codes-vs-static)).
### What a scan records and what it misses
| Signal | What the redirect records | Limit |
| --- | --- | --- |
| Time and device | Timestamp, OS and browser from the user agent | Crawlers can pose as scans; TrackRev flags bots |
| Location | Country and city from the IP address | Approximate; Bitly lists city-level data under Bitly Premium, $199 a month billed annually |
| Referrer | None, because the camera app opens the URL directly | Untagged scans reach Google Analytics 4 as direct traffic |
| Visitor | An anonymous ID in a cookie | A name exists only once the visitor gives an email |
| Repeat scans | 1 row per request | 3 scans by 1 person count as 3 unless the tool counts by visitor ID |
*Bitly details from its pricing page, October 2026.*
### Setting up a trackable QR code
Steps 1 to 4 need no code.
#### 1. Create one tracked link per placement
Placements that share a link share a number, so give each banner, insert and table tent its own link, named after the placement. TrackRev's free plan allows 50 links; a CSV import creates a set at once, and the REST API returns any link's code as an SVG up to 2,048 px wide.
#### 2. Put the campaign on the destination URL
Write the placement into the destination: `utm_source=expo`, `utm_medium=qr`, `utm_campaign=launch-oct26` and `utm_content=banner-a`. Google Analytics 4 treats values as case-sensitive, so Meta and meta become 2 rows. The [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming.
#### 3. Encode the short link, not the destination
The symbology is defined in [ISO/IEC 18004:2024](https://www.iso.org/standard/83389.html), and [Thonky's capacity table](https://www.thonky.com/qr-code-tutorial/character-capacities) lists the limits: error correction M fits 42 bytes in version 3 and 122 in version 7, and each side is (version minus 1) times 4 plus 21 modules. A 29-character short link fits version 3. The same page with 4 UTM parameters runs 108 characters and needs version 7.
| Encoded URL | Characters | Level | Version | Capacity in bytes | Modules per side | Module width at 30 mm |
| --- | --- | --- | --- | --- | --- | --- |
| Short link | 29 | M | 3 | 42 | 29 | 0.81 mm |
| Short link, logo | 29 | H | 4 | 34 | 33 | 0.73 mm |
| URL with 4 UTMs | 108 | M | 7 | 122 | 45 | 0.57 mm |
| URL with 4 UTMs, logo | 108 | H | 10 | 119 | 57 | 0.46 mm |
*Byte-mode capacities from Thonky's tutorial. Widths assume a 30 mm symbol with a 4-module quiet zone on each side. Generators that mix encoding modes can land 1 version lower.*
Levels L, M, Q and H recover 7%, 15%, 25% and 30% of damaged data, as the [free QR code generator](https://www.trackrev.io/tools/qr-code-generator) page tabulates. A logo needs H, which lowers capacity, and at 30 mm the long URL's modules come out 30% smaller than the short link's.
#### 4. Test the printed proof
Print a proof at final size and scan it with an iPhone and an Android phone from where a person will stand, with a 4-module margin clear, dark modules on a light ground and a line saying what the scan delivers.
#### 5. Install the pixel and capture an email
On each redirect TrackRev appends a 36-character visitor UUID to the destination as `_vid`, reusing the one in the visitor's existing cookie or minting a new one. The pixel reads it on the first pageview, tying the click to the browser session. Call `identify` when the visitor gives an email: email joins a Stripe customer to the scan. On pages with Stripe Payment Links, the pixel also adds the visitor ID as `client_reference_id`.
Landing page
```
```
Set `data-requires-consent="true"` and the pixel waits for `window.trk.grantConsent()` from your banner. The redirect still logs the click server-side, so ask a lawyer where you need a prompt.
#### 6. Connect your billing system
In the Stripe Dashboard, create a read-only restricted key covering 4 resources: charges, customers, subscriptions and PaymentIntents. TrackRev polls every hour, or within seconds with the optional webhook, and also syncs Paddle, Polar and Lemon Squeezy. Revenue figures start on Starter at $39 a month, and the free plan stops at link tracking.
### Where the trail from scan to charge goes cold
| Break point | What happens | Repair |
| --- | --- | --- |
| Scan on a phone, buy on a laptop | No cookie crosses from phone to laptop | Capture an email on the phone visit |
| Safari Intelligent Tracking Prevention | Script-written storage is deleted after 7 days of Safari use without interaction (WebKit, 2020) | Bind an email within 7 days; the server-side click row stays |
| Hosted checkout | A Stripe Payment Link page (buy.stripe.com) can't read your cookie | Pass a client_reference_id up to 200 characters; a 36-character UUID fits |
| No pixel on the landing page | The _vid parameter arrives unread | Install the snippet on every landing page |
*Safari rule from the [WebKit tracking prevention post](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/); Stripe limit from its [tracking page for payment links](https://docs.stripe.com/payment-links/url-parameters).*
A scan in a shop followed by a purchase a month later outlives the cookie, so capture the email at signup instead of waiting for checkout. The [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the browser rules, and the [Payment Links guide](https://www.trackrev.io/blog/stripe-payment-links-attribution) shows how to carry the reference to the Stripe webhook.
### A worked example: three placements, one $59 plan
These figures are invented to show the arithmetic.
| Placement | Print cost | Scans | Trials | Customers | Monthly revenue | Scan to customer | Cost per customer |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Booth banner | $180 | 420 | 42 | 5 | $295 | 1.2% | $36 |
| Badge insert | $240 | 310 | 31 | 1 | $59 | 0.3% | $240 |
| Table tent | $60 | 95 | 19 | 6 | $354 | 6.3% | $10 |
| Total | $480 | 825 | 92 | 12 | $708 | 1.5% | $40 |
*Invented figures. Monthly revenue is customers times $59.*
Ranked by scans the banner leads, and ranked by revenue the table tent does: 19 of its 95 scans (20.0%, against 10.0% for the others) became trials, and 6 of those paid. The insert costs 24 times as much per customer as the tent. Samples this small prove little; the scan column alone would have funded the banner and passed over the tent.
### Choosing a QR code generator with tracking
A QR code tracker is a link tool with a QR button, so compare caps, scan history and reach past the click.
| Question | Bitly | Uniqode | TrackRev |
| --- | --- | --- | --- |
| Entry price | Free; Bitly Core $10 a month billed annually | Static free; dynamic from $9 a month, annual billing only | Free; Starter $39, Growth $99, Scale $199 a month |
| Free tier | 2 QR codes a month, unlimited scans | Unlimited static codes; 14-day trial of dynamic | 50 links, 1,000 tracked events a month |
| QR codes on paid plans | 5 on Bitly Core, 10 on Bitly Growth, 200 on Bitly Premium a month | Scan limits per plan, reset every year | Unlimited links and events |
| Higher tiers | Bitly Growth $29 a month annual or $35 monthly; Bitly Premium $199 annual or $300 monthly | Uniqode Core $49 a month | The same features on every paid plan; annual billing pays 9 months for 12 |
| Scan history | 30 days on Bitly Core, 4 months on Bitly Growth, 1 year on Bitly Premium | Not stated in its pricing FAQ | None listed in its plan features |
| Revenue per code | Not mentioned on the pricing page | Not mentioned in its pricing FAQ | Paid plans, via Stripe, Paddle, Polar or Lemon Squeezy sync |
| Fits when | Counts are enough | You need single sign-on and SOC 2 reporting | A scan has to end at a charge |
*Prices from each vendor's pricing page, October 2026: [Bitly](https://bitly.com/pages/pricing), [Uniqode](https://www.uniqode.com/pricing) and TrackRev's own.*
> **Check what happens to printed codes:** A dynamic code points at a redirect the vendor hosts. Uniqode's FAQ says its codes go inactive and stop redirecting after a cancellation or when the 14-day trial ends. Ask any vendor the same before printing.
### QR code tracking in TrackRev
Each link has a QR button that opens the [designer](https://www.trackrev.io/products/qr-code-designer), with PNG or SVG export up to 2,048 px. Each scan becomes a click with time, country, city, device, browser, OS, referrer and a bot flag. After printing you can change a campaign's destination, route phones and desktops to different pages, or expire a link by date or click count.
Links can run on your own domain with automatic SSL and 1 CNAME record. The Camera app shows the URL before anyone opens it, and the Federal Trade Commission's [December 2023 alert](https://consumer.ftc.gov/consumer-alerts/2023/12/scammers-hide-harmful-links-qr-codes-steal-your-information) tells people to check for misspelled or swapped letters, so go.yourbrand.com beats a generic shortener domain. The [branded short link guide](https://www.trackrev.io/blog/what-is-a-branded-short-link) covers the DNS.
With the pixel installed and a billing system connected, each paid charge is credited to the link that started the journey under last-touch, first-touch or linear credit, and renewals keep crediting the original click. Revenue needs a paid plan from $39 a month; the free plan shows scans and no revenue. See the [pricing page](https://www.trackrev.io/pricing).
A menu or Wi-Fi code needs only the free generator, and pasting a TrackRev link into it makes its static code trackable. TrackRev is the wrong tool when nobody buys online, or when the purchase happens in a shop or on a marketplace outside the 4 billing systems it reads.
### Frequently asked questions
**How do I track QR code scans?**
Encode a short link from a link tool and read its scan log. Each scan is 1 request, so the tool counts it, groups it by device and location, and forwards the visitor. A code holding a long URL can't be tracked at the scan.
**Can you track a static QR code?**
Only at the landing page. If the encoded URL carries utm_source, utm_medium and utm_campaign, Google Analytics 4 reports the sessions that load your site. Scans that never load the page leave no trace.
**Can you tell who scanned a QR code?**
Not as a person. A scan gives a timestamp, device, browser, approximate location and an anonymous visitor ID; a name appears only if the visitor later gives an email.
**How can I trace where a QR code leads before I open it?**
Read the link the camera shows before you tap; an iPhone opens it only on a tap. The FTC's December 2023 alert advises distrusting unexpected codes in email or text, and stickers placed over another code.
**How soon do scans and revenue appear in TrackRev?**
Scans appear within seconds. Revenue follows the billing sync, hourly by default and within seconds with the optional Stripe webhook.
**Is there a free way to track QR code scans?**
Within limits. Bitly's free plan allows 2 QR codes a month with unlimited scans, and TrackRev's free plan covers 50 links and 1,000 tracked events a month. Revenue reporting starts at $39 a month.
---
## Reditus alternatives: which one fits why you are leaving
URL: https://www.trackrev.io/blog/reditus-alternative
Published: 2026-07-15
Author: Muzahid Maruf
Reditus lists you on its marketplace only from the $399 Scale Up plan. Compared on price, billing systems and how they find affiliates: 5 alternatives.
The right Reditus alternative depends on which part of Reditus you pay for. Reditus runs affiliate and in-app referral programs for B2B SaaS and adds a network of 27,000+ affiliates. It costs $99 a month on annual billing ($149 monthly) for up to $60K of ARR, and the marketplace listing starts at the $399 Scale Up plan on a 12-month term. Rewardful, FirstPromoter and Tolt start lower, PartnerStack runs the larger marketplace, and TrackRev ranks partners against your other channels.
I run TrackRev, which is one of the five, and I judge it on the same terms, including where it loses. The two-way version is [Reditus vs TrackRev](https://www.trackrev.io/blog/reditus-vs-trackrev).
> **Key takeaways:**
>
> - Reditus Growth costs $99 a month on yearly billing ($149 monthly) for up to $60K of ARR, and its marketplace listing waits for Scale Up at $399 on a 12-month term.
> - Affiliates who bring in $12,000 a month at a 20% commission need Reditus Scale Up at $399, while Rewardful, FirstPromoter and Tolt cover that program at $99 and TrackRev Starter at $39.
> - Reditus reaches Paddle through an API that its own page puts at about 4 hours of developer work, against 30 to 60 minutes for Stripe, so billing outside Stripe is a reason to compare.
> - TrackRev gives up the network, AI affiliate search and automated payouts. In return it starts at $39 against Reditus's $99, has no annual term and ranks partners against ads, SEO and email.
### What Reditus costs and what each plan includes
[Reditus's pricing page](https://getreditus.com/pricing) sells 3 plans, plus a 14-day Growth trial that needs no card and replaced the old free plan.
| Plan | Price a month | ARR covered | Extras | Marketplace listing | Term |
| --- | --- | --- | --- | --- | --- |
| Growth | $99 yearly, $149 monthly | $60K | 1 AI affiliate search a month | No | Monthly or 12 months |
| Scale Up | $399 | $360K | Vetted database, 5 AI searches | Yes | 12 months |
| Enterprise | From $799 | Unlimited | Named customer success manager | Yes | 12 months |
*Prices from Reditus's pricing page and help center, October 2026. European visitors see euros at the same numbers.*
Each cap counts ARR from referrals and affiliates combined. At $60K that is $5,000 a month of recurring revenue, so a program that outgrows it jumps from $99 to $399 a month. Automated payouts come with every plan: Reditus charges your card or invoices you, then pays affiliates through PayPal or IBAN, for a fee of 5% on card payments or 2% on invoices. A Featured Listing that pins you to the top of the marketplace is $150 a month.
### Why teams look for a Reditus alternative
The network is the expensive part. Reditus Growth includes a limited database, and the listing in front of 27,000+ B2B SaaS affiliates needs Scale Up, which makes the entry price for the network $4,788 a year against $1,188 for Growth on yearly billing. One help article says listings start at Growth, while the pricing page and its [pricing help](https://getreditus.com/help/reditus-pricing) say Scale Up, so get the plan in writing before you buy.
Billing outside Stripe takes developer time. Reditus sizes a full Stripe setup at 30 to 60 minutes, and sends every other processor, Paddle and Chargebee included, through its Payments API. [Its Paddle page](https://getreditus.com/paddle-affiliate-program-software) puts that route at about 4 hours, limits coupon-code tracking to Stripe, and says partial refunds are unsupported there: any refund rejects the whole commission.
[Reditus's installation guide](https://getreditus.com/help/full-installation-guide) says it supports only B2B SaaS companies, and it tracks 2 channels, affiliates and in-app referrals. I found no report on its pricing page or in its help center that ranks them against ads, SEO or email, so a team asking which channel pays the most MRR needs a second tool.
### 5 alternatives compared on price, billing and recruiting
| Tool | Entry price a month | Entry limit | Billing systems | Finding affiliates |
| --- | --- | --- | --- | --- |
| Reditus | $99 yearly ($1,188), $149 monthly | $60K ARR | Stripe, others through its Payments API | Marketplace from Scale Up |
| PartnerStack | $1,000 Launch, $1,520 Growth | Not published | Not published | Marketplace on every plan |
| Rewardful | $49, or $490 a year | $7,500 revenue a month | Stripe, Paddle | Affiliate Finder search |
| FirstPromoter | $49, or $490 a year | $5,000 revenue a month | Stripe, Paddle, Chargebee, Recurly, Braintree | Not listed |
| Tolt | $69 | $10,000 earned a month | Stripe, Paddle, Chargebee | Not listed |
| TrackRev | $39, or $351 a year | $10,000 of commission a month | Stripe, Paddle, Polar, Lemon Squeezy | None, recruiting is outbound |
*Prices from each vendor's pricing page, October 2026. Rewardful, FirstPromoter and Tolt meter revenue, Reditus meters ARR, and TrackRev meters the commission paid out. All four paid tools offer 14-day trials, and Reditus, FirstPromoter and Tolt ask for no card.*
#### The same program on each plan
Take affiliates who bring in $4,000 and then $12,000 a month of recurring revenue at a 20% commission rate. Reditus reads those as $48K and $144K of ARR, and TrackRev's meter reads $800 and $2,400 of commission against its $10,000 Starter limit.
| Tool | $4,000 a month | $12,000 a month |
| --- | --- | --- |
| Reditus | Growth, $99 | Scale Up, $399 |
| PartnerStack | Launch, $1,000 | Launch, $1,000 |
| Rewardful | Starter, $49 | Growth, $99 |
| FirstPromoter | Starter, $49 | Business, $99 |
| Tolt | Basic, $69 | Growth, $99 |
| TrackRev | Starter, $39 | Starter, $39 |
*Cheapest plan whose published limit covers the revenue, at list monthly prices. Reditus Growth is $99 on yearly billing and $149 monthly, and Scale Up is yearly only. I multiplied monthly revenue by 12 to compare it with Reditus's annual cap.*
At $4,000 the plans run from $39 to $99, and at $12,000 from $39 to $399. Reditus is the only one that asks for a 12-month commitment at that size. TrackRev stays at $39 until partners earn $10,000 of commission in a month, which at 20% is $50,000 of referred revenue and $600K of ARR. Reditus would put that program on Enterprise, from $799 a month.
### PartnerStack, for recruiting at volume
[PartnerStack](https://partnerstack.com/pricing) shows no prices in its plan cards, but the pricing data behind the page lists Launch at $1,000 a month and Growth at $1,520 on a yearly term, with Enterprise on custom pricing. Launch includes marketplace access, and its [homepage](https://partnerstack.com) claims 115,000+ active partners and 600+ B2B brands. Go with it over Reditus when recruiting volume matters more than the bill, which at $1,000 a month is about ten times the $99 Reditus Growth rate. See [PartnerStack vs TrackRev](https://www.trackrev.io/blog/partnerstack-vs-trackrev).
### Rewardful, for a Stripe-first tool
[Rewardful](https://www.rewardful.com/pricing) meters affiliate-attributed revenue. Rewardful Starter costs $49 for $7,500 a month with 1 campaign and 2 team members, Rewardful Growth costs $99 for $15,000, and Rewardful Enterprise starts at $149 and covers $30,000 on its entry tier. Every plan has a 0% transaction fee, coupon tracking and self-referral detection, and the branded portal and custom domain wait for Growth. Instead of a marketplace it has an Affiliate Finder that searches the web and spends 1 credit each time you reveal a result. It fits when referred revenue stays under $7,500 a month and you would rather recruit affiliates yourself. See [Rewardful vs TrackRev](https://www.trackrev.io/blog/rewardful-vs-trackrev).
### FirstPromoter, for more billing systems
[FirstPromoter's](https://firstpromoter.com/pricing) Starter plan is $49 for $5,000 a month of affiliate revenue, 1,000 affiliates and 3 campaigns. FirstPromoter Business is $99 for $15,000 with unlimited affiliates and campaigns plus a custom domain, and FirstPromoter Enterprise is $149 beyond that. Its billing list covers Stripe, Paddle, Chargebee, Recurly and Braintree, and Reditus sends every one of those except Stripe through its API. Every plan has multi-tier commissions across up to 3 levels, mass payouts by PayPal, Wise, Stripe, crypto or bank transfer, and W-9 and W-8BEN collection, while Managed Auto Payouts sit on Enterprise. Take it when billing runs through Recurly or Braintree, or when affiliates should earn on the partners they recruit.
### Tolt, for a $69 start and payouts that file 1099s
[Tolt](https://tolt.com/pricing) prices on revenue earned from affiliates. Tolt Basic is $69 for $10,000 a month with manual payouts, Tolt Growth is $99 for $20,000, and Tolt Pro is $199 for $50,000. Growth sends the money through PayPal, Wise, local bank, crypto or wire at a 2% processing fee, creates invoices for affiliates, collects W-9 and W-8 forms and files 1099s. It lists Stripe, Paddle and Chargebee. It suits a US-heavy program that wants tax paperwork handled and stays under $20,000 a month. See [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev).
### TrackRev, for partner revenue next to every other channel
TrackRev Starter costs $39 a month, and every paid plan includes the affiliate program, link tracking and revenue attribution. Starter meters up to $10,000 of partner commission a month in 1 workspace, TrackRev Growth is $99 for $100,000 across unlimited workspaces, and TrackRev Scale is $199. Annual billing charges for 9 months and gives 12, so Starter is $351 a year. Revenue syncs from Stripe, Paddle, Polar and Lemon Squeezy. Commissions can be recurring, one-time or multi-tier, paid as cash or credit, held for 0 to 180 days per program (the default is 0) and reversed on refunds and disputes. Partners get a white-label portal and upload W-9 or W-8 forms when they join.
A partner's link is a tagged TrackRev link, so one channel report ranks affiliates, newsletter, YouTube and paid ads by MRR under 3 credit rules: last-touch, first-touch or linear. The [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows it. The free plan covers link tracking only, at 50 links and 1,000 tracked events a month, and the affiliate program and revenue figures start on Starter.
TrackRev has no marketplace or affiliate database, so recruiting is outbound. Payouts are a PayPal or Wise CSV that you send and mark paid, where Reditus pays for you at a 2% or 5% fee. I found no in-app referral widget in TrackRev's product pages, while Reditus ships one. Choose TrackRev when partners are 1 channel of several, when you bill through Paddle, Polar or Lemon Squeezy, or when Reditus's $99 yearly floor is too much for a small program.
### Where Reditus is still the better pick
Reditus wins when finding affiliates is the bottleneck. Its Scale Up listing, vetted database and 5 monthly AI searches exist to fill a program that has few partners, and TrackRev offers none of them. It also fits when you want someone else to run the payouts or an in-app referral widget beside the affiliate program. Annual plans include free white-glove migration with a 30-day cookie transition window, and Reditus sells managed launch, recruitment and management services. If affiliates are the only channel you will measure, TrackRev's attribution sits unused.
### Moving a program off Reditus
- Time it to your term. Growth on monthly billing cancels anytime, while annual plans run 12 months and stay active until the period ends, so check your renewal date first.
- Export your affiliates. TrackRev's import wizard has a Reditus preset that reads a CSV with an email per affiliate, reuses referral codes as link codes, and writes each unpaid balance as 1 carried-over commission, with past clicks, sales and revenue as opening balances. I found no Reditus documentation of a self-serve export, so ask its support for the file.
- Connect billing and add TrackRev's tracking beside Reditus's script. Run both through your cookie window, which Reditus says is typically 30 to 90 days, and pay each commission from 1 system only.
- Settle the cycle. Reditus creates payouts on the 1st of each month, and with manual payouts you get 1 month to process them, so finish that cycle before you cancel.
- Ask affiliates to replace links that point at Reditus, then remove its script from your site header or Google Tag Manager, along with the `gr('track', 'conversion')` sign-up snippet.
### Check these before you cancel Reditus
Run one test purchase through your real checkout. Click a test affiliate's link, pay with the [Stripe test card](https://docs.stripe.com/testing) 4242 4242 4242 4242, confirm the commission lands on that affiliate, then refund it and confirm it reverses. [Reditus's payment tracking guide](https://getreditus.com/help/end-to-end-payment-tracking-revenue-commissions) says full refunds reverse a commission and partial refunds shrink it in proportion on its Stripe connection, so match that. TrackRev reverses refunds and disputes from Stripe webhooks, and the [refunds and upgrades post](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) covers the edge cases.
Ask how the tool remembers the click. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Safari Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without user interaction, so a script-written cookie from a day-1 click can be gone by a day-9 purchase. [Reditus's tracking script guide](https://getreditus.com/help/installing-the-tracking-script) says a click places a cookie named gr_id for a duration you set, and it does not say whether a script or a server writes it, so ask. TrackRev logs the click on the server at the tracked redirect, and the [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers what that changes for SaaS conversions.
TrackRev's free tier is enough to test redirects and click logging, while the affiliate program starts on Starter at $39. [Pricing](https://www.trackrev.io/pricing) lists the plans.
### Frequently asked questions
**What is the best Reditus alternative?**
None wins on every axis. PartnerStack has the largest marketplace and starts at $1,000 a month. Rewardful, FirstPromoter and Tolt give up the network for entry prices of $49, $49 and $69. TrackRev gives up the network and automated payouts for a $39 start and attribution across ads, SEO and email.
**Does Reditus have a free plan?**
No. A 14-day Growth trial with no card replaced it. TrackRev's free plan stops at link tracking, so testing a partner program there means starting Starter at $39.
**Is there a Reditus alternative with an affiliate marketplace?**
PartnerStack is the clear one, with marketplace access on every plan. Rewardful's Affiliate Finder crawls the open web for prospects, and Rewardful's own FAQ says it is not a marketplace.
**Does Reditus work with Paddle?**
Not natively. Reditus connects to Stripe directly and sends every other processor through its API, which its own Paddle page says takes about 4 hours of developer work. TrackRev reads Paddle Billing and Paddle Classic revenue through its pixel, a webhook and one line in your checkout config.
**How much do Reditus automated payouts cost?**
Paying $5,000 of affiliate commissions costs $250 by card at 5%, or $100 by invoice at 2%, on top of the plan price. Tolt's Growth plan charges 2% for its own automated payouts.
**Does the Reditus tracking script need a cookie consent banner?**
Reditus says no under Dutch law: its help center cites Article 11.7a of the Telecommunications Act and says the cookie builds no visitor profile. It also says rules differ by country, so treat that as the vendor's position and ask your own counsel.
**How much do Reditus's managed services cost?**
The pricing page lists a launch package from $2,500 once, a recruitment campaign from $2,500 a month on a 3-month minimum, and done-for-you management from $3,500 a month. The help center gives $2,750 a month with a 6-month minimum for management, so confirm which applies before you sign.
**Can I run Reditus and TrackRev together?**
Yes, with one gap: partner clicks on Reditus links never pass through TrackRev, so its channel report cannot show partner revenue. Revenue for your other channels needs a paid plan, because the free plan shows clicks only.
---
## Reditus vs TrackRev: an affiliate network or one revenue view across channels
URL: https://www.trackrev.io/blog/reditus-vs-trackrev
Published: 2026-07-28
Author: Muzahid Maruf
Reditus lists you on its 27,000-affiliate network from $399 a month; TrackRev starts at $39 with no network. Prices, tracking, billing and payouts compared.
Reditus vs TrackRev comes down to whether finding affiliates or measuring them is your bottleneck. Reditus runs affiliate and in-app referral programs for B2B SaaS and adds a network of 27,000+ affiliates. It costs $99 a month on yearly billing ($149 monthly) for up to $60,000 of ARR. TrackRev starts at $39 a month with link tracking and revenue attribution included, and it has no network.
I run TrackRev, so it gets the same scrutiny as Reditus. Reditus figures come from its pricing page and help center in October 2026, and more options are in [Reditus alternatives](https://www.trackrev.io/blog/reditus-alternative).
> **Key takeaways:**
>
> - Reditus Growth runs $99 a month on yearly billing ($149 monthly) for up to $60,000 of ARR, and marketplace listing needs Scale Up: $399 a month on a 12-month term. TrackRev Starter is $39.
> - Reditus replaced its free plan with a 14-day trial of Growth. TrackRev's free tier covers 50 links and 1,000 events a month, so partner programs start at Starter.
> - Paddle reaches Reditus through its Payments API, a job Reditus estimates at 4 hours. TrackRev connects Stripe, Paddle, Polar and Lemon Squeezy with read-only keys.
> - Reditus automates payouts for a 2% to 5% fee, while TrackRev payouts are manual. TrackRev ranks partners beside newsletter, YouTube and ad clicks by MRR.
### Reditus vs TrackRev at a glance
| Question | Reditus | TrackRev |
| --- | --- | --- |
| Built for | B2B SaaS only: affiliates plus in-app referrals | SaaS affiliate programs, link tracking and revenue attribution |
| Entry price | $99 a month yearly, $149 monthly | $39 a month, $351 a year |
| Free plan | None, a 14-day Growth trial | Link tracking only: 50 links, 1,000 events a month |
| Plan limit | $60,000 ARR on Growth, $360,000 on Scale Up | $10,000 of commission a month on Starter, $100,000 on Growth |
| Affiliate network | 27,000+ claimed, listing from Scale Up | None |
| Billing connections | Stripe natively, others through an API | Stripe, Paddle, Polar, Lemon Squeezy, Creem, Dodo Payments |
| Reports cover | Affiliates and customer referrals | Every tracked link, ranked by MRR |
| Referral widget in your app | Yes, JWT-authenticated, 8 languages | Yes, a script tag with a publishable key |
| Terms | Growth monthly cancels anytime, other plans run 12 months | Monthly, or yearly at 9 months for 12 |
*Prices from each vendor's pricing page, October 2026.*
### What Reditus costs against TrackRev
[Reditus's pricing page](https://getreditus.com/pricing) sells 3 plans. Growth's $60,000 cap is $5,000 of monthly recurring revenue, and yearly billing makes it $1,188, which is $600 (4 months) cheaper than $1,788 monthly. Scale Up is $399 a month for up to $360,000 of ARR, sold only as a 12-month plan ($4,788), and adds a Dedicated Account Manager and Priority Slack Connect. Enterprise starts at $799 a month ($9,588 a year) with unlimited ARR.
TrackRev meters commission instead of ARR. Starter covers 1 workspace, Growth at $99 ($891 a year) raises the limit to $100,000 of partner commission a month with unlimited workspaces, and Scale at $199 ($1,791 a year) removes the ceiling. Sale revenue is never capped, and every paid plan includes the whole product.
#### Four program sizes on each plan
Take partners who bring in recurring revenue at a 25% commission. I multiplied monthly revenue by 12 to compare it with Reditus's ARR cap, and TrackRev meters the commission itself.
| Partner-referred MRR | ARR | Reditus plan, yearly cost | Commission a month | TrackRev plan, yearly cost |
| --- | --- | --- | --- | --- |
| $2,500 | $30,000 | Growth, $1,188 | $625 | Starter, $351 |
| $7,500 | $90,000 | Scale Up, $4,788 | $1,875 | Starter, $351 |
| $30,000 | $360,000 | Scale Up, $4,788 | $7,500 | Starter, $351 |
| $50,000 | $600,000 | Enterprise, from $9,588 | $12,500 | Growth, $891 |
*Yearly billing at list prices. Reditus Growth costs $1,788 a year when billed monthly.*
TrackRev stays at $39 until partners earn more than $10,000 of commission in a month, which at 25% means more than $40,000 of referred revenue a month. The Reditus premium buys things TrackRev lacks: the network, payouts run for you and paid services from Reditus's team.
#### Reditus add-ons and services
| Add-on | Price | Terms |
| --- | --- | --- |
| Featured Listing | $150 a month | Pins your program to the top of the marketplace |
| Program Launch Package | From $2,500 once | 6-week guided launch |
| Recruitment campaign | From $2,500 a month | 3-month minimum, pitched as 25 to 50 qualified affiliates in 90 days |
| Done-for-you management | From $3,500 a month | The pricing help page says $2,750 with a 6-month minimum |
| Complex migration | From $1,500 | Multi-brand moves; standard migrations are free on annual plans |
*Prices from Reditus's pricing page and pricing help, October 2026.*
> **Get the marketplace plan in writing:** Reditus's pricing page and [pricing help](https://getreditus.com/help/reditus-pricing) put the marketplace listing on Scale Up, $399 a month on a 12-month term. Its [listing guide](https://getreditus.com/help/how-to-get-listed-in-the-reditus-marketplace) says listing starts at Growth. Ask which applies before you pay.
### Finding affiliates: Reditus's network against outbound recruiting
The network is the reason to pick Reditus. Scale Up lists your program to the affiliates already on the platform and adds a vetted affiliate database, full AI affiliate database access, 5 AI searches a month and public campaigns. Growth gets 1 AI search a month and a limited database.
Reditus puts the network at 27,000+ affiliates on its pricing page, 26,000+ on its Paddle page and 15,000+ in its listing guide, and says 200+ B2B SaaS teams use it. All of these are vendor figures, so ask how many affiliates are active in your category.
TrackRev has no marketplace or affiliate database, so you invite partners and approve applications yourself, as the [guide to creating an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) explains. With a handful of partners and no prospect list, that favors Reditus.
### How each tool tracks a referral
Reditus tracks with a script placed before the closing head tag on every page, the sign-up page included, and Google Tag Manager works. A click on an affiliate link sets a cookie named gr_id for 30 to 90 days in typical programs, and a conversion snippet fires once at sign-up. [Its docs](https://getreditus.com/help/installing-the-tracking-script) say the script places the cookie but not whether JavaScript or a server response writes it, and that matters on Safari, where [WebKit says](https://webkit.org/tracking-prevention/) Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without user interaction. Test a buyer who clicks on day 1 and signs up on day 9, and read the [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) for what survives.
TrackRev logs the click on its own server at the tracked redirect and carries a click ID through checkout. A read-only billing key joins each paid charge to that click by customer email, and the attribution window is adjustable.
### Billing systems and refunds
Stripe is the only native Reditus connection. [Reditus's setup guide](https://getreditus.com/help/reditus-integration-effort-setup-time) gives 5 minutes for the Stripe OAuth link, 5 to 10 for the tracking script and 30 to 60 for the full integration. Paddle, Chargebee and every other processor go through the Payments API, which [Reditus's Paddle page](https://getreditus.com/paddle-affiliate-program-software) sizes at about 4 hours of developer time. That route has no coupon-code tracking and no partial refunds, so any refund rejects the entire commission, while [its payment tracking guide](https://getreditus.com/help/end-to-end-payment-tracking-revenue-commissions) says partial refunds on Stripe shrink a commission in proportion.
TrackRev reads Stripe (Stripe Connect accounts included), [Paddle](https://www.trackrev.io/integrations/paddle), Polar and Lemon Squeezy with read-only keys, plus Creem and Dodo Payments. The first Stripe sync backfills 90 days of paid charges, and refunds and chargebacks reverse the partner's commission. Coupon codes are credited from Stripe, Paddle and Polar orders but not Lemon Squeezy, and there is no Chargebee connector.
### Commissions and payouts
| Payout detail | Reditus | TrackRev |
| --- | --- | --- |
| Who sends the money | Reditus on automated payouts, otherwise you | You, from a PayPal or Wise export |
| Fee | 5% by card, 2% by invoice on automated payouts | None from TrackRev |
| Cycle | Monthly, created on the 1st | Weekly, every 2 weeks, monthly, quarterly or manual |
| Hold before payout | Not stated in its payouts article | 0 to 180 days, default 0 |
| Payment threshold | Not stated in its payouts article | You set it, default $100, smaller balances roll over |
| Partner payout methods | PayPal or IBAN | PayPal, Payoneer, Wise, wire, ACH, WebMoney |
| Tax paperwork | Not stated in its payouts article | W-9 or W-8 upload at partner signup |
*Reditus help center and TrackRev program settings, October 2026.*
Reditus's pricing page lists automated payouts on every plan, while its [automated payouts article](https://getreditus.com/help/how-do-automated-payouts-work-at-reditus) limits them to Scale Up, so confirm before you buy. At $7,500 of referred MRR, commissions run $1,875 a month, so letting Reditus pay them costs $93.75 by card or $37.50 by invoice. That is $1,125 or $450 a year on top of Scale Up, for totals of $5,913 or $5,238 against $351 on TrackRev Starter. TrackRev payouts are manual today and [its docs](https://doc.trackrev.io/affiliate/payouts) put automatic ones on the roadmap: you pay everyone from one export and mark each payout paid with its reference. Its program currency is USD only, and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers the tax side.
### Measuring affiliates against your other channels
[Reditus's reporting guide](https://getreditus.com/help/affiliate-program-reporting-analytics-saas) covers clicks, sign-ups, trials, paid conversions, MRR, revenue per click and churn by affiliate plus a leaderboard, and credits each customer to the first affiliate who referred them. I found no report ranking affiliates against ads, SEO or email.
TrackRev tags partner links like any other link, so a partner sits in the same [channel report](https://www.trackrev.io/products/channel-analytics) as your newsletter, YouTube and paid campaigns, ranked by MRR under 3 credit rules: last click (the default), first click or every click equally.
### Referral widgets inside your product
Both tools embed a referral widget. [Reditus's guide](https://getreditus.com/help/how-to-set-up-the-in-app-referral-program-full-guide) describes a JWT from your backend, 8 languages and advocate.created, lead.created and reward.created webhooks. [TrackRev's docs](https://doc.trackrev.io/affiliate/referral-widget) describe a script tag with a publishable key that enrolls each signed-in user, with signups reported from your backend.
### Which one fits your situation
| If this is true | Pick | What decides it |
| --- | --- | --- |
| Finding affiliates is the bottleneck | Reditus | Network listing and 5 AI searches a month |
| You want payouts run for you | Reditus | Automated, fees on top of the plan |
| You want payout periods other than monthly | TrackRev | Weekly, every 2 weeks, quarterly or manual |
| Your billing runs through Chargebee | Reditus | Payments API, no TrackRev connector |
| Partners must be ranked against other channels | TrackRev | Same report as newsletter and ads |
| You bill through Paddle, Polar or Lemon Squeezy | TrackRev | Direct connection, no API work |
| The budget is under $99 a month | TrackRev | $39 Starter, no 12-month term |
| You want QR codes and custom domains too | TrackRev | Included on every paid plan |
### Moving between the two
Going from Reditus to TrackRev, the import wizard has a Reditus preset that reads a CSV of your affiliates. It carries over affiliates, referral links and commissions owed. Old links still point at Reditus, so partners swap them, and annual Reditus plans run 12 months, so time the cancellation. In the other direction, Reditus says it migrates programs free on annual plans and that affiliates keep their links.
TrackRev's free plan tests redirects and click logging. The affiliate program starts on Starter at $39 a month, and [pricing](https://www.trackrev.io/pricing) lists every plan.
### Frequently asked questions
**Is Reditus or TrackRev cheaper?**
TrackRev. Reditus Growth costs $837 a year more than TrackRev Starter on yearly billing and $1,320 more on monthly billing. A program with $12,000 of referred monthly revenue is $144,000 of ARR, which is past Growth's $60,000 cap and needs Scale Up at $399 a month, while its $3,000 of commission at 25% sits far under TrackRev's $10,000 Starter limit.
**Does Reditus have a free plan?**
No. A trial with no credit card replaced it. TrackRev's free plan stops at link tracking, so trying its affiliate program means starting Starter.
**Does Reditus work with Paddle?**
Through its Payments API, not natively. Reditus tells Paddle users to budget about 4 hours of engineering.
**Which tool pays affiliates automatically?**
Reditus does. It bills your card or an invoice, then pays through PayPal or IBAN. TrackRev records payouts, and you settle them from a PayPal or Wise export.
**Can Reditus show affiliates next to my ads and newsletter?**
Its documented reports cover affiliates and customer referrals and credit each customer to the first affiliate. TrackRev tags every link, so partners sit among your other campaigns in one ranking.
**Can I run Reditus and TrackRev together?**
Yes, with a gap. Clicks on Reditus affiliate links never pass through a TrackRev redirect, so those partners are missing from TrackRev's channel report. Reditus credits the first affiliate and TrackRev the last click by default, so pay each commission from one system.
---
## 12 Referral Program Examples and What Each One Pays
URL: https://www.trackrev.io/blog/referral-program-examples
Published: 2026-10-02
Author: Muzahid Maruf
12 referral program examples checked against each company's own page in October 2026: what Dropbox, Mercury, Shopify and others pay, and what to copy.
These 12 referral program examples were checked against each company's own help or program page in October 2026. The rewards run from Dropbox's storage bonuses and Robinhood's stock milestones to Shopify's 4-year partner revenue share and a $1,500 bonus Mercury pays accounting firms. Ahrefs ended its affiliate program, Notion closed its own to new members and Airbnb ended guest referrals. They stay in because programs do change, and Ahrefs explained why it ended its own.
Referral programs and affiliate programs share a unique link, a tracked conversion and a payout. They differ in who is asked, and in B2B the two overlap.
> **Key takeaways:**
>
> - Ten of the 11 programs that state a trigger pay only once the referred customer's money moves. Dropbox is the exception, paying in storage after activation.
> - Programs for advisers pay longer than programs for friends: 4 years of revenue share at Shopify and up to 3 at HubSpot, against 12 months for HubSpot's affiliates.
> - Ahrefs shut its program over billing upkeep and because 3% of affiliates sent 90% of leads, so check how a tool tracks plan changes before you launch.
> - On a $29 plan with an 80% margin, a 20% recurring reward for 12 months costs $63.80, a quarter of the $255.20 gross profit.
### Referral program examples at a glance
| Program | Referrer earns | Friend gets | Paid when |
| --- | --- | --- | --- |
| Dropbox | 500 MB each on Basic (16 GB ceiling); 1 GB each on Plus, Family and Professional (32 GB ceiling) | 500 MB | Friend signs up by link, installs the app, logs in and verifies an email |
| Robinhood | Stock bonuses of $50, $150, $800, $4,000 and $10,000 at 1, 3, 10, 50 and 200 referrals ($15,000 yearly cap) | A separate sign-up stock reward | Friend opens an account and deposits more than $0 |
| Wise | A reward that varies by region, shown on the member's invite page | A free transfer, or a choice of free transfer or free card | Friend sends an international transfer or spends on a Wise Multi-Currency Card |
| Mercury (customers) | $250 | $250 and a faster application review | Friend holds $10,000 in its first 90 days |
| Webflow | 50% revenue share on a 12-month term | None | New customer's first paid subscription |
| HubSpot (affiliates) | 30% recurring commission on a 1-year term | None | Referred customer buys inside a 180-day cookie window |
| Shopify | 20% of the subscription fee plus 0.1% of eligible sales for 4 years; $2,500 for a Plus referral | Not stated | Client's store transfers and the merchant subscribes |
| HubSpot (partners) | 20% revenue share on a 3-year term | Not stated | Shared deal is registered and closed |
| Mercury (accountants) | $1,500 per client: $1,000 plus $500 | Not stated | Client deposits $50,000, or spends $10,000 on cards, in 90 days |
| Airbnb (hosts) | Cash that varies by location and listing type, plus milestone bonuses on home referrals | Not stated | New host completes a booking worth $100 (home) or $50 (experience, service) in 180 days |
| Notion (closed to new) | Up to $50 per activated sign-up plus 20% of year-one revenue | None | Workspace upgrades to a paid plan in 180 days |
| Ahrefs (discontinued) | No public terms | None | Not applicable |
*Reward terms from each company's own help or program page, October 2026.*
### Consumer and product-led referral programs
#### Dropbox: storage as the reward
Dropbox pays for an invitation in storage, a reward it can hand out without paying cash. A Dropbox Basic user earns 500 MB per referral and tops out at 16 GB, Plus, Family and Professional users earn 1 GB per referral and top out at 32 GB, and the invitee starts with 500 MB extra. Team accounts can't send referrals. Per [Dropbox's referral help page](https://help.dropbox.com/accounts-billing/space-storage/earn-space-referring-friends), nobody is credited until the invitee has signed up through the link, installed the app, logged in to the desktop app and verified an email address. Registering from the same computer as the referrer makes a referral ineligible.
Both ceilings equal 32 referrals (16 GB at 500 MB, 32 GB at 1 GB), so every plan maxes out at the same point while paying customers get the bigger prize.
#### Robinhood: bonuses that jump at milestones
Robinhood's Tiered Referrals Program pays in stock at 5 milestones: $50 for the 1st referral, $150 at 3, $800 at 10, $4,000 at 50 and $10,000 at 200. Each bonus is paid once as the milestone is reached, so a member at 10 referrals has collected $1,000 ($50 + $150 + $800), and all 5 together come to $15,000, the yearly limit. A referral counts when a new US customer opens an account and funds it with a deposit above $0. Rewards must be claimed within 60 days, and the invitee may get a separate sign-up stock reward. The [program page](https://robinhood.com/us/en/support/articles/invite-friends-pick-stock/) applies this schedule to referrals that begin signing up on or after September 1, 2026.
Nothing is paid between milestones, so a member at 9 referrals has a plain reason to find a 10th.
#### Wise: a free transfer for the friend, a reward on spend
Wise assigns each member one of several regional invite programs, so no single reward figure applies. The [standard program's help page](https://wise.com/help/articles/77zvWSO4tKdGobXrgHIJAA/how-does-the-standard-invite-program-work) gives a new user a free transfer, or a choice between a free transfer and a free card, and rewards the member once that user qualifies, usually by sending an international transfer between different currencies or spending on a Wise Multi-Currency Card. ATM withdrawals, gift vouchers, gambling and crypto purchases don't count, and an unclaimed reward expires after 1 year. The new user's discount applies even if they never spend enough to qualify the member, so the offer a stranger sees is unconditional and the referrer's reward waits for spend.
### B2B and SaaS referral programs
#### Mercury: $250 each, tied to a $10,000 balance
Mercury pays $250 to the referrer and $250 to the new business once that business holds at least $10,000 for 1 full business day inside its first 90 days. The new business also gets an expedited application review. The [help article](https://support.mercury.com/hc/en-us/articles/28772343724308-Earning-referral-bonuses-for-Mercury-business-accounts) adds that the company must be net new, must open its account through the referrer's link, and can't be owned by the referrer.
The Referrals page moves each company through 5 statuses (Started, Applied, Account opened, Paid, Expired). Mercury's [referral agreement](https://mercury.com/legal/referrals) bans self-referrals and lets Mercury cap, withhold or claw back payments for abuse.
#### Webflow: 50% for 12 months, with agencies sent elsewhere
Webflow's [affiliate program](https://affiliates.webflow.com) pays a 50% revenue share on a new customer's first subscription, for 12 months of an active monthly plan or on one annual purchase. Attribution is first-touch with a 90-day cookie, and affiliates register with PartnerStack to collect payouts. Pro affiliates add 10% for 12 more months when the customer renews after year one, and Premium affiliates add 15%. Against the 20% median B2B SaaS commission in [TrackRev's benchmark tables](https://www.trackrev.io/data/affiliate-program-benchmarks), 50% is 2.5 times the going rate.
The program pays nothing on one-to-one referrals, so a client's purchase earns their freelancer no commission, and agencies that build Webflow sites go to the Certified Partner Program.
#### HubSpot affiliates: 30% recurring, with tiers by volume
HubSpot's [affiliate program](https://www.hubspot.com/partners/affiliates) pays 30% recurring commission across a 1-year term, with a 180-day cookie window, no sales minimum and no need to be a HubSpot customer. The page says a single sale can pay $1,000 or more and lists 3 tiers by monthly sign-ups: Starter at 0 to 29, Sprocket at 30 to 99 and Elite at 100 or more, where commission becomes custom. Only 7% of programs in the same benchmark tables use a cookie window of 180 days or longer.
Volume tiers give a small affiliate a reason to grow and give HubSpot a place to move its biggest ones onto negotiated terms.
### Client and agency referral programs
The referrers in these 3 programs are accountants, agencies and implementation partners, who do part of the selling, and the pay is larger and lasts longer than in the consumer programs above.
#### Shopify Partners: 4 years of revenue share
A Shopify Partner who builds a store and transfers it to a merchant earns 20% of the merchant's monthly subscription fee plus 0.1% of the merchant's eligible monthly sales (GMV), each for 4 years, according to Shopify's [partner earnings reference](https://help.shopify.com/en/partners/how-to-earn). The two pieces run on separate clocks that start at each one's first payment. Earnings are calculated on fees the merchant paid after discounts and credits, and eligible GMV means online consumer sales up to $100 million a year.
A hypothetical merchant paying $100 monthly earns the partner $20, or $960 over the term. Add $50,000 of monthly eligible sales and the 0.1% share contributes another $50, so the same client yields $70 a month, $3,360 over 48 months. A straight referral pays once: $2,500 for a new Plus or Enterprise merchant and $500 for POS Pro. A Plus referral also needs a merchant that hadn't contacted Shopify Sales, has sold more than $5,000 in GMV and has paid its first Plus invoice, and an existing merchant who upgrades to Plus pays $2,500 too.
#### HubSpot Solutions Partners: 20% for 3 years
HubSpot's [deal-based commission page](https://www.hubspot.com/deal-based-commissions) gives Solutions Partners 20% of revenue across a 3-year term. The partner creates a shared deal in HubSpot, the deal has to close, and it must include Marketing Hub, Sales Hub, Service Hub, Content Hub or Operations Hub at the Professional or Enterprise level. Net-new sales, cross-sells and upsells all qualify. Upmarket assisted deals above $3,000, open to partners with CRM implementation accreditation, pay 20% for 1 year plus credit toward the partner's tier.
Compare HubSpot's affiliate terms: an affiliate who sends traffic earns 30% for 1 year, while a partner who registers and closes the deal earns 20% for 3. On $1,000 of monthly subscription revenue that is $3,600 against $7,200, assuming the customer stays the full term.
#### Mercury Advisor Portal: $1,500 per client
Accounting firms refer clients to Mercury from an Advisor Portal and earn as much as $1,500 per eligible client, according to [Mercury's help center](https://support.mercury.com/hc/en-us/articles/36209705827220-How-do-Mercury-Advisor-Portal-referrals-and-bonuses-work). A $1,000 deposit bonus is earned when the client deposits $50,000 within 90 days of approval. A $500 card bonus is earned when the client is approved for a Mercury IO credit card and spends $10,000 across its debit and IO cards in the first 90 days.
Against the qualifying deposit, the accountant's bonus is 2% ($1,000 on $50,000) and a customer's is 2.5% ($250 on $10,000).
### Referral programs that closed or changed
#### Airbnb: guest referrals ended, host referrals continue
Airbnb's [referral terms page](https://www.airbnb.com/help/article/2269) opens with a notice that the guest referral program has ended, and the terms were last updated on February 26, 2021, so travel credits for inviting friends are gone. Host referrals continue. A member who refers someone new to hosting earns a cash reward that varies by listing location and type, and home referrers get extra cash after their 2nd, 3rd and 5th successful referrals. The new host has to finish a first reservation within 180 days of clicking the link, on a booking worth at least $100 for a home or $50 for an experience or service, before taxes and fees.
Home, experience and service referrers stop earning after 25 rewards, and Co-host Network and Ambassador referrers after 2,000, per Airbnb's [host referral overview](https://www.airbnb.com/help/article/3405). The program that remains pays for new supply: first-time hosts.
#### Notion: affiliates closed to new applicants
Notion's [affiliate page](https://www.notion.com/affiliates) still lists up to $50 per activated sign-up plus 20% of year-one revenue, next to a warning that the program is not accepting new affiliates. A conversion is a net new workspace that upgrades to a paid Plus or Business plan within 180 days of the click. Affiliates must disclose the paid relationship. You can't join, and the page doesn't say why it closed.
#### Ahrefs: why a program was shut down
In a [June 2023 post](https://ahrefs.com/blog/ahrefs-affiliate-program), Ahrefs CMO Tim Soulo wrote that the company ran an affiliate program about 5 years earlier, discontinued it and has no plans to relaunch. He gave 2 reasons. Billing kept changing, with new payment processors, packages and add-ons, and supporting an affiliate program through each change took a lot of work. And 3% of affiliates generated 90% of leads, so Ahrefs now makes individual deals with its top partners. The post is dated June 2023, and I found no later announcement.
The first reason is a tracking problem, the kind a tool can absorb by reading billing events. The second fits the usual skew: the median program in TrackRev's benchmarks gets 71% of affiliate revenue from the top 10% of affiliates, though Ahrefs measured leads, not revenue.
### What the working programs have in common
Of the 11 programs with a published trigger, 10 pay only after the referred customer's money moves: a paid subscription, a deposit, a transfer, a completed booking or a closed deal. Dropbox is the exception. A cash or stock reward tied to a signup invites fake signups, which is why Mercury bans self-referrals and permits clawbacks (see [preventing affiliate self-referral fraud](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud)).
Most programs also limit what they can owe. Dropbox stops at 16 or 32 GB, Robinhood at $15,000 a year and Airbnb at 25 rewards for most host referrals. Time limits do the same job: rewards expire after 60 days at Robinhood and 1 year at Wise, and referrals must convert in 90 days at Mercury or 180 at Airbnb and Notion. Decide both before launch, because people share links in places you can't edit.
### A sample referral program for a SaaS product
Without spare storage or stock to give away, a software company is left with discounts, free months and commission. Start from the gross profit a referred customer brings in during year one and cap the reward at a fraction of it. Take a $29 monthly plan at an 80% gross margin and a newcomer whose first month is free. They pay 11 invoices in year one: $319 of revenue and $255.20 of gross profit. The [guide to starting an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) has more commission arithmetic, and the [commission benchmarks for 2026](https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026) give rates by category.
| Referrer reward | Referrer earns in year one | Gross profit left | Share of gross profit |
| --- | --- | --- | --- |
| $29 account credit after the first paid invoice | $29.00 | $226.20 | 11.4% |
| $50 cash after the first paid invoice | $50.00 | $205.20 | 19.6% |
| 20% of each payment for 12 months | $63.80 | $191.40 | 25.0% |
*Hypothetical example; the new customer stays for all 11 paid invoices.*
The recurring option pays the most only if the customer stays. A newcomer who cancels after 3 paid invoices has earned the referrer $17.40, while the two one-time options have already paid in full. Terms for the $29 plan:
- Any customer on a paid plan in good standing can refer through a unique link.
- The newcomer gets the first month free, applied on arrival through the link.
- The referrer earns 20% of each payment for 12 months, starting with the first paid invoice, and nothing if the referred customer never pays.
- Commission becomes payable 30 days after each payment, matching a 30-day refund window, and a refund inside that window cancels it ([how to reverse commissions after refunds](https://www.trackrev.io/blog/affiliate-refund-clawback-handling)).
- Balances of $25 or more are paid monthly by PayPal or bank transfer, smaller balances roll forward, and tax forms are collected before the first payout.
- Self-referrals, referrals sharing a card or company with the referrer, and ads bidding on your brand name are excluded.
- Public posts promoting the link must disclose the reward, as the FTC's [endorsement guidance](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) expects for commissions on referred sales ([FTC and GDPR requirements](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr)).
- You can change the terms with 30 days' notice, and rewards already earned are honored.
### A sample client referral program for a service business
A client referral program at a service firm rewards existing clients, and the arithmetic is simpler because the fee is the revenue. Assume an agency with a $3,000 monthly retainer, a 40% margin and a typical client who stays 10 months. A new client then brings in $30,000 of revenue and $12,000 of profit.
| Reward | Cost per referred client | Share of the client's profit |
| --- | --- | --- |
| $500 flat after the first invoice is paid | $500 | 4.2% |
| 10% of the first 3 months' fees | $900 | 7.5% |
| 10% of every payment over the 10 months | $3,000 | 25.0% |
*Hypothetical example; the client stays the full 10 months.*
I would give clients a fixed amount and keep revenue share for partners who refer repeatedly, which is close to how Shopify splits its one-time referral fee from its 4-year revenue share on stores it builds. A credit against the next invoice costs the firm less than cash: at a 40% margin, delivering $500 of services costs $300. Some professions restrict paying for referrals, so check licensing rules before offering cash.
### Running a referral program on TrackRev
TrackRev's [referral campaigns](https://www.trackrev.io/products/referral-campaigns) cover the SaaS sample above. Each advocate gets a unique link and a one-time or recurring commission, and the new customer can get a percentage discount, free months or an extended trial, shown on the signup page when the referral link is detected. Commissions come from paid invoices synced from 4 billing systems (Stripe, Polar, Lemon Squeezy and Paddle), so renewals and refunds arrive through billing.
The commission hold is set per program from 0 to 180 days and defaults to 0, so the 30-day hold in the sample is your setting. Payouts run from a PayPal or Wise CSV export, after which you mark each one paid. Referral and partner programs share a single workspace, so a customer who becomes a creator needs no second account.
If the reward is storage, credits or feature access that only your own app can grant, build that part in the product and use TrackRev for link tracking and the commission ledger. The free plan covers 50 links and 1,000 tracked events a month with revenue figures hidden; paid plans from $39 a month include the whole product (see [pricing](https://www.trackrev.io/pricing)).
### Frequently asked questions
**What are good referral program examples for SaaS?**
Webflow pays 50% for 12 months and HubSpot pays 30% for 1 year, both to people with audiences. For customers referring customers, pair a discount or free month for the newcomer with credit or commission for the referrer, as in the $29 sample.
**What is a client referral program?**
It rewards existing clients, or advisers who work with them, for introducing new business. Clients usually get a fixed reward such as an invoice credit, while accountants and agencies get revenue share, as in Shopify's 4-year and HubSpot's 3-year terms.
**How much should a referral reward be?**
Keep the total well below half of the gross profit a referred customer produces in the first 12 months. The richest sample option takes 25%, and Mercury's bonuses run 2% to 2.5% of the qualifying deposit.
**What should a referral program sample include?**
Eligibility, the trigger that releases the reward, the reward for each side, caps and expiry, a hold period (30 days in the sample), a minimum payout ($25 in the sample) and method, banned behavior such as self-referral, a disclosure rule, and a notice period for changes.
**Are referral rewards taxable?**
Generally yes. A US company paying referrers may need to collect tax forms and file information returns once someone passes the annual IRS threshold. Mercury's referral terms ask for 1099 information above $600 in a calendar year, and thresholds change, so confirm the current figure with an accountant.
**Do referral rewards have to be disclosed?**
Yes, when the promoter is rewarded and the audience wouldn't expect it. The FTC Endorsement Guides call for clear disclosure of such connections, commissions included, and Notion requires it of its affiliates.
---
## Referral program ideas for SaaS and B2B: 16 rewards, mechanics and contests, priced
URL: https://www.trackrev.io/blog/referral-program-ideas
Published: 2026-10-01
Author: Muzahid Maruf
16 referral program ideas for SaaS and B2B, from recurring commission to contests, with the cost of each and real terms from Dropbox, Gusto and Wise.
The best referral program ideas pay for customers you wanted anyway, at a price you can calculate before launch. The 16 below run from reward types and campaign mechanics to contests and B2B or client referrals, each with when it fits and what it costs.
A [Journal of Marketing study](https://faculty.wharton.upenn.edu/wp-content/uploads/2012/04/Schmitt-Skiera-vandenBulte-2011-Referral-Programs-Customer-Value.pdf) from 2011 followed about 10,000 customers of a German bank for almost 3 years. A referred customer was worth at least 16% more than a similar customer who wasn't referred, and the retention advantage persisted. The gap varied by segment, so the authors advise a selective approach.
I build TrackRev, an affiliate and referral tool, so weigh its mentions here as a vendor's.
> **Key takeaways:**
>
> - Price each reward against a customer who leaves early. On a $60 plan, a $100 gift card for each side costs $200, more than the $180 collected from a customer who cancels after 3 months, while a 20% commission costs $36.
> - Pay on an event that costs the friend something. Wise waits for a transfer of at least 200 GBP, Dropbox for a verified email and an app login, and Gusto for a first paid payroll.
> - Published terms cap rewards very differently: Dropbox Basic accounts stop at 16 GB after 32 referrals, Neon One credits up to $250 a side, and Gusto pays $300 for the first referral and $1,000 from the fifth.
> - A leaderboard sprint costs its fixed prize pool. A random draw needs a free way to enter, and the IRS reporting threshold for prizes is $2,000 for 2026 payments.
> - B2B referrals need a separate agency track and a rule that excludes prospects already in your sales pipeline.
### Referral program ideas at a glance
Costs below assume a $60 monthly plan, so a customer who stays a year pays $720.
| Idea | Fits when | Cost on the $60 plan |
| --- | --- | --- |
| 1. Recurring commission | Creators or consultants promote you | 20% over a year is $144, paid only while the customer pays |
| 2. Account credit or free months | Referrers are current customers | A month per side is $120 of forgone revenue |
| 3. Friend discount or longer trial | The friend needs a nudge to start | 50% off month 1 is $30 |
| 4. In-product reward | You have a cheap unit to give, such as storage | Your cost to serve the unit |
| 5. Flat cash bounty | Cheap plan, short sales cycle | $50 once |
| 6. Reward after a qualifying action | Fake signups are easy to create | $0 until the friend pays |
| 7. Milestone ladder | Referrers can find 5 or more friends | Prize cost times the few who reach each rung |
| 8. Payouts that grow per referral | High contract value, referrers who know many buyers | $2,900 for 5 referrals on Gusto's ladder |
| 9. Expiry dates and capped offers | You want a launch window | 50 redemptions of a $30 discount is at most $1,500 |
| 10. Referrers who recruit referrers | A few partners have audiences | A capped pool: 30% of a $60 sale is $18 across every level |
| 11. Leaderboard sprint | You have many active referrers | A fixed pool, such as $1,000 |
| 12. Random-draw entries | Many small referrers | One prize, such as $500 |
| 13. Shared goal | Your customers talk to each other | 100 free months is $6,000, owed only if the goal is hit |
| 14. Warm-introduction path | Buyers are named accounts | Your usual reward, paid on closed deals only |
| 15. Partner track for agencies | Advisors influence several buyers | 20% to 30% over a year is $144 to $216 |
| 16. Client referral fee | You sell retainers or projects | 10% of 3 months of a $4,000 retainer is $1,200 |
*Costs per referred customer on a $60 monthly plan; prize and goal costs are example figures.*
### What published referral programs pay
| Program | Reward | Trigger | Limit or window |
| --- | --- | --- | --- |
| Dropbox Basic | 500 MB per side | Friend signs up, installs the app, logs in, verifies an email | 16 GB, reached at 32 referrals |
| Dropbox Plus, Family, Professional | 1 GB per side | Same as Basic | 32 GB |
| Neon One | 1 free month per side | Friend pays a first invoice, usually within 60 days | Up to $250 per credit, no cap on credits earned |
| Gusto | $300 to $1,000 gift card for the referrer, $100 for the friend | Friend runs 1 paid payroll and stays active | Reward rises across the first 5 referrals |
| HubSpot affiliates | 30% recurring | Purchase within 180 days of sign-up | Up to 12 months |
| Wise free-transfer invite | Friend's first transfer is fee-free; inviter's reward varies by region | Friend sends 200 GBP or more internationally | Friend's discount lasts 6 months; reward claimable for 1 year |
| Notion affiliates | Up to $50 plus 20% of year-one revenue | Upgrade to a paid plan within 180 days of the click | Closed to new affiliates |
| Harry's pre-launch | Product rewards at 5, 10, 25 and 50 referrals | A friend's email sign-up | 4 rungs |
*Terms from each company's own program pages, October 2026; Harry's from a 2017 Viral Loops case study.*
### Referral incentive ideas for referrers and friends
#### 1. Recurring commission for a fixed term
Pay a percentage of each payment the customer makes. [HubSpot's affiliate program](https://www.hubspot.com/partners/affiliates/resource-center/frequently-asked-questions) pays 30% for up to 12 months, which on its example $50 Starter plan is $15 a month and $180 in all. TrackRev's [benchmark tables](https://www.trackrev.io/data/affiliate-program-benchmarks) put the median B2B SaaS commission at 20%, most often paid for 12 months. The payout follows retention, so an early cancellation costs you little. I'd cap the term, since a lifetime promise is hard to withdraw once partners have built content around it.
#### 2. Account credit or free months
Credit costs forgone revenue instead of cash and keeps the reward inside your product. [Neon One](https://neonone.com/referral-program-neon-one/) gives the referring customer and the friend a free month each, up to $250 a side, once the friend pays a first invoice, usually within 60 days. In Stripe Billing, a credit is a negative [customer invoice balance](https://docs.stripe.com/billing/customer/balance) that applies to the next finalized invoice. Current customers who would rather shrink their bill than collect a payout tend to like credit, while outside promoters can't spend it on a product they don't use.
#### 3. A discount or longer trial for the friend
The friend's half of a two-sided offer is usually the cheaper half. A [Stripe Billing coupon](https://docs.stripe.com/billing/subscriptions/coupons) can apply to the first invoice only (the default), repeat for a set number of months, or last forever. A 50% discount on the first month of the $60 plan costs $30, and 20% off for 3 months costs $36. A longer trial delays the first payment, which helps where trial-to-paid conversion is the weak step.
#### 4. A reward inside the product
If a unit costs you little to give away, pay in that. A [Dropbox Basic](https://help.dropbox.com/space/how-much-free-space) user earns 500 MB per referral up to 16 GB, so the ceiling arrives after 32 referrals, and Dropbox Plus users earn 1 GB per referral up to 32 GB. Credits, seats and API calls work the same way when the marginal cost is low. The reward has no value outside your product, which makes it a weak lever for referrers who barely use it.
#### 5. A flat cash bounty after the first payment
A fixed amount per referred customer, paid once. [Notion's affiliate page](https://www.notion.com/affiliates) advertises up to $50 per activated sign up plus 20% of year-one revenue, a hybrid of this idea and the first, though it now says the program isn't accepting new affiliates. On the $60 plan a $50 bounty costs $50 whether the customer stays 1 month or 12, so unlike a percentage it doesn't shrink with churn. Cheap plans and short sales cycles suit it. Gift cards work the same way, at face value.
### Referral campaign ideas that change what referrers do
#### 6. A reward after a qualifying action, not at signup
Free signups are easy to fake, so tie the reward to an event that costs the friend something. [Wise's free transfer invite program](https://wise.com/help/articles/2487043/how-does-the-free-transfer-invite-program-work) pays an inviter only after a friend sends at least 200 GBP internationally, and the reward expires unless it is claimed within 1 year. Dropbox waits for a verified email and a login from the app. For a subscription product the cleanest event is the first paid invoice.
#### 7. A milestone ladder
Thresholds push a referrer who has found 3 friends to look for a 4th. In [Viral Loops' account of Harry's pre-launch campaign](https://viral-loops.com/blog/harrys-gathered-100k-emails-single-week-milestone-referral-program/), shave cream came at 5 referrals, a razor at 10, a premium razor at 25 and a year of free shaving at 50, and 77% of the emails collected came from referrals. Each rung is harder than the last, so few people claim the top prize, and its cost is the prize times that small number. A ladder works best with a reward you can make at cost. A B2B referrer who knows 5 buyers needs a lower first rung.
#### 8. Payouts that grow with each referral
[Gusto's published terms](https://gusto.com/legal/promotions/referral-rewards-terms) pay a customer a Visa gift card of $300 for the first successful referral, then $400, $500, $700 and $1,000 for the fifth and every one after, and the referred business gets $100. Five referrals cost $2,900 plus $500 for the referees, $3,400 in total, which is affordable only when a customer's lifetime revenue is several times the reward. Escalation makes sense in high-contract B2B, where one referrer, such as an accountant, knows many buyers.
#### 9. Expiry dates and capped offers
A deadline makes the friend act, and a cap limits what you can owe. Wise's friend discount must be used within 6 months of signing up. In Stripe, a coupon can carry a redemption limit (`max_redemptions` of 50 means 50 uses across all customers) and an expiration date. Together they give a launch-week offer a worst case you can write down: 50 redemptions of a $30 first-month discount is $1,500.
#### 10. Let referrers recruit referrers
A second tier pays the person who recruited a referrer a smaller share of the same sale. TrackRev's [Partner Accelerator](https://www.trackrev.io/products/partner-accelerator) does it from one capped pool, 30% of the sale by default: in its example the seller earns 10%, the recruiter about 6.67%, the next level up about 4.44%, and so on, so the chain never exceeds the pool. HubSpot instead keeps its 30% standard rate and customizes payouts for affiliates in its Sprocket and Elite tiers. Watch the internal revenue, because affiliates buying through each other aren't new customers; TrackRev flags a program once that passes 25%.
### Referral contest ideas
#### 11. A leaderboard sprint with a fixed prize pool
Run it for 4 weeks, rank referrers by qualified referrals, and split a fixed pool among the top 3, such as $500, $300 and $200. The cost is the pool however many people enter: if the sprint adds 40 paying customers beyond your normal pace, a $1,000 pool adds $25 per customer on top of the regular reward. Count a referral only after your refund window closes, or a refund can change a winner after you announced one. A ranking decided by results has no random draw, and a [promotions attorney's explainer](https://enochtarver.com/how-to-lawfully-run-a-contest-sweepstakes-or-giveaway/) treats skill-based promotions as contests, a different category from sweepstakes.
#### 12. Random-draw entries
Give 1 entry per qualified referral and draw 1 winner for a prize such as $500. Small referrers get a real chance, and your cost stops at the prize. A drawing is sweepstakes territory, though: it needs a free way to enter, and New York and Florida require registering and bonding games of chance with prizes over $5,000. An entry that depends on the friend paying may blur that line, so have a lawyer read the rules.
#### 13. A shared goal for the whole customer base
Announce a target the community hits together: if customers refer 100 qualified customers in a month, everyone who made a referral gets a free month. A visible counter gives quiet customers a reason to share, and the bill arrives only if the goal is met. At most that is 100 free months, $6,000 on the $60 plan, so choose a goal your base can reach and a reward you can afford at that number. Each referral needs its own tracked link for the counter to be honest.
### B2B and client referral ideas
#### 14. A warm-introduction path for named accounts
B2B buyers often arrive after a conversation, so give referrers a form to name the company and the contact, and pay when the deal closes. HubSpot's affiliate FAQ excludes customers already assigned to a HubSpot rep or in an active sales process, a rule that stops referrers from claiming deals the team opened first. The cost is your usual reward, on closed deals only: $144 on a 20% program for the $60 plan.
#### 15. A separate partner track for agencies and consultants
Advisors who influence several buyers deserve terms different from a customer's 1-month credit. Neon One sends agencies and consultants to a separate partner program, and HubSpot's affiliate program pays 30% for up to 12 months. On the $60 plan, 20% to 30% over a year is $144 to $216 per customer. Partners also need a place to grab links and see what they've earned, which is what a branded partner portal is for.
#### 16. Client referral fees for service businesses
For an agency, studio or consultancy, the reward is usually a discount on the referring client's next invoice or a fee on the new client's first bills. A 10% fee on the first 3 months of a $4,000 retainer is $1,200, paid after the new client's first invoice clears. A reciprocal introduction costs nothing, and a free audit costs only your time. Some professions restrict paying for referrals, so check your licensing body first, and tell the new client when a fee is being paid.
### What a reward costs when the customer leaves early
Those costs assume the customer stays a year. Retention changes the answer, so here are 4 rewards on the same $60 plan for a customer who pays for 12 months ($720) and one who leaves after 3 ($180).
| Reward | 12 months: cost | 12 months: share of $720 | 3 months: cost | 3 months: share of $180 |
| --- | --- | --- | --- | --- |
| 20% commission for 12 months | $144 | 20.0% | $36 | 20.0% |
| $60 credit per side | $120 | 16.7% | $120 | 66.7% |
| $50 flat bounty | $50 | 6.9% | $50 | 27.8% |
| $100 gift card per side | $200 | 27.8% | $200 | 111.1% |
*Reference plan: $60 a month. Credits are counted at list price, as if applied in full.*
Only the percentage moves with retention. The credit, the bounty and the gift cards cost the same whether the customer stays or leaves, and the gift cards cost more than the $180 a 3-month customer pays. Break-even is 2 payments for the $120 credit and 4 for the $200 of gift cards, so check your own early churn before you publish an amount.
### Rules that keep referral rewards from backfiring
- Hold rewards until your refund window closes, and say so in the terms. HubSpot counts a commission only after a 1-month locking window, 2 months for annual purchases, and [clawing back a payout](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) after a refund is harder than not paying it yet.
- Block self-referral. A referrer who signs up through their own link, or posts it on coupon sites (Gusto bans that), is farming the reward, and the [self-referral fraud guide](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) covers detection.
- Disclose the incentive. The FTC's [Disclosures 101 for Social Media Influencers](https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers) says a financial relationship includes free or discounted products, so put a one-line disclosure in the share text you hand referrers. [Affiliate compliance for FTC, GDPR and consent](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) has the rest.
- Plan the tax paperwork. The [IRS instructions for Forms 1099-MISC and 1099-NEC](https://www.irs.gov/instructions/i1099mec) raise the reporting threshold from $600 to $2,000 for tax years after 2025, and prizes and awards are on the $2,000 list. Collect a W-9 or W-8BEN before paying anyone, and see [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) for methods and forms.
- Decide the cap before launch. Dropbox Basic stops at 16 GB, and the Gusto terms I read state no ceiling on the $1,000 reward, so each is a deliberate choice about who your best referrer can become.
### What TrackRev covers and what it leaves to you
TrackRev's [referral campaigns](https://www.trackrev.io/products/referral-campaigns) and affiliate program handle the plumbing behind ideas 1, 3, 5, 6 and 10. A program pays a percentage or a flat amount per sale, one time, for a set number of months or for life, and the friend's side can be a percentage discount, free months or an extended trial. Commission is written against paid charges synced from Stripe, Paddle, Polar or Lemon Squeezy, so each one traces to a payment. Every program has a hold of 0 to 180 days, defaulting to 0, that you set to your refund window.
Credit rewards (idea 2) differ: TrackRev delivers each qualified signup to your own backend through a database connection or a webhook, and credits reach nobody until that connector works.
The dashboard ranks Top partners by attributed revenue, which feeds a leaderboard sprint or a shared-goal counter. TrackRev doesn't run contests, milestone ladders or sweepstakes draws, so you announce winners and pay prizes yourself. Paid plans start at $39 a month, listed on the [pricing page](https://www.trackrev.io/pricing), with unlimited partners and programs, and the free plan (50 links, 1,000 tracked events a month, revenue figures hidden) is for testing the tracking first.
### Where to start
For a first program I'd launch a friend discount (idea 3) with a 12-month percentage commission (idea 1) released on the first paid invoice (idea 6). A new referrer wants 3 answers fast: what do I get, what does my friend get, and when does it arrive. Add a leaderboard sprint once enough referrers are active that a ranking means something.
### Frequently asked questions
**What are good referral program ideas for a small SaaS company?**
Match the idea to the referrer: credit for customers who use the product, recurring cash for creators and consultants, a shared goal for a community. Release every reward on the first paid invoice so a signup alone costs $0.
**How much should a referral reward be?**
Start from what a customer pays in the first year and decide what share you can give away. A flat reward should be recoverable within the payments your median customer reliably makes. TrackRev's benchmark tables show 15% for 6 months in B2C SaaS and 20% for 12 months in B2B.
**What is a double-sided referral program?**
It rewards both the existing customer and the friend, for example 50% off the friend's first month plus a month of credit for the referrer. It costs more per referral than a one-sided offer and gives the referrer an easy message to pass on.
**Should referral rewards be cash, credit or discounts?**
Credit and discounts cost forgone revenue and only interest people who keep using the product. Cash reaches outside promoters and can be larger, but it adds payout fees, W-9 or W-8BEN collection and fraud checks.
**How do you track referrals without a developer?**
Give each referrer a unique link or code, record the click, and match the later payment to that referrer. Links suit written sharing and codes suit podcasts and video. Tools that read Stripe, Paddle, Polar or Lemon Squeezy do the matching.
**How long should a referral link stay valid?**
Two clocks apply: how long after a click a purchase still credits the referrer, and how long a promised reward can be claimed. HubSpot credits a sign-up within 30 days of a click and a purchase within 180 days of that sign-up. Longer windows suit slow B2B decisions.
---
## Rewardful vs TrackRev: $49 and $39 count different things
URL: https://www.trackrev.io/blog/rewardful-vs-trackrev
Published: 2026-07-30
Author: Muzahid Maruf
Rewardful vs TrackRev in October 2026: Rewardful's plans meter affiliate sales from $49 a month, TrackRev's meter partner commission from $39. Limits compared.
Rewardful vs TrackRev comes down to what each plan counts. Rewardful's Starter costs $49 a month and covers $7,500 of affiliate-attributed sales before it moves you up a tier. TrackRev's Starter costs $39 and covers $10,000 of partner commission, which at a 20% rate is $50,000 of sales. Both tie a Stripe Checkout charge to a partner through an ID in client_reference_id, and both reverse commission when a charge is refunded. Rewardful has the 14-day trial and the bigger customer base, with 3,000+ teams on its pricing page. TrackRev includes white-label on every paid plan, reads four billing systems and ranks partner revenue beside your other channels.
I build TrackRev, so weigh my read accordingly. Rewardful's figures come from its [pricing page](https://www.rewardful.com/pricing), its [pricing schedule](https://www.rewardful.com/pricing-schedule) and its [help center](https://help.rewardful.com), read in October 2026.
> **Key takeaways:**
>
> - Rewardful's plans cap the sales your referred customers pay, renewals included: $7,500 on the $49 Starter and $15,000 on the $99 Growth. TrackRev's plans cap the partner's cut instead: $10K, $100K or unlimited at $39, $99 and $199.
> - With partners paid 20%, $45,000 of monthly sales lands in Rewardful's $299 tier but fits TrackRev's $39 Starter.
> - Past its limit Rewardful bumps your tier itself, while TrackRev pauses new commission until you upgrade. TrackRev also holds commission 0 days by default against Rewardful's 30, so set the hold to your refund window.
> - Rewardful suits teams that want a trial, ACH payouts or documented no-code installs. TrackRev suits white-label under $99, Polar, Lemon Squeezy or Paddle Billing, and channel-level ranking.
### Rewardful vs TrackRev at a glance
| Feature | Rewardful | TrackRev |
| --- | --- | --- |
| Cheapest plan | $49 a month, $490 yearly | $39 a month, $351 yearly |
| Free option | 14-day trial on every plan | Link tracking only: 50 links, 1,000 events |
| What the plan meters | Sales from referred customers: $7,500, $15,000, then $30,000 and up | Partner commission tracked: $10K, $100K, unlimited |
| Past the limit | Moves you to the next tier in the next billing cycle | New commission pauses until you upgrade or the month resets |
| Campaigns or programs | 1 on Starter, unlimited from Growth | Unlimited from Starter |
| Branded portal, custom domain | From Growth, $99 | From Starter, $39 |
| Billing systems | Stripe, Paddle Classic | Stripe, Paddle, Polar, Lemon Squeezy |
| Click-to-charge join | Referral ID on Checkout | Visitor ID, with email as fallback |
| Attribution | First or last touch for affiliate referrals | Last-touch, first-touch or linear across every channel |
*Prices from each vendor's pricing page, October 2026.*
### Rewardful pricing in October 2026
Rewardful sells 3 plans. Each includes a 14-day free trial, unlimited affiliates and visitors, and a 0% transaction fee on affiliate-attributed revenue. Starter allows 1 campaign and 2 team members and leaves out the branded affiliate portal and the custom domain. Growth adds unlimited campaigns and team members, the branded portal, a custom domain, private invite-only campaigns, custom rewards and custom scripts. Enterprise brings one-click PayPal payouts and phone support, and its price follows a 9-step schedule. Yearly billing is 12 months for the price of 10.
| Monthly sales limit | Plan | Monthly | Yearly |
| --- | --- | --- | --- |
| $7,500 | Starter | $49 | $490 |
| $15,000 | Growth | $99 | $990 |
| $30,000 | Enterprise | $149 | $1,490 |
| $75,000 | Enterprise | $299 | $2,990 |
| $150,000 | Enterprise | $499 | $4,990 |
| $350,000 | Enterprise | $749 | $7,490 |
| $500,000 | Enterprise | $999 | $9,990 |
| $750,000 | Enterprise | $1,500 | $15,000 |
| $1,000,000 | Enterprise | $2,000 | $20,000 |
| $1,500,000 | Enterprise | $3,000 | $30,000 |
| $2,500,000 | Enterprise | $5,000 | $50,000 |
*Rewardful's pricing schedule, October 2026.*
Managed Payouts is optional on every plan and charges a 3% processing fee on the commissions it pays. Affiliates may pay withdrawal fees, and Stripe, PayPal and Wise bill their own rates on top.
#### What counts toward the monthly revenue limit
[Rewardful's help article](https://help.rewardful.com/en/articles/14240865-understanding-the-monthly-revenue-limit) says the limit counts the full value of each payment from customers an affiliate referred, dated by when the customer paid. Renewals count every month, and they keep counting after commissions end: a program that rewards only the first purchase still sees each later renewal add to the total. Customers who arrived without an affiliate don't count. Pass the limit and Rewardful emails you, then moves you up a tier.
Take 150 referred customers on a $50 monthly plan. That is $7,500, exactly Starter's limit, and the 151st referral lifts your price from $49 to $99 whether you pay those partners 10% or 40%.
### What the same program costs on each tool
TrackRev's meter counts the partner's cut and ignores sale revenue, so a fair comparison needs a commission rate. The table assumes 20%, which is only an example. Each row picks Rewardful's plan from the sales figure in the schedule above and TrackRev's plan from 20% of it.
| Partner sales | Commission at 20% | Rewardful plan | TrackRev plan |
| --- | --- | --- | --- |
| $5,000 | $1,000 | Starter, $49 | Starter, $39 |
| $12,000 | $2,400 | Growth, $99 | Starter, $39 |
| $25,000 | $5,000 | Enterprise, $149 | Starter, $39 |
| $45,000 | $9,000 | Enterprise, $299 | Starter, $39 |
| $60,000 | $12,000 | Enterprise, $299 | Growth, $99 |
| $120,000 | $24,000 | Enterprise, $499 | Growth, $99 |
| $400,000 | $80,000 | Enterprise, $999 | Growth, $99 |
| $900,000 | $180,000 | Enterprise, $2,000 | Scale, $199 |
*Prices from each vendor's pricing page, October 2026. Every figure is monthly.*
Billed yearly, Rewardful Starter is $490 and TrackRev Starter is $351, because TrackRev bills 9 months for 12. The commission rate moves the TrackRev side. Starter's $10,000 covers $100,000 of sales when partners earn 10%, $50,000 at 20% and about $33,000 at 30%. Even a 50% rate leaves room for $20,000 of sales, above Rewardful Starter's $7,500.
> **The Starter commission cap:** TrackRev never caps sales revenue, but on Starter new partner commission stops accruing once $10,000 has been tracked in a UTC calendar month. Accrual resumes after an upgrade to Growth ($99, up to $100K) or when the counter resets on the 1st. Refunded and voided commission frees room under the cap. Rewardful handles the same moment by upgrading you automatically, so on TrackRev watch the counter before a big launch.
### Tying a Stripe payment to a partner
Rewardful's [Checkout guide](https://help.rewardful.com/en/articles/4209748-stripe-checkout-client-side-integration) has you add its tracking script, which sets a cookie when a visit arrives on a ?via= link, and then pass the referral ID to Stripe. For Payment Links it has you add a data-rewardful attribute to each link and turn on Save payment details for future use, and the help center carries further guides for the Buy Button, the Pricing Table, Next.js, Rails and Django. Its links point at any page on your own domain with a URL parameter and no redirect.
Rewardful: passing the referral ID to client-side Stripe Checkout (from its help center)
```
var checkoutParams = {
lineItems: [{ price: price, quantity: 1 }],
mode: mode,
successUrl: "https://www.example.com/checkout?result=success",
cancelUrl: "https://www.example.com/checkout/?result=cancel"
};
if (window.Rewardful && window.Rewardful.referral) {
checkoutParams.clientReferenceId = window.Rewardful.referral;
}
stripe.redirectToCheckout(checkoutParams);
```
TrackRev partner links resolve on a redirect host: your own go.yourbrand.com after 1 CNAME record, a hosted trackrev.io subdomain, or a shared short host. The redirect records the click on the server and hands a visitor ID to the pixel on your site. The pixel then tags Stripe Payment Links, Buy Buttons and Pricing Tables with that ID on its own, so no attribute goes on each link. For Checkout Sessions your server creates, you read the vid cookie and pass it along.
TrackRev: passing the visitor ID to a Checkout Session you create (Next.js)
```
import { cookies } from "next/headers";
const vid = (await cookies()).get("vid")?.value;
const session = await stripe.checkout.sessions.create({
line_items: [/* ... */],
mode: "subscription",
success_url: "https://yourstore.com/thanks",
client_reference_id: vid,
});
```
The hourly Stripe sync, which an optional webhook speeds up, looks for the ID in charge metadata first, then in the Checkout Session, and falls back to the buyer's email when you have called `identify`. It needs only a read-only [restricted key](https://docs.stripe.com/keys), which Stripe recommends over a secret key. Rewardful's [permissions page](https://help.rewardful.com/en/articles/13863552-stripe-permissions-to-integrate-with-rewardful) lists what it reads and says its only writes are metadata, coupons and promo codes.
[Stripe's rule](https://docs.stripe.com/payment-links/url-parameters) for `client_reference_id` in a Payment Link URL allows up to 200 characters of letters, numbers, dashes and the _ character, and a value that breaks the rule is silently dropped. Both tools use UUIDs, which fit, but make 1 test purchase and confirm the ID shows on the payment. Coupon codes are the second route. With coupon tracking on, Rewardful creates a promo code in Stripe for each affiliate, and TrackRev credits any sale that used a partner's code, so creators who never post a link still earn.
### Refunds, holds and payouts
| Situation | Rewardful | TrackRev |
| --- | --- | --- |
| Refunded charge | Commission adjusts automatically | Commission comes back out on its own |
| Disputed charge | Not described in the pages I read | Commission comes back out on its own |
| Hold before a commission is due | 30 days after the sale by default, editable | 0 to 180 days per program, default 0 |
| Paying | PayPal and Wise mass-payout CSV, one-click PayPal on Enterprise, optional Managed Payouts | PayPal or Wise CSV export, then mark each payout paid |
| Payout batches | Reminders when commissions come due | Closed weekly, every 2 weeks, monthly, quarterly or by hand |
| Fraud rules | Self-referral detection and a brand-bidding block on every plan | Fraud and self-referral detection built in, rules not listed |
The hold default is the setting to check before launch. [Rewardful's overview](https://help.rewardful.com/en/articles/2044650-what-is-rewardful) suggests stretching its 30 days to match a longer refund policy, such as 90 days for a 90-day policy. TrackRev starts at 0, so set the days on each program before the first payout. [Affiliate commissions on Stripe refunds](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) covers the reversal rules, and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers rails and tax forms.
### Where Rewardful is the better pick
- Every Rewardful plan starts with 14 free days, so you can test with real affiliates before paying. TrackRev's free plan stops at link tracking, and its affiliate side begins at Starter, $39.
- No-code stacks have a documented path. Its help center lists install guides for Memberstack, Bubble, Podia, Teachable and SamCart, among others.
- Managed Payouts sends commissions by ACH for a 3% fee, and Enterprise adds one-click PayPal. TrackRev stops at a CSV you upload to PayPal or Wise.
- A ?via= link goes straight to a page on your domain, with no redirect. TrackRev's links pass through a host you own, which is how it records each click on the server.
- Its pricing page lists 3,000+ teams and a Premier Stripe Partner label, which matters if you want a vendor many Stripe SaaS companies already use.
### Where TrackRev is the better pick
Price at volume is the plain reason. Past $15,000 of partner sales, Rewardful's bill climbs a tier at each step, while TrackRev holds at $39 until partners earn $10,000. Branding follows the same pattern. Rewardful keeps the branded portal and custom domain for Growth at $99, and TrackRev's [white-label partner pages](https://www.trackrev.io/products/white-label-branding) come with Starter, along with unlimited programs where Rewardful's Starter allows 1 campaign.
Billing coverage is the next gap. Rewardful's [Paddle page](https://www.rewardful.com/paddle) says it integrates with Paddle Classic and not Paddle Billing, and its integrations page names only Stripe and Paddle as billing systems. TrackRev reads Stripe, [Paddle Billing and Classic](https://www.trackrev.io/integrations/paddle), [Polar](https://www.trackrev.io/integrations/polar) and [Lemon Squeezy](https://www.trackrev.io/integrations/lemon-squeezy). On Lemon Squeezy the join key is the buyer's email, so a buyer who pays under a different address is missed.
Reporting is the other difference. A buyer clicks a partner's link, then a newsletter link, then pays $90, and TrackRev's [revenue attribution](https://www.trackrev.io/solutions/revenue-attribution) credits that $90 by the model you choose.
| Credit model | Who gets the $90 |
| --- | --- |
| Last-touch | Newsletter, $90 |
| First-touch | The partner link, $90 |
| Linear | Partner link and newsletter, $45 each |
Rewardful's documentation describes visitors, leads and conversions from affiliates, and I found nothing on ranking your newsletter, ads or search traffic by revenue. That comparison would take a second tool such as Google Analytics 4. The [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) shows how TrackRev runs both halves on one data model.
### Moving partners from Rewardful to TrackRev
TrackRev lists Rewardful as an import source. Export your affiliates from Rewardful as a CSV with the token column included, upload the file on the import page and check the column preview. Email is the only required column. By default each token becomes the slug of that partner's TrackRev link, coupon codes keep crediting the partner, historical clicks and sales arrive as opening balances, and unpaid earnings become 1 carried-over commission.
Links partners already posted in the ?via= form point at your own site, where TrackRev's pixel doesn't read that parameter, so partners need their new URLs. Keep the Rewardful account running until they swap. The affiliate program, and so the import, needs a paid plan from $39. The [Rewardful comparison page](https://www.trackrev.io/compare/rewardful) lines the features up row by row, [best Rewardful alternatives](https://www.trackrev.io/blog/best-rewardful-alternatives-2026) prices 6 other tools, and [pricing](https://www.trackrev.io/pricing) lists every TrackRev plan.
### Frequently asked questions
**Can I try Rewardful before paying?**
Yes, each of its 3 plans starts with 14 free days. TrackRev's free tier covers link tracking and hides revenue figures, so a partner program there starts on Starter.
**Does Rewardful take a cut of affiliate sales?**
No. Every tier carries a 0% transaction fee. The extras are the optional 3% fee on Managed Payouts and whatever Stripe, PayPal and Wise charge.
**Is Paddle Billing supported by Rewardful?**
Its Paddle page names Classic only, so ask support before you plan around the newer product. TrackRev reads both versions.
**Is TrackRev a good Rewardful alternative?**
For a Stripe SaaS that wants a white-label portal under $99, bills through Polar or Lemon Squeezy, or wants partner revenue ranked beside other channels, yes. A team that needs a trial first, ACH payouts or a documented no-code install fits Rewardful better.
**Can Rewardful report on my newsletter or ads?**
Its documentation describes affiliate referrals, and I found no feature that reports on paid, newsletter or organic traffic. An attribution tool would fill that gap.
**What hold period should I set on commissions?**
Match your refund window. A 60-day money-back guarantee needs 60 days before a commission becomes payable on either tool, because a shorter hold risks paying commission on a sale you then refund.
**Do my partners keep their codes if I switch from Rewardful?**
Yes. The CSV import keeps each token as the partner's link slug and keeps coupon codes crediting them. Links already posted with ?via= need replacing.
---
## SaaS affiliate benchmarks for 2026: commission, activation and cookie windows
URL: https://www.trackrev.io/blog/saas-affiliate-program-benchmarks-2026
Published: 2026-06-06
Author: Muzahid Maruf
Median commission, activation, cookie window and revenue concentration for SaaS affiliate programs in 2026, checked against HubSpot, Webflow and Notion terms.
SaaS affiliate benchmarks for 2026 come down to a few medians: a 20% commission on B2B products, a 60-day cookie window, 18% of new partners selling within 30 days, and 71% of revenue coming from the top tenth of the roster. Top-quartile programs reach 31% activation. PartnerStack's best vendors mostly offer 20% to 30%, and HubSpot, Webflow, Notion, Semrush, GetResponse and Zoho publish terms from 15% to 50%. The sections below set those terms next to the activation data.
> **Key takeaways:**
>
> - Read the medians as ranges and match the definition. The dataset counts a paid sale in a partner's first 30 days as activation, so a source that counts first clicks will show a higher figure.
> - Activation varies fivefold between programs, from 31% in the top quartile to 6% in the bottom, and PartnerStack's data points to vetting and fast onboarding as the levers.
> - Published terms run from Zoho's 15% to Webflow's 50% for 12 months, and tier ladders at HubSpot, Semrush and GetResponse raise the payout for partners who prove their sales.
> - In TrackRev data a 60-day window passes the 90th percentile of click-to-paid time at 48.2 days, yet Safari deletes JavaScript-written cookies after a week without a visit.
> - Set holds against dispute timing, which Stripe says is typically 120 days on cards, and reverse commission automatically when a refund or dispute lands.
> - In TrackRev's Q2 2026 workspace data, affiliate traffic converts to paid at 3.9% and carries a 1.4x lifetime value multiplier, against 0.8x for paid social.
### SaaS affiliate benchmarks at a glance
These medians come from [TrackRev's affiliate program benchmark dataset](https://www.trackrev.io/data/affiliate-program-benchmarks), which takes the cross-source median of public reports from Impact, PartnerStack, Awin, Rakuten Advertising and CJ Affiliate. It synthesizes other people's research and does not measure TrackRev customers, so read each figure as the middle of a range.
| Metric | Median program | Spread across programs | What it measures |
| --- | --- | --- | --- |
| Commission rate, B2B SaaS | 20% | 15% for B2C SaaS, 30% for information products | Share of each referred payment, usually for a fixed term |
| Cookie window | 60 days | 28% of programs use 30 days or fewer, 7% use 180 or more | How long a click can still earn credit |
| 30-day activation | 18% | 6% in the bottom quartile, 31% in the top | Affiliates with a paid conversion within 30 days of joining |
| Revenue from the top 10% of affiliates | 71% | 84% in the top decile of programs | How concentrated partner revenue is |
| Days to first commission | 14 | 5 in the top quartile, 27 in the third | Approval to first attributed paid conversion |
| Most common payout structure | Recurring for 3 to 12 months | 39% of programs, against 33% one-time and 18% lifetime | How commission is paid after the first sale |
*Source: TrackRev affiliate program benchmark dataset, Q2 2026. Activation counts a paid conversion within 30 days of joining.*
> **Check the definition before you compare:** Activation can mean a first click or a first paid sale, over 30 days or over the program's lifetime. In a roster of 100 partners, 40 might send a click while 12 make a sale. Match your own definition to the source's before calling a number good or bad.
### Commission rates: what named SaaS programs pay
PartnerStack's Research Lab looked at its 25 highest-performing vendors in 2023 and found that the offers paying out the most in total commission were 20%, 25% and 30%, in that order, with an average of 23.53% ([PartnerStack chart, March 2024](https://partnerstack.com/resources/research-lab/charts/high-performing-vendors-tend-to-offer-20-25-for-commissions)). ERP software paid 30% to 35% on average. That sample is the top of the market, so it shows what works for the best vendors and says little about the median program.
| Program | Commission | Cookie window | Detail |
| --- | --- | --- | --- |
| HubSpot | 30% of the monthly subscription | 180 days | Recurring for up to 1 year; tiers by monthly sign-ups |
| Webflow | 50% of the first subscription | 90 days | For up to 12 months; first-touch attribution |
| Notion | Up to $50 per activated sign-up, plus 20% of year-one revenue | 180 days to upgrade | Last-click; reward may be clawed back on a refund in the first 2 months; page says it is not accepting new affiliates |
| Semrush | $100 to $300 per sale, $10 per free trial | 120 days | Flat fee by toolkit; paid through Impact |
| GetResponse | 40% for 12 months, 50% at 50 sales, 60% at 100 sales | 90 days | Sales counted over 12 months; run on PartnerStack |
| Zoho | 15% of each qualified sale for 12 months | 90 days | Referred customers get $100 in wallet credits |
*Terms from each program's own page ([HubSpot](https://www.hubspot.com/partners/affiliates), [Webflow](https://webflow.com/solutions/affiliates), [Notion](https://www.notion.com/affiliates), [Semrush](https://www.semrush.com/lp/affiliate-program/en/), [GetResponse](https://www.getresponse.com/affiliate-programs), [Zoho](https://www.zoho.com/affiliate/)), October 2026.*
Five of the six pay for the first 12 months or year one. Semrush pays a flat dollar amount per sale instead, and Notion adds a per-sign-up bounty to its revenue share. That matches the dataset's most common structure, recurring commission for a fixed term of 3 to 12 months, followed by one-time payment at the sale. Lifetime recurring is rarer, and 3% of programs pay a flat dollar amount, with a median of $45.
#### What the same customer costs under each structure
Take a hypothetical $79-a-month plan, so a customer who stays all year pays $948. The percentages in the table above translate into these 12-month payouts to the affiliate.
| Structure | Affiliate earns over 12 months | Gross profit you keep at 75% margin |
| --- | --- | --- |
| 15% for 12 months (Zoho) | $142.20 | $568.80 |
| 20% for 12 months (benchmark median, B2B) | $189.60 | $521.40 |
| 30% for 12 months (HubSpot) | $284.40 | $426.60 |
| 40% for 12 months (GetResponse, entry tier) | $379.20 | $331.80 |
| 50% for 12 months (Webflow) | $474.00 | $237.00 |
*Hypothetical $79 plan, customer retained for all 12 months, no refunds. At a 75% gross margin the $948 of revenue leaves $711 of gross profit before payment fees and support.*
Customers also leave. TrackRev's attribution data puts the median time to first churn for affiliate-referred customers at 9.6 months, so a 12-month term will not pay in full on every referral. That is the reason to calculate commission from paid invoices. [Stripe's subscription webhook documentation](https://docs.stripe.com/billing/subscriptions/webhooks) says `invoice.paid` is sent when an invoice is successfully paid, and its renewal flow ends in the same event, so a ledger built on it stops accruing when the customer stops paying. For rates by price band, see [affiliate commission benchmarks](https://www.trackrev.io/blog/affiliate-commission-benchmarks-2026).
### Cookie windows and what Safari does to them
In the dataset, 41% of programs use a 60-day window, 28% use 30 days or fewer, 24% use 90 days and 7% use 180 or more, which puts the median at 60. The named programs above lean longer: HubSpot and Notion allow 180 days, Semrush 120, and Webflow, GetResponse and Zoho 90.
A window should follow how long buyers take to pay. TrackRev's Q2 2026 workspace data has the distribution of days from first click to first paid charge:
| Percentile | Days from first click to first paid charge | Window that reaches it |
| --- | --- | --- |
| 50th (median) | 6.3 | 7 days |
| 75th | 21.0 | 30 days |
| 90th | 48.2 | 60 days |
| 95th | 73.5 | 90 days |
*Per-workspace medians across all channels, TrackRev workspace data, Q2 2026. Each workspace's own window truncates its tail, so real tails run longer.*
Those figures cover every channel. A partner's review may land early in a buyer's evaluation, so I would start a self-serve product at 60 days and move to 90 or more when a trial and a purchasing approval sit in the path.
A configured window and an effective one can differ. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Safari deletes cookies created in JavaScript, and other script-writable storage, after 7 days of no interaction with the site. A 60-day window in a client-side snippet is cut to 7 days for Safari visitors who do not return within the week, and 7 days is barely past the 6.3-day median above. WebKit also caps the expiry of cookies set in an HTTP response at 7 days when it detects third-party CNAME or IP address cloaking. How this plays out for SaaS conversions is in [the Safari ITP breakdown](https://www.trackrev.io/blog/safari-itp-attribution-saas).
### Activation: where top programs pull away
Activation varies fivefold between the top and bottom quartile, and the dataset ties the gap to onboarding effort. The table pairs each quartile with the onboarding that typically goes with it.
| Program tier | 30-day activation | Typical onboarding |
| --- | --- | --- |
| Top quartile | 31% | Welcome sequence, ready-made creative, first-week check-in |
| Second quartile | 22% | Welcome email, swipe copy library |
| Median program | 18% | Approval email, dashboard link |
| Third quartile | 11% | Approval email only |
| Bottom quartile | 6% | Approval, then no further contact |
*Source: TrackRev affiliate program benchmark dataset, Q2 2026.*
Out of 100 recruited affiliates, a median program ends the first month with 18 who have made a sale. A top-quartile program has 31 and a bottom-quartile program has 6.
PartnerStack's chart data supports the same lever from the recruiting side. Of partners approved into its Network, [43% have earned a commission, against 3% of partners outside it](https://partnerstack.com/resources/research-lab/charts/partnerstack-network-approved-partners-are-far-more-likely-to-earn-a-commission-compared-to-non-network-partners) (May 2024). After PartnerStack gated entry in 2023, the share of activated, approved partners earning commissions [rose 2.25 times](https://partnerstack.com/resources/research-lab/charts/since-gating-the-partnerstack-network-more-marketplace-partners-generate-commissions) (July 2024).
Speed matters as well. [37% of Network partners join their first partnership within 24 hours of approval](https://partnerstack.com/resources/research-lab/charts/most-network-partners-have-a-median-time-of-2-days-to-joining-their-first-partnership), with a median of two days (June 2024). Those are marketplace partners browsing for programs, so invited partners may move more slowly, but a welcome email that goes out on day three still lands after half of them have joined a first program.
#### What the best programs do in the first week
Approve applications within a day, send the referral link together with one ready-to-publish post, and have a person ask what the partner plans to publish. I would invite your most engaged customers before anyone else, because they already understand the product and need no explanation of it. A starter kit of screenshots, approved claims and any coupon code saves a new partner the first two hours. The launch steps are in [how to start an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program).
### Revenue concentration and partner tiers
Affiliate revenue follows a power law, and the dataset puts numbers on it.
| Affiliate segment | Share of revenue, median program | Share of revenue, top decile of programs |
| --- | --- | --- |
| Top 1% of affiliates | 34% | 52% |
| Top 10% of affiliates | 71% | 84% |
| Top 25% of affiliates | 89% | 95% |
| Bottom 50% of affiliates | 2% | 0.4% |
*Source: TrackRev affiliate program benchmark dataset, Q2 2026.*
> **Worked example: a 200-partner program:** If a program with 200 partners earns $20,000 a month in partner revenue and matches the median row, the top 20 partners produce $14,200, the top 2 produce $6,800, and the bottom 100 together produce $400.
Recruiting 100 more partners who behave like the bottom half would add about $400 a month. One more partner who resembles the top 2 would add far more. An application does not show which partners those will be, so tiers that pay more to partners who prove themselves do the sorting.
Semrush raises its Semrush One payout from $300 a sale at 0 to 4 sales a quarter to $450 at 50 or more. GetResponse moves from 40% to 50% commission at 50 sales in 12 months and to 60% at 100. HubSpot sorts partners by monthly sign-ups into Starter (0 to 29), Sprocket (30 to 99) and Elite (100 or more), and Elite partners get custom commission subject to approval.
### Payout timing, thresholds and hold periods
Payout terms vary more than headline rates. HubSpot sets a $10 minimum balance and pays by direct deposit or PayPal. Semrush runs on the Impact network, locks a transaction 27 days after the end of its month, and pays 21 days after the end of the month in which it locked. Read literally, a sale on January 10 locks on February 27 and pays on March 21, a 10-week wait. Notion says it may claw back the reward when a user downgrades to free or gets a refund in the first 2 months. Mechanics for paying partners, including tax forms, are in [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates).
Holds exist because of disputes. [Stripe's documentation](https://docs.stripe.com/disputes/how-disputes-work) says card networks typically allow cardholders to dispute a payment within 120 days, and alternative payment methods typically allow up to 180. A 30-day hold ends with 90 days of the card dispute window still open, and a hold long enough to cover all 120 makes honest partners wait four months. I would pair a moderate hold with automatic commission reversal, as covered in [affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling).
### The affiliate channel in TrackRev's own data
TrackRev's [attribution dataset](https://www.trackrev.io/data/saas-attribution-benchmarks) measures channels per workspace across 4,217 workspaces active between April 1 and June 22, 2026. Of those, 1,612 report an affiliate or partner channel.
| Channel | Click-to-paid | Revenue per click | LTV multiplier | Median months to first churn |
| --- | --- | --- | --- | --- |
| Newsletter (owned email) | 4.8% | $4.40 | 1.9x | 11.8 |
| Affiliate / partner | 3.9% | $4.10 | 1.4x | 9.6 |
| Paid search | 2.4% | $2.20 | 0.9x | 7.1 |
| Paid social | 1.2% | $1.30 | 0.8x | 6.2 |
*Per-workspace medians, TrackRev workspace data, Q2 2026. The LTV multiplier is 12-month channel LTV divided by the workspace's overall 12-month LTV, and the LTV and churn columns cover the 1,803 workspaces with at least 12 months of paid history.*
Affiliate traffic converts to paid slightly below the 4.2% all-channel median, and its customers are worth 1.4 times the workspace average over 12 months against 0.8 times for paid social. The dataset skews toward bootstrapped and growth-stage SaaS with a median MRR of $14,800, so enterprise programs should treat the figures as directional.
### How to benchmark your own program
Five numbers are enough to compare a program with everything above:
- Divide the affiliates with a paid conversion within 30 days of joining by the affiliates who joined, for each monthly cohort, and compare the result with the 18% median.
- Take the revenue from your top 10% of partners as a share of all partner revenue and compare it with 71%.
- Find the 90th percentile of days from click to paid charge for partner-referred customers and check it against your configured cookie window.
- Add up commission paid and pending as a share of partner-attributed revenue, and check it against gross margin.
- Count the days from sale to payment, since partners compare payout lag across programs.
TrackRev's partner analytics page shows active partners, clicks and sales over the last 30 days, partner revenue, and a top-partners list by lifetime attributed revenue, so concentration is a quick read. Each program sets its own cookie window, credit rule (last click, first click or shared), payout schedule, payment threshold and hold period, which runs from 0 to 180 days and defaults to 0. A refunded or disputed charge reverses its commission automatically. The [affiliate program](https://www.trackrev.io/solutions/affiliate-program) runs on paid plans from Starter at $39 a month.
TrackRev has no partner marketplace, so partners arrive by invite, application form or your own outreach. If you want a pool of pre-vetted partners to recruit from, PartnerStack's Network is built for that.
### Frequently asked questions
**What is a good activation rate for a SaaS affiliate program?**
Fewer than 1 in 5 recruited affiliates activate in a typical program, and more than 3 in 10 puts a program in the top quartile. Measure each signup cohort only after its own 30 days have passed, because recent signups drag the rate down. Programs near 11% usually send an approval email and little else, which is the cheapest thing to fix.
**What commission should a SaaS affiliate program pay?**
Work backward from what a customer is worth to you over the payout term. The B2B median is 20% for 12 months and PartnerStack's top vendors averaged 23.53% in 2023, so the competitive band runs 20% to 30%. Add tiers for proven partners before raising the base rate for everyone.
**How long should an affiliate cookie window be?**
Set it from your own click-to-paid timing, since a competitor's window reflects its own buyers. Sixty days reaches past most self-serve buyers, and a trial plus a purchasing approval justifies another 30. If tracking depends on a client-side cookie, test it in Safari.
**How many affiliates produce most of the revenue?**
In the median program roughly 1 in 10 affiliates produces 71% of revenue, and in the most concentrated tenth of programs the same group produces 84%. With 40 affiliates, expect about 4 to carry the program. A quiet bottom half is normal, and tracking deserves a check only if your best partners show no clicks.
**How long until an affiliate makes a first sale?**
The median affiliate needs 14 days from approval to a first commission. Top-quartile affiliates by year-one revenue take 5 and third-quartile ones take 27. An affiliate with no conversion by day 60 has a 3.7% lifetime chance of making one, so review the roster at 30 and 60 days and message anyone with clicks and no sales.
**Should SaaS affiliate commission be recurring or one-time?**
Recurring for a fixed term suits a subscription, because the affiliate is paid while the customer pays. One-time commission at the sale, with a median of 25% in the dataset, suits annual-only or single-payment products and caps your exposure. Lifetime recurring, used by 18% of programs, has the median rate of 30% and commits you to pay for as long as the customer stays.
**Can I track these metrics on TrackRev's free plan?**
No. The free plan covers link tracking: 50 links, 1,000 tracked events a month and one workspace. The affiliate program and revenue figures need a paid plan, which starts at Starter for $39 a month.
---
## SaaS Referral Programs: How They Work and What Real Ones Pay
URL: https://www.trackrev.io/blog/saas-referral-program
Published: 2026-10-03
Author: Muzahid Maruf
How a SaaS referral program works: credit or cash, two-sided rewards, where the invite lives, 7 real programs checked in 2026, and tracking to paid.
A SaaS referral program pays an existing customer when someone they send becomes a paying subscriber. The reward is usually account credit, sometimes a gift card or cash, and the friend often gets a discount or a longer trial. The trigger sets the cost: Airtable pays $10 when an invited person signs up and verifies an email, while DigitalOcean pays $25 only after the friend has spent $25.
6 of the 7 programs checked for this guide wait until money moves, so the product has to know which signup became which subscription. The referrer's identity must survive 4 hand-offs: the click, the signup, the checkout and the first paid invoice.
> **Key takeaways:**
>
> - 6 of the 7 SaaS referral programs checked in October 2026 pay only after the friend's money moves. Airtable pays $10 at a verified signup and lets credit lapse after 90 days on the Free plan.
> - On a $59 plan at an 80% gross margin, a $25 credit is earned back in 0.5 months of gross profit and a 25% share for 12 months in 3.75 months.
> - A Stripe subscription with a trial creates an immediate invoice for an amount of 0. Reward the first invoice with an amount paid above 0, then hold the reward for your refund window, such as FreshBooks' 60 days or Fathom's 30.
> - Referral credit in Stripe is a negative customer balance transaction, -2500 for $25.00. It reduces only the next invoice, and posting an opposite transaction is the only way to undo it.
> - The 5 flat-reward programs checked pay $10 to $1,000 once. Affiliate programs pay recurring cash, 20% for 12 months at the B2B SaaS median across 564 programs. FreshBooks and Pipedrive run both.
> - TrackRev runs credit and cash referral programs from Starter at $39 a month, with the commission hold set per program from 0 to 180 days and defaulting to 0.
### What each SaaS referral program pays, and when
| Company | Referrer earns | Friend gets | Reward fires when |
| --- | --- | --- | --- |
| [Airtable](https://support.airtable.com/docs/airtable-credits-overview) | $10 in credit per accepted invite | Nothing on the credits page | Invitee signs up, or accepts a collaborator invite, and verifies an email |
| [DigitalOcean](https://www.digitalocean.com/referral-program) | $25 in credits | Access to the products; no credit listed | Friend reaches $25 in billings |
| [FreshBooks](https://www.freshbooks.com/referral-program) | $100 account credit (limited-time offer) | 90% off the first 90 days | Friend has been a paying subscriber for 60 days |
| [Pipedrive](https://support.pipedrive.com/hc/en-us/articles/115005413505-Pipedrive-Referral-Program) | $100 gift card, Amazon or PayPal; paying customers only | 30-day trial instead of 14 days | Friend's payments to Pipedrive pass $100 |
| [Gusto](https://support.gusto.com/article/106622339100000/Refer-a-friend-to-Gusto-Earn-a-sign-up-bonus) | $300, $400, $500, $700 or $1,000 gift card, set by how many people you referred before | $100 | Friend signs up and pays its first payroll invoice |
| [Fathom Analytics](https://usefathom.com/affiliates) | 25% recurring commission, taken as account credit ($20 minimum) or a Wise payout ($200 minimum) | $10 off the first invoice | Each payment, after a 30-day clearing period |
| [Railway](https://docs.railway.com/community/affiliate-program) | 15% of invoices for the first 12 months | $20 in Railway credits, a free month of Pro | Friend becomes a Railway customer |
*Terms from each company's own referral page, help article or program terms, October 2026. Fathom and Railway call theirs partner and affiliate programs.*
Airtable is the exception and has the smallest reward, $10 for a verified signup. The rest scale the reward to how late the trigger fires: $25 at $25 of billings (DigitalOcean), $100 after 60 paid days (FreshBooks) or $100 of payments (Pipedrive), and $300 to $1,000 after the first paid payroll invoice (Gusto). A trigger on signup costs more per customer. With 100 referred signups and 20 who pay, those 20 carry the reward paid for all 100.
| Trigger | Reward | Signups | Paying at 20% | Total reward cost | Cost per paying customer |
| --- | --- | --- | --- | --- | --- |
| Verified signup | $10 | 100 | 20 | $1,000 | $50 |
| First payment above $0 | $25 | 100 | 20 | $500 | $25 |
*Hypothetical: 100 referred signups, 20% of whom become paying customers.*
#### How the programs limit their exposure
| Company | Expiry or claim window | Who does not count |
| --- | --- | --- |
| Airtable | Credit expires after 90 days on Free, 1 year on Team | Existing accounts, unverified emails and anyone who already accepted another invitation for credit; Business and Enterprise accounts cannot earn |
| FreshBooks | Credit issues 60 days after the upgrade, never expires, and cannot be refunded or transferred | Referrals sharing a cookie, IP address, email address or customer ID with the referrer |
| Pipedrive | 12 months to claim after manual approval | A 2nd account at the same company, or accounts made to claim the reward |
| Gusto | Gift card expires after 6 months; sent up to 30 days after the invoice is paid | Accounts closed before the bonus is issued |
| Fathom Analytics | 30-day attribution cookie; commissions clear after 30 days | Partners without an active subscription |
*Same sources, October 2026, plus [FreshBooks](https://www.freshbooks.com/policies/terms-and-conditions-of-freshbooks-referral-program) and [Pipedrive](https://www.pipedrive.com/en/referral-program-terms) program terms. DigitalOcean lists no expiry or cap.*
### Credit, cash or a gift card
Credit needs no payout rails and only has value to a referrer who stays. Product usage is the cheapest reward when you have spare capacity, and [Dropbox](https://help.dropbox.com/accounts-billing/space-storage/earn-space-referring-friends) pays in storage: 500 MB per referral on Basic up to 16 GB, 1 GB on Plus, Family and Professional up to 32 GB, plus 500 MB for the friend.
I would default to credit and offer cash only to referrers who would never use it, because cash adds admin. Gusto's cards come through Tremendous, which asks anyone earning $600 or more in a calendar year for a W-9 for a 1099-NEC. Pipedrive validates each referral by hand. Fathom lets a referrer pick account credit from $20 or a Wise transfer from $200.
#### What the reward costs on a $59 plan
Take a $59 monthly plan at an 80% gross margin, which leaves $47.20 of gross profit a month per paying customer. Each reward divided by that figure gives the months of gross profit needed to earn it back.
| Reward | Given up per referred customer | Months of gross profit to earn it back |
| --- | --- | --- |
| $25 credit after the first paid invoice | $25.00 | 0.5 |
| $59 credit, one free month | $59.00 | 1.25 |
| $100 gift card after $100 paid | $100.00 | 2.1 |
| 25% of revenue for 12 months, $14.75 a month | $177.00 | 3.75 |
*Hypothetical $59 a month plan at an 80% gross margin, for a customer who stays at least 12 months.*
Credit never leaves the bank, but it is still revenue you do not collect, so count it as cost. A customer who leaves after 2 invoices costs $29.50 under the commission row. The 25% share takes 31.25% of gross profit, because it is computed on the $59 price while gross profit is $47.20.
#### Granting credit in Stripe
In Stripe Billing, credit is a negative [customer balance transaction](https://docs.stripe.com/api/customer_balance_transactions/create), in cents. Per the [invoice balance documentation](https://docs.stripe.com/billing/customer/balance), it applies to the next invoice finalized for that customer, up to the invoice total, in a matching currency, so a $25 credit against a $59 invoice leaves $34 due. A transaction's amount cannot be changed and the transaction cannot be deleted, so undoing 1 credit means posting an opposite one.
Stripe API: grant a $25 referral credit to the referrer
```
# Negative amounts are credits. The idempotency key stops a webhook retry paying twice.
curl https://api.stripe.com/v1/customers/<>/balance_transactions \
-u "<>:" \
-H "Idempotency-Key: referral-ref_8841" \
-d amount=-2500 \
-d currency=usd \
-d description="Referral credit for invoice in_1PxExample" \
-d "metadata[referral_id]=ref_8841"
```
### One-sided or two-sided rewards
5 of the 7 programs also reward the friend, and the offers run from free to expensive. Airtable's credits page and DigitalOcean's referral page list nothing for the friend beyond access.
| Friend reward | Seen at | Cost on a $59 monthly plan |
| --- | --- | --- |
| 30-day trial instead of 14 | Pipedrive | $0 in cash; the first invoice arrives 16 days later |
| $10 off the first invoice | Fathom Analytics | $10.00 |
| $20 in credits | Railway | $20.00 |
| $100 reward | Gusto | $100.00 |
| 90% off the first 90 days | FreshBooks | $159.30 (3 months at $53.10 off) |
*Hypothetical $59 plan billed monthly; the friend offers are as each company publishes them.*
The friend's reward gives the link a reason to be used. Pipedrive pays nothing when a friend signs up directly instead of through the link, and its help page says the link cannot be applied after the account exists. A longer trial does that job at no cash cost, so I would start there. On the referrer's side, Gusto sets the reward by past referral count: $300, $400, $500, $700 or $1,000.
### Where the invite lives in the product
Pipedrive puts "Referral program" in the top-right account menu, with a link, email invites and 3 social share options. Its tab tracks 4 statuses: invites sent, invitees signed up, companies subscribed and rewards in progress. Gusto lists Referrals in the top menu, or "Refer & earn" in the left menu, and adds a Refer option to its mobile app. Railway puts a Refer button in the dashboard, and Airtable pays $10 for each new collaborator who accepts a share invite.
A referrer waiting 60 days on a FreshBooks credit needs the status tab more than the share button. I would show 1 prompt, once, right after a win such as the first exported report, and leave the menu entry for everyone else. A modal at signup asks for a favor before the user has anything to recommend.
### How a SaaS referral program differs from an affiliate program
FreshBooks runs both. Customers get a $100 account credit 60 days after the friend upgrades; affiliates apply through PartnerStack, are reviewed and earn up to $200 per sale, per its [affiliate page](https://www.freshbooks.com/affiliate-program). Pipedrive draws the same line: its referral program is for paying customers, and affiliates go to a separate partner program.
| Attribute | Customer referral program | Affiliate program |
| --- | --- | --- |
| Who promotes | Paying customers, as at Pipedrive | Creators, publishers and consultants; FreshBooks reviews each PartnerStack application |
| Typical reward | A flat $10 to $1,000 once, as in 5 of the 7 programs above | A recurring share; the B2B SaaS median is 20% for 12 months across 564 programs, and only 3% of programs pay flat dollars, $45 at the median |
| Attribution window | The link must be used at signup, as at Pipedrive | 60 days is the median, used by 41% of programs |
| Reach limit | Your customer count and whom they know | The partners you can recruit and activate |
| Common abuse | A 2nd account made to claim the reward | Coupon sites and bidding on your brand name |
*Benchmark figures from [TrackRev's affiliate benchmark tables](https://www.trackrev.io/data/affiliate-program-benchmarks), Q2 2026, compiled from public Impact, PartnerStack and Awin research.*
The line blurs when a customer earns a share of every payment. Fathom pays 25% recurring to paying customers only, and Railway's affiliate program gives the friend $20 and the referrer 15% of 12 months of invoices. Choose by who you want to reach: your customers' contacts, or readers already comparing tools. The [guide to creating an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) covers the second.
### Tracking a referral from signup to paid subscription
#### Capture the referrer at signup
Land the visitor on a URL such as `yourapp.com/?ref=user_2093`, store the value in a first-party cookie, and copy it onto the new user's row in the signup handler. Pipedrive's help page says a link cannot be applied after the account exists, and Airtable disqualifies an invitee who already has an account. Fathom Analytics uses a 30-day cookie, and 60 days is the most common affiliate setting, used by 41% of programs. A "How did you hear about us?" field is the fallback: Fathom counts a signup whose answer matches a phrase a partner registered.
#### Carry it through checkout
Send 3 references to Stripe Checkout. The `client_reference_id` field, up to 200 characters, ties the Checkout Session to the friend's user id in your system. Session `metadata` records the referrer for that session. The `subscription_data` metadata sets the referrer on the subscription, and each invoice then carries an immutable snapshot of it. Without that last field, renewal invoices carry no referrer. See [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup).
Stripe API: a subscription Checkout Session that records the friend and the referrer
```
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=subscription \
-d "line_items[0][price]=<>" \
-d "line_items[0][quantity]=1" \
-d "subscription_data[trial_period_days]=14" \
-d client_reference_id=user_4417 \
-d "metadata[referrer]=user_2093" \
-d "subscription_data[metadata][referrer]=user_2093" \
-d success_url="https://example.com/welcome"
```
#### Fire the reward on a paid invoice
Stripe's [free trial documentation](https://docs.stripe.com/billing/subscriptions/trials/free-trials) says a subscription with a trial still creates an immediate invoice, but the amount is 0. A 14-day trial that starts June 1 produces a 0 invoice on June 1 and the first $59 charge on June 15, so a handler that treats the first invoice as the first payment would reward the referrer 14 days early. Check that `amount_paid` is above 0, record 1 reward per referred customer, and set a pay-on date after your refund window. A daily job then grants each reward on its pay-on date, after rechecking the invoice for a refund. Stripe's [subscription webhook guide](https://docs.stripe.com/billing/subscriptions/webhooks) describes `invoice.paid` as sent when an invoice is successfully paid.
A webhook handler for invoice.paid; db stands for your own data layer
```
export async function onInvoicePaid(invoice: Stripe.Invoice) {
const referrer = invoice.parent?.subscription_details?.metadata?.referrer;
if (!referrer || invoice.amount_paid === 0) return; // trial invoices are 0
const customer = invoice.customer as string;
if (await db.rewards.exists({ referredCustomer: customer })) return; // one reward each
await db.rewards.insert({
referrer,
referredCustomer: customer,
invoiceId: invoice.id,
status: "pending",
payOn: addDays(new Date(), 30), // your refund window
});
}
```
#### Reverse it when the money goes back
Pipedrive pays nothing if the friend cancels or downgrades before reaching $100 in payments, so on a $59 plan a friend who stops after 1 payment ($59) earns nothing and one who stops after 2 ($118) clears the bar. FreshBooks needs the friend to still be a paying account on day 60. Mirror that: listen for `charge.refunded` and `charge.dispute.created`, void a reward not yet granted, and post an opposite balance transaction for 1 already issued. [Refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers the edge cases.
### Abuse, tax and disclosure
FreshBooks compares cookie, IP address, email address and customer ID, and Pipedrive allows 1 reward per company. A paid-invoice trigger plus a hold through the refund window catches most of the rest, and [preventing self-referral fraud](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) covers the signals.
Referrers who post their link publicly need a disclosure. The Federal Trade Commission's [Endorsement Guides Q&A](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking), covering guides revised in 2023, says a connection a significant minority of consumers would not expect should be disclosed clearly and conspicuously, and its examples include commission links and discount codes. Pipedrive's terms go further and forbid publishing referral codes where search engines can index them. [FTC, GDPR and consent rules for affiliates](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers the rest.
### Referral software or your own build
A credit-only build on Stripe has 6 parts: a code table, the signup stamp, checkout metadata, a webhook handler, a daily pay-on job and a status page. Tools earn their price at cash payouts, tax forms, refunds across billing systems and a second program for affiliates. When you compare SaaS referral software, ask whether it delivers credit or only cash, and whether it holds a reward through your refund window.
### Running a SaaS referral program in TrackRev
TrackRev's [referral campaigns](https://www.trackrev.io/products/referral-campaigns) and affiliate program run as programs in 1 workspace. A non-cash program pays credit in a unit you name, such as `free_days` or `ai_credits`, with separate amounts for free and paid users. Per the [credit documentation](https://doc.trackrev.io/affiliate/credits-and-fulfilment), a connector for Supabase, Postgres, MongoDB or Airtable writes it into your database, or a signed webhook you handle yourself, so the Stripe call above could sit inside that handler. Grants stay earned but undelivered until a connector exists, and refunds or self-referral blocks revoke them.
The [dashboard embed](https://doc.trackrev.io/affiliate/dashboard-embed) adds a Refer & Earn page to your app from 1 script tag. It enrolls each signed-in user on first view and shows their link, clicks, signups, purchases and rewards. With 1 setting turned on, credit earners can switch to cash commissions and keep the credit already earned.
TrackRev dashboard embed, filled in with the signed-in user
```
```
Cash commission is tracked against paid invoices synced from Stripe, Polar, Lemon Squeezy or Paddle, and reversed on a refund or dispute. The hold runs from 0 to 180 days per program and defaults to 0, so set it to your refund window. You pay from a PayPal or Wise CSV export and mark each payout paid. Billing outside those 4 systems reports purchases through an API call. If all you need is a Stripe credit for a few dozen customers, the handler above does the job without another subscription.
| Plan | Price | Commission tracked a month | Workspaces |
| --- | --- | --- | --- |
| Free | $0 | Programs locked; 50 links and 1,000 tracked events | 1 |
| Starter | $39 a month | $10,000 | 1 |
| Growth | $99 a month | $100,000 | Unlimited |
| Scale | $199 a month | Unlimited | Unlimited |
*From TrackRev's [pricing](https://www.trackrev.io/pricing). Annual billing pays for 9 months and gives 12.*
### Frequently asked questions
**What is a SaaS referral program?**
It is a rule set that rewards current customers when someone they introduce becomes a paying subscriber: who can refer, what each side gets, which event releases the reward and when it can be reversed. A $25 credit after the friend's first $25 of billings is a complete program.
**How much should a SaaS referral program pay?**
Hold it to the payback period you accept for paid channels. On a $29 plan at an 80% gross margin, a customer yields $23.20 of gross profit a month, so a $50 reward takes 2.2 months to earn back and a $75 reward takes 3.2.
**Should a SaaS referral reward be credit or cash?**
Credit suits customers who keep paying: a $25 credit covers 42% of a $59 invoice and needs no payout rails. Cash or gift cards suit referrers who would not use credit, at the price of tax paperwork: Gusto collects a W-9 once rewards reach $600 in a year, and thresholds change, so check the current one.
**Does a referral program work with a freemium product?**
Yes, if the reward waits for the paid upgrade. At a 5% free-to-paid rate, a $10 reward per signup costs $200 per paying customer, 8 times a $25 reward paid on the first payment. Count free signups as progress and pay on the upgrade.
**When should a referrer be paid?**
After the friend's first real payment clears and your refund window has passed. With a 14-day window, an invoice paid on June 12 becomes payable on June 26, and a refund before then cancels the reward.
**Can I run a SaaS referral program on Stripe without extra software?**
Yes. Pass the referrer in 2 metadata fields, listen for invoice.paid, and post a negative balance transaction such as -2500 for $25. You build or buy the ledger, payouts, fraud checks and a status page for referrers.
**Can I run a referral program and an affiliate program together?**
Yes, and FreshBooks and Pipedrive each run 2 programs. Keep the terms separate so nobody collects twice on 1 signup, and give each program its own link so reports stay clean. In TrackRev both are programs in 1 workspace.
**What if the friend signs up on another device or without the link?**
A cookie cannot follow a person across 2 devices, so offer a code typed at signup or checkout, plus a how-did-you-hear field. Decide which one wins when a code and a link disagree, and confirm the friend is a new account.
---
## Safari ITP and SaaS attribution: what the 7-day cap deletes
URL: https://www.trackrev.io/blog/safari-itp-attribution-saas
Published: 2026-07-11
Author: Muzahid Maruf
Safari ITP caps JavaScript cookies at 7 days, or 1 day after some ad clicks, so SaaS payments land in Direct. What it deletes and how to keep the source.
Safari ITP attribution loss comes from the way Intelligent Tracking Prevention (ITP) shortens anything your site writes to the browser with JavaScript. Since February 2019, a cookie created that way expires after 7 days, and after 1 day when a classified tracker domain sent the visitor to a URL with a query string. A 14-day trial can reach Stripe with no source, and the payment is filed under Direct. A source stored in your own database and on the Stripe payment survives.
> **Key takeaways:**
>
> - ITP 2.1 capped JavaScript-written cookies at 7 days in February 2019, and ITP 2.2 cut that to 1 day after a tagged link from a classified domain.
> - Since March 2020 Safari also deletes LocalStorage, IndexedDB and other script-writable storage after 7 days of use without interaction.
> - Cookies your server sets in a response have no ITP cap, except third-party CNAME-cloaked ones, which get 7 days.
> - A day-0 signup keeps its source while the day-14 payment loses it and lands in Direct.
> - Log the click at a redirect you own, bind the email at signup and store the visitor ID in Stripe metadata.
### What Safari ITP caps and deletes
Apple shipped ITP in 2017 and has added rules since.
| Rule | Limits | Trigger | Announced |
| --- | --- | --- | --- |
| 7-day cookie cap | document.cookie cookies | Any persistent cookie created with JavaScript | [ITP 2.1](https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/), Safari 12.1, iOS 12.2, Feb 21, 2019 |
| 1-day cookie cap | document.cookie cookies set on the landing page | Classified sender plus a query string or fragment | [ITP 2.2](https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/), iOS 12.3, Apr 24, 2019 |
| 7-day storage deletion | LocalStorage, IndexedDB, SessionStorage, media keys, service workers | 7 days of Safari use without interaction | [ITP 2.3](https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/) on tagged navigations, Sep 23, 2019; [Safari 13.1](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) on every site, iOS 13.4, Mar 24, 2020 |
| Third-party cookie block | Cross-site cookies | Always, unless the Storage Access API grants access | Safari 13.1, iOS 13.4, Mar 24, 2020 |
| CNAME cloaking cap | Cookies set in HTTP responses, capped at 7 days | A subresource resolves through a third-party CNAME | [Safari 14](https://webkit.org/blog/11338/cname-cloaking-and-bounce-tracking-defense/), iOS 14, Nov 12, 2020 |
*Dates are the WebKit blog post dates.*
A machine learning model picks the classified domains, and [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) publishes no list, so you cannot check a campaign in advance. Tagged links always meet the query-string condition, which leaves the sender to decide whether the 1-day cap applies.
#### Cookies set in an HTTP response
WebKit limited the 2019 caps to cookies created through document.cookie, so a cookie your server sets in a response keeps its expiry, with or without the HttpOnly flag. The exception is CNAME cloaking: cookies set in responses from a subdomain such as track.blog.example that resolves to tracker.example get 7 days. Apple's definition covers subresources, and I found nothing from Apple on a top-level redirect through a vendor domain, so read the cookie's expiry in Safari if your tracking subdomain points at a vendor.
### Safari ITP attribution loss in a 14-day trial
A visitor clicks a tagged newsletter link in Safari, starts a trial in the same session and pays on day 14. The day-0 signup carries its source. What the payment finds depends on the gap since the last page view that ran your pixel.
| Last page view with your pixel | Cookie expires after a normal view (7-day cap) | Cookie expires after a tagged landing from a classified domain (1-day cap) |
| --- | --- | --- |
| Day 0 | Day 7 | Day 1 |
| Day 5 | Day 12 | Day 6 |
| Day 8 | Day 15 | Day 9 |
| Day 12 | Day 19 | Day 13 |
| Day 14 | Day 21 | Day 15 |
*The payment lands on day 14, so a cookie that expires on day 14 or earlier is already gone. Assumes the pixel rewrites its cookie on every page view.*
A prospect who ignores the onboarding emails and pays on the day-14 reminder is the first row: the cookie is gone, the charge lands in Direct and the click row at your redirect is untouched. Paid social is the likeliest to meet both conditions of the 1-day cap, since a social app is a plausible classified sender and ad URLs carry parameters.
For scale, [Statcounter's September 2026 data](https://gs.statcounter.com/browser-market-share) puts Safari at 18.27% of worldwide browser usage and [46.38% of US mobile usage](https://gs.statcounter.com/browser-market-share/mobile/united-states-of-america). Your customer mix sets the real figure. Take 80 new customers every month at $79 each, 40% of them on Safari, with Direct absorbing every lost source.
| Safari customers losing their source | Filed as Direct | MRR | 12-month revenue |
| --- | --- | --- | --- |
| 25% | 8 | $632 | $7,584 |
| 50% | 16 | $1,264 | $15,168 |
| 75% | 24 | $1,896 | $22,752 |
*Invented numbers: 80 new customers per month, 40% on Safari (32), each paying $79 monthly for 12 months.*
### Which attribution setups ITP breaks
| Where the source lives | Expiry in Safari |
| --- | --- |
| Cookie your pixel writes with JavaScript | 7 days, or 1 day after a tagged landing from a classified domain |
| UTM tags in LocalStorage or SessionStorage | Deleted after 7 days of Safari use without interaction |
| Cookie your server sets on your own domain | No cap since ITP 2.1 |
| Cookie from a subdomain that CNAMEs to a vendor | 7 days when it counts as CNAME cloaking |
| Third-party cookie on a vendor domain | Blocked since Safari 13.1 |
| Click row or visitor ID in your database or Stripe metadata | Outside the browser; Stripe takes 50 keys of 500 characters |
Link Tracking Protection, which removes known tracking parameters from links opened in Messages, Apple Mail and Private Browsing, is a separate Apple feature, covered in [iOS 17 Link Tracking Protection and what survives](https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas).
### Moving the source out of Safari's reach
#### 1. Log the click at a redirect you own
Send shared links through a short link such as `go.example.com/spring-launch`. The redirect stores the click (visitor ID, link, timestamp, user agent, referrer) and sets the visitor cookie in its 302 response, with Domain set to your registrable domain, outside the script caps. The [server-side versus client-side comparison](https://www.trackrev.io/blog/server-side-click-tracking-vs-client-side-pixel) covers what that log sees.
#### 2. Bind the email to the visitor on day 0
Read the visitor ID from the cookie your redirect set and save it in the same request that creates the user, the one moment the ID and the email arrive together. A script-written cookie may not last from the click to a signup 8 days later, and an ID that never reaches the user record leaves that click unlinked.
#### 3. Write the visitor ID onto the payment
[Stripe Checkout](https://docs.stripe.com/api/checkout/sessions/create) takes a `client_reference_id` of up to 200 characters, and [metadata](https://docs.stripe.com/metadata) allows 50 pairs with keys up to 40 characters and values up to 500. Metadata on the session stays on the session. `subscription_data.metadata` saves to the Subscription. The [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post has a field mapping.
A Checkout Session that carries the visitor ID and UTM tags onto the subscription
```
// vid comes from the cookie your server set at the redirect
const click = await db.clicks.findFirstByVisitor(vid);
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
client_reference_id: vid,
subscription_data: {
metadata: {
vid,
utm_source: click?.utmSource ?? "",
utm_medium: click?.utmMedium ?? "",
utm_campaign: click?.utmCampaign ?? "",
},
},
success_url: "https://app.example.com/welcome",
cancel_url: "https://www.example.com/pricing",
});
```
#### 4. Set the attribution window past the trial
Windows count back from the payment. A trial of 14 days under a window of 30 days means a click counts only if it came within 16 days of the trial start, so a pricing-page visit 21 days earlier drops out. Cover the trial plus your usual research time.
#### 5. Test in Safari before you trust the numbers
The [ITP 2.3 post](https://webkit.org/blog/9521/intelligent-tracking-prevention-2-3/) describes ITP Debug Mode (Develop menu, Safari 13 on macOS) and a defaults command that classifies a test domain as a tracker. WebKit wrote those steps in 2019, so confirm them on your version. WebKit says ITP Debug Mode was available in Safari Technology Preview well before regular Safari 13 got it.
From the ITP 2.3 post: classify a test domain (macOS)
```
defaults write com.apple.Safari ITPManualPrevalentResource sender.example
```
Click from that domain to a URL with a query string, write a cookie with JavaScript, and read its expiry in Web Inspector. Then split the last 30 days of paying customers into Safari and other browsers and compare how many in each group have a source.
### What TrackRev does with Safari traffic
A [TrackRev link](https://www.trackrev.io/products/first-party-tracking) logs each click server-side and sets a `vid` cookie in the HTTP response, good for 365 days. The destination URL carries the ID as `_vid`, and your pixel copies it into a JavaScript cookie that Safari caps at 7 days, or 1 day after a tagged landing. The pixel rewrites that cookie on every page view.
`trk.identify(email)` attaches an email to a known visitor. The Stripe sync resolves a visitor from a `vid` in charge metadata, from the Checkout Session or from the customer's email, then credits clicks inside your attribution window (1 to 365 days, set per workspace). Renewals copy the first order's credit.
A Safari visitor who goes quiet for more than 7 days and returns through a plain URL gets a new pixel visitor with no click behind it, so the email binds to nothing. A signup within the same session, or a return through any tracked link, keeps the chain.
The Free plan covers 50 links and 1,000 tracked events monthly, with revenue figures hidden. Revenue by channel needs Starter at $39 a month ([pricing](https://www.trackrev.io/pricing), [revenue attribution](https://www.trackrev.io/solutions/revenue-attribution)). Skip a tool if you already write UTM tags and a click ID to Stripe metadata at checkout, as in step 3. Google Analytics 4 showing no revenue by channel is a separate fix, covered in [GA4 not showing revenue by channel](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel).
### Frequently asked questions
**Does ITP block cookies on my own domain?**
No. Safari has blocked third-party cookies by default since March 2020, and the Storage Access API is the only way around that. A cookie on your own domain is first party. ITP shortens the ones created with JavaScript and the CNAME-cloaked ones.
**Can I set a longer cookie lifetime?**
Not for cookies created with JavaScript. A script that requests 365 days gets 7 in Safari, and only a request for under 7 days is honored. Move the write to your server.
**Does LocalStorage get around the cookie limit?**
No. The March 2020 rule exists because trackers moved to LocalStorage after the 2019 cookie cap, and LocalStorage has no expiry function. Safari now deletes it after 7 days of use without interaction.
**Does a longer trial make ITP worse?**
Only for visitors who go quiet. If your pixel rewrites its cookie, a user who opens a page with your script every 6 days keeps the cookie for the whole trial, whatever its length.
**Is a CNAME tracking subdomain safe from ITP?**
Apple's table shows no cap when a subdomain resolves to another subdomain of your own site, and 7 days when it resolves to a third party. A vendor-hosted redirect domain is untested here, so read the cookie's expiry after a click.
**Does ITP change click counts on short links?**
A click logged at the redirect does not depend on browser storage, so the storage caps leave the count alone. Click IDs are a separate matter, handled by Link Tracking Protection in iOS 17 and later.
**Do Home Screen web apps get the 7-day cap?**
WebKit exempts the first-party domain of a web app added to the Home Screen from its website data removal and keeps its data separate from Safari's, so a classification made in Safari does not carry over.
---
## How to scale an affiliate program to $50K MRR
URL: https://www.trackrev.io/blog/scale-affiliate-program-50k-mrr
Published: 2026-07-02
Author: Muzahid Maruf
A plan to scale an affiliate program to $50K MRR: the customer and partner math, what to do at each stage, what tiers cost and when to hire a manager.
To scale an affiliate program to $50K MRR, plan around a short list of partners who carry real volume. On a $79 plan that target is 633 paying customers, and in a program that matches the benchmark medians about 20 partners in a roster of 200 bring in 71% of the revenue. Only 18% of new affiliates make a sale in their first 30 days. Growth therefore comes from raising that rate, finding more partners like your best ones, and keeping payouts and records clean as the numbers rise.
> **Key takeaways:**
>
> - At the median, 71% of partner revenue comes from 10% of partners. On a $79 plan that means about 20 partners in a roster of 200 carry roughly 22 customers each.
> - Raise 30-day activation before recruiting more. The gap between a bottom-quartile and a top-quartile program is 12 against 62 sellers per 200 recruits.
> - Tier once you can name your best 10%. Raising 20 partners from 20% to 25% commission costs $1,775 monthly in the example.
> - A part-time manager costing about $3,250 monthly pays for itself at roughly $5,900 of added partner MRR.
> - Pick a hold period before payouts get large. TrackRev defaults to 0 days, Stripe puts the usual card dispute window at 120 days, and 20% of $50,000 equals the $10,000 Starter cap.
### What $50K MRR takes in customers and partners
The customer count sets every other number. The plan prices below are hypothetical, and the 3% monthly churn is an illustration.
| Monthly plan price | Annual value per customer | Customers needed for $50,000 MRR | Customers lost per month at 3% churn |
| --- | --- | --- | --- |
| $29 | $348 | 1,725 | 52 |
| $79 | $948 | 633 | 19 |
| $199 | $2,388 | 252 | 8 |
*Arithmetic on hypothetical prices. Customers needed is $50,000 divided by the plan price, rounded up.*
At $79 that is 633 customers and about 19 new ones a month just to stand still. If partners earn 20% for 12 months, commission runs up to $10,000 monthly while every customer is inside the term. Older customers age out, so a mature program pays less than that ceiling.
Partner revenue is concentrated, and the concentration decides who you need to find. The [affiliate benchmark dataset](https://www.trackrev.io/data/affiliate-program-benchmarks) is a cross-source median of public network reports. It puts 34% of program revenue with the top 1% of affiliates, 71% with the top 10% and 2% with the bottom half. Applied to 200 partners producing $50,000 of MRR on a $79 plan:
| Partner segment | Partners | Share of MRR | MRR | MRR per partner | Customers per partner |
| --- | --- | --- | --- | --- | --- |
| Top 1% | 2 | 34% | $17,000 | $8,500 | 108 |
| Top 10% | 20 | 71% | $35,500 | $1,775 | 22 |
| Top 25% | 50 | 89% | $44,500 | $890 | 11 |
| Bottom 50% | 100 | 2% | $1,000 | $10 | 0.1 |
*Shares are the dataset's median-program figures. The first three segments overlap, each containing the one above it, and customers per partner is MRR per partner divided by $79.*
The top 2 partners, at 108 customers each, carry the total. Adding another 100 partners who behave like the bottom half brings in about $1,000. Your own program may be flatter or steeper than the median, so rebuild this table from your ledger once you have 90 days of sales.
### How to scale an affiliate program in five stages
These dollar bands are my own rules of thumb for ordering the work, since no public dataset ties partner MRR to program stages. Programs move through them at different speeds, and a fast one often works on two at once.
| Stage | Partner MRR | Main job | Move on when |
| --- | --- | --- | --- |
| 1. Prove it | Up to $5,000 | Invite 10 to 20 customers who already recommend you | 3 paid conversions from at least 2 partners |
| 2. Repeat it | $5,000 to $20,000 | Onboard every partner the same way and track monthly cohorts | 30-day activation stays at 18% or higher for 3 cohorts in a row |
| 3. Sort it | $20,000 to $35,000 | Tier the best performers and add a manager | Top 10% named and tiers live for a full quarter |
| 4. Recruit it | $35,000 to $50,000 | Run 3 sourcing channels aimed at lookalikes of your best partners | Each channel has produced a partner who sold |
| 5. Protect it | $50,000 and up | Guard the biggest partners and tighten payouts and records | Ongoing |
### Up to $5,000: prove partners can sell your product
Two checks come before any recruiting. Your buyers should be reachable through people with audiences, such as consultants, agency owners, newsletter writers and developers. And your product should have a moment when people ask for a recommendation, like a tool comparison or a "what stack do you use" thread.
Your first 10 to 20 partners should be customers who already recommend you: the ones who reply to founder emails, answer questions in Slack groups or post about the product without being asked. They know the product, so they need little onboarding. Offer the market rate. The dataset's median for B2B SaaS is 20%, usually recurring for 12 months.
Choose a tool in a day. Running a program on TrackRev needs a paid plan, starting at $39 monthly, and the free plan covers link tracking only. Comparing platforms for 3 weeks before a single partner has signed up delays finding out whether anyone buys.
Call this stage done at 3 paid conversions from at least 2 partners. If 10 partners have held working links for 60 days and nothing has sold, check the commission, then whether your customers like the product enough to recommend it, then whether it has a recommendation moment at all. Waiting rarely fixes it: the dataset puts an affiliate's lifetime chance of a first conversion at 3.7% once 60 days pass without one.
### $5,000 to $20,000: make the first week repeatable
Activation is the number to move at this size. The dataset's median 30-day activation rate is 18%, against 31% in the top quartile and 6% in the bottom, and it attributes the gap to onboarding effort: a welcome sequence, ready-made creative and a first-week check-in. Of 200 recruits, the median program ends the first month with 36 sellers, a top-quartile program with 62 and a bottom-quartile program with 12.
Timing matters too. The median affiliate needs 14 days from approval to a first commission, and affiliates in the top quartile by year-one revenue need 5. I would send the tracking link and one ready-to-publish post the day a partner is approved, a content prompt with 2 real examples on day 3, and a personal message on day 10, before the median partner would have sold. The launch checklist is in [how to create an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program).
A rough kit this week beats a polished library in 6 weeks, because partners start writing the day they get it. Include logo files, 3 to 5 screenshots, the claims partners may make and a coupon code if you run one. After that, send every active partner one email each month covering product changes, a partner spotlight, content ideas and policy updates. GetResponse sends monthly newsletters to partners at every tier of its program.
Track activation by monthly signup cohort and read each cohort only after its own 30 days have passed, since recent signups drag the rate down. Message anyone with clicks and no sales at day 30 and day 60, and archive accounts that stay silent for 12 months so the averages describe real partners. Keep everyone on one rate for now: with 12 sellers, any tier threshold is a guess.
### $20,000 to $35,000: tier your best partners and add a manager
By $20,000 you have enough sellers to see who the best performers are, and running the program in spare hours stops working.
#### Tiered affiliate commissions and what they cost
Base tiers on proven sales over a window long enough to rule out one lucky month. HubSpot requires a partner's monthly sign-ups to stay consistent for 3 months before moving up a tier, and GetResponse counts sales over 12 months and pays each rate for 12 months.
| Program | Tier | Qualifies at | Commission |
| --- | --- | --- | --- |
| HubSpot | Starter | 0 to 29 sign-ups a month | 30% recurring for up to 1 year |
| HubSpot | Sprocket | 30 to 99 sign-ups a month | 30% recurring and/or a cost per sign-up |
| HubSpot | Elite | 100 or more sign-ups a month | Custom, subject to approval |
| GetResponse | Bronze | All partners | 40% |
| GetResponse | Silver | 50 or more sales in 12 months | 50% |
| GetResponse | Gold | 100 or more sales in 12 months | 60% |
*Terms from each program's own page ([HubSpot](https://www.hubspot.com/partners/affiliates), [GetResponse](https://www.getresponse.com/affiliate-programs)), October 2026.*
GetResponse's Gold tier adds a quarterly one-to-one with its head of affiliate and partnerships, a Slack channel, 2 conference tickets, co-marketing and a personalized landing page alongside the 60% rate.
> **Worked example: a 5-point bonus for the top 20:** In the 200-partner table above, the top 20 partners produce $35,500 of the $50,000. Raising their rate from 20% to 25% adds 5% of $35,500, or $1,775 monthly, which takes total commission from $10,000 to $11,775. Two of those partners carry $17,000 of MRR between them, so a monthly bonus of $425 each (5% of $8,500) is small next to the $8,500 that one departure would remove.
Keep the base rate the same for everyone and pay the bonus only above the threshold. Review the list every quarter, and talk to a partner who slips under the line before you move them down.
#### When to hire an affiliate manager
The trigger is operational. Hire when the founder starts missing partner check-ins, the monthly newsletter slips and new partners wait days for an answer. Expect that somewhere between $20,000 and $30,000 of partner MRR. A contractor working 10 to 15 hours a week is enough through this stage.
The manager owns onboarding, the newsletter, cohort review, approvals and partner check-ins. The founder keeps commission design, disputes with the sales team and the relationships with the top 5 partners.
> **Worked example: what a part-time manager costs:** A contractor at a hypothetical $50 an hour for 15 hours a week costs about $3,250 per month. At a 75% gross margin and 20% commission, each dollar of partner MRR leaves 55 cents while the commission term runs, so the hire is covered once it adds about $5,900 of MRR, roughly 12% of the $50,000 target.
### $35,000 to $50,000: recruit more partners like your best ones
With 71% of revenue coming from 10% of partners, open sign-ups add mostly bottom-half partners. List what your top 10 share: the kind of audience, where they publish and how they found you. Then recruit that profile on purpose.
Pick 3 sourcing channels for the quarter, for example direct outreach to category consultants, sponsorships in newsletters your buyers read, and introductions from your best partners. I would rather run 3 channels with weekly effort than 7 with a single message each.
Public data favors vetting over volume. PartnerStack reports that [43% of partners approved into its Network have earned a commission, against 3% of partners outside it](https://partnerstack.com/resources/research-lab/charts/partnerstack-network-approved-partners-are-far-more-likely-to-earn-a-commission-compared-to-non-network-partners), and that the share of activated, approved partners earning commissions [rose 2.25 times](https://partnerstack.com/resources/research-lab/charts/since-gating-the-partnerstack-network-more-marketplace-partners-generate-commissions) after it gated entry in 2023. Both figures come from PartnerStack's own marketing for its network, so read them as directional.
Your best partners also know people like themselves. [Partner Accelerator](https://www.trackrev.io/products/partner-accelerator) pays a smaller share up the referral chain from one capped pool, 30% by default, and flags any program where more than 25% of revenue comes from partners referring each other. Give your biggest partners their own landing page too, as GetResponse does at its top tier.
### $50,000 and up: protect the top and tighten the books
At this size a few partners carry most of the revenue, and payout volume brings tax and disclosure duties with it.
#### Concentration risk
In the 200-partner example the top 2 partners carry 34% of MRR, about 17% each. If one of them signs with a competitor, you lose the channel behind $8,500 of MRR and the new customers that audience would have sent. The defenses are the tools from the last two stages: a top tier that pays more and buys attention, a one-to-one with each of the top 5 every quarter, co-marketing and early access to product changes.
#### Payouts, tax forms and disclosure
Set the hold period before the first large batch. TrackRev's hold is set per program from 0 to 180 days and defaults to 0, so commission is eligible for payout immediately. [Stripe's dispute documentation](https://docs.stripe.com/disputes/how-disputes-work) says card networks typically allow cardholders 120 days to dispute a payment, and alternative payment methods such as Klarna and PayPal up to 180. A hold matching your refund window lets refunds land before commission is payable, and a hold covering all 120 days makes honest partners wait 4 months. Refunded or disputed charges reverse their commission automatically, and [affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers what to do when the money has already gone out.
Tax paperwork grows with the roster. The [IRS instructions for Forms 1099-MISC and 1099-NEC](https://www.irs.gov/instructions/i1099mec) set the reporting threshold for nonemployee compensation at $2,000 for tax years beginning after 2025, and the box instructions list commissions among the payments included. The same instructions say payments made through a third-party network can be reported on Form 1099-K by the payment settlement entity instead, so the right form depends on how you pay. Collect a W-9 from US partners and a W-8 from non-US partners before the first payout, and ask your accountant which rules apply. [How to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers methods and schedules.
Disclosure becomes a monitoring job. The FTC's [endorsement guide Q&A](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) says an advertiser needs reasonable programs to train and monitor the members of its network. Its list of elements is to tell partners what they can and cannot claim, instruct them on how to disclose their connection to you, search periodically for what they say, and act on questionable practices. With 50 or more active partners that is a recurring task for the manager, and [affiliate compliance for FTC and GDPR](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) has the checklist.
### What TrackRev covers as the program grows
The [affiliate program](https://www.trackrev.io/solutions/affiliate-program) in TrackRev handles the mechanics above: recurring and tiered commissions, a partner portal on your domain where partners see clicks, conversions and balances, payout batches on a weekly to quarterly schedule paid from one PayPal or Wise CSV export, W-9 and W-8 upload during onboarding, and automatic reversal on refunds and disputes. Fraud and self-referral detection is built in.
It needs a paid plan, from [Starter at $39 a month](https://www.trackrev.io/pricing). Starter tracks up to $10,000 of partner commission a month, which is what 20% of $50,000 comes to, and new commissions stop accruing past the cap until the month rolls over or you upgrade. Growth at $99 raises the cap to $100,000, and Scale at $199 removes it. TrackRev has no partner marketplace, so partners arrive by invite, application form or your own outreach. If you want a pool of pre-vetted partners to browse, PartnerStack's Network is built for that.
### Frequently asked questions
**How long does it take to reach $50K MRR through partners?**
No public dataset gives a reliable timeline, so work it out from your own adds. At $79 per customer, $50,000 of MRR is 633 customers. Adding 30 net customers per month gets there in about 21 months, and adding 50 gets there in about 13. Partner count, audience size and churn move those numbers more than any stage label does, so measure net adds after your first 90 days of sales and divide.
**How many affiliates do I need to reach $50K MRR?**
It depends on how many customers each strong partner carries. A partner with 20 active customers at $79 brings in $1,580 of MRR, so 32 such partners reach $50,000. If your strong partners carry 50 customers each, or $3,950 of MRR apiece, 13 of them do it. The full roster will be several times larger, since most recruits never sell.
**Should commission be recurring or one-time as the program grows?**
Recurring for a fixed term suits subscriptions, and it is the most common structure in the benchmark dataset at 39% of programs, ahead of one-time at the sale (33%) and lifetime recurring (18%). Lifetime recurring is the one with no end date on its cost, since every customer you win adds a commission obligation for as long as they stay. Calculate commission from paid invoices so it stops when payment stops.
**Where should I set the first tier threshold?**
Sort partners by their last 12 months of sales and set the first threshold where roughly the top 10% sit, which is 20 partners in a roster of 200. Check that the bonus costs a small share of the revenue those partners carry. Raise the line only after a quarter in which several partners cleared it.
**Can partners recruit other partners without raising my commission cost?**
With multi-tier commissions you set a pool cap, and in TrackRev's Partner Accelerator each level above the seller earns a smaller share than the level below, so the chain's total cannot pass the cap. Payouts stop once a level's share falls under $1, and a refund reverses every commission in the chain.
**Can I run an affiliate program on TrackRev's free plan?**
No. The free plan covers link tracking only, with 50 links, 1,000 tracked events a month and one workspace. The affiliate program and revenue figures need a paid plan, which starts with Starter at $39 monthly.
---
## Self-reported attribution vs tracked data: which source to trust for which decision
URL: https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data
Published: 2026-07-11
Author: Muzahid Maruf
Self-reported attribution vs tracked data: what a how-did-you-hear survey sees that clicks miss, where each errs, and how to cross-check both on real buyers.
Self-reported attribution vs tracked data splits by question. Tracked data wins any question about dollars on a channel that leaves a click. A customer's own answer wins the question of whether a channel with no click, such as a podcast or a friend's recommendation, exists at all. In the 40-customer month worked through below, 13 sales sit under Direct, and 10 of the 11 buyers there who answered a "How did you hear about us?" question named a friend or a podcast.
> **Key takeaways:**
>
> - In a hypothetical 40-customer month with $1,960 of new MRR, 13 sales sit under Direct, and 10 of the 11 buyers there who answered credit a friend or a podcast.
> - Never add the two sources together. In that month 6 of the 16 friend and podcast answers belong to customers with a tracked click, so a sum counts 6 sales twice.
> - Ask once, right after signup, with 6 to 8 plain options plus Other. "How did you first hear about us?" measures the opening touch, and "What made you sign up today?" measures the closer.
> - Keep ad budgets and affiliate commissions on recorded clicks. Use the answers to decide whether channels without links deserve money, such as the audio behind 8 of the 40 sales.
### Self-reported attribution vs tracked data at a glance
| Attribute | Tracked data | Self-reported answers |
| --- | --- | --- |
| Podcast mention, no link | Nothing; a later typed visit shows as Direct in Google Analytics 4 | Captured if the buyer names it |
| Typical error | Missed touches; the closing click takes all | Faded memory; one answer per buyer |
| Coverage | Every visitor whose click and cookie survive | Only people who answer |
| Revenue link | Join click to charge | Join answer to customer, then to charge |
| Setup | Links, a pixel, a Stripe connection | 1 form field, 1 place to store it |
### What each source records for one buyer
A buyer hears your founder on a podcast on day 1 and sees a colleague mention the tool in Slack on day 3, with no link in either. On day 9 she searches your brand name, clicks the organic result and starts a trial. On day 23 she pays $49 through Stripe Checkout. Your tracker holds 1 touch, the day-9 click, so [first-touch, last-touch and linear attribution](https://www.trackrev.io/blog/attribution-models-saas-comparison) all give organic search the $49.
Ask her 1 question at signup and the wording picks the answer. "How did you first hear about us?" points to the podcast, and "What made you sign up today?" points to the colleague, while the tracker says organic search either way.
### One month of 40 customers, both sources side by side
The numbers are hypothetical, chosen so the arithmetic is easy to follow. A SaaS company sells a $49 monthly plan and signs 40 new paying customers, which is $1,960 of new MRR. Each has a tracked source from last-touch attribution and a survey answer, and 6 left the question blank. That response rate is picked for readability, and real optional questions may draw fewer answers.
| Tracked source (last touch) | Friend or colleague | Podcast | Google search | Newsletter | No answer | Customers |
| --- | --- | --- | --- | --- | --- | --- |
| Direct, no recorded click | 5 | 5 | 1 | 0 | 2 | 13 |
| Organic search click | 2 | 2 | 5 | 0 | 2 | 11 |
| Paid search click | 0 | 1 | 6 | 0 | 1 | 8 |
| Newsletter link click | 1 | 0 | 1 | 5 | 1 | 8 |
| Total | 8 | 8 | 13 | 5 | 6 | 40 |
*Hypothetical month. Each customer pays $49, so 40 customers is $1,960 of new MRR.*
Start with the Direct row, where the two records disagree most: 13 customers with no recorded click, which is $637 of the $1,960. Eleven answered, and 10 of the 11 credit a recommendation or an episode, neither of which usually leaves a click. TrackRev's [Q2 2026 benchmarks](https://www.trackrev.io/data/saas-attribution-benchmarks) list a Direct / dark social channel with the highest median click-to-paid rate, 7.1%, and the highest 12-month LTV multiplier, 2.3x, so look inside the bucket before cutting anything that feeds it.
To size the pieces, apply the responders' shares to the whole row. Five of 11 answers named a friend, so about 13 × 5/11, or 6, Direct customers came through a friend, about 6 through a podcast and 1 through Google. That is $294, $294 and $49 of the $637. It is an estimate from responders and should be labeled one.
Now the double count. The table holds 8 friend answers and 8 podcast answers, and 10 of those 16 sit in the Direct row. The other 6 belong to customers with a tracked click, such as the 2 organic-search buyers who named a podcast. They are already inside the tracker's 40, so adding the survey's 16 to its totals counts 6 sales twice.
### Where each source goes wrong
| Source | Failure | Where it shows in that month |
| --- | --- | --- |
| Tracker | No signal from dark social or link-less audio | 10 of 13 Direct sales trace to a recommendation or an episode |
| Tracker | The closing click takes all the credit | The podcast earns $0 although 8 customers, $392 of MRR, name it |
| Survey | Faded memory: buyers may name the touch they remember best | 3 of 8 newsletter buyers never mention the newsletter they clicked |
| Survey | One box for a path with several touches | The day 1 to day 23 buyer has 3 touches and 1 answer |
| Survey | Vague answers | 6 of 8 paid-search buyers wrote Google search |
| Survey | Only responders count | 6 of 40 buyers, 15%, left the question blank |
#### Touches that send no signal
A tracker logs only requests that reach a server you run. Alexis Madrigal named the gap "dark social" in [The Atlantic](https://www.theatlantic.com/technology/archive/2012/10/dark-social-we-have-the-whole-history-of-the-web-wrong/263523/) on October 12, 2012, listing email programs, instant messages and some mobile apps as sources that arrive with no referrer, so analytics tools file them under "direct" or "typed/bookmarked". At The Atlantic those visits were 56.5% of its social traffic to individual stories, though that was 1 news publisher in 2012 and no SaaS benchmark. Google defines Direct in the [GA4 default channel group](https://support.google.com/analytics/answer/9756891) as a source of "(direct)" with a medium of "(not set)" or "(none)", a test that a link sent in an instant message passes.
#### Signals deleted in transit
WebKit's [tracking prevention post](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) says Intelligent Tracking Prevention deletes all of a website's script-writable storage after 7 days of Safari use without interaction on the site, and the [Safari 17.0 notes](https://webkit.org/blog/14445/webkit-features-in-safari-17-0/) add blocking for known tracking query parameters in links in Private Browsing. A visitor a script recorded on day 6 who then stays away for 7 days of Safari use can pay on day 23 as a stranger. The [Safari ITP guide](https://www.trackrev.io/blog/safari-itp-attribution-saas) and the post on [stripped UTM parameters](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) cover what survives.
### Which source answers which decision
| Decision | Use | Reason from that month |
| --- | --- | --- |
| Raise or cut paid-search spend | Tracker | 75% of paid-search buyers (6 of 8) answered Google, so answers cannot isolate the ad |
| Sponsor a second podcast episode | Survey | A link-less mention earns $0 in the tracker, and 8 of 34 answers named a podcast |
| Pay an affiliate a commission | Tracker | A payout needs an auditable click and charge |
| Decide whether word of mouth deserves a budget | Survey | 10 of the 13 Direct sales trace to it |
| Report revenue by channel to finance | Tracker, plus an unattributed line | $637 of $1,960 has no recorded click |
| Choose first touch, last touch or linear | Tracker | All 3 models rework recorded touches only |
### How to add a how-did-you-hear question
#### Where to ask
Ask once, right after signup or when the account first does something useful. If signup is the payment, use the confirmation screen. Stripe Checkout can hold the question too: its [custom fields](https://docs.stripe.com/payments/checkout/custom-fields) allow up to 3 fields and a dropdown of up to 200 options, and the answer arrives in the `checkout.session.completed` event.
#### How to word it
Use the customer's words. "How did you first hear about us?" works, and "What was your acquisition channel?" does not, because no customer thinks in channels. Offer 6 to 8 options such as a friend or colleague, a podcast, YouTube, Google search, a newsletter, a review site and an ad, then Other with a text box. Review the write-ins monthly and promote repeats to their own option. Keep it to 1 question, and ask role and goals on another screen.
#### Where to store the answer
Write it to the user record at signup and copy it to the Stripe customer's metadata, which per [Stripe's docs](https://docs.stripe.com/metadata) takes 50 key-value pairs with keys up to 40 characters and values up to 500. The answer then sits on the Stripe customer who paid, and a revenue-weighted comparison becomes a join. The [Stripe metadata setup guide](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) shows the same pattern for tracked sources.
### Reconciling the two without double counting
Put both sources on one customer list and one date range. The survey's share of responders and the tracker's share of all customers describe different populations and rarely line up. Take new paying customers in 1 month for both, then sort each one into 1 of 5 groups. The [GA4 revenue-by-channel post](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) explains why the tracked side leaves so much in Direct to begin with.
| Group | Customers | What to do |
| --- | --- | --- |
| Tracker and survey agree | 16: 5 organic and 6 paid-search buyers who answered Google, plus 5 newsletter buyers | Act on it, since two independent records point the same way |
| Direct, with a friend or podcast named | 10 | Estimate the split from the responders' shares and label it an estimate |
| Tracked click, with an earlier friend or podcast named | 6 | Keep the tracker's credit and note the earlier influence without adding it |
| Any other mismatch | 2: a Direct buyer and a newsletter buyer, each of whom answered Google | Look for a stripped referrer or a click the buyer forgot |
| No answer | 6 | Hold them in an unknown line and assign nothing |
*The 40 customers from the table above, sorted into 5 groups: 16 + 10 + 6 + 2 + 6 = 40.*
### What TrackRev does for this problem
TrackRev covers the tracked side. It logs each click server-side at the tracking link, tags the visitor with a first-party cookie, follows the session with a one-line pixel, and joins each Stripe, Paddle, Polar or Lemon Squeezy charge to that visitor by visitor ID or email. Last touch is the default, with first-touch and linear computed from the same click log.
A charge with no matching visitor shows as Unmatched on the Orders page, and the dashboard flags the dollar total of sales not tied to a click. In the month above that is the $637 your survey has to explain.
TrackRev has no survey field, so keep the answers in your signup form, CRM or Stripe metadata. The `sale.created` webhook carries the buyer's email, the credited channel and the visitor ID, with the channel and visitor ID null when no click was credited, so an endpoint of your own can write the tracked channel beside each answer.
Revenue by channel needs a paid plan, from $39 a month. The free plan tracks 50 links and 1,000 events a month and hides revenue. If nearly all your customers come by word of mouth, a survey and a spreadsheet will tell you more than any tracker. Otherwise see the [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) and [pricing](https://www.trackrev.io/pricing).
### Frequently asked questions
**What is the difference between self-reported and tracked attribution?**
Tracked attribution is built from events your systems recorded: clicks, page visits and Stripe charges joined by a visitor ID. Self-reported attribution is built from what customers write in a how-did-you-hear field. The first misses channels that leave no click, such as the 8 podcast mentions that earned $0 above, and the second loses detail.
**Is self-reported attribution accurate?**
It is reliable on whether a channel exists and weak on exact shares. For a share near 25%, the 95% margin of error is about 15 points with 34 responders, 8 points with 100 and 4 points with 400. Those figures assume a random sample, and responders self-select, so the real error is larger. Under 100 responders, read the ranking of answers and ignore the decimals.
**Why does my how-did-you-hear survey disagree with Google Analytics 4?**
They measure different moments. Google Analytics 4 logs the source of the last recorded visit, and the survey logs what the buyer recalls. Someone who heard a podcast on day 1 and searched your name on day 9 is Organic Search in the report and the podcast in the survey.
**Should the how-did-you-hear question be required?**
No. Stripe Checkout custom fields are required by default, so pass optional=true if you ask there. Leave it optional, because a blank is more honest than a forced pick. Watch the skip rate, 15% (6 of 40) in the month above.
**Can a survey replace tracking?**
Only for a business that grows almost entirely through recommendations and spends $0 on ads. Once you buy ads or pay partners you need recorded clicks, because answers cannot separate 2 paid channels or support an audit of a commission payout.
**How often should I compare the two sources?**
Every quarter, plus 1 extra comparison after a launch, a podcast appearance or a newsletter feature. Use the same dates and customer list each time.
---
## Server-side tracking: what it is, what it fixes and what it can't
URL: https://www.trackrev.io/blog/server-side-click-tracking-vs-client-side-pixel
Published: 2026-05-31
Author: Muzahid Maruf
Server-side tracking records clicks and payments on your own server. What it fixes in Safari and ad blockers, what Cloud Run costs and a 6-step SaaS setup.
Server-side tracking means a server you control records the event, such as a click or a payment, instead of JavaScript in the visitor's browser. The browser can still send the request, but the log entry, the cookie and any forwarding to Google Analytics 4, Google Ads or Meta happen on your infrastructure. That removes several losses: blocked scripts, the 7-day limit Safari Intelligent Tracking Prevention puts on script-written cookies, and beacons that die with the tab. Consent and cross-device identity stay as they were.
> **Key takeaways:**
>
> - Safari caps JavaScript cookies at 7 days since ITP 2.1, or 1 day after link decoration since ITP 2.2, but a cookie set in an HTTP response keeps its expiry unless a third-party CNAME serves it, which Safari 14 caps at 7 days.
> - A Google Cloud Run server container costs about $45 per server a month with 2 recommended, while a redirect and a Stripe webhook run inside the app you already host.
> - EDPB Guidelines 2/2023 place tracking links and pixels under Article 5(3) of the ePrivacy Directive, so consent stays on the table even when a server does the recording.
### What server-side tracking is, compared with client-side
| Question | Client-side tag | Server-side record |
| --- | --- | --- |
| Where the code runs | The visitor's browser | A machine you operate |
| How the cookie is set | JavaScript, through document.cookie | An HTTP Set-Cookie header |
| Cookie lifetime in Safari | 7 days (ITP 2.1), or 1 day after link decoration (ITP 2.2) | The expiry you set on your own domain, such as 365 days; 7 days when a third-party CNAME serves a subresource |
| Ad blockers | Drop a listed script or beacon host | Drop only a listed tracking URL |
| Scroll depth and form fields | Visible | Invisible |
| Stripe payment | Seen only if the buyer reaches your thank-you page | Seen through a webhook, retried for up to 3 days |
*Sources: WebKit and Stripe documentation.*
For a SaaS product the cookie lifetime decides the most. A trial that pays on day 14 keeps its source only if something outlasted the 7-day script cookie.
### Four setups that share the name
| Setup | What the server records | Still in the browser | Documented figures |
| --- | --- | --- | --- |
| Redirect click log | The click, plus the cookie in the redirect response | Nothing until the landing page loads | A 301 may be reused from cache without reaching you, and a 302 may not ([RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html)) |
| Server container (server-side Google Tag Manager) | Events the container receives, forwarded to Google Analytics 4, Google Ads or Meta | The web tag that feeds the container, unless [your own web server](https://developers.google.com/tag-platform/tag-manager/server-side/intro) does | About $45 a month per Cloud Run server, 2 recommended ([Google](https://developers.google.com/tag-platform/tag-manager/server-side/cloud-run-setup-guide)) |
| Conversion APIs (Meta Conversions API, GA4 Measurement Protocol) | Conversions your backend sends | The Meta Pixel or Google tag, for event IDs and client IDs, since Measurement Protocol is meant to [augment gtag or Tag Manager](https://developers.google.com/analytics/devguides/collection/protocol/ga4) | [Meta](https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/) deduplicates events arriving within 48 hours; Measurement Protocol takes 25 events and 130 kB per request, with timestamps up to 72 hours back ([Google](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events)) |
| Payment webhook (Stripe) | The charge, pushed to your endpoint, the same server-to-server pattern as an affiliate [postback URL](https://www.trackrev.io/blog/postback-url-vs-pixel-tracking-affiliate) | Nothing | Retries for up to 3 days in live mode; resend for 15 days in the Stripe Dashboard, 30 with the Stripe CLI ([Stripe](https://docs.stripe.com/webhooks)) |
### What it does not fix
#### Server-set cookies still meet Safari's rules
[Statcounter's September 2026 data](https://gs.statcounter.com/browser-market-share/mobile/united-states-of-america) puts Safari at 46.38% of US mobile usage, and [18.27% worldwide](https://gs.statcounter.com/browser-market-share), so a Safari cap touches a large share of mobile traffic in the US.
| Date | Release | Rule | Cookie your server sets in a response |
| --- | --- | --- | --- |
| Feb 21, 2019 | [ITP 2.1](https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/), Safari 12.1, iOS 12.2 | Cookies created with document.cookie capped at 7 days | Not affected, since only document.cookie cookies are covered |
| Apr 24, 2019 | [ITP 2.2](https://webkit.org/blog/8828/intelligent-tracking-prevention-2-2/), iOS 12.3 | document.cookie cookies capped at 1 day after link decoration from a classified domain | Not affected |
| Mar 24, 2020 | [Safari 13.1](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/), iOS 13.4 | Third-party cookies blocked; script-writable storage deleted after 7 days of Safari use without interaction | Not affected on your own domain |
| Nov 12, 2020 | [Safari 14](https://webkit.org/blog/11338/cname-cloaking-and-bounce-tracking-defense/) | Cookies set in responses to third-party CNAME-cloaked subresource requests capped at 7 days | Capped when a subresource on your site, such as a tagging subdomain, CNAMEs to a third party |
WebKit's November 2020 post cites a study that found 1,762 websites using CNAME cloaking for 56 trackers. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) adds that ITP detects third-party IP address cloaking too, with the same 7-day cap, and leaves that term undefined. A CNAME to another subdomain of your site is not capped. [Google's custom domain guide](https://developers.google.com/tag-platform/tag-manager/server-side/custom-domain), last updated on June 27, 2025, says a server container left on its default provider domain can set JavaScript cookies only. Stape's Cookie Keeper power-up, per [its documentation](https://stape.io/helpdesk/documentation/cookie-keeper-power-up), restores cookies that Safari 16.4 and later expire after 7 days.
#### Consent
The EDPB's [Guidelines 2/2023](https://www.edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-22023-technical-scope-art-53-eprivacy-directive_en) reached version 2.0 on 7 October 2024, after a consultation that ran from 16 November 2023 to 18 January 2024. They treat tracking links and tracking pixels as falling under Article 5(3) of the ePrivacy Directive. Sending the link to the device counts as storage, and collecting the identifier counts as gaining access. Being covered does not automatically require consent, since exemptions are assessed case by case. UK and US state rules differ, so take legal advice on your own setup.
### What it costs
| Option | Monthly figure | Annual cost | Capacity |
| --- | --- | --- | --- |
| Cloud Run, 2 servers | 2 x $45 = $90 | $1,080 | Google's minimum recommendation |
| Cloud Run, 10 servers | 10 x $45 = $450 | $5,400 | 35 to 350 requests per second across 2 to 10 servers |
| Stape Free | $0 | $0 | 10K requests |
| Stape Pro | $17 | $200 | 500K requests |
| Stape Business | $83 | $1,000 | 5M requests |
| Stape Enterprise | $167 | $2,000 | 20M requests |
| Redirect and webhook in your app | No separate bill | $0 extra | Your existing hosting plan |
*Prices from each vendor's pricing page, October 2026. Google's figure comes from its setup guide, and Stape's monthly figures assume yearly billing.*
Two Cloud Run servers cost $880 a year more than Stape Pro at $200 a year, per [Stape's pricing page](https://stape.io/pricing). For source-to-payment attribution alone I would skip the container at first, since the redirect and the webhook cover the click and the charge, the events that decide the answer.
### When browser-side tracking is enough
| Situation | Browser tag enough? | Reason |
| --- | --- | --- |
| Payment 1 to 7 days after the click | Usually | A script cookie lasts 7 days, unless link decoration cuts it to 1 |
| Payment 8 to 30 days after the click | No | The cookie can expire first, and the charge lands under Direct |
| Partner commissions | No | A lost source pays the wrong partner, or none |
| Optimizing Meta or Google Ads on conversions | Both | The tag captures the session and your backend sends the conversion |
### How to set it up for a SaaS product
#### 1. Put a redirect on a domain you own
Share links like `go.example.com/spring-launch`, and tag every one, since an untagged click logs a blank channel. The route writes a click row with visitor ID, link, timestamp, user agent and referer, then answers 302. A cache may reuse a 301 without asking again, so a repeat click behind a 301 can skip your server.
#### 2. Set the visitor cookie and pass the ID on
Send the cookie on the redirect with Lax, Secure and a Domain on your registrable domain, so subdomains can read it. [MDN's Set-Cookie reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie) says Lax also sends it on cross-site top-level navigations such as an email click, and Strict does not. Append the ID to the destination as `vid` and accept only UUID-shaped values on the landing page.
A redirect route in Express that logs the click and sets the cookie (cookie-parser assumed)
```
import { randomUUID } from "node:crypto";
app.get("/:slug", async (req, res) => {
const link = await db.links.findBySlug(req.params.slug);
if (!link) return res.redirect(302, "https://www.example.com");
const vid = req.cookies.vid ?? randomUUID();
await db.clicks.insert({
linkId: link.id,
visitorId: vid,
userAgent: req.get("user-agent"),
referer: req.get("referer"),
at: new Date(),
});
res.cookie("vid", vid, {
maxAge: 365 * 24 * 60 * 60 * 1000, // Express takes milliseconds
domain: ".example.com",
sameSite: "lax",
secure: true,
httpOnly: true,
});
const target = new URL(link.destination);
target.searchParams.set("vid", vid);
res.redirect(302, target.toString());
});
```
#### 3. Bind the ID to the user at signup
Read the ID in the request that creates the account and save it beside the email, since a script cookie may be gone when someone signs up 8 days after the click. A phone click and a laptop purchase share no ID until a login or email joins them.
#### 4. Put the ID on the payment
Pass the ID to Stripe Checkout as `client_reference_id` or in metadata. The [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post has the field mapping.
#### 5. Read charges through a webhook
Verify the `Stripe-Signature` header against the raw request body and return a 2xx before any heavy work. Stripe's libraries reject a timestamp more than 5 minutes old by default. Store each event ID, since the same event can arrive twice and out of order, and serve the endpoint over TLS 1.2 or 1.3, the only versions Stripe supports.
#### 6. Test in Safari
Click a tracked link and read the cookie's expiry on the Storage tab of Web Inspector. A date a year out means the response cookie survived, and a date 7 days out means something capped it. The [Safari ITP attribution post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the remaining rules.
### How TrackRev records clicks on the server
| Step | What TrackRev does | Detail |
| --- | --- | --- |
| Click | Logs each click at its own redirect before your page loads | 302 response with a visitor-ID cookie (Lax, Secure, 365 days); UTM parameters and `_vid` added to the destination. See [first-party tracking](https://www.trackrev.io/products/first-party-tracking) |
| Record | Timestamp, IP address, location, device, browser, OS, referrer, bot flag | Crawler and empty user agents and prefetches flagged; `click.created` webhook for humans only. See [bot filtering](https://www.trackrev.io/blog/bot-traffic-filtering-for-links) |
| Identity | A pixel reads `_vid` and writes its own JavaScript cookie | Safari's 7-day cap applies to that copy; `window.trk.identify` binds the email on the server |
| Payment | Stripe read hourly with a read-only restricted key | Optional webhook; match order is `metadata.vid`, `client_reference_id`, email. See [revenue attribution](https://www.trackrev.io/solutions/revenue-attribution) |
| Consent | Pixel waits for `grantConsent()` when `data-requires-consent` is set | The redirect itself runs no script |
| Plans | Free: 50 links and 1,000 tracked events a month | Revenue attribution starts at $39 a month on Starter, per the [pricing page](https://www.trackrev.io/pricing) |
| Not included | A tag manager, or forwarding to ad platforms | A server container or the Meta Conversions API does that job |
### Frequently asked questions
**What is server-side tracking?**
Tracking where your own server records the event instead of a browser script, such as a redirect click log, a Meta Conversions API call or a Stripe webhook.
**Does a branded tracking domain trigger Safari's CNAME rule?**
WebKit's definition covers subresource requests. A short link domain that CNAMEs to a vendor is a top-level navigation, and I found nothing from WebKit on how ITP treats its cookie, so check the expiry in Safari.
**Does a server-side setup get around ad blockers?**
Yes when the event never depended on a browser script, like a redirect click or a Stripe webhook. A tracking URL on a filter list can still be blocked.
**Do I still need cookie consent?**
Possibly. The EDPB's 2024 guidelines cover tracking links and pixels, and consent is needed unless an exemption fits your use.
**How can I tell whether a cookie was set by the server or by JavaScript?**
Reload with Chrome DevTools or Safari Web Inspector open. A server-set cookie appears in a response's Set-Cookie header on the Network tab, and a checked HttpOnly column usually points to the server.
**Is server-side tracking the same as server-side Google Tag Manager?**
No. Server-side Google Tag Manager is one product that implements it. A redirect log or a webhook receiver counts too and needs no container.
---
## Short.io alternatives: what to use when clicks have to show revenue
URL: https://www.trackrev.io/blog/short-io-alternative
Published: 2026-06-12
Author: Muzahid Maruf
Short.io fires conversions from a browser page and lists no Stripe link. Compare Dub, Bitly and TrackRev on price, link limits and revenue per link.
The right Short.io alternative depends on why you are leaving. If its limits are the problem, a bigger or cheaper shortener fixes that. If the problem is revenue per link, you need a tool that reads your payment processor, and Short.io fires conversions from a browser page with no connection to one. Dub reads Stripe from its $90/month Business plan, and TrackRev reads Stripe, Paddle, Polar and Lemon Squeezy from $39/month.
I run TrackRev, so it is one of the options below and is judged on the same terms. For the two-way version, see [Short.io vs TrackRev](https://www.trackrev.io/blog/short-io-vs-trackrev) or the [comparison page](https://www.trackrev.io/compare/short-io).
> **Key takeaways:**
>
> - Short.io does track conversions: a clid parameter plus a browser script, capped at 50 a month on Free and 200 on Hobby. Its integrations page names no payment processor, so renewals, refunds and upgrades never reach it.
> - Pro costs $18/month for unlimited tracked clicks, but mobile deep links wait for Team at $48 and API link creation stops at 10,000 a year on Pro.
> - Dub is the closest alternative with native Stripe sales tracking, from its $90/month Business plan. Bitly Growth is $35/month with four months of click data and no revenue tracking listed.
> - TrackRev Starter is $39/month and ranks channels by revenue across four billing systems. It routes by device only, with no country routing or split testing.
> - Stay on Short.io when the job is routing: country targeting, A/B tests on every plan, and a free plan that covers 50,000 tracked clicks a month.
### What Short.io costs and where its limits sit
[Short.io's pricing page](https://short.io/pricing) sells five plans, takes 17% off annual billing and gives every paid plan a 7-day trial. Its homepage claims 1.2 million users and more than 100 billion clicks tracked.
| Plan | Price | Domains | Branded links | Tracked clicks | Conversions | API links |
| --- | --- | --- | --- | --- | --- | --- |
| Free | $0 | 5 | 1,000 | 50,000 | 50 | 1,000 |
| Hobby | $5 | 7 | 2,500 | 100,000 | 200 | 2,500 |
| Pro | $18 | 10 | Unlimited | Unlimited | Unlimited | 10,000 a year |
| Team | $48 | 50 | Unlimited | Unlimited | Unlimited | 100,000 a year |
| Enterprise | $148 | Unlimited | Unlimited | Unlimited | Unlimited | Unlimited |
*Monthly prices and limits from Short.io's pricing page, October 2026. Branded links are a total, and API links carry a period only on Pro and Team.*
On Free, detailed statistics cover 50,000 tracked clicks a month. Past that Short.io keeps collecting data but restricts what you can see, and the links keep redirecting until you upgrade.
### Why teams look for a Short.io alternative
Country targeting starts on Hobby at $5, password protection, expiration and cloaking on Pro at $18, and city or region targeting and mobile deep links only on Team at $48. One deep link for an app campaign therefore costs $30/month more than Pro.
Pro allows 10,000 API or bulk links a year, about 27 a day, at 50 requests per second like every plan. A product that creates a link per signup hits that ceiling at 27 signups a day, and Team's 100,000 a year allows about 274.
Short.io's [storage policy](https://docs.short.io/articles/statistics/click-statistics-storage-policy-at-short.io) keeps click-stream data for 1 year and aggregated statistics for 26 months, so a customer acquired 18 months ago has no click-level record left to join to a charge.
### Can Short.io track revenue?
Short.io does track conversions: events your own page reports, with an optional value. [Switch conversion tracking on for a domain](https://docs.short.io/articles/features/features/how-to-enable-conversion-tracking) and Short.io appends a clid parameter to each destination URL. Your page captures it with the [Short.io browser SDK](https://docs.short.io/articles/api-reference/API%20guides/Statistics/how-to-conversion-to-shortio) and reports an event back, such as a signup or purchase, with an optional value. Results appear per link and in a Conversion Stream panel.
Conversion event with a value, from Short.io's docs
```
```
That design has gaps for a subscription business. The event fires while a visitor sits on a page, so renewals never produce one. A $39 plan kept for a year is $468: the signup page can report the first $39, and the other 11 charges, $429 in total, land on Stripe's schedule with nobody on a page. Refunds and plan changes stay invisible for the same reason, and a campaign that sells 300 plans in a month overruns Hobby's 200 conversions.
Short.io's [integrations page](https://short.io/integrations) names Zapier, Make, Segment, Google Analytics, Meta Pixel and AdRoll among its native options, and no payment processor. You can pass the clid through checkout and fire the event from your Stripe Checkout success page. That works for one product with one-time purchases and stops working once money arrives after the visit.
### Short.io alternatives compared on price and revenue tracking
| Tool and plans | Price | Links | Clicks or events | Revenue tracking | Free plan |
| --- | --- | --- | --- | --- | --- |
| Short.io Hobby and Pro | $5 and $18 | 2,500 in total, then unlimited | 100,000, then unlimited | Browser conversions only | 5 domains, 50,000 clicks |
| Dub Pro and Business | $30 and $90 | 1,000 and 10,000 new | 50,000 and 250,000 events | Stripe and Shopify from Business | 3 domains, 25 new links |
| Bitly Core and Growth | $10 (annual only) and $35 | 100 and 500 new | Unlimited clicks, 30 days and 4 months of data | None listed | 5 links |
| TrackRev Starter | $39 | Unlimited | Unlimited events | Stripe, Paddle, Polar, Lemon Squeezy | 50 links, 1,000 events |
*Prices from each vendor's pricing page, October 2026. Monthly billing and monthly limits unless noted.*
#### Dub
[Dub's link plans](https://dub.co/pricing/links) run Free, Pro at $30 and Business at $90, with a 14-day trial on the paid ones. Pro has 50,000 tracked events, 10 custom domains and 1 year of analytics history. Business raises that to 250,000 events, 3 years and 100 custom domains, and it is the first plan with conversion tracking and A/B testing.
In Dub's [conversion docs](https://dub.co/docs/quickstart/server), a lead event such as a signup fixes which link the customer came from. Later sales attach to that link through native Stripe and Shopify integrations or the POST /track/sale endpoint. That is link-level revenue, for $51/month more than TrackRev Starter. Pick Dub for geo targeting and split tests, or when Shopify runs your checkout. [Dub.co vs TrackRev](https://www.trackrev.io/blog/dub-co-vs-trackrev) goes deeper.
#### Bitly
[Bitly's pricing page](https://bitly.com/pages/pricing) puts Core at $10 on annual billing only, with 100 links a month and 30 days of click data. Growth is $35, or $29 on annual billing, with 500 links a month, 4 months of click and scan data, a complimentary custom domain and bulk creation of 100 links per upload. Premium is $199 on annual billing and adds 3,000 links a month and a year of data. No tier mentions conversion or revenue tracking. Pick Bitly when QR codes and landing pages matter more than conversion data.
#### TrackRev
A link on your own domain redirects through TrackRev's server, which records the click, and a first-party pixel on your site binds the visitor to an email at signup or checkout. An hourly sync reads Stripe with a read-only restricted key, matches each paid charge to that email, and walks back to the click that started the journey. Paddle, Polar and Lemon Squeezy orders are credited to channels too, and the [Stripe integration](https://www.trackrev.io/integrations/stripe) page and [attributing Stripe revenue to marketing channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels) explain the join in full.
Renewals credit the original click, and a refunded or disputed charge drops its revenue on the next sync, so a channel's total follows what you keep. Starter covers 1 workspace and Growth, at $99, covers unlimited ones. Paid plans include an affiliate program on the same data. A [custom tracking domain](https://www.trackrev.io/products/custom-tracking-domains) takes one CNAME to cname.trackrev.io and gets automatic SSL. The free plan covers 50 links and 1,000 events a month for link tracking only, and revenue figures need Starter.
### What 12 months costs on each plan
| Plan | 12 monthly payments | Annual billing |
| --- | --- | --- |
| Short.io Pro | $216 | About $179 after 17% off |
| Dub Business | $1,080 | About $972 after 10% off |
| Bitly Growth | $420 | $348 |
| TrackRev Starter | $468 | $351 (nine months for twelve) |
*Annual figures apply each vendor's stated discount to the monthly prices above.*
### Why a click ranking and a revenue ranking disagree
> **Worked example with invented numbers:** Two links point at the same $39 plan. The newsletter link gets 600 clicks and 1% buy, so 6 customers and $234 a month. The YouTube link gets 160 clicks and 5% buy, so 8 customers and $312 a month. A click column ranks the newsletter first by 440 clicks. If every customer renews for 12 months, one month's YouTube cohort pays $3,744 against $2,808 for the newsletter's, and only a tool that sees the charges can show it.
### Moving links without breaking printed ones
Short.io's pricing FAQ says you can export all your links for free by asking support. Raw click data exports automatically to S3 only on Enterprise at $148, so decide what history you need before you downgrade.
Build a CSV with a destination URL and a channel on each row and keep the slugs, because TrackRev honors the slug you give it and [bulk import](https://www.trackrev.io/products/bulk-links) takes up to 500 rows per upload. Check the import, then repoint your branded domain's CNAME to cname.trackrev.io and verify it in the dashboard. Any slug you skipped stops resolving once the record moves, and Short.io serves the old links until then, so cancel it last.
### When Short.io is still the better pick
A revenue tool is the wrong replacement in these cases:
- Country targeting from Hobby and city or region targeting from Team, neither of which TrackRev has.
- A/B testing and mobile targeting on every plan, Free included.
- A free plan with 5 domains and 50,000 tracked clicks, against 50 links on TrackRev's.
- Team workspaces with unlimited users, 50 domains and a 99.9% uptime SLA at $48.
- Zapier and Make automations, where TrackRev has webhooks and no Zapier app.
- Custom short links in Google Ads, since Short.io became a [Google certified click tracker](https://docs.short.io/changelog/2024/12/11/shortio-is-now-google-certified-click-tracker) on December 11, 2024.
If none of that applies and revenue per link is the missing piece, TrackRev's free plan lets you try the link side with 50 links and 1,000 events a month. Revenue figures start on Starter.
### Frequently asked questions
**Can Short.io connect to Stripe?**
Not natively. A purchase value reaches Short.io only when your own code sends it through the data-shortio-conversion-value attribute, so charges made outside a browser session go unrecorded.
**Is Short.io free for commercial use?**
Yes. Its pricing FAQ allows marketing campaigns and customer-facing URLs on the free plan, which includes 5 domains and 1,000 branded links.
**Where does Short.io store click data?**
EU customers' data is stored in Germany and everyone else's in Virginia, according to its storage policy.
**Does Short.io have an affiliate program feature?**
Not one you can run: I found no partner portal, commission rules or payouts on its pricing or features pages. TrackRev paid plans, from $39/month, include a program on the same click and revenue data.
**Can I use Short.io and TrackRev together?**
Yes, with one catch. TrackRev records a click only when the visitor passes through its own redirect, so links you want ranked by revenue must be TrackRev links. Keep Short.io for campaigns where a click count is enough.
**Which Short.io alternative is cheapest for tracking revenue?**
TrackRev Starter at $39/month, against $90/month for Dub Business, the other tool here with native Stripe sales tracking. Bitly mentions no revenue tracking at any tier.
---
## Short.io vs TrackRev: what each one measures after the click
URL: https://www.trackrev.io/blog/short-io-vs-trackrev
Published: 2026-08-02
Author: Muzahid Maruf
Short.io vs TrackRev in October 2026: Short.io costs $18 for unlimited clicks and routes by country. TrackRev costs $39 and reads Stripe revenue for each link.
Short.io vs TrackRev comes down to what you need counted after the click. Short.io is the better link tool: Pro costs $18 a month for unlimited links and clicks, and country routing starts at $5. TrackRev starts at $39 a month and reads your payment processor, so each link shows the revenue it earned, renewals included. Choose Short.io when a click count is enough, and TrackRev when you need to know which link paid for the subscription.
I run TrackRev, so weigh my read accordingly. Short.io's figures come from its [pricing page](https://short.io/pricing), [integrations page](https://short.io/integrations) and documentation in October 2026. The [Short.io alternative guide](https://www.trackrev.io/blog/short-io-alternative) covers switching, and [TrackRev vs Short.io](https://www.trackrev.io/compare/short-io) has the feature rows.
> **Key takeaways:**
>
> - Short.io is the better pure link tool: Pro is $18 a month for unlimited links and clicks, country routing starts at $5, and A/B tests with up to 10 variations are on every plan.
> - Short.io reports conversions through a clid parameter and a browser callback, capped at 50 a month on Free and 200 on Hobby. Its integrations page lists no payment processor, so renewals and refunds never reach it.
> - TrackRev Starter is $39 a month, reads Stripe, Paddle, Polar and Lemon Squeezy, and credits renewals to the click that brought the customer. It routes only by mobile or desktop.
> - On annual billing the entry plans differ by $171 a year ($351 against $180), worth paying only when per-link revenue steers your budget.
> - Moving takes a link export, a CSV import of up to 500 rows per upload and 1 CNAME change.
### Short.io vs TrackRev at a glance
| Feature | Short.io | TrackRev |
| --- | --- | --- |
| Cheapest plan with unlimited links and clicks | Pro, $18/mo | Starter, $39/mo |
| Free plan | 5 domains, 1,000 branded links, 50,000 tracked clicks and 50 conversions a month | 50 links, 1,000 events a month, 1 workspace, no revenue figures |
| Routing | Country from Hobby, city or region from Team, mobile OS on every plan | 1 mobile and 1 desktop destination |
| A/B testing | Up to 10 variations, every plan | None |
| Password protection and expiration | Pro, $18/mo | Free plan and up, with expiry by date or click cap |
| Mobile deep links | Team, $48/mo | Yes |
| Links created by API or bulk import | 10,000 a year on Pro, 100,000 on Team, at 50 requests a second | Unlimited on paid plans, 500 per bulk call |
| Conversion tracking | Click ID plus browser callback: 50 a month on Free, 200 on Hobby, unlimited from Pro | First-party pixel plus payment sync, unlimited events on paid plans |
| Payment processors | None on its integrations page | Stripe, Paddle, Polar, Lemon Squeezy |
| Renewals and refunds | Only what your own page reports | Read from the processor every hour |
| Affiliate program | None on its pricing or features pages | Every paid plan |
| Automation | Zapier, Make, Segment, click webhooks from Pro | Webhooks, REST API, CLI |
| Annual billing | 10 months for 12 (17% off) | 9 months for 12 (25% off) |
*Prices and limits from each vendor's pricing page, October 2026.*
### Where Short.io is the better tool
Short.io costs less at every step below $39, and its Free plan alone has 5 custom domains and 50,000 tracked clicks a month. Country targeting starts on Hobby at $5, while city and region targeting wait for Team at $48. [A/B testing](https://docs.short.io/articles/features/features/how-to-run-an-ab-test) is included on every plan, takes up to 10 variations, and the percentages you set must total 100.
- Short.io became a [Google certified click tracker](https://docs.short.io/changelog/2024/12/11/shortio-is-now-google-certified-click-tracker) on December 11, 2024, so its branded links can go into Google Ads campaigns.
- Its integrations page lists Zapier, Make, Segment, Slack, Google Tag Manager, Meta Pixel and AdRoll. [Click webhooks](https://docs.short.io/articles/integrations-and-extensions/direct-integrations/how-to-add-webhook-integration) start on Pro and carry the referrer, user agent, path and the UTM parameters on the clicked URL.
- A 99.9% uptime SLA and unlimited users arrive on Team at $48. Single sign-on and a daily raw click export to Amazon S3 come with Enterprise at $148.
### How Short.io tracks conversions
Switch on conversion tracking for a domain and Short.io [appends a clid parameter](https://docs.short.io/articles/features/features/how-to-enable-conversion-tracking) to every destination URL. Your page sends it back through the [browser SDK](https://docs.short.io/articles/api-reference/API%20guides/Statistics/how-to-conversion-to-shortio), which calls `navigator.sendBeacon()`, and results appear per link and in the Conversion Stream.
Conversion events, from Short.io's docs
```
import { trackConversion, getClickId, observeConversions } from '@short.io/client-browser';
```
The event fires while a visitor sits on a page, and Stripe collects renewals without one: its [subscription docs](https://docs.stripe.com/billing/subscriptions/overview) say Stripe automatically generates invoices and attempts payment collection. A success page can fire the event for the first payment, and the docs I read cover nothing after it.
Conversions are also metered, at 50 a month on Free and 200 on Hobby, so 300 signups through one launch link, one event each, overrun Hobby by 100. Pro at $18 lifts the cap.
### How TrackRev tracks conversions
A TrackRev link redirects through its own server, which records the click first. A pixel sets a first-party cookie on your domain, and an email given at signup or checkout binds the visitor to that address. Every hour TrackRev reads Stripe with a read-only restricted key on 4 resources, finds new paid charges and walks back from the customer's email to the click. The [Stripe integration page](https://www.trackrev.io/integrations/stripe) shows the setup.
Paddle, Polar and Lemon Squeezy orders are credited to channels too. A renewal credits the original click, and a refunded charge leaves the channel's total on the next sync. The email join misses any buyer who never enters an email on a page with the pixel.
> **Worked example with made-up numbers:** One newsletter link brings in 60 customers on a $29 monthly plan, which is $1,740 in the first month. By month 7, 45 of them still pay, which is $1,305 a month from clicks that happened 6 months earlier. A signup-page event reports the 60 signups, and seeing the $1,305 takes a tool that reads the charges.
### Pricing from $0 to $199 a month
| Short.io plan | Price/mo | Domains | Branded links | Tracked clicks/mo | Conversions/mo | API or bulk links |
| --- | --- | --- | --- | --- | --- | --- |
| Free | $0 | 5 | 1,000 | 50,000 | 50 | 1,000 |
| Hobby | $5 | 7 | 2,500 | 100,000 | 200 | 2,500 |
| Pro | $18 | 10 | Unlimited | Unlimited | Unlimited | 10,000 a year |
| Team | $48 | 50 | Unlimited | Unlimited | Unlimited | 100,000 a year |
| Enterprise | $148 | Unlimited | Unlimited | Unlimited | Unlimited | Unlimited |
*Prices from each vendor's pricing page, October 2026. Branded links are a lifetime total.*
| TrackRev plan | Price/mo | Links | Events/mo | Workspaces | Commission tracked/mo |
| --- | --- | --- | --- | --- | --- |
| Free | $0 | 50 | 1,000 | 1 | Program locked |
| Starter | $39 | Unlimited | Unlimited | 1 | $10,000 |
| Growth | $99 | Unlimited | Unlimited | Unlimited | $100,000 |
| Scale | $199 | Unlimited | Unlimited | Unlimited | Unlimited |
*Prices from each vendor's pricing page, October 2026.*
| Plan | 12 monthly payments | Annual billing | Saved |
| --- | --- | --- | --- |
| Short.io Hobby | $60 | $50 | $10 |
| Short.io Pro | $216 | $180 | $36 |
| Short.io Team | $576 | $480 | $96 |
| TrackRev Starter | $468 | $351 | $117 |
| TrackRev Growth | $1,188 | $891 | $297 |
*Short.io's listed yearly rates and TrackRev's annual billing, October 2026.*
Between the two entry plans with unlimited links, the gap is $21 a month on monthly billing and $171 a year on annual billing. Starter earns it only if revenue per link would change where you spend.
### When TrackRev is the better pick
Choose TrackRev if you sell subscriptions through Stripe, Paddle, Polar or Lemon Squeezy and your budget question is which channel pays. Each link shows revenue beside its clicks, under last-touch, first-touch or linear credit.
It also suits products that create links in volume. Short.io's Pro plan allows 10,000 links a year through the API or bulk create, about 27 a day, and Team allows 100,000, about 274 a day. TrackRev's paid plans cap neither links nor events, and its bulk endpoint takes 500 per call.
Links and affiliates can share one record. Every paid plan includes the [affiliate program](https://www.trackrev.io/solutions/affiliate-program), with commissions calculated from the same charges and reversed on refunds. I found no partner portal, commission rules or payouts on Short.io's pricing or features pages.
### Where TrackRev falls short
- Device routing only: 1 destination for mobile, 1 for desktop, and no country, region or city targeting.
- No A/B or split testing.
- No Zapier app. Automation runs through webhooks, the REST API and the CLI.
- Revenue from 4 processors only, so a business billing through PayPal alone gets the link layer and none of the revenue side.
- A free plan that hides revenue figures and the affiliate program, which start on Starter (see [pricing](https://www.trackrev.io/pricing)).
### Moving links from Short.io to TrackRev
Short.io's pricing FAQ says you can export all your links for free by contacting support, so the move is a CSV and 1 DNS change.
- Pull any click history you want to keep first. Its [storage policy](https://docs.short.io/articles/statistics/click-statistics-storage-policy-at-short.io) keeps click-stream data for 1 year and aggregated statistics for 26 months, and the [clickstream API](https://docs.short.io/articles/api-reference/API%20guides/Statistics/requesting-clickstream) is documented as a Team feature.
- Build a CSV with a destination URL, a channel and your existing slug on each row. TrackRev keeps slugs as written, flags duplicates before creating anything, and [bulk import](https://www.trackrev.io/products/bulk-links) takes up to 500 rows per upload. The free plan's 50 links are enough for a trial run.
- Point your domain's CNAME at `cname.trackrev.io` and click Verify, and TrackRev issues and renews the SSL certificate ([custom tracking domains](https://www.trackrev.io/products/custom-tracking-domains) has the DNS details). A slug missing from the import stops resolving once the record moves.
- Upgrade to Starter for revenue figures, install the pixel, paste a restricted Stripe key, then cancel the Short.io plan.
### Frequently asked questions
**Does Short.io track revenue from Stripe?**
Not natively. Its integrations page lists no payment processor, and a conversion value arrives only when your own page sets it on the event.
**Is Short.io free for business use?**
Yes. Its pricing FAQ allows marketing campaigns and customer-facing URLs on the Free plan.
**Does Short.io offer a free trial?**
Every paid plan has a 7-day trial that you can cancel without being charged.
**What happens to my links if I cancel Short.io?**
The account drops to the Free plan and the links keep working within its limits.
**Can I run Short.io and TrackRev together?**
Yes, but TrackRev ranks by revenue only the links that go through its own redirect. Short.io can keep campaigns where a click count is enough, such as Google Ads links.
**Does Short.io have QR codes?**
Yes, on every plan, with custom colors and logos. TrackRev's QR designer ties each scan to the sale it led to.
---
## Stan Store vs Linktree, plus 9 Stan Store alternatives and what each one costs
URL: https://www.trackrev.io/blog/stan-store-alternatives
Published: 2026-10-03
Author: Muzahid Maruf
Stan Store vs Linktree head to head, then 9 Stan Store alternatives from free tiers to course platforms, using each vendor's October 2026 prices.
Stan Store vs Linktree depends on what you sell. Stan has no free plan, only a 14-day trial, then $29 monthly ($300 billed annually) with no cut taken from your sales. Linktree's free tier holds links and sign-ups, and selling digital products there starts on Pro at $12 a month on annual billing. Stan fits courses, bookings and memberships; Linktree fits a page that mostly sends people elsewhere. The nine alternatives run from Payhip's $0 tier with a 5% fee to Kajabi at $143 a month. I run TrackRev, and its free link-in-bio page is entry 9.
> **Key takeaways:**
>
> - Stan's $300 a year covers courses, booking and community, and its 0% fee starts to pay off against a 9% fee at $322 of monthly sales.
> - The 12% Linktree fee that Stan quotes is absent from Linktree's own pricing page, which lists 0% fees on Pro.
> - Stan and Linktree both refuse a custom domain. Beacons Creator, Podia and Systeme.io accept one.
> - Systeme.io is the one free tier with no transaction fee, capped at 3 funnels and 1 course.
> - Gumroad's 10% + $0.50 takes $1.00 of a $5 sale, so low-priced products favor Payhip or Ko-fi.
> - Payhip's three plans differ only in fee (5%, 2%, 0%), and its $29 Plus tier beats the free one above about $967 of monthly sales.
### Stan Store vs Linktree: price, fees and features
| Feature | Stan | Linktree |
| --- | --- | --- |
| Free tier | None, only a trial | Unlimited basic links, email and phone sign-ups |
| Paid tiers | Creator $29/mo, $300/yr. Creator Pro $99/mo, $948/yr | Starter $6, Pro $12, Premium $30 per month on annual billing ($8, $15, $35 if monthly) |
| Cheapest tier that sells | Creator, $29/mo | Pro, $12/mo annual |
| Fee on sales | 0%, plus Stripe or PayPal processing | 0% listed for Pro, plus Stripe's 2.9% + $0.30 per purchase |
| Courses and bookings | Both from Creator | Products and courses need Pro, and selling covers 35 countries |
| Memberships and community | Creator | Paid communities, US only |
| Email | Lead magnets on Creator, broadcasts and flows on Pro | Sign-ups free, list integrations on Pro |
| Auto-replies on Instagram | Creator | Premium |
| Custom domain | No | No |
| Analytics | Store and product stats on Creator, ad pixels on Pro | Basic from Starter, all-time history and export on Premium |
*Prices from each vendor's pricing page, October 2026.*
Twelve months of Stan Creator cost $300, against $144 for Linktree Pro ($12 times 12). The $156 difference buys a booking calendar, community features and an unlimited course builder under one login, where Linktree routes courses through Kajabi. Premium is Linktree's priciest listed tier at $360 a year, $60 above Stan Creator, and the one that lists Instagram auto-replies, which Stan includes from Creator.
Neither tool lets you swap its address for yours. [Stan's help center](https://help.stan.store/article/151-can-i-create-a-custom-domain-for-my-stan-store) says a custom domain cannot be created or embedded, and forwarding from your registrar to the stan.store address is the closest you get. A [Linktree help article](https://linktr.ee/help/en/articles/6571689-can-i-change-the-linktree-url-to-a-custom-domain) agrees and points to a Redirect link.
> **Check the 12% claim before you rely on it:** [Stan's comparison page](https://stan.store/blog/stan-store-vs-linktree/) says Linktree takes 12% of sales on its free tier. Linktree's [own guide](https://linktr.ee/help/en/articles/10518645-guide-to-selling-digital-products-on-linktree) puts Digital Products and Courses on Pro and Premium, and its [pricing page](https://linktr.ee/s/pricing) lists 0% fees on Pro. The help center says the fee varies by plan without printing percentages in the article text. Read the rate in your own Linktree dashboard before comparing.
Stan earns its price if you will use at least two of its built-in parts, such as a course, a booking page, a paid community or AutoDM. As a link list with a few downloads, $300 a year is poor value next to Linktree Pro or any percentage-fee tool below. Linktree wins on cost for a small catalog and loses where it cannot sell: the [Earn features list](https://linktr.ee/help/en/articles/11126119-who-can-use-linktree-s-earn-features) covers 35 countries, from Australia and Canada to the United Arab Emirates, and a seller outside them cannot use Pro for products.
### How much Stan Store costs, and whether it is free
[Stan's pricing article](https://stan.store/blog/stan-store-pricing/), updated July 22, 2026, answers the free question itself: you get a trial, not a free plan. After 14 days you pick Creator or Creator Pro, and annual billing saves $48 on the first and $240 on the second.
| Plan | Monthly | Annual | Saving | What it adds |
| --- | --- | --- | --- | --- |
| Creator | $29 | $300 ($25/mo) | $48 | Unlimited digital products, course builder, booking calendar, recurring subscriptions, community, lead magnets, AutoDM |
| Creator Pro | $99 | $948 ($79/mo) | $240 | All of Creator, plus discount codes, upsells and order bumps, payment plans, affiliate management, email broadcasts and flows, Meta, Google, Pinterest and TikTok pixels |
*Stan's plans as listed in October 2026.*
The step from Creator to Pro costs $70 more each month, or $648 more over a year ($948 minus $300), and most of what it buys is email and promotion tooling. If email is your main sales channel, $948 a year is what Stan really costs. Beacons lists unlimited email at $300 a year, and Payhip says every one of its plans gets every feature.
### What 20 sales of a $25 product cost on each platform
Take one month with 20 sales of a $25 download, so $500 in revenue. The figures count platform charges only, and card processing is separate everywhere.
| Platform and plan | Charge | Arithmetic |
| --- | --- | --- |
| Systeme.io Free | $0 | No transaction fee |
| Linktree Pro (annual) | $12 | 0% fee listed, $15 on monthly billing |
| Payhip Free | $25 | 5% of $500 |
| Ko-fi shop | $25 | Flat 5% service fee |
| Stan Creator (annual) | $25 | $300/12, or $29 when billed monthly |
| Beacons Creator Plus (annual) | $25 | $300/12, no seller fee |
| Payhip Plus | $39 | $29 plus 2% ($10) |
| Beacons Free | $45 | 9% of $500 |
| Gumroad | $60 | 10% ($50) plus 20 sales at $0.50 ($10) |
| Teachable Starter (annual) | $66.50 | $29 plus 7.5% ($37.50) |
| Podia Mover (annual) | $67 | $42 plus 5% ($25) |
*Platform charge on $500 of monthly sales, October 2026 prices.*
Stan's $29 undercuts Beacons' free-tier 9% fee at $322 of monthly sales ($29 ÷ 0.09), and any 5% fee at $580 ($29 ÷ 0.05). On annual billing, at $25 a month, those points drop to $278 and $500. A $25 sale on Gumroad costs $3.00 there, so the tenth sale in a month ($30) already tops Stan's $29. Below these volumes a percentage fee costs less, and a platform that charges nothing until a sale lands is the lower-risk way to find out whether your audience buys.
### The alternatives at a glance
| Tool | Free tier | Fee on sales | Cheapest plan with no platform fee |
| --- | --- | --- | --- |
| Beacons | $0, unlimited digital products | 9% on Free and Creator | Creator Plus, $300/yr |
| Payhip | $0, all features | 5% Free, 2% Plus | Pro, $99/mo |
| Gumroad | No monthly charge | 10% + $0.50, or 30% via Discover | None |
| Ko-fi | Free to join | 5% on shop sales | Gold, $12/mo |
| Systeme.io | 2,000 contacts, 3 funnels, 1 course | None on any plan | The free tier |
| Podia | 14-day trial | 5% on Mover | Shaker, $84/mo annual |
| Teachable | 7-day trial | 7.5% on Starter | Builder, $69/mo annual |
| Kajabi | Free trial | No revenue share | Basic, $143/mo annual |
| TrackRev | Free link-in-bio page | Sells nothing | Not applicable |
*Prices from each vendor's pricing page, October 2026.*
### 9 Stan Store alternatives, one at a time
#### 1. Beacons, the closest match to Stan
[Beacons](https://beacons.ai/i/pricing) puts a link in bio, a store, email and a media kit behind one login. Its $0 tier sells unlimited digital products at a 9% seller fee, with 50 email sends a month and real-time analytics. Creator ($100 yearly, $10 monthly) keeps the 9% and adds a free custom domain and 500 sends. Creator Plus ($300 yearly, $30 monthly) drops the fee to 0% and brings courses with video hosting, memberships and unlimited sends. The $300 matches Stan Creator's annual price, so choosing between them comes down to features. Beacons is the pick for unlimited email and a domain of your own, and Stan for community features, which Beacons' pricing page does not list.
#### 2. Payhip, for every feature at $0
[Payhip](https://payhip.com/pricing) is the nearest free alternative to Stan for a plain store, and its plans differ only in the transaction fee. Free is $0 with a 5% fee, Plus is $29 a month with 2%, and Pro is $99 a month with none, while all three carry unlimited products. Its menu lists downloads, courses, coaching, memberships and physical products, and Payhip says it collects and remits EU and UK VAT for you. Plus beats the free tier above about $967 in monthly sales ($29 ÷ 0.03), and Pro beats Plus above $3,500 ($70 ÷ 0.02). It is a store builder, so the link in your bio lands on a Payhip store page.
#### 3. Gumroad, for tax handled by someone else
[Gumroad](https://gumroad.com/pricing) has no monthly plan. It takes 10% + $0.50 on sales through your profile or direct links, and 30% when a new customer finds you through Gumroad Discover. Since January 1, 2025 it has acted as merchant of record, collecting and remitting sales tax worldwide, which is the reason to accept the higher rate if you would rather not file VAT returns. Small prices hurt most: a $5 product loses $1.00 (20%), against $0.25 on Payhip's free tier, and a $25 sale through Discover costs $7.50.
#### 4. Ko-fi, for tips plus a small shop
Ko-fi's [fee article](https://help.ko-fi.com/hc/en-us/articles/360002506494-Does-Ko-fi-take-a-fee) describes two modes, both free to join. One-off tips cost 0%, while shop items, memberships, monthly tips and commissions carry a flat 5% service fee. Money lands in your own PayPal or Stripe account, where the processor charges its usual rate, typically around 3% + $0.30. Ko-fi Gold is [$12 a month](https://help.ko-fi.com/hc/en-us/articles/360005506873-What-is-Ko-fi-Gold) for new signups, on monthly billing only, and the same article says it replaces the 5% fee with 0%. The shop suits a creator whose income is part tips and part a few products.
#### 5. Systeme.io, for $0 and a funnel builder
[Systeme.io](https://systeme.io/pricing) is the only free tier here that charges no fee on sales. Its pricing FAQ lists up to 2,000 contacts, 3 sales funnels, 1 blog, 1 course, 1 affiliate program and 1 custom domain, with unlimited emails and file storage, no credit card and no expiry. Startup is $17 a month for 5,000 contacts, unlimited funnels and 5 courses. The pages are funnel pages, so the link in your bio lands on a funnel rather than a storefront. It fits a zero budget and some patience for building pages. Pick Stan if you want a ready-made storefront template, since its pricing article lists 11 of them.
#### 6. Podia, for a store on your own domain
[Podia](https://www.podia.com/pricing) starts with a 14-day trial and no card. Mover is $42 a month on annual billing ($49 monthly) with a 5% fee, 50 products, 100 email subscribers and 25 community spaces. Shaker is $84 ($99 monthly), carries no Podia fee, and raises the limits to 150 products and 500 subscribers, plus upsells and affiliate marketing. Every plan includes a custom domain, a website with a blog, courses, downloads, coaching and events. Mover totals $504 a year, so it is the pick when the store itself should live at your address and you can spend $204 more than Stan Creator.
#### 7. Teachable, for structured courses
[Teachable](https://www.teachable.com/pricing) gives a 7-day trial and a 30-day guarantee. Starter is $39 a month ($29 annual) with 5 products and a 7.5% fee. Builder is $89 ($69 annual) with 10 products, no fee and an affiliate program, and Growth is $189 ($139 annual) with 50 products, certificates and removable Teachable branding. Stan Creator gives an unlimited course builder and no fee for $300 a year, while Teachable's cheapest fee-free plan costs $828 a year. It fits a course sold to students who will log in through Teachable's iOS and Android apps, and it makes little sense as a bio-page store.
#### 8. Kajabi, when the course is the whole business
[Kajabi](https://www.kajabi.com/pricing) lists Basic at $143 a month on annual billing ($179 monthly), with 5 products, 2,500 contacts, 1 website, 1 community and 2 admin users. Growth is $199 ($249 monthly) for 50 products and 25,000 contacts, and Pro is $399 ($499 monthly) for unlimited products and 100,000 contacts. The page states there is no revenue sharing, and processing fees apply. Basic costs $1,716 a year, which is $1,416 more than Stan Creator. That premium pays off for a creator running a full course business with websites and funnels, and does not for one selling a few PDFs from a bio.
#### 9. TrackRev, for a free page that sends people to a checkout
TrackRev's [free link-in-bio builder](https://www.trackrev.io/tools/link-in-bio) does not sell digital products: it has no store, checkout or email capture. It publishes without an account at trackrev.io/yourname, with up to 50 links, 12 social icons and 12 theme presets, and the builder has no switch for the "Made with TrackRev" footer. A free account lets you serve the page from a domain you own, which neither Stan nor Linktree allows (see [custom tracking domains](https://www.trackrev.io/products/custom-tracking-domains) for the DNS setup). It fits when the checkout lives elsewhere, as with a Payhip or Gumroad product page or a Stripe Payment Link ([attribution for Payment Links](https://www.trackrev.io/blog/stripe-payment-links-attribution)). When the page itself must take payment, use one of the eight above.
### Seeing which bio link made the sale
Unless the link in each profile carries its own tag, a store on one address has no reliable way to tell which profile sent a visitor. Stan puts ad pixels on Creator Pro, and Linktree's Premium plan adds all-time analytics with a data export. Below those plans you get Stan's store and product stats or Linktree's basic analytics.
A different utm_source on each profile's link (utm_source=instagram on one, utm_source=tiktok on another) gives whatever analytics you have something to split by. The free [UTM builder](https://www.trackrev.io/tools/utm-builder) tags a URL in seconds, and the [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers each field. Test one purchase before trusting that a given store reports the tag per order.
TrackRev's [link tracking](https://www.trackrev.io/solutions/links-and-analytics) adds a counted hop between profile and store. It is free for 50 links and 1,000 tracked events a month, and paid plans start at $39 a month ([pricing](https://www.trackrev.io/pricing)). On a paid plan, revenue matching reads Stripe, Paddle, Polar and Lemon Squeezy. TrackRev has no Stan, Beacons, Payhip or Gumroad connector, so orders placed there are not matched to clicks.
### Frequently asked questions
**Is Stan Store free?**
No. Anyone can start a trial, and once it ends the store stays live only on a paid subscription. Zero-subscription routes exist, such as Payhip's $0 tier or Gumroad, but each takes a share of every sale.
**How much is Stan Store per month?**
$29 for Creator and $99 for Creator Pro when billed monthly. Paying yearly works out to $25 and $79 a month. Stan itself adds no per-order charge, so what you pay on top is the card processor's cut.
**Is Stan Store better than Linktree?**
For selling courses, coaching and memberships from one login, yes, because those parts ship inside Stan. For a handful of downloads, Linktree Pro is $144 a year against Stan's $300, as long as you are in one of its 35 supported countries.
**Does Stan Store take a percentage of my sales?**
Stan states 0% transaction fees on both plans. Upsells, discount codes and email flows sit one tier up, at Creator Pro, so that is where your monthly bill rises rather than your per-order cost.
**Can I use my own domain with Stan Store?**
Not as the address of the store, which stays on stan.store. A redirect set up with your domain registrar sends visitors across. For a page that does live on your domain, look at Beacons Creator, Podia or Systeme.io.
**What is the cheapest Stan Store alternative with no per-sale fee?**
Systeme.io's free tier lists no transaction fee and costs nothing, within its caps of 3 funnels and 1 course. Linktree Pro at $12 monthly on annual billing is the next cheapest, followed by Beacons Creator Plus at $25.
**Can I sell digital products on Linktree's free tier?**
Selling starts at the Pro tier according to Linktree's help center, and only in 35 countries. The percentage Stan quotes for the free tier does not appear on Linktree's pages, so treat it as unconfirmed until your dashboard shows a rate.
**Does TrackRev's free link in bio sell products?**
No. Nothing on it takes payment, and it holds up to 50 links. Aim each button at a checkout that already exists, whether that is a Stripe Payment Link or a Payhip product.
---
## How to handle Stripe affiliate commissions on refunds, upgrades and downgrades
URL: https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades
Published: 2026-07-01
Author: Muzahid Maruf
How a Stripe affiliate commission should react to partial refunds, upgrades, downgrades and cancellations, with the invoice arithmetic worked out.
A Stripe affiliate commission should follow cash the customer paid and kept. Create it on `invoice.paid`, base it on the pre-tax amount, and shrink it in proportion on `charge.refunded`, which covers partial refunds too. With cash as the base, upgrades, downgrades and coupons adjust it through Stripe's own invoice math, and cancellation only stops future commissions.
> **Key takeaways:**
>
> - Create the commission on invoice.paid from the pre-tax cash paid, so upgrades, coupons and downgrade credits flow through Stripe's own invoice amounts.
> - One event, charge.refunded, covers full and partial refunds. Scale the commission by the share of the charge the customer kept: a $110.00 refund on a $330.00 charge turns a $60.00 commission into $40.00.
> - A downgrade sends no refund event. Stripe credits the next invoice, so a plan-price commission overpays by 20% of the credit, which is $13.33 on a $66.67 credit.
### How a Stripe affiliate commission should react to each event
| Event | What Stripe says it means | Commission action |
| --- | --- | --- |
| `invoice.paid` | Payment succeeded | Create the commission |
| `charge.refunded` | Refunded, partially or fully | Recompute from the running `amount_refunded` |
| `refund.failed` | A refund failed | Restore the reversed commission |
| `customer.subscription.updated` | Plan, coupon or renewal change | Only for per-plan rates or caps |
| `customer.subscription.deleted` | Subscription ended | Stop future commissions |
| `invoice.payment_failed` | Payment attempt failed | Nothing: no paid invoice, no commission |
| `charge.dispute.created`, `charge.dispute.closed` | Dispute opened or closed | Reverse on open, restore on a win |
| `checkout.session.completed` | Checkout finished | Do not pay on it |
*The webhook types that touch a commission, with meanings paraphrased from Stripe's [event type reference](https://docs.stripe.com/api/events/types).*
#### Pay on invoice.paid, not on checkout completion
`checkout.session.completed` can fire before money moves in Stripe Checkout. Stripe's [fulfillment guide](https://docs.stripe.com/checkout/fulfillment) gives ACH Direct Debit as an example, with `checkout.session.async_payment_succeeded` following later. Pay on `invoice.paid` for subscriptions and `payment_intent.succeeded` for one-time payments.
#### Which refund event to listen to
Stripe describes `charge.refunded` as covering partial refunds. `charge.refund.updated` fires only on selected payment methods, so a handler built on it alone can miss them. Stripe's [webhook documentation](https://docs.stripe.com/webhooks) adds that an endpoint can receive the same event twice and that live deliveries retry for up to 3 days, so recompute from current totals and key each write on an ID. The [guide to affiliate refund clawbacks](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers replays, disputes and holds.
### Refund math with tax on the invoice
Tax belongs to the tax authority, so a commission on the gross charge overpays the affiliate by the tax rate, while a refund is gross because it returns the tax too. Reversing the commission rate on each refund therefore takes back too much. Take a $300.00 invoice plus $30.00 of sales tax from Stripe Tax, a 20% commission of $60.00 on the pre-tax amount, and two refunds against the $330.00 charge.
| Refund | Refunded so far | Left after reversing 20% of each refund | Left after scaling by what the customer kept |
| --- | --- | --- | --- |
| $110.00 | $110.00 | $38.00 | $40.00 |
| $220.00 | $330.00 | -$6.00 | $0.00 |
*The scaled figure is $60.00 x (1 - refunded / $330.00).*
Scaling needs no tax lookup, because the commission was already pre-tax. Reversing 20% of each refund takes back $22.00 and $44.00, which is $6.00 more than the $60.00 credited. The scaled method assumes a refund returns pre-tax amount and tax in the original ratio. Floor the result at zero either way.
Node: recompute from the charge on charge.refunded
```
async function onChargeRefunded(event) {
const charge = event.data.object; // amount_refunded is the running total
const commission = await findCommissionByCharge(charge.id);
if (!commission) return; // not an affiliate sale
const kept = 1 - charge.amount_refunded / charge.amount;
const next = Math.max(0, Math.round(commission.original_cents * kept));
// event.id is the idempotency key: a repeat delivery changes nothing
if (next !== commission.current_cents) {
await setCommission(commission.id, next, event.id);
}
}
```
### Upgrades and downgrades on the invoice
By default, `create_prorations` adds a credit line for unused time on the old price and a debit line for the remaining time on the new one, and bills neither at once. Setting `always_invoice` bills an upgrade immediately, per the [subscription update reference](https://docs.stripe.com/api/subscriptions/update). A downgrade sends no refund: the [proration guide](https://docs.stripe.com/billing/subscriptions/prorations) says negative prorations are not automatically refunded, and the [customer balance guide](https://docs.stripe.com/billing/customer/balance) lists them as credit against the next invoice. With no `charge.refunded` event, the affiliate keeps the larger plan's commission.
Take one customer: a $99 plan upgraded to $299 on day 15 of a 30-day cycle, then dropped back to $99 on day 50.
| Change | Credit for old plan | Debit for new plan | Net |
| --- | --- | --- | --- |
| Day 15, $99 to $299, 15 days left | -$49.50 | $149.50 | $100.00 |
| Day 50, $299 to $99, 10 days left | -$99.67 | $33.00 | -$66.67 |
*Stripe prorates to the second, so live invoices differ by a few cents.*
| Day | Stripe event | Invoice | Cash commission at 20% | Plan-price commission at 20% |
| --- | --- | --- | --- | --- |
| 0 | Signup on $99 | $99.00 | $19.80 | $19.80 |
| 15 | Upgrade, prorations queued | None | $0.00 | $0.00 |
| 30 | Renewal with the $100.00 proration | $399.00 | $79.80 | $59.80 |
| 50 | Downgrade, credit queued | None | $0.00 | $0.00 |
| 60 | Renewal after the $66.67 credit | $32.33 | $6.47 | $19.80 |
| 90 | Renewal | $99.00 | $19.80 | $19.80 |
| Total | | $629.33 | $125.87 | $119.20 |
*Default proration settings, tax ignored.*
With `always_invoice` on the upgrade, the $100.00 is invoiced on day 15 and the day 30 invoice is $299.00, so the commission total stays $125.87 and only the timing moves. The plan-price rule is $20.00 short on the upgrade and pays $13.33 on credited money at the downgrade. I would pay on cash, because Stripe has already done the proration arithmetic and a plan-price rule makes you redo it. In your own code the cash figure is `amount_paid` less the invoice's tax. To exclude proration, read `parent.subscription_item_details.proration` on each invoice line.
#### When the subscription event matters
A percentage of cash needs no plan lookup, but per-plan rates, a tier bonus or a cap such as the first 12 months do. Stripe's [subscription webhook guide](https://docs.stripe.com/billing/subscriptions/webhooks) says `customer.subscription.updated` also fires for renewals, coupons and added invoice items, so diff `previous_attributes` against the new object, which per the [event object reference](https://docs.stripe.com/api/events/object) holds the whole array when part of one changes.
Node: detect a plan change on customer.subscription.updated
```
function planChange(event) {
const before = event.data.previous_attributes?.items?.data?.[0]?.price?.id;
const after = event.data.object.items.data[0].price.id;
// renewals and coupons arrive here too, with no price change
return before && before !== after ? { before, after } : null;
}
```
### Annual switches, cancellations and failed renewals
Stripe's [price change guide](https://docs.stripe.com/billing/subscriptions/change-price) says that when two prices have different billing intervals, the new price bills from the day of the change. Take a customer on $99 a month who moves to $990 a year on day 10 of 30.
| Line | Amount |
| --- | --- |
| Credit for 20 unused days of the $99 plan | -$66.00 |
| Annual plan | $990.00 |
| Invoice | $924.00 |
| Commission at 20% | $184.80 |
No invoice follows for 12 months, so a rule that pays 12 months of recurring commission is met by that one payment. Count the window in months of service, because counting invoices pays the annual customer 12 times over.
`customer.subscription.deleted` reverses nothing, because only money returned to the customer undoes a paid invoice. A declined renewal needs no hold when commissions are created on `invoice.paid`, and Stripe marks the subscription `past_due` while it retries.
### Testing with Stripe test clocks
Stripe's [test clock simulations](https://docs.stripe.com/billing/testing/test-clocks/simulate-subscriptions) advance time in a sandbox by up to 2 billing intervals per step, so a monthly subscription jumps up to 2 months, and the Run simulation button is disabled for a customer attached to more than 3 subscriptions.
| Test | Expected result |
| --- | --- |
| Subscribe at $99 a month through a test affiliate link | One commission of $19.80 |
| Upgrade to $299 on day 15, once with `always_invoice` and once with the default | Both runs total $79.80 by day 30 |
| Downgrade on day 50 and advance to day 60 | Commission of $6.47 and no refund event |
| Refund $110.00, then $220.00, on a $330.00 charge | Ledger lands on $0.00 |
| Refund a charge from an earlier cycle | Commission reverses even though newer charges exist |
| Resend a refund event from the Stripe Dashboard | Ledger does not change |
### Keeping channel revenue honest after refunds and upgrades
Debit a refund from the channel that earned the sale, using the model that credited it, whether [last-touch, first-touch or linear](https://www.trackrev.io/blog/attribution-models-saas-comparison), so a linear sale splits its refund across the same touches. Credit an upgrade from the source stored against the customer, because a plan change in the Stripe Customer Portal happens on a Stripe-hosted page you cannot tag, as [Stripe Customer Portal attribution](https://www.trackrev.io/blog/stripe-customer-portal-attribution) explains.
Normalize annual plans to monthly figures first. Moving from $99 a month to $990 a year books $891 of expansion if counted raw, while the monthly equivalent falls from $99 to $82.50. TrackRev copies the original click's credit onto each renewal, rescaled to the charge amount, so expansion revenue stays with the channel that brought the customer.
### How affiliate tools handle these events
Rewardful's [Stripe integration article](https://help.rewardful.com/en/articles/2213091-how-does-rewardful-use-my-stripe-account) says it commissions the amount the customer actually paid, after discounts and account balance debits, and recalculates from the refunded amount on full and partial refunds. FirstPromoter's [refund endpoint](https://docs.firstpromoter.com/api-reference-v2/api-admin/tracking-api/refund) creates a negative commission, requires an event ID, and answers a repeat with a 409. The [Rewardful and TrackRev comparison](https://www.trackrev.io/blog/rewardful-vs-trackrev) goes further.
#### What TrackRev does with each case
TrackRev reads Stripe charges, not subscription events, using a restricted API key. A sync runs hourly, and an optional webhook for `charge.succeeded`, `charge.refunded` and `checkout.session.completed` runs it at once. The [Stripe integration page](https://www.trackrev.io/integrations/stripe) lists the key permissions.
| Case | What TrackRev does |
| --- | --- |
| Paid charge | Each paid charge from a partner link or coupon earns its own commission, renewals included on a recurring program |
| Commission base | The charge amount Stripe reports, tax included: 20% of a $330.00 charge is $66.00 |
| Upgrade or downgrade | The commission follows the charge: the $399.00 and $32.33 renewals above earn $79.80 and $6.47 at 20%, with no per-plan rate |
| First-sale-only program | A $299 renewal earns $0.00 after the first sale |
| Refund of any size | A $110.00 refund on that $330.00 charge reverses all $66.00, at every multi-tier level |
| Commission already paid | Marked refunded with no negative balance, so subtract it from the next payout |
| Dispute | Follows the refund status Stripe reports, so check the ledger when a dispute ends without a refund |
| Hold period | Per program, 0 to 180 days, default 0 |
*TrackRev affiliate program behavior with a Stripe connection.*
TrackRev reverses the whole commission on any refund and has no per-plan rates, so pick a tool that documents proportional reversal, as Rewardful does, if you need it. The affiliate program needs a paid plan from Starter at $39 a month, which tracks up to $10K of commission a month. The Free plan covers link tracking only, with 50 links and 1,000 tracked events a month. The [pricing page](https://www.trackrev.io/pricing), the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) and [affiliate tracking for recurring subscriptions](https://www.trackrev.io/blog/affiliate-tracking-subscriptions-recurring) cover the rest.
### Frequently asked questions
**Should an affiliate commission include the tax on a Stripe invoice?**
No. Tax goes to the tax authority, so pay on the pre-tax amount. Stripe's invoice has total_excluding_tax and total fields, so on a $120.00 total with $20.00 of tax, a 20% commission is $20.00, not $24.00.
**Does a coupon lower the commission?**
Yes, when the commission is a share of cash collected. A $99 invoice with a 25% coupon is $74.25, so a 20% commission is $14.85.
**What is the difference between charge.refunded and refund.created?**
charge.refunded carries the charge and its running amount_refunded, while refund.created carries one refund and its ID. Recompute from the charge and deduplicate on the refund ID, since a $330.00 charge can take several refunds.
**Can I pay only on the first invoice and ignore upgrades?**
Yes, if your partner terms say so. A $99 first invoice earns $19.80 at 20% and still reverses if refunded, while a $299 renewal after an upgrade earns $0.00.
**How long should a commission wait before payout?**
At least as long as your refund window, so a 30-day policy needs a hold of 30 days or more. TrackRev's hold runs 0 to 180 days per program and starts at 0.
**Can the affiliate program run on TrackRev's free plan?**
No. The Free plan covers link tracking only, with 50 links and 1,000 tracked events monthly. Commission tracking starts on the $39 Starter plan.
---
## How to run a Stripe affiliate program, from click to payout
URL: https://www.trackrev.io/blog/stripe-affiliate-program-complete-guide
Published: 2026-10-03
Author: Muzahid Maruf
A 9-step Stripe affiliate program setup: tag each referral in Checkout, create commission when invoices are paid, handle refunds, then pay affiliates.
A Stripe affiliate program comes down to four jobs: capture the referral when someone clicks, carry the affiliate's ID into Stripe Checkout or onto the subscription, create commission from money Stripe has collected (`invoice.paid` for Stripe Billing subscriptions), and take it back when a charge is refunded. Stripe stores the payment, but nothing on a charge says who sent the customer.
> **Key takeaways:**
>
> - Stripe copies metadata between objects in only four cases, so decide early which object holds the affiliate ID: the Checkout Session, the subscription or the customer.
> - A Payment Link or Buy Button needs a handler that copies the ID onto the subscription, or the second month's invoice has no affiliate on it.
> - Pay commission on paid invoices and before tax. At 20% on a $49 plan the right base pays $9.80, and a 19% VAT-inclusive base pays $11.66.
> - Hold payouts longer than your 30-day refund window, because card chargebacks typically arrive within 120 days.
> - Paying 40 affiliates $150 each costs $120 on Stripe Connect and $60 on Global Payouts with US bank transfers.
### What Stripe records and where an affiliate ID can live
Stripe gives you three places to attach a referral. A Checkout Session takes a `client_reference_id`. Payment Links, Buy Buttons and pricing tables accept the same value as a URL parameter or an HTML attribute. Customers, subscriptions and PaymentIntents take `metadata`, which Stripe's [metadata guide](https://docs.stripe.com/metadata) caps at 50 key-value pairs, with keys up to 40 characters and values up to 500.
The same guide says metadata does not copy automatically between related objects, with four exceptions, so an ID set on the wrong object never arrives on the invoice you will pay commission on.
| Where you set it | Reaches renewal invoices? | What Stripe does with it |
| --- | --- | --- |
| Checkout Session: `client_reference_id` | No | Stays on the Checkout Session and appears in `checkout.session.completed` |
| Payment Link, Buy Button or pricing table: `client_reference_id` | No | Passed to the session as a URL parameter or attribute of up to 200 characters; invalid values are silently dropped |
| Subscription: `metadata` via `subscription_data` | Yes | Copied to each new invoice as `parent.subscription_details.metadata` |
| Customer: `metadata` | By lookup | Nothing is copied; you fetch the customer from the invoice |
| PaymentIntent: `metadata` via `payment_intent_data` | One-time payments only | Snapshotted onto the Charge once; later edits are not |
*Sources: Stripe documentation on [metadata](https://docs.stripe.com/metadata), [Payment Links URL parameters](https://docs.stripe.com/payment-links/url-parameters), pricing tables and Buy Buttons, October 2026.*
### How to set up a Stripe affiliate program in 9 steps
#### Step 1: Set the terms your Stripe data has to support
Four numbers decide what the rest of the setup must record: the commission rate, how long renewals keep earning it, the hold before commission becomes payable, and the click-to-purchase window. The [affiliate benchmark tables](https://www.trackrev.io/data/affiliate-program-benchmarks) list 20% for 12 months as the median B2B SaaS program and 60 days as the median cookie window.
| Monthly plan | Monthly commission | Commission over 12 months | Gross profit left |
| --- | --- | --- | --- |
| $19 | $3.80 | $45.60 | $136.80 |
| $49 | $9.80 | $117.60 | $352.80 |
| $99 | $19.80 | $237.60 | $712.80 |
| $199 | $39.80 | $477.60 | $1,432.80 |
*20% for 12 months, customer retained all 12, 80% gross margin assumed.*
Write the commission base into the terms as well: the invoice amount after discounts and before tax.
#### Step 2: Capture the click on your own domain
Set the referral cookie from your server, on your own domain. WebKit documents that [Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) deletes cookies created in JavaScript after 7 days without user interaction, so a 60-day window written by a script shrinks to a week for Safari visitors who do not return. A cookie on your domain is also invisible on buy.stripe.com, so the ID has to travel in the URL or through your checkout code. The cookie side has its own guide: [affiliate tracking without third-party cookies](https://www.trackrev.io/blog/affiliate-tracking-without-third-party-cookies).
#### Step 3: Pass the affiliate ID into Stripe
When your server creates the Checkout Session, read the cookie and set two fields in one call. `client_reference_id` labels the Checkout Session. `subscription_data.metadata` writes the ID onto the subscription Stripe creates, which is what lets renewals find their affiliate.
Server code that creates the session (Node)
```
// aff_id was set when the visitor clicked the affiliate link
const affiliateId = (await cookies()).get("aff_id")?.value;
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
client_reference_id: affiliateId,
subscription_data: { metadata: { affiliate_id: affiliateId } },
success_url: "https://example.com/welcome",
});
```
For a Payment Link, append `?client_reference_id=` and the affiliate's ID to the URL, and Stripe sends the value in `checkout.session.completed` after payment. Pricing tables and Buy Buttons take a `client-reference-id` attribute. A link-level `subscription_data.metadata` is set once when you create the link, so it names an affiliate only if you create one Payment Link per affiliate through the API. [Stripe Payment Links attribution](https://www.trackrev.io/blog/stripe-payment-links-attribution) covers that flow.
A podcast read has no clickable link, so give that affiliate a promotion code. Stripe's [Promotion Code object](https://docs.stripe.com/api/promotion_codes/object) has a `metadata` field and a `max_redemptions` limit, so one code per affiliate can name its owner and cap its use. [Coupon code tracking for affiliate programs](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) covers the rest.
#### Step 4: Make the ID survive to renewals
A Payment Link or Buy Button puts the ID on the Checkout Session only, so the month-2 invoice arrives with no trace of the referral. Close the gap in your `checkout.session.completed` handler by writing the ID to the subscription and the customer.
Webhook handler for checkout.session.completed
```
const session = event.data.object;
const affiliateId = session.client_reference_id;
if (affiliateId && session.subscription) {
await stripe.subscriptions.update(session.subscription, {
metadata: { affiliate_id: affiliateId },
});
}
if (affiliateId && session.customer) {
await stripe.customers.update(session.customer, {
metadata: { affiliate_id: affiliateId },
});
}
```
Stripe's webhook guide says not to depend on event order, so the first `invoice.paid` can arrive before this write lands. For an invoice with a `billing_reason` of `subscription_create`, list the Checkout Sessions with a `subscription` filter and read `client_reference_id` there. For later invoices, check `parent.subscription_details.metadata`, then the subscription, then the customer.
#### Step 5: Create commission from collected money
Create the commission for a subscription on `invoice.paid`, which Stripe's [subscription webhook guide](https://docs.stripe.com/billing/subscriptions/webhooks) describes as sent when an invoice is successfully paid. Skip any invoice with an `amount_paid` of 0, and use the invoice ID as the commission row's unique key so a replayed event changes nothing.
| Stripe event | What it tells you | What to do |
| --- | --- | --- |
| `invoice.paid` | An invoice, first or renewal, was paid | Create commission if `amount_paid` is above 0 |
| `checkout.session.completed` | Checkout finished; `payment_status` is paid, unpaid or no_payment_required | Copy the affiliate ID (step 4); commission only on one-time Checkout Sessions marked paid |
| `checkout.session.async_payment_succeeded` | A bank debit or voucher settled, which Stripe says can take 2 to 14 days | Create the one-time commission |
| `charge.refunded` | A refund, partial ones included | Recompute commission (step 7) |
| `charge.dispute.created` | A cardholder opened a dispute | Freeze the commission (step 7) |
| `customer.subscription.updated` | A renewal, plan change or discount | Update the base for future invoices |
| `customer.subscription.deleted` | The subscription ended | Stop accruing |
*Event names and descriptions from Stripe's subscription webhook, refund, Checkout fulfillment and Payment Links guides, October 2026.*
> **A free trial can look like a sale:** Stripe's Checkout reference says a free-trial session reports `payment_status` `paid` once the $0 trial invoice is processed. A handler that creates commission on `checkout.session.completed` without checking the amount pays for trial signups that never convert.
Verify the signature and return a 2xx before slow work. Stripe's [webhook documentation](https://docs.stripe.com/webhooks) says failed deliveries are retried for up to three days in live mode and the same event can arrive twice, so log event IDs.
Then choose one amount per invoice and keep to it. `total_excluding_tax` is the invoice total after discounts and before tax; `subtotal` is before invoice-level discounts. Take a $49.00 plan billed to a customer in Germany with 19% VAT added. Commission on the VAT-inclusive total overpays by the tax rate on every renewal.
| Commission base | Invoice amount | 20% commission | Overpayment |
| --- | --- | --- | --- |
| Before tax (`total_excluding_tax`) | $49.00 | $9.80 | None |
| Invoice total with 19% VAT | $58.31 | $11.66 | $1.86 a renewal |
*A $49.00 monthly plan; $58.31 is $49.00 plus $9.31 of VAT.*
#### Step 6: Follow upgrades, downgrades and cancellations
Commission follows invoices, so most plan changes need no special code: an upgrade makes the next invoice larger and a cancellation stops invoices. What needs a rule is the recurring window. Count paid invoices per subscription using `billing_reason` (`subscription_create` for the first, `subscription_cycle` for each renewal, `subscription_update` for a mid-cycle change) and stop at your term. Decide whether proration invoices earn commission, and whether the term counts months or invoices; annual plans make that difference visible.
| Scenario | Paid invoices | Affiliate earns |
| --- | --- | --- |
| Stays on the $49 plan all year | 12 invoices of $49.00 | 12 × $9.80 = $117.60 |
| Upgrades to $99 after month 4 | 4 of $49.00, then 8 of $99.00 | $39.20 + $158.40 = $197.60 |
| Cancels after month 3 | 3 invoices of $49.00 | 3 × $9.80 = $29.40 |
| Starts a trial and cancels before the first charge | One $0.00 invoice | $0.00 |
*Worked example: $49 monthly plan, 20% commission for 12 months, proration ignored.*
#### Step 7: Reverse refunds and hold for chargebacks
Stripe sends `charge.refunded` for every refund, partial ones included. Recompute the commission from the charge's cumulative refunded amount so a replayed event cannot subtract twice. If the original commission was already paid, carry the difference as a negative balance on the next payout; the [refunds and upgrades guide](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) walks through the ledger states.
| Case | Event | Commission before | Commission after |
| --- | --- | --- | --- |
| Full refund of a $49 renewal | `charge.refunded` | $9.80 | $0.00 |
| $100 partial refund on a $300 annual charge | `charge.refunded` | $60.00 | $40.00 |
| Dispute opened on a $49 renewal | `charge.dispute.created` | $9.80 | Frozen until `charge.dispute.closed`, then reversed if lost |
*At a 20% rate. The partial refund leaves $200 of net revenue, and 20% of $200 is $40.*
> **Holds and chargebacks run on different clocks:** Stripe's [dispute documentation](https://docs.stripe.com/disputes/how-disputes-work) says card networks typically let a cardholder file within 120 days of the payment, and a dispute can take 2 to 3 months to resolve. A 30-day hold covers refund requests; a chargeback filed in month 3 or 4 arrives after it. Hold as long as your affiliates will accept, and state the hold length in the terms before the first payout.
#### Step 8: Pay the affiliates
Stripe settles your customers' payments to you. Getting part of that money to affiliates is a separate job, and the rails differ in reach and cost.
| Payout rail | Who it reaches | Cost for 40 affiliates at $150 | Catch |
| --- | --- | --- | --- |
| CSV export, then PayPal or Wise | Wherever PayPal or Wise operates | Provider fees only | You run each payout cycle by hand |
| Stripe Connect transfers | Affiliates in your platform's region, with limited cross-border reach | $80 account fees + $25 payout fees + $15 routing = $120 (2.0%) | Each affiliate onboards with Stripe; a transfer fails if your balance is short |
| Stripe Global Payouts | Recipients without Stripe accounts; the sender must be a US or UK business | 40 US bank payouts at $1.50 = $60 (1.0%) | Requires Stripe Treasury; you manage your own compliance, which Stripe says can call for a Money Transmitter License |
| Rewardful Managed Payouts | Optional on every Rewardful plan | 3% of $6,000 = $180 (3.0%) | Affiliates may also pay withdrawal fees |
| Tolt auto payouts | PayPal, Wise, local bank, crypto and wire | 2% of $6,000 = $120 (2.0%) | Growth plan ($99) or higher |
*Forty payouts of $150 is $6,000 in a month. Connect rates from [Stripe's Connect pricing page](https://stripe.com/connect/pricing): $2 per monthly active account, 0.25% + $0.25 per payout, plus the 0.25% of payout volume funds-routing line in its feature table. Global Payouts rate from [Stripe's Global Payouts pricing](https://docs.stripe.com/global-payouts/pricing). Vendor rates from [Rewardful](https://www.rewardful.com/pricing) and [Tolt](https://tolt.com/pricing), October 2026.*
Stripe Connect pays out of your own Stripe balance: Stripe's [separate charges and transfers guide](https://docs.stripe.com/connect/separate-charges-and-transfers) says a transfer fails when it exceeds your available balance, with no automatic retry. Transfers cross borders only between the US, Canada, the UK, the EEA and Switzerland. Stripe's docs now call Standard, Express and Custom accounts legacy and model a payee as a v2 Account with a `recipient` configuration.
Stripe restricts transfers to permitted use cases, and its [cross-border payouts page](https://docs.stripe.com/connect/cross-border-payouts) lists affiliate payouts under Global Payouts, so ask Stripe whether your program fits before you build. For a first program I would start with the CSV route: Stripe Connect's $2 monthly account fee alone is 1.3% of a $150 payout, and every affiliate must finish Stripe onboarding. Collect a W-9 or W-8 before the first payout on any rail; [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers methods and tax forms.
#### Step 9: Test the whole path with test clocks
Stripe's [test clocks](https://docs.stripe.com/billing/testing/test-clocks) (called simulations in the current docs) move a test subscription through time, so a month-2 renewal takes minutes. Run one referred customer through a payment, a renewal, an upgrade, a partial refund and a cancellation, then compare the ledger with the invoice list. Repeat with a Payment Link and an API-created Checkout Session, which take different paths through steps 3 and 4, and run an unreferred customer to confirm nothing is paid.
### Build it yourself or use an affiliate tool
Steps 3 to 7 stay yours to maintain while the program runs: event order, replays, disputes and payout files all land on you. A tool connects to Stripe, reads the same events and runs the ledger, and those steps are the checklist for judging one: how it finds the affiliate on a renewal, what it pays on, and what it does with a partial refund. Entry plans differ on what they cap and how they pay.
| Tool | Entry plan, monthly price | What the entry plan caps | Payouts |
| --- | --- | --- | --- |
| [Rewardful](https://www.rewardful.com/pricing) | Starter, $49 | $7,500/month of affiliate-attributed revenue, 1 campaign | PayPal and Wise mass payouts; Managed Payouts optional at 3% |
| [FirstPromoter](https://firstpromoter.com/pricing) | Starter, $49 | $5,000/month of affiliate revenue, 1,000 affiliates | Mass payouts through PayPal, Wise, Stripe, crypto and bank transfer |
| [Tolt](https://tolt.com/pricing) | Basic, $69 | $10,000/month earned through affiliates | Manual payouts on Basic; auto payouts from Growth at $99 |
| [PromoteKit](https://www.promotekit.com/pricing) | Pro, from $29 (yearly toggle shown); free plan covers 3 referrals | $10,000/month from affiliates | One-click global payouts on Pro |
| TrackRev | Starter, $39 | $10,000 of commission tracked monthly, 1 workspace | Wise or PayPal CSV export, then mark paid |
*Prices from each vendor's pricing page, October 2026. Rewardful, FirstPromoter and Tolt each offer a 14-day trial.*
Caps are measured differently. The first four cap affiliate-driven revenue; TrackRev caps the commission it tracks, so at a 20% rate $10,000 of commission corresponds to $50,000 of affiliate revenue. The full comparison is in [best affiliate software for Stripe in 2026](https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026).
### How TrackRev handles the Stripe side
TrackRev connects with a restricted Stripe key and syncs paid charges hourly; an optional webhook cuts the delay to seconds. It never writes metadata onto your customers or subscriptions, which removes step 4. Its pixel sets a first-party visitor ID and adds it as `client_reference_id` to Payment Links, Buy Buttons and pricing tables on your pages; for Checkout Sessions you create, pass it as `client_reference_id` or `metadata.vid`. Without either, it matches the customer's email, and renewals inherit the affiliate from the first charge on the subscription.
Per program you set a percentage or flat amount, first sale only or renewals too, a 60-day click window by default, a hold of 0 to 180 days (default 0) and a payout schedule from weekly to quarterly. Paying means exporting a PayPal or Wise CSV and marking each payout paid.
Against the build above, TrackRev reads charges, so the base is the charge amount, including any tax Stripe collected. Any refund, partial ones too, reverses that charge's whole commission with no proration. The program needs a paid plan.
| TrackRev plan | Monthly price | Commission tracked monthly | Workspaces |
| --- | --- | --- | --- |
| Free | $0 | None; link tracking only, with 50 links and 1,000 events | 1 |
| Starter | $39 | Up to $10,000 | 1 |
| Growth | $99 | Up to $100,000 | Unlimited |
| Scale | $199 | Unlimited | Unlimited |
*Annual billing charges for 9 months and gives 12.*
Pick Tolt (Growth, $99) when automatic payouts with 1099 filing matter more than the entry price, PromoteKit when Stripe is your only billing system and price decides it, and TrackRev when the affiliate program should sit beside link tracking and channel attribution on one data model. The [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) lists what partners see in their portal.
### Frequently asked questions
**Does Stripe have a built-in affiliate feature?**
Stripe's docs describe no affiliate feature: a charge carries an amount, a customer and whatever IDs and metadata you attach, so Stripe affiliate tracking is your code or a tool's. Stripe does list affiliates among the recipients of Global Payouts.
**Can I run a Stripe affiliate program without writing code?**
Yes. Tools such as Rewardful ($49 and up) and TrackRev ($39 and up) connect to Stripe through an authorization grant or a restricted API key and run the ledger for you. You still set the terms and run the tests before inviting anyone.
**What commission should I offer to start?**
Start near the benchmark medians, 20% for B2B SaaS and 15% for B2C. Then check the rate against margin. At 80% gross margin, a 20% commission leaves 60% of every payment as gross profit, and 30% would leave 50%.
**How long should I hold commission before paying?**
Longer than your refund window and shorter than your affiliates' patience. A 30-day refund policy points to a hold of 30 to 45 days. Stretching it to 120 days catches most chargebacks but delays every first payout by four months. TrackRev's hold is set per program from 0 to 180 days and defaults to 0.
**What happens to commission when a renewal payment fails?**
Nothing is created until Stripe collects the money. A failed attempt produces no invoice.paid event, so a $49 renewal that fails twice and clears on the third attempt earns its $9.80 at 20% once, on that day. One that never clears earns nothing.
**How do annual plans work with a 12-month commission term?**
A 12-month term counted in months covers one invoice on an annual plan. A $490 plan at 20% earns $98.00 once, when that invoice is paid. If affiliates should earn on the second year too, define the term in renewals or years and put it in writing.
**Can I start a Stripe affiliate program on TrackRev's free plan?**
No. The free plan covers link tracking only, with 50 links, 1,000 tracked events monthly and 1 workspace, and the affiliate program stays locked. It starts on Starter at $39.
---
## How to track attribution through Stripe Checkout
URL: https://www.trackrev.io/blog/stripe-checkout-attribution-tracking
Published: 2026-07-11
Author: Muzahid Maruf
A Stripe Checkout Session holds 200 characters of reference ID and 50 metadata pairs but no UTM code. Add a visitor ID before the redirect and read it back.
Stripe Checkout attribution tracking comes down to one handoff: your server puts a visitor ID on the Checkout Session before the redirect, and your webhook reads it back when the payment completes. A Checkout Session has no UTM, referrer or landing page field, and [Stripe's OpenAPI spec](https://github.com/stripe/openapi) for API version 2026-09-30 has no UTM field on any object.
Stripe's [Checkout lifecycle](https://docs.stripe.com/payments/checkout/how-checkout-works) has 4 steps: your server creates the Session, the buyer is redirected to its URL, the buyer pays, and a webhook reports the payment. Attribution gets written in step 1 and read in step 4.
> **Key takeaways:**
>
> - A Stripe Checkout Session returns only what your server wrote at creation: one client_reference_id of up to 200 characters and up to 50 metadata pairs. UTM codes have no field.
> - Create the Session when the buyer clicks Buy, record the link on checkout.session.completed and revenue on invoice.paid, keyed by subscription ID so payment 12 of a $49 plan credits the channel of payment 1.
> - Success-page counts miss buyers who pay and close the tab, and Stripe retries a failed webhook for up to 3 days, so count sales from the webhook.
> - Safari deletes JavaScript-written cookies after 7 days without interaction, so save the visitor ID on the user record at signup.
### What a Checkout Session keeps and what it drops
A Checkout Session returns the attribution data your server wrote at creation and nothing else about the visit.
| Field | Set with | Comes back on | Limit |
| --- | --- | --- | --- |
| Reference ID | client_reference_id | The Session and checkout.session.completed | 200 characters |
| Session metadata | metadata | The Session and its events | 50 pairs, 40-character keys, 500-character values |
| Payment-mode copy | payment_intent_data.metadata | The PaymentIntent | Same 50, 40 and 500 limits |
| Subscription-mode copy | subscription_data.metadata | The Subscription | Same 50, 40 and 500 limits |
| Return URL | success_url with {CHECKOUT_SESSION_ID} | The URL the buyer lands on | Stripe fills in the Session ID |
| Buyer email | customer_email, to prefill | customer_details.email | 800 characters |
| UTM codes, referrer, landing page | No parameter exists | Nowhere | 0 fields |
*Limits from Stripe's [Create a Checkout Session reference](https://docs.stripe.com/api/checkout/sessions/create) and [metadata guide](https://docs.stripe.com/metadata), October 2026.*
Stripe's metadata guide says metadata doesn't copy to related objects on its own, so a source written only on the Checkout Session never reaches the Subscription or its invoices. The [Stripe metadata setup guide](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) lists the copy rules.
### Why analytics tools lose the buyer at Checkout
| Where it breaks | What happens | Number to know | Fix |
| --- | --- | --- | --- |
| Payment page | Your tags don't run on Stripe's page, including one served from a custom domain such as payments.example.com | 1 custom domain per account | Write the ID into the Checkout Session |
| Return trip | Google Analytics 4 files the visit as a referral | 50 unwanted referrals per stream | Exclude checkout.stripe.com |
| Success page | Counts miss paid buyers and repeat on refresh | 3 days of webhook retries | Count from the webhook |
| Safari | Cookies created in JavaScript are deleted | 7 days without interaction | Set the cookie from your server |
Stripe's [Google Analytics 4 funnel guide](https://docs.stripe.com/payments/checkout/analyze-conversion-funnel) tags only your product, success and canceled pages, so a client-side tag sees the Buy click and the return trip. It says to add checkout.stripe.com to the referral exclusion list, which Google's [unwanted referrals page](https://support.google.com/analytics/answer/10327750) documents under Admin, Data streams, Configure tag settings. The [GA4 revenue-by-channel guide](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) covers the revenue mismatch.
[WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Intelligent Tracking Prevention deletes cookies created in JavaScript, plus localStorage and other script-writable storage, after 7 days without the visitor interacting with the site. A reader who clicks a newsletter link on Monday and next opens the site 9 days later arrives with no stored ID. I'd set the cookie from your server and save the visitor ID on the user record at signup, since SaaS buyers usually register before they pay. The [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers what else survives.
### Stripe Checkout attribution tracking, step by step
Build against a Stripe sandbox, where test card 4242 4242 4242 4242 with any future expiry and any 3-digit CVC completes a payment, and run `stripe listen --forward-to localhost:4242/webhook` to receive events locally.
#### Step 1: Give every visitor an ID and save the first visit
On the first page view, create a 36-character UUID, set it as a cookie from your server, and store the landing URL, referrer and 5 UTM parameters against it. Write first touch once and let last touch update. Use a random ID in place of an email address, since an anonymous visitor has no email yet. The stored referrer covers links whose UTM codes a shortener stripped ([why UTM parameters get stripped](https://www.trackrev.io/blog/why-utm-parameters-get-stripped)).
#### Step 2: Create the Session when the buyer clicks
Create the Checkout Session inside the click handler, because one built when the pricing page loads carries whatever the cookie held at that moment and can sit open for 24 hours. Per Stripe's [redirect guide](https://docs.stripe.com/payments/checkout/custom-success-page), hosted pages take a `success_url` and embedded Checkout takes a `return_url`. Embedded Checkout renders on your page, so your cookie and tags stay in place while the buyer pays.
Express route behind the Buy button (Node)
```
// vid is the visitor ID from your first-party cookie; visit is the row saved in step 1
app.post("/create-checkout-session", async (req, res) => {
const vid = req.cookies.vid;
const visit = await getVisit(vid);
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
client_reference_id: vid, // 36 characters, the limit is 200
metadata: { vid }, // visible on the Session itself
subscription_data: { // copied onto the Subscription
metadata: { vid, first_touch: visit.firstSource, last_touch: visit.lastSource },
},
// payment mode takes payment_intent_data.metadata in place of subscription_data
// embedded Checkout takes return_url in place of success_url
success_url: "https://example.com/welcome?session_id={CHECKOUT_SESSION_ID}",
cancel_url: "https://example.com/pricing",
});
res.redirect(303, session.url);
});
```
#### Step 3: Record the link from the webhook and the revenue from invoices
The funnel guide notes that success-page counts miss purchases when the redirect fails and over-count refreshes, and Stripe's [fulfillment guide](https://docs.stripe.com/checkout/fulfillment) requires webhooks for that reason. According to the [webhook guide](https://docs.stripe.com/webhooks), live-mode deliveries retry for up to 3 days, the same event can arrive twice, and order isn't guaranteed, so verify the Stripe-Signature header, log event IDs and key rows by object ID. Bank debits and vouchers can take 2 to 14 days to confirm, as Stripe's [Payment Links tracking page](https://docs.stripe.com/payment-links/url-parameters) says, so also listen for `checkout.session.async_payment_succeeded`.
A subscription's first invoice repeats the $49 the Checkout Session reports, so pick one revenue source. I'd count revenue from invoices and use the Checkout Session only to learn who the buyer was, which sends payment 1 and payment 12 down the same path. A one-time payment has no invoice by default, so count the Checkout Session's `amount_total` once `payment_status` is `paid`.
Webhook handler (Node)
```
app.post("/webhook", express.raw({ type: "application/json" }), async (req, res) => {
let event;
try {
event = stripe.webhooks.constructEvent(
req.body, req.headers["stripe-signature"], process.env.STRIPE_WEBHOOK_SECRET);
} catch (err) {
return res.sendStatus(400);
}
if (await seenEvent(event.id)) return res.sendStatus(200); // deliveries can repeat
const obj = event.data.object;
if (event.type === "checkout.session.completed" && obj.client_reference_id) {
await saveLink({
sessionId: obj.id,
subscriptionId: obj.subscription, // null in payment mode
vid: obj.client_reference_id,
email: obj.customer_details?.email, // fallback join key
});
}
if (event.type === "invoice.paid") {
await saveRevenue({
invoiceId: obj.id,
subscriptionId: obj.parent?.subscription_details?.subscription ?? obj.subscription, // older API versions
cents: obj.amount_paid,
reason: obj.billing_reason, // subscription_create, then subscription_cycle
});
}
res.sendStatus(200);
});
```
When a webhook endpoint listens for `checkout.session.completed` and a success URL is set, Checkout waits up to 10 seconds for your response before redirecting the buyer, so write the link row first and defer slow work.
#### Step 4: Carry the channel to renewals and refunds
A renewal creates no Checkout Session, so it earns its channel through the subscription ID saved in step 3. A `charge.refunded` event carries a PaymentIntent, and Stripe's [Invoice Payments API](https://docs.stripe.com/api/invoice-payment/list) can look up the invoice that PaymentIntent paid, which leads back to the subscription and the channel to debit. The [subscription LTV guide](https://www.trackrev.io/blog/subscription-ltv-attribution) covers lifetime revenue by channel.
#### Step 5: Test the chain before you trust it
Run a sandbox subscription checkout, retrieve the Checkout Session to confirm the visitor ID, and check that both events reached your tables with 1 shared subscription ID. Then delete the cookie and run a second checkout to exercise the email fallback.
### A worked example with numbers
Take 40 new subscribers on a $49 plan, which adds $1,960 of MRR. With an ID on every Checkout Session the revenue splits by channel, and unmatched buyers stay visible as their own row.
| Channel | New subscribers | New MRR | Share of new MRR |
| --- | --- | --- | --- |
| Newsletter sponsorship | 14 | $686 | 35.0% |
| Google Ads | 9 | $441 | 22.5% |
| Affiliate links | 6 | $294 | 15.0% |
| Organic search | 5 | $245 | 12.5% |
| No ID found | 6 | $294 | 15.0% |
| Total | 40 | $1,960 | 100% |
*Illustrative figures, not customer data.*
One newsletter subscriber who stays 12 months pays $588, yet a report built only from Checkout Sessions credits the newsletter with $49.
| Month | Invoices paid | Credited with the subscription join | Credited from Sessions only |
| --- | --- | --- | --- |
| 1 | 1 | $49 | $49 |
| 3 | 3 | $147 | $49 |
| 6 | 6 | $294 | $49 |
| 12 | 12 | $588 | $49 |
*Illustrative figures for one $49 subscriber.*
The 6 unmatched buyers in the first table stand for $3,528 a year (6 × $588), and the newsletter's 14 subscribers are worth $8,232 (14 × $588) if none cancels, the figure to weigh against what the sponsorship cost.
### What this setup leaves uncovered
Buyers who click on a phone and pay on a laptop arrive with a second cookie, so only the email they registered with can join them. Payment Links skip your server-side Session creation and need the ID added another way, which the [Payment Links attribution guide](https://www.trackrev.io/blog/stripe-payment-links-attribution) walks through.
### What TrackRev does with a Checkout Session
TrackRev's pixel writes a first-party cookie named `vid` that lasts 365 days. Pass it as `client_reference_id` when your server creates a Checkout Session; the [Stripe integration page](https://www.trackrev.io/integrations/stripe) covers the pixel and the restricted key. Because the pixel writes the cookie from JavaScript, WebKit's 7-day rule applies, so call `trk.identify(email)` at signup to enable an email match as well.
TrackRev reads Stripe with a restricted key and checks 4 places for the visitor ID, in this order.
| Order | Where the sync looks |
| --- | --- |
| 1 | metadata.vid on the charge |
| 2 | client_reference_id on the Checkout Session |
| 3 | metadata.vid on the Checkout Session |
| 4 | The buyer's email, once identify() has run |
*Lookup order in TrackRev's Stripe sync.*
A renewal inherits the first order's visitor through the subscription ID, and a refunded charge flips its order to refunded on the next sync. The sync runs hourly, or on 3 webhook events (`charge.succeeded`, `charge.refunded` and `checkout.session.completed`) when the key allows webhook writes. Revenue figures need a paid plan, from Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)), with last-touch, first-touch or linear credit. The free plan covers link tracking with 50 links and 1,000 tracked events a month.
### Frequently asked questions
**Does Stripe Checkout save UTM parameters?**
No. A Checkout Session has no field for the 5 UTM codes, so they vanish at the redirect unless your server copies them into client_reference_id or metadata first. Payment Links accept the same 5 codes at up to 150 characters each, but return them only on your redirect URL.
**Does a 36-character UUID fit in client_reference_id?**
Yes. The limit is 200 characters, so a UUID uses 36 of them. Payment Links and Pricing Tables accept only letters, digits, dashes and the _ character, and silently drop an invalid value, which a UUID satisfies.
**What happens when a buyer abandons checkout?**
No charge is made, so there is nothing to attribute. An unpaid Session expires after 24 hours by default, or 30 minutes at the shortest, and the next click creates a new one. Log the visitor ID at creation to compare Sessions started with Sessions paid for every channel.
**What does payment_status mean on a completed Session?**
It is paid, unpaid or no_payment_required. For a subscription with a free trial, paid means the $0 trial invoice was processed.
**What if my webhook endpoint was down for 4 days?**
Automatic retries last up to 3 days in live mode, so the earliest events from the outage need a manual fix. Resend events from the Stripe Dashboard within 15 days of creation or with the Stripe CLI within 30 days, or list recent Checkout Sessions through the API and backfill the missing rows.
**Do I need TrackRev, or can I build this myself?**
You can build it: one route, one webhook handler and a visitor table cover the first sale. Renewals, refunds, deduplication and a channel report are the ongoing work, and TrackRev covers them for Stripe, Paddle, Polar and Lemon Squeezy from $39 a month on Starter. If Stripe is your only processor and one hand-built report is enough, building it yourself is reasonable.
---
## How to attribute Stripe Customer Portal upgrades and cancellations
URL: https://www.trackrev.io/blog/stripe-customer-portal-attribution
Published: 2026-07-11
Author: Muzahid Maruf
Stripe Customer Portal attribution: why portal plan changes carry no UTMs, and how a stored source, webhooks and proration settings credit upgrades and churn.
Stripe Customer Portal attribution works only when the channel was saved before the customer first opened the portal. Stripe hosts that page, so a plan change or cancellation reaches your systems as a webhook event with no UTM, cookie or referrer attached. Take a customer who bought the $29 plan 11 months ago and upgrades to $79 in the Customer Portal: nothing in the event points to the newsletter issue that won them. Save the source at signup against the Stripe customer and subscription IDs, then read it back when `customer.subscription.updated` arrives.
> **Key takeaways:**
>
> - Stripe hosts the Customer Portal and says it can't be shown in an iframe, so a plan change or cancellation reaches you only as webhook events with no UTM, cookie or referrer.
> - On a $29 plan upgraded to $79 on day 20 of 30, the net proration is $16.67: billed at once with always_invoice, on the $95.67 renewal with create_prorations, never with proration off.
> - A portal cancellation sends 2 events, customer.subscription.updated when the customer schedules it and customer.subscription.deleted when the period ends, and Stripe allows an undo in between.
> - TrackRev credits every later charge on a subscription to the channel of its first charge, so after a $29 to $79 upgrade every renewal still credits the original channel. It ignores subscription events.
### Stripe Customer Portal attribution: what each action sends
The [Customer Portal](https://docs.stripe.com/customer-management) lets customers update payment methods, switch plans or quantities, cancel and read invoices. In the Stripe Dashboard, Switch plan, Update quantities and Prorate subscription updates start off, and Cancel subscription and Cancellation reason start on ([configuration guide](https://docs.stripe.com/customer-management/configure-portal)).
| Portal action | Events Stripe sends | MRR change | Annualized |
| --- | --- | --- | --- |
| Switch a $29 plan to a $79 plan | customer.subscription.updated | +$50 | +$600 |
| Add 3 seats at $15 | customer.subscription.updated | +$45 | +$540 |
| Downgrade from $79 to $29, scheduled for period end | subscription_schedule.created | -$50 at period end | -$600 |
| Cancel a $79 plan at period end | customer.subscription.updated, then customer.subscription.deleted | -$79 at period end | -$948 |
| Cancel a $79 plan immediately | customer.subscription.deleted | -$79 now | -$948 |
| Undo a scheduled cancellation | customer.subscription.updated | $0 | $0 |
| Replace a card or edit the billing address | payment_method.attached, customer.updated | $0 | $0 |
*Event names from Stripe's portal, cancellation and subscription webhook documentation, October 2026. Prices are illustrative.*
Customers can cancel but not update subscriptions with multiple products, usage-based billing, trial offers or invoice collection, and the plan picker lists at most 10 products.
### Why a portal change carries no marketing signal
Stripe serves the Customer Portal from its own page and says it can't be displayed inside an iframe, so none of your scripts run there. A new session URL expires after 5 minutes if unused, and a used one within 1 hour of the last activity. A custom domain can replace billing.stripe.com, but Stripe still serves the page.
The customer also arrives far from the click that won them. The Google Analytics [Measurement Protocol documentation](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events) says an event meant to join a gtag.js session should arrive within 48 hours, or it may not be processed as expected for conversion attribution. An upgrade 11 months after signup lands about 7,920 hours after the visit, 165 times that window. [Connecting Google Analytics to Stripe revenue](https://www.trackrev.io/blog/connect-google-analytics-stripe-revenue) covers the build that works for a first payment.
You still control 3 steps. Your server creates every session after authenticating the customer ([integration guide](https://docs.stripe.com/customer-management/integrate-customer-portal)), so that route can record the customer, the page the click came from and the session ID. Stripe lists 5 flow types in its [deep link guide](https://docs.stripe.com/customer-management/portal-deep-links), and a flow can return the customer to your own URL through `after_completion`, where your tag fires. Webhooks then report what changed. Matching each webhook to the customer's latest logged session is a heuristic.
The no-code login link skips the session route: the customer enters an email and Stripe sends a login link. When 2 or more customers share that email, Stripe picks the most recently created one with an active subscription, according to the [no-code portal setup page](https://docs.stripe.com/customer-management/activate-no-code-customer-portal).
### Store the source on the customer and the subscription
The [portal documentation](https://docs.stripe.com/customer-management) says changes that take effect immediately go through the Subscriptions API and changes at period end go through Subscription Schedules, so the subscription ID and its metadata stay in place. It serves subscriptions started in Stripe Checkout, Payment Links or the pricing table alike, so capture the source in whichever flow creates them, and write it to the Customer too. A canceled subscription can't be reactivated ([cancellation guide](https://docs.stripe.com/billing/subscriptions/cancel)), so a returning customer needs a new subscription, and a source on the Customer carries over when your checkout reuses the customer ID. [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) has the key names and the 50-pair limit. I credit an upgrade to the channel that won the customer, since a plan change involves no new visit.
### Reading each event
`customer.subscription.updated` also fires for renewals and coupons ([subscription webhook guide](https://docs.stripe.com/billing/subscriptions/webhooks)), so compare `previous_attributes` with the new object.
Classify customer.subscription.updated (Node)
```
// After signature verification. Amounts are in cents.
// Handles single-item subscriptions with per-unit prices, which is what the portal can change.
function classify(event) {
const sub = event.data.object;
const prev = event.data.previous_attributes ?? {};
const monthly = (item) =>
(item.price.unit_amount * item.quantity) /
(item.price.recurring.interval === "year" ? 12 : 1);
const oldItem = prev.items?.data?.[0];
if (oldItem) {
const delta = monthly(sub.items.data[0]) - monthly(oldItem);
if (delta !== 0) return { type: delta > 0 ? "expansion" : "contraction", delta };
}
if (sub.cancel_at && prev.cancel_at === null) {
return { type: "cancel_scheduled", feedback: sub.cancellation_details?.feedback ?? null };
}
if (sub.cancel_at === null && prev.cancel_at) return { type: "reactivated" };
return null; // renewal, coupon or another field changed
}
```
One `cancel_at` test covers both billing modes. Classic mode sets `cancel_at_period_end` to true and `cancel_at` to the period end for a portal cancellation, and flexible mode sets `cancel_at` alone ([billing mode comparison](https://docs.stripe.com/billing/subscriptions/billing-mode/compare)).
### When a portal upgrade turns into cash
The subscription event fires on the day of the change, but the money can arrive a cycle later. With prorations disabled, the customer pays the full new price when the next invoice is generated, per the [proration guide](https://docs.stripe.com/billing/subscriptions/prorations). The portal configuration takes `none`, `create_prorations` or `always_invoice` for `features.subscription_update.proration_behavior`. Take a $29 plan upgraded to $79 on day 20 of a 30-day cycle. The credit for 10 unused days is $9.67 (29 x 10/30), the debit for 10 days at the new price is $26.33 (79 x 10/30), and the net is $16.67. With `always_invoice` Stripe calculates that sum and generates an invoice for it at once.
| proration_behavior | Billed on day 80 | Renewal invoice on day 90 | Billed after the change |
| --- | --- | --- | --- |
| none | $0.00 | $79.00 | $79.00 |
| create_prorations | $0.00 | $95.67 | $95.67 |
| always_invoice | $16.67 | $79.00 | $95.67 |
*Day 20 of a 30-day cycle that began on day 60, tax ignored. Stripe prorates to the second, so live invoices differ by a few cents.*
Follow one newsletter subscriber through create_prorations.
| Day | What happens | Invoice | MRR after | Channel total |
| --- | --- | --- | --- | --- |
| 0 | Signup on the $29 plan, source saved as newsletter | $29.00 | $29 | $29.00 |
| 30 | Renewal | $29.00 | $29 | $58.00 |
| 45 | Card replaced in the portal | None | $29 | $58.00 |
| 60 | Renewal | $29.00 | $29 | $87.00 |
| 80 | Upgrade to $79 in the portal, 10 days left | None | $79 | $87.00 |
| 90 | Renewal plus the $16.67 proration | $95.67 | $79 | $182.67 |
| 120 | Renewal | $79.00 | $79 | $261.67 |
| 135 | Customer schedules cancellation for day 150 | None | $79 | $261.67 |
| 150 | Subscription ends | None | $0 | $261.67 |
*Illustrative customer, 30-day cycles, tax ignored.*
A first-invoice report holds $29 of the $261.67, or 11%. On day 80, `previous_attributes` holds the $29 item and the subscription now holds the $79 item, so the delta is 7,900 minus 2,900 = 5,000 cents, a $50 expansion dated day 80 while the cash arrives on day 90. Record MRR from the subscription event and cash from `invoice.paid`. A downgrade applied now runs in reverse: negative prorations aren't automatically refunded, so no `charge.refunded` event fires and a later invoice is smaller. Commission rules for these cases are in [affiliate commissions on Stripe refunds and upgrades](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades).
A switch to annual billing adds cash and removes MRR. A $29 monthly plan moved to $290 a year lowers MRR from $29 to $24.17, a $4.83 contraction, and saves the customer $58 against 12 x $29 = $348, yet the next invoice jumps to $290 when the switch waits for period end. The [portal configuration reference](https://docs.stripe.com/api/customer_portal/configurations/create) counts that switch as a `decreasing_item_amount`, 1 of 2 conditions that can schedule a change for period end, and the portal schedules only between prices of the same product.
### Churn by channel from portal cancellations
Date the churn decision from the first event, day 135 in the ledger, and the lost revenue from the second, day 150, or a channel's cancellations land up to a month late. The [cancellation page](https://docs.stripe.com/customer-management/cancellation-page) in Stripe's docs lists 3 places to read the customer's reason: the subscription page in the Stripe Dashboard, Stripe Sigma and the webhook payload. Separately, Stripe can cancel a subscription automatically after failed payment under your billing settings, and `cancellation_details.reason` records that as `payment_failed`, or `payment_disputed` after a dispute ([Subscription object reference](https://docs.stripe.com/api/subscriptions/object)).
| Field | Values | How to read it |
| --- | --- | --- |
| cancellation_details.feedback | 8 options, from too_expensive to unused | The customer's own reason, present only when they canceled explicitly |
| cancellation_details.reason | 4 values, including payment_failed and cancellation_requested | Why Stripe ended the subscription. payment_failed is involuntary |
*Fields from Stripe's Subscription object and cancellation page documentation, October 2026.*
Keep failed payments apart from chosen cancellations before you compare channels.
| Channel | Customers | Chose to cancel | Payment failed | Chosen rate | All cancellations |
| --- | --- | --- | --- | --- | --- |
| Newsletter | 40 | 3 | 5 | 7.5% | 20% |
| Paid social | 60 | 9 | 3 | 15% | 20% |
*Illustrative numbers, 90 days after signup. Rates are cancellations divided by customers.*
Lumped together, the 2 channels tie at 20%, while chosen cancellations run 7.5% against 15%. Read cohorts by age, since small cohorts mislead: 3 cancellations among 20 customers is 15% and one more makes it 20%. For scale, [TrackRev's Q2 2026 benchmarks](https://www.trackrev.io/data/saas-attribution-benchmarks) report a median of 6.2 months to first churn for paid social customers against 12.4 months for organic search, across workspaces with at least 12 months of paid history. Read a cluster of too_expensive answers in one channel as a price or targeting mismatch, and a cluster of missing_features as a gap between what the channel promised and what the product does.
### What TrackRev does with a portal change
TrackRev syncs Stripe charges every hour and, when the restricted key allows it, registers a webhook for 3 charge and Checkout events so new charges arrive sooner. It ignores subscription events. The first charge on a subscription is matched to a visitor through `metadata.vid`, the Checkout Session's reference ID or the buyer's email, and every later charge on that subscription ID copies the first order's channel and link split, rescaled to its own amount.
In the ledger, the $95.67 renewal and every $79 renewal after it credit the channel that won the $29 signup, provided that signup matched a click inside the window, with no tag on billing.stripe.com. Because TrackRev ignores `customer.subscription.updated`, it doesn't label a change as expansion or contraction, doesn't record cancellations or their reasons, and has no churn-by-channel report in the product. For those, run a handler like the one above or query your billing data directly.
Two limits apply. The first sync reaches back 30 days, so a subscription that began before you connected Stripe arrives without a source order. Its first charge in TrackRev is matched against clicks inside your attribution window, which defaults to 30 days and accepts 1 to 365, so a customer who signed up 11 months ago gets no channel unless a tracked click fell inside it. A customer who cancels and returns gets a new subscription ID, and the first charge is matched against recent clicks again instead of inheriting.
Revenue figures need a paid plan, starting at Starter for $39 a month. The free plan tracks links only, with 50 links and 1,000 tracked events a month ([pricing](https://www.trackrev.io/pricing)). Setup is on the [Stripe integration page](https://www.trackrev.io/integrations/stripe), and the renewal math is in [subscription LTV attribution](https://www.trackrev.io/blog/subscription-ltv-attribution).
### Frequently asked questions
**Can I add a tracking pixel or UTM parameters to the Stripe Customer Portal?**
No. The page is Stripe's, so your tag never loads. Log the click in the route that creates the session, fire an event on the after-completion page, and read the result from webhooks.
**Does a Stripe Customer Portal plan change create a new subscription?**
No. An immediate change updates the existing subscription, and a downgrade scheduled for period end attaches a schedule to it. Only a canceled subscription is replaced.
**What happens to a free trial when a trialing customer switches plans in the Stripe Customer Portal?**
By default the change ends the trial and creates an invoice for immediate payment, per Stripe's portal limitations. Set trial_update_behavior to continue_trial to keep the trial running.
**Should I show my own pricing page instead of the Customer Portal plan picker?**
You can. The subscription_update_confirm flow lets your page choose the price and an optional coupon while Stripe handles the upcoming invoice, prorations, payment failures and 3D Secure. Your page then knows which prompt drove the change.
**How do I test portal events before going live?**
In a sandbox, open a customer in the Stripe Dashboard, choose Actions, then Open customer portal. Make the change there and watch your event destination.
**Can I see portal upgrades by channel on the free TrackRev plan?**
No. The free plan covers link tracking, and revenue figures start on the Starter plan at $39 a month.
---
## How to set up Stripe metadata attribution
URL: https://www.trackrev.io/blog/stripe-metadata-attribution-setup
Published: 2026-07-11
Author: Muzahid Maruf
Write a visitor ID and UTM fields into Stripe metadata for Checkout, Payment Links and subscriptions, and see which copies Stripe makes and which it skips.
Stripe metadata attribution setup means writing a visitor ID and 6 UTM fields into the metadata of the Stripe objects that carry a payment, so one report can show which channel pays your MRR. Stripe forwards metadata in only 4 documented cases, so a source set on the Checkout Session alone reaches none of the invoices and charges that follow.
> **Key takeaways:**
>
> - Stripe allows 50 metadata pairs per object, with keys up to 40 characters and values up to 500, so a visitor ID plus 6 UTM fields uses 7 slots.
> - A Checkout Session's metadata is not copied to its PaymentIntent or Subscription. Set payment_intent_data.metadata or subscription_data.metadata yourself.
> - Invoices created from June 29, 2023 hold a snapshot of the subscription's metadata, while the renewal charge holds none, so read renewals from the invoice.
> - client_reference_id holds up to 200 characters and is the per-click field for Payment Links, where UTM codes reach only your redirect URL.
> - Stripe Search finds metadata on 7 object types within 1 minute, but not on Checkout Sessions.
### What Stripe metadata can hold
Stripe keeps metadata on Customers, Checkout Sessions, PaymentIntents, Charges, Subscriptions, Invoices and other objects. I'd start with a single key, vid, pointing at visit history you control, and copy UTM fields onto Stripe only to see the source in webhook payloads. [Stripe's metadata guide](https://docs.stripe.com/metadata) recommends the same split for bigger records.
| Field | Limit | Consequence |
| --- | --- | --- |
| Metadata pairs per object | 50 | A visitor ID plus 6 UTM fields uses 7 |
| Metadata key | 40 characters | utm_campaign takes 12 |
| Metadata value | 500 characters | Parse landing URLs into discrete values |
| Readable with | Secret keys only | Not from Stripe.js in the browser |
| client_reference_id | 200 characters | Fits a visitor ID, while campaign data goes in metadata |
| UTM codes on a Payment Link | 5 parameters, 150 characters each | Letters, digits, dashes and _ only |
| Checkout Session lifetime | 30 minutes to 24 hours, default 24 | Keys written at creation can be a day old at payment |
*Limits from Stripe's metadata, Checkout Session and Payment Links documentation, October 2026.*
### Which Stripe objects inherit metadata
Metadata doesn't copy to related objects unless one of 4 documented exceptions applies, and Customer metadata never copies down, so look it up by customer ID. Three exceptions are one-time snapshots, which leave the copy unchanged when you edit the parent later. The 4th shows the subscription's current values.
| Exception | From | To | What Stripe copies |
| --- | --- | --- | --- |
| 1 | PaymentIntent | Charge | A snapshot when the charge is created |
| 2 | Payment Link | Checkout Session | A snapshot when the Session is created |
| 3 | Subscription | Invoice | A snapshot in the invoice's parent details |
| 4 | Subscription | Invoice line item | The current values, for line items of type subscription |
*Copy rules from Stripe's metadata documentation, October 2026.*
> **Worked example: a $49 monthly plan:** A newsletter reader buys a $49 plan through Stripe Checkout and stays 12 months, which produces 12 invoices and 12 charges worth $588. Metadata on the Checkout Session alone reaches 0 of those 24 objects. Adding `subscription_data.metadata` puts the source on the Subscription and all 12 invoices, and the 12 charges still carry none.
Per Stripe's [Invoice reference](https://docs.stripe.com/api/invoices/object), `parent.subscription_details.metadata` is immutable once the invoice is finalized and exists only on invoices created from June 29, 2023. Fix a mistyped utm_campaign after the 3rd invoice and those 3 invoices keep the typo. A Charge in the current Stripe API has no invoice field, so report from invoices or the `invoice.paid` event, or go from a charge through its PaymentIntent to the [Invoice Payments API](https://docs.stripe.com/api/invoice-payment/list).
### Stripe metadata attribution setup, step by step
Use a Stripe sandbox. The test card 4242 4242 4242 4242, with any future expiry date and any 3-digit CVC, completes a payment, per [Stripe's testing guide](https://docs.stripe.com/testing).
#### Step 1: Capture the source on your own domain
Read the 5 UTM parameters on the first page view and store them under a visitor ID in a first-party cookie or your database. Stripe never sees the ad that sent the visitor, because your server creates the Checkout Session. Per [WebKit's tracking prevention notes](https://webkit.org/tracking-prevention/), Safari's Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without user interaction, so set the cookie from your server where you can. [Why UTM parameters get stripped](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) covers the other leaks.
#### Step 2: Pick the keys once
Pick short, stable names, since webhooks and backfills depend on them. This schema uses 9 of the 50 slots.
| Key | Example value | Purpose |
| --- | --- | --- |
| vid | A 36-character UUID | Join key to your stored visit history |
| ft_source, ft_medium, ft_campaign | newsletter, email, launch-2026 | First touch, written once and never overwritten |
| lt_source, lt_medium, lt_campaign | google, cpc, brand-2026 | Latest touch before checkout |
| click_id | a gclid or fbclid | Platform click ID for sending conversions back |
| first_touch_at | 2026-10-02T14:08:31Z | Time of the first visit in ISO 8601 |
Store both touches: 2 sets of 3 keys cost 6 slots and leave the credit rule, first-touch, last-touch or linear, for report time, as [the attribution model comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) lays out.
#### Step 3: Write the keys onto the Checkout Session
In subscription mode, write 3 fields. The Session's own `metadata` (1 key, vid) arrives with `checkout.session.completed`. `subscription_data.metadata` (7 keys) lands on the Subscription and, through the snapshot, on every invoice. `client_reference_id` takes up to 200 characters and comes back on the Session. In payment mode use `payment_intent_data.metadata`, which reaches the Charge as a snapshot, per the [Checkout Session reference](https://docs.stripe.com/api/checkout/sessions/create). The [Stripe Checkout attribution guide](https://www.trackrev.io/blog/stripe-checkout-attribution-tracking) covers the redirect side.
Checkout Session in subscription mode (Node)
```
// visitorId and attr come from your own first-party capture (step 1)
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
client_reference_id: visitorId, // up to 200 characters, echoed on the Session
metadata: { vid: visitorId }, // lands on the Checkout Session
subscription_data: {
metadata: { // lands on the Subscription, then on each invoice
vid: visitorId,
ft_source: attr.firstSource,
ft_medium: attr.firstMedium,
ft_campaign: attr.firstCampaign,
lt_source: attr.lastSource,
lt_medium: attr.lastMedium,
lt_campaign: attr.lastCampaign,
},
},
success_url: "https://example.com/welcome",
});
// mode: "payment" takes payment_intent_data: { metadata: { ... } } instead.
```
#### Step 4: Carry the ID through Payment Links
[Stripe's tracking page](https://docs.stripe.com/payment-links/url-parameters) says the 5 UTM codes on a Payment Link are passed to your redirect URL after payment, and only when the link's confirmation behavior is a redirect. Stripe doesn't describe saving them on the payment. Two routes do reach it.
Route 1 is a Payment Link per channel, created through the API with `metadata` on the link, which copies to every Checkout Session, plus the nested metadata fields for the PaymentIntent or Subscription underneath. It suits 3 to 5 channels. Route 2 is a per-click ID: append `?client_reference_id=VISITOR_ID` to the link, using letters, digits, dashes and _ only, 200 characters at most. Stripe silently drops anything else, such as an ID with a dot or colon. The [Payment Link reference](https://docs.stripe.com/api/payment_links/payment_links/create) and the [Payment Links attribution guide](https://www.trackrev.io/blog/stripe-payment-links-attribution) cover the rest.
One Payment Link per channel, with a recurring price (curl)
```
curl https://api.stripe.com/v1/payment_links \
-u "<>:" \
-d "line_items[0][price]=price_123" \
-d "line_items[0][quantity]=1" \
-d "metadata[lt_source]=newsletter" \
-d "subscription_data[metadata][lt_source]=newsletter"
```
#### Step 5: Read the metadata back
Every Stripe event carries its object with that object's metadata, and most attribution work needs only these 4 events.
| Event | Object in the payload | Where the source sits |
| --- | --- | --- |
| checkout.session.completed | Checkout Session | metadata and client_reference_id |
| customer.subscription.created | Subscription | metadata set through subscription_data |
| invoice.paid | Invoice | parent.subscription_details.metadata, the snapshot |
| charge.succeeded | Charge | metadata, payment mode only, copied from the PaymentIntent |
*Event names from Stripe's event reference, October 2026.*
Free trials have no charge yet, so trial-to-paid rates by channel start at `customer.subscription.created`. Count delayed payment methods on `checkout.session.async_payment_succeeded`. Verify the Stripe-Signature header and key rows by subscription ID, since deliveries repeat and arrive out of order.
| Behavior | Limit |
| --- | --- |
| Retries of a failed webhook delivery, live mode | 3 days, exponential backoff |
| Retries of a failed sandbox delivery | 3 attempts over a few hours |
| Resending an event from the Stripe Dashboard | 15 days |
| Resending an event from the Stripe CLI | 30 days |
| Metadata search coverage | 7 object types, no Checkout Sessions |
| Clauses in one search query | 10, joined by AND or OR but not both |
| Time until new data is searchable | Under 1 minute |
| Search rate limit | 20 reads a second |
| Oldest API version that supports Search | 2020-08-27 |
*Delivery and search limits from Stripe's webhook and search documentation, October 2026.*
[Stripe Search](https://docs.stripe.com/search) takes `metadata["vid"]:"VALUE"` on charges, customers, invoices, PaymentIntents, prices, products and subscriptions, matching exactly and ignoring case. Stripe points analytics workloads to Stripe Sigma and bulk exports to Data Pipeline, and its [webhook documentation](https://docs.stripe.com/webhooks) has the signature details.
Find active subscriptions from one source (curl)
```
curl -G https://api.stripe.com/v1/subscriptions/search \
-u "<>:" \
--data-urlencode 'query=metadata["lt_source"]:"newsletter" AND status:"active"'
```
Grouping active subscriptions by lt_source gives MRR by channel.
| lt_source | Active subscriptions | Plan | MRR | Share of MRR |
| --- | --- | --- | --- | --- |
| newsletter | 12 | $49 | $588 | 36.2% |
| google | 8 | $99 | $792 | 48.7% |
| affiliate | 5 | $49 | $245 | 15.1% |
| Total | 25 | | $1,625 | 100% |
*Illustrative figures, not customer data.*
#### Step 6: Test the chain before you trust it
Run a subscription checkout in the sandbox, then retrieve the Checkout Session, the Subscription, the first invoice and the charge with `stripe get` from the Stripe CLI. The Session shows 1 key and the Subscription shows 7. The invoice shows the same 7 in its snapshot, and the charge shows none. Repeat with a payment-mode Session, where the charge should carry the PaymentIntent's keys. Then open a Payment Link with `?client_reference_id=test-123` and confirm the value on the completed Session.
### What TrackRev does with the visitor ID
TrackRev reads Stripe with a read-only restricted key, so it never writes metadata. Its pixel keeps a visitor ID in a first-party cookie named vid and adds it to Payment Links, Buy Buttons and Pricing Tables on your pages. For Checkout Sessions your server creates, pass the cookie value as the Session's reference ID or set `metadata.vid` on the PaymentIntent. The Stripe sync finds the Checkout Session through the charge's PaymentIntent, which Stripe documents for payment-mode Sessions only, so Subscription checkouts need `identify()`.
| Order | Where each sync looks for the visitor ID |
| --- | --- |
| 1 | metadata.vid on the charge |
| 2 | client_reference_id on the Checkout Session |
| 3 | metadata.vid on the Checkout Session |
| 4 | The buyer's email, if you called identify() on your site |
*Lookup order in TrackRev's Stripe sync.*
Renewals inherit the first order's visitor through the subscription ID, so month 12 credits the original channel without any subscription metadata. The sync runs hourly. Call `identify()` at signup too, since the pixel writes its cookie from JavaScript and Safari's 7-day cap applies. Revenue figures need a paid plan from Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)), and setup is on the [Stripe integration page](https://www.trackrev.io/integrations/stripe).
### When metadata isn't enough
Metadata holds a snapshot of 1 or 2 touches taken at purchase, so keep the full history of visits and link clicks under the visitor ID, as in the [multi-touch attribution setup guide](https://www.trackrev.io/blog/multi-touch-attribution-setup-guide). If you only match each payment to a row in your orders table, a single reference ID is enough and 49 slots stay empty. Plan changes in the Stripe customer portal are covered in [Stripe Customer Portal attribution](https://www.trackrev.io/blog/stripe-customer-portal-attribution). Sales-led deals sent as Stripe Quotes can carry the source in the quote's subscription data, which lands on the Subscription on acceptance.
### Frequently asked questions
**Does Stripe copy Checkout Session metadata to the charge?**
No. Of the 4 cases where Stripe copies metadata, Checkout Session to PaymentIntent is not one. Set payment_intent_data.metadata in payment mode or subscription_data.metadata in subscription mode.
**Why is the metadata empty on my renewal charge?**
Stripe copies subscription metadata onto the invoice, not the charge. Read the invoice's parent subscription details, or fetch the subscription. Invoices created before June 29, 2023 have no snapshot.
**Can I add UTM parameters to a Stripe Payment Link?**
Stripe passes the 5 UTM codes, up to 150 characters each, to your redirect URL after payment and doesn't store them on the charge. Use client_reference_id for a per-click value, or a link per channel with metadata set.
**Can I search Stripe payments by metadata?**
Yes, for 7 object types, using metadata["key"]:"value". Checkout Sessions can't be searched. Matching is exact and ignores case, and fresh data usually appears within a minute.
**Should the visitor ID go in client_reference_id or in metadata?**
Use client_reference_id for the ID that rides on a Payment Link URL, and metadata for the Subscription, PaymentIntent or invoice. Writing the ID in both places costs 1 slot.
**Do I need to write metadata to Stripe to use TrackRev?**
No. TrackRev reads Stripe with a read-only key. It checks 4 places for the visitor ID, ending with the buyer's email through identify(). Revenue figures are on paid plans from Starter at $39 a month.
---
## Stripe Payment Links attribution: find the channel behind each sale
URL: https://www.trackrev.io/blog/stripe-payment-links-attribution
Published: 2026-07-11
Author: Muzahid Maruf
Stripe stores no campaign or referrer for a Payment Link sale. See what it does keep, 3 ways to tag each sale with its channel, and how renewals inherit it.
To attribute a Stripe Payment Links sale, put the channel in the `client_reference_id` (200 characters) or in link metadata (50 keys, 500-character values), the only fields that reach the sale. UTM codes on a link reach only your redirect URL, because no Stripe API object has a field for them. The Checkout Session has no referrer field either, and you publish no pages on `buy.stripe.com`, where the Google tag for Google Analytics 4 would have to run.
> **Key takeaways:**
>
> - UTM codes reach only your redirect URL and never the Checkout Session, so the source must ride in client_reference_id or link metadata.
> - Stripe's limits: 150 characters per UTM value, 50 metadata keys per object, and a 200-character client_reference_id that a 36-character UUID fits.
> - A renewal creates no Checkout Session, so copy the channel onto the subscription after payment 1.
> - TrackRev's pixel tags buy.stripe.com links on its own, and Revenue Attribution starts at $39 a month.
### What Stripe keeps from a Payment Link sale
[Stripe's page on tracking a payment link](https://docs.stripe.com/payment-links/url-parameters) lists 5 UTM codes and the `client_reference_id` parameter. UTM codes work only with redirect confirmation, and they are appended to that redirect URL. The [Checkout Session object](https://docs.stripe.com/api/checkout/sessions/object) has no UTM field, and [Stripe's OpenAPI spec](https://github.com/stripe/openapi) for API version 2026-09-30 has no `utm_` field on any object.
| Field | Where you set it | Where Stripe puts it | Limit or catch |
| --- | --- | --- | --- |
| UTM codes | Query string of the link URL (5 codes) | Appended to your redirect URL after payment | Redirect confirmation required; 150 characters per value; no Session field keeps them |
| `client_reference_id` | Link URL, Buy Button or pricing table attribute | Checkout Session and the checkout.session.completed event | 200 characters; letters, digits, dashes, the _ character; invalid values dropped silently |
| Link metadata | Payment Link API object | Copied onto each Checkout Session the link creates | 50 keys, 40-character key names, 500-character values; same for every buyer |
| `payment_intent_data.metadata` | Payment Link API object | PaymentIntents the link creates in payment mode | One-time prices only |
| `subscription_data.metadata` | Payment Link API object | Subscriptions the link creates | Needs at least 1 recurring price |
| Link analytics | Automatic | Payments and analytics tab in the Stripe Dashboard | Views, sales and revenue only; up to 18 hours late; unavailable for recurring prices |
*Sources: Stripe's [payment link tracking page](https://docs.stripe.com/payment-links/url-parameters), [metadata guide](https://docs.stripe.com/metadata) and [API reference for creating a payment link](https://docs.stripe.com/api/payment-link/create), October 2026.*
Link metadata is the same for every buyer, so it names a channel only when each channel has its own link. Setting it is an API job, since the Stripe Dashboard steps on Stripe's tracking page cover only the client reference ID.
### Why Google Analytics 4 and Safari lose the source
Google's [cross-domain setup](https://support.google.com/analytics/answer/10071811) needs the same G- tag ID on every domain in the measurement, and you publish no pages on Stripe's, so Google Analytics 4 can log the click on your page but never the purchase. The [GA4 revenue-by-channel guide](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) shows the symptoms.
In Safari, [WebKit's Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) deletes script-written cookies and localStorage after 7 days without interaction, so a newsletter reader who buys 8 days after the click arrives with no stored ID. A Set-Cookie header from your own server falls outside that rule, so I'd set the ID there. The [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the rest.
### Three methods for Payment Links attribution
Pick by volume: 2 or 3 channels fit the first method, affiliates, many placements and renewals need the second, and the third adds UTM capture to a thank-you page you already run.
#### One Payment Link per channel, no code
Create a Payment Link per placement and read Stripe's per-link numbers in the Payments and analytics tab, which skips links with recurring prices, so this method suits one-time products. To keep an exportable reference, click the arrow beside Copy, choose URL parameters, then Client reference ID, and enter a value such as `nl-2026-10` for the October newsletter.
An example with made-up numbers: a $49 template pack sells through 3 URLs, with 14 sales on the newsletter link, 6 on a Google Ads link and 2 on the affiliate link. Revenue is $686, $294 and $98, which sums to $1,078. Refund 2 of the 14 newsletter sales and that link's net revenue falls to 12 × $49 = $588. Against a made-up $250 of Google Ads spend, the 6 sales return $294, or $1.18 per $1. Every new placement costs a new URL.
#### A visitor ID joined on the Stripe webhook
On the first visit, create a UUID, store it in a first-party cookie and save the landing page, referrer and UTM codes against it. Add the UUID as `client_reference_id` to each Payment Link; its 36 characters fit the 200-character limit.
Your pages: create the ID and tag the links
```
// On your own pages, before the visitor can click a Payment Link
function visitorId() {
var m = document.cookie.match(/(?:^|; )cid=([^;]+)/);
if (m) return m[1];
var id = crypto.randomUUID(); // 36 characters: hex digits and dashes
document.cookie = "cid=" + id + "; Max-Age=31536000; Path=/; SameSite=Lax; Secure";
return id;
}
var cid = visitorId();
// Send the landing context; your endpoint keeps the first row per ID
navigator.sendBeacon("/api/visits", JSON.stringify({
cid: cid,
landing: location.href,
referrer: document.referrer
}));
document.querySelectorAll('a[href^="https://buy.stripe.com/"]').forEach(function (a) {
var u = new URL(a.href);
u.searchParams.set("client_reference_id", cid);
a.href = u.toString();
});
```
On the paid event, the handler joins the reference to the stored visit and writes the channel to 2 Stripe objects: the subscription or PaymentIntent, plus the customer.
Your webhook: resolve the channel
```
// Inside your Stripe webhook handler, after stripe.webhooks.constructEvent()
// Handle 2 events: ACH debits and other delayed methods fire the async one days later
const paidEvents = ["checkout.session.completed", "checkout.session.async_payment_succeeded"];
if (paidEvents.includes(event.type)) {
const session = event.data.object;
if (session.payment_status === "unpaid") return; // delayed method: wait for the async event
const visit = await db.visits.findFirst(session.client_reference_id); // may be null
const metadata = {
channel: visit ? visit.source : "unknown", // your own label, e.g. "newsletter"
campaign: visit ? visit.campaign : "none",
cid: session.client_reference_id || "none",
};
// Renewals inherit subscription metadata; one-time sales use a guest customer,
// so the PaymentIntent is the object to write to there
if (session.mode === "subscription") {
await stripe.subscriptions.update(session.subscription, { metadata });
} else if (session.payment_intent) {
await stripe.paymentIntents.update(session.payment_intent, { metadata });
}
if (session.customer) {
await stripe.customers.update(session.customer, { metadata });
}
}
```
Test locally with `stripe listen` from the Stripe CLI. The [Buy Button docs](https://docs.stripe.com/payment-links/buy-button) and [pricing table docs](https://docs.stripe.com/payments/checkout/pricing-table) take the same reference as a `client-reference-id` attribute, with the same 200-character limit.
#### A redirect page that records the Checkout Session
Set the confirmation behavior to redirect and put `{CHECKOUT_SESSION_ID}` in the URL. Per Stripe's [post-payment page](https://docs.stripe.com/payment-links/post-payment), Stripe fills in the session ID and appends the link's UTM codes (up to 5), so your thank-you page gets both. The page records a sale only if the buyer's browser loads it, and 2 buyers on one tagged URL look identical. The [free UTM builder](https://www.trackrev.io/tools/utm-builder) makes the URLs.
### Subscriptions, delayed payments and refunds
`client_reference_id` sits on the Checkout Session, and a renewal creates none: month 2 is an invoice. Per [the Invoice object reference](https://docs.stripe.com/api/invoices/object), each invoice carries a snapshot of the subscription metadata taken at finalization, for invoices created on or after June 29, 2023 (in API version 2026-09-30 it sits at `parent.subscription_details.metadata`). Write the channel to subscription metadata.
Suppose 10 buyers from one newsletter take a $29 monthly plan for 12 months. That is 10 × $29 × 12 = $3,480, and the first payments are $290 of it, about 8%. Crediting only the first charge makes the newsletter look 12 times smaller. The [subscription LTV attribution guide](https://www.trackrev.io/blog/subscription-ltv-attribution) reports lifetime revenue by channel.
Stripe says bank debits and vouchers can take 2 to 14 days to confirm, and a refund typically takes 5 to 10 business days to reach a statement. Count revenue on a paid status and drop it when you issue the refund.
### What TrackRev reads from Payment Link sales
On pages where TrackRev's pixel runs, it adds its 36-character visitor ID as `client_reference_id` to every `buy.stripe.com` link and to Buy Button and pricing table embeds. A read-only restricted Stripe key lets TrackRev find the Checkout Session behind each paid charge and credit the click behind that reference. With no ID, matching falls back to the email passed to `identify()`.
| Setting | Value |
| --- | --- |
| Pixel link sweeps | At load, at 0.8, 1.5 and 2.5 seconds, and on click |
| [Stripe sync](https://www.trackrev.io/integrations/stripe) and window | Hourly poll, or seconds with the optional webhook; 90-day attribution window |
| Default model | Last touch; first touch and linear are 1 dropdown away |
| Renewals and refunds | Renewals inherit the original click, and a refund removes the credit on the next sync |
| Visitor cookie | Written from JavaScript with a 1-year lifetime; Safari's 7-day rule can delete it sooner |
| Paid plans, all with Revenue Attribution | [Starter $39, Growth $99, Scale $199](https://www.trackrev.io/pricing) a month; annual billing pays 9 months for 12 |
| Free plan | 50 links and 1,000 tracked events a month, no revenue figures |
| Where it adds no ID | Links pasted into email, DMs or a bio, and links that already carry a client_reference_id |
*Source: TrackRev's pixel script and plan limits, October 2026.*
### When your own webhook is enough
One product on 2 or 3 links needs no tool, and an existing webhook endpoint makes the visitor-ID method a few dozen lines plus a visits table. Renewals, refunds and delayed payments are the harder part, and affiliates turn each one into a commission change, which is where I'd pay for a tool. Checkout Sessions you create yourself take metadata at creation, and the [Checkout attribution guide](https://www.trackrev.io/blog/stripe-checkout-attribution-tracking) and [metadata setup guide](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) cover that route.
### Frequently asked questions
**Does Stripe save UTM parameters from a Payment Link?**
Only in the redirect. With redirect confirmation, Stripe appends the 5 UTM codes to your redirect URL, and the Stripe API has no field to read them back.
**Does Stripe accept an email address as client_reference_id?**
No. The 200-character limit allows letters, digits, dashes and the _ character only, so the @ and period in an email make Stripe drop the value silently.
**How do I track a Payment Link sent in an email or a DM?**
Give each send a URL with its own client_reference_id, such as nl-2026-10 or dm-batch-3, since no script runs in a mail client.
**Why is my Stripe Checkout reference missing on a renewal?**
A renewal is an invoice, and only the first payment has a Checkout Session, so copy the channel into subscription metadata after payment 1.
**Do I need my own webhook endpoint to use TrackRev with Payment Links?**
No. TrackRev polls paid charges hourly with a restricted key, and the optional webhook cuts that to seconds. Without Checkout Session read access, matching falls back to email.
**Which attribution model fits Payment Link sales?**
Last touch credits the channel that sent the buyer to the link, and first touch credits the one that introduced them. TrackRev defaults to last touch with a 90-day window.
---
## How to attribute Stripe revenue to marketing channels
URL: https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels
Published: 2026-06-25
Author: Muzahid Maruf
Stripe attribution writes a visitor's source onto the payment in 6 steps. See where Stripe stores it, what to count as revenue and which tools do the join.
Stripe attribution means attaching the marketing source of a visit to the Stripe payment it produced, so revenue can be totaled by channel. A Checkout Session has no UTM field, and the [Payment Links tracking guide](https://docs.stripe.com/payment-links/url-parameters) describes UTM codes coming back on the redirect URL. Your side has to carry the source from the browser to the charge, which takes a first-party cookie and a few server lines, then a report that groups paid invoices by what you stored.
In the illustrative numbers below, paid social brings 57.1% of the trials on a $39 plan and 19.1% of the net revenue, so ranking by signups would misplace budget.
> **Key takeaways:**
>
> - Stripe records no campaign for a sale. The source rides in client_reference_id (200 characters) or metadata (50 keys) that your server writes.
> - Metadata copies between Stripe objects only in a few cases, so write the source onto the Subscription or PaymentIntent whose events you will read.
> - Count revenue from invoice.paid, subtract the amount on each charge.refunded event, and wait for checkout.session.async_payment_succeeded on delayed methods such as ACH debits.
> - In the worked example (illustrative figures), paid social brings 57.1% of the trials on a $39 plan and 19.1% of net revenue. Crediting only first payments would cut the newsletter's share from 48.4% to 39.0%.
### What Stripe stores about a sale
A sale spreads across a Customer, a Checkout Session, a PaymentIntent, a Charge and, for subscriptions, an Invoice each billing period. Each has a metadata field, and the [metadata guide](https://docs.stripe.com/metadata) says it copies between objects only in the cases below. Only secret-key requests return it, so your server does the writing.
| Field | Limit | Where the value ends up |
| --- | --- | --- |
| client_reference_id on a Checkout Session | 200 characters | The Session and its checkout.session.completed event |
| metadata on any object | 50 keys, 40-character keys, 500-character values | The object you set it on |
| payment_intent_data.metadata in Checkout | Same as metadata | The PaymentIntent, then a one-time copy on its Charge |
| subscription_data.metadata in Checkout | Same as metadata | The Subscription, then a copy on every later Invoice |
| Metadata on a Payment Link | Same as metadata | A snapshot on each Checkout Session the link creates |
| UTM codes on a Payment Link URL | 5 codes, 150 characters each | Your redirect URL |
*From Stripe's metadata, Checkout and Payment Links documentation, October 2026.*
Metadata set on a Customer does not copy to its Charges. Write the source onto the object whose events you will read, when you create it.
### Four ways to join a payment to a source
The first and third routes need no checkout code, but the second is the one I would build, because only it stores a journey you own. Google's [Measurement Protocol guide](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events) asks for server events within 48 hours of the browser event, so renewals strain the fourth route. The [Google Analytics guide](https://www.trackrev.io/blog/connect-google-analytics-stripe-revenue) has the build.
| Route | Code | Keeps | Breaks when |
| --- | --- | --- | --- |
| One Payment Link per channel | None | The channel, as link metadata | Placements outnumber links |
| Visitor ID in Stripe Checkout | A few server lines | The stored journey | Payments skip your server |
| Customer email | None | Any flow with matching emails | Signup and payment emails differ |
| GA4 purchase event | A webhook | Google's channel reports | Renewals arrive late |
### How Stripe attribution works, step by step
The visitor ID route has 6 links, and a break in any one sends revenue to an unattributed row.
#### Step 1: Tag the link and save the source on your own domain
Give each placement its own lowercase UTM values: Google's [Analytics Help page](https://support.google.com/analytics/answer/10917952) says parameter values are case sensitive, so Newsletter and newsletter count as 2 sources. Have your server set the cookie. WebKit's [cookie rules](https://webkit.org/tracking-prevention/) say Intelligent Tracking Prevention deletes JavaScript-created cookies after 7 days without interaction, and caps cookies set in an HTTP response at 7 days only when it detects third-party CNAME or IP address cloaking.
#### Step 2: Tie the visitor to an account at signup
Store the visitor ID, first-touch source and email on the user record. A buyer who clicks on a phone and pays on a laptop holds 2 cookies, and the email links them.
#### Step 3: Write the visitor ID into Stripe when checkout starts
Create the Stripe Checkout Session when the buyer clicks Buy, because it stays open for 30 minutes to 24 hours and one built at page load carries whatever the cookie held then. Put the ID in `client_reference_id` and in metadata, with `subscription_data.metadata` for subscriptions and `payment_intent_data.metadata` for one-time payments. The [Checkout attribution guide](https://www.trackrev.io/blog/stripe-checkout-attribution-tracking) has the route and the [metadata setup guide](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) has key names.
A Payment Link skips your server, so append `client_reference_id` to its URL. Stripe accepts letters, digits, dashes and the _ character up to 200 characters, which fits a 36-character UUID. The [Payment Links attribution guide](https://www.trackrev.io/blog/stripe-payment-links-attribution) covers the rest.
#### Step 4: Read the money from webhooks
Stripe's [subscription webhook guide](https://docs.stripe.com/billing/subscriptions/webhooks) says invoice.paid is sent when an invoice is successfully paid. Each new invoice gets a copy of the subscription's metadata under `parent.subscription_details.metadata`, so payment 12 of a $39 plan carries the source written for payment 1. Live mode retries a failed delivery for up to 3 days, so store each event ID under a unique index.
| Event | Fires when | Action |
| --- | --- | --- |
| checkout.session.completed | Stripe Checkout finishes | Link visitor ID to customer |
| invoice.paid | Any invoice is paid | Book the revenue once |
| charge.refunded | A full or partial refund | Subtract the amount |
*Events from Stripe's subscription and refund documentation, October 2026.*
> **A completed Checkout Session is not always a settled sale:** Stripe's Checkout fulfillment guide says ACH direct debit and other delayed methods fire `checkout.session.async_payment_succeeded` only once the payment succeeds, so credit a channel on that event.
#### Step 5: Group paid invoices by source, net of refunds
Credit one amount and write the rule down. A Checkout Session reports `amount_subtotal`, `amount_total` and `total_details.amount_tax`, so the pre-tax figure is easy to isolate. Stripe's [refund guide](https://docs.stripe.com/refunds) says a charge can take several refunds and the original processing fee is not returned, so keep gross and net in separate columns.
Revenue by channel from your own payments and refunds tables (SQL)
```
-- payments: one row per paid invoice or one-time charge, filled from the webhook
-- refunds: one row per charge.refunded amount, linked to the payment
with refunded as (
select payment_id, sum(amount_cents) as cents
from refunds
group by payment_id
)
select
coalesce(p.source, 'unattributed') as channel,
count(distinct p.customer_id) as customers,
sum(p.amount_cents) / 100.0 as gross,
sum(coalesce(r.cents, 0)) / 100.0 as refunded,
sum(p.amount_cents - coalesce(r.cents, 0)) / 100.0 as net
from payments p
left join refunded r on r.payment_id = p.id
where p.livemode
and p.paid_at >= date '2026-07-01'
group by 1
order by net desc;
```
#### Step 6: Test the chain in a sandbox
Click a tagged link in a private window, sign up and pay with Stripe's test card 4242 4242 4242 4242 and a future expiry such as 12/34. Then refund it: the channel should gain the amount and lose it again.
### What the numbers look like after the join
Take a $39 monthly plan and 90 days of sales from 3 channels. The figures are invented to show the arithmetic, so replace them with your own.
| Channel | Trials (share) | Paid invoices | Refunded invoices | Net revenue (share) |
| --- | --- | --- | --- | --- |
| Paid social | 400 (57.1%) | 34 | 4 | $1,170 (19.1%) |
| Search ads | 180 (25.7%) | 54 | 3 | $1,989 (32.5%) |
| Newsletter | 120 (17.1%) | 78 | 2 | $2,964 (48.4%) |
| Total | 700 | 166 | 9 | $6,123 |
*Net revenue is paid invoices minus refunded invoices, times $39, over 90 days. Illustrative figures.*
Paid social leads on trials, with 400 of 700. It earns $1,170 of the $6,123, while the newsletter's 120 trials return $2,964. Per trial, that is $24.70 for the newsletter, $11.05 for search ads and under $3 for paid social. Paid social also refunded 4 of 34 invoices, or 11.8%, against 2.6% for the newsletter, so gross revenue would have flattered it by $156.
Renewals shift the picture again. If a report credits only each customer's first payment, the newsletter's share falls from 48.4% to 39.0%, because its customers paid 2.6 invoices each against 1.7 for paid social. The [subscription LTV guide](https://www.trackrev.io/blog/subscription-ltv-attribution) covers 3 ways to credit renewals.
| Channel | Paying customers | Invoices per customer | First payments only (share) | Net revenue (share) |
| --- | --- | --- | --- | --- |
| Paid social | 20 | 1.7 | $780 (26.0%) | $1,170 (19.1%) |
| Search ads | 27 | 2.0 | $1,053 (35.1%) | $1,989 (32.5%) |
| Newsletter | 30 | 2.6 | $1,170 (39.0%) | $2,964 (48.4%) |
*First payments are paying customers times $39, before refunds. Same 90 days of sales as above.*
### Choosing a window and a credit rule
TrackRev's [attribution benchmarks](https://www.trackrev.io/data/saas-attribution-benchmarks) put the median time from first click to first paid charge at 6.3 days and the 90th percentile at 48.2 days. Those counts include only conversions inside each workspace's window, so the true tail runs longer. Pull the click-to-payment gap for your last 100 customers and set the window just past the 90th percentile.
Last touch gives the closing click all the credit, first touch gives it to the introducer, and linear splits it evenly, so a sale touched by 2 channels counts 0.5 on each. In the Q2 2026 data, 64% of TrackRev workspaces default to last touch, 22% to linear and 14% to first touch. The [attribution models comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) matches each rule to a funnel.
### Stripe attribution tools compared
The [Sigma guide](https://docs.stripe.com/stripe-data/how-sigma-works) says Stripe Dashboard financial reports can include metadata and Sigma's templates leave it out, with a Metadata to column template to add it. Sigma runs ANSI SQL, shows up to 1,000 rows, exports all of them to CSV and costs nothing in a sandbox.
| Stripe Sigma billing | Charges included a month | Price a month | Each additional charge |
| --- | --- | --- | --- |
| Monthly | Not stated | $15 | 6¢ |
| Annual | 250 | $10 | 4¢ |
| Annual | 2,500 | $60 | 2.5¢ |
| Annual | 10,000 | $225 | 2.5¢ |
| Annual | 25,000 | $450 | 2¢ |
*From Stripe's [Sigma pricing page](https://stripe.com/sigma/pricing), October 2026. New users get a 30-day free trial.*
| Approach | Sees the click | Renewals and refunds | Effort |
| --- | --- | --- | --- |
| Stripe Dashboard reports or Stripe Sigma | No, only stored metadata | Yes, in Stripe's data | A query plus the metadata write |
| Your own webhook and database | Yes, once you build the click log | Yes, from invoice.paid and charge.refunded | An endpoint, 2 tables and a report |
| Google Analytics 4 with the Measurement Protocol | Yes, inside GA4 | Limited by the 48-hour window | A webhook and a GA4 property |
| A billing-side tool such as TrackRev | Yes, via pixel and tracked links | Yes, renewals credit the first click | A pixel and a restricted key |
### Where the chain breaks
| Symptom | Cause | Fix |
| --- | --- | --- |
| Your total differs from Stripe's report | Stripe Dashboard reports default to your local time zone, Sigma templates use UTC, and a day's balance report publishes by 12:00 pm the next day | Match the time zone and compare after noon |
| Test payments inflate a channel | Test events arrive with livemode false | Skip them in production queries |
| One buyer shows up as 2 channels | A phone click and a laptop payment leave 2 cookies | Join on the email saved at signup |
*Causes from Stripe's reporting and Sigma documentation, October 2026.*
### What TrackRev does with a Stripe charge
TrackRev Revenue Attribution reads Stripe with a restricted key, so checkout code can stay as it is. The first sync reads the previous 30 days of charges, a scheduled job picks up new ones, and a webhook that TrackRev registers when the key allows it starts a sync on a successful charge, a refund or a completed Session.
For each charge it checks a `vid` key in the charge metadata, then the Session's `client_reference_id` or metadata, then the buyer's email, which the pixel binds to the visitor at signup or checkout. A renewal inherits the first order's credit, and a charge with any refund is marked refunded on the next sync, so even a partial refund removes the whole charge. Credit defaults to last touch, with first touch and linear available, and the window runs from 1 to 365 days, 30 by default.
Revenue figures need a paid plan, from Starter at $39 a month. The free plan is link tracking only, with 50 links and 1,000 tracked events a month. The [Stripe integration page](https://www.trackrev.io/integrations/stripe) covers the pixel and the key permissions.
Pick something else when your payments run through none of Stripe, Paddle, Polar or Lemon Squeezy, or when you close a handful of sales a month. A metadata write and a spreadsheet will answer the question.
### Frequently asked questions
**Does Stripe attribute revenue to marketing channels on its own?**
No. Stripe keeps no referrer, landing page or campaign, so channel revenue exists only after you write a source into client_reference_id or metadata.
**Can I do Stripe attribution without writing code?**
Partly. One Payment Link per channel needs no code, and a billing-side tool can match payments to clicks by email. A visitor ID passed through Stripe Checkout is the most reliable match.
**Which Stripe event should I count as revenue?**
invoice.paid for subscription payments, first and renewal alike, and checkout.session.completed with a paid status for one-time purchases. Subtract the amount on charge.refunded, which also covers partial refunds.
**What attribution window suits a SaaS subscription?**
Use the 90th percentile of days from first click to first payment in your own data, rounded up. The benchmark's 48.2 days counts only conversions inside each workspace's window.
**Is Stripe Sigma enough for channel attribution?**
Yes, when every payment already carries a source in metadata and you only need totals. Stripe Sigma, from $15 a month, reads what Stripe holds, so a buyer who reached checkout without a stored source stays unattributed.
**Does TrackRev's free plan show revenue by channel?**
No. The free plan covers link tracking with 50 links and 1,000 tracked events a month. Revenue views begin on a paid plan, and Starter costs $39 a month.
---
## Subscription LTV attribution: credit every renewal to its channel
URL: https://www.trackrev.io/blog/subscription-ltv-attribution
Published: 2026-05-26
Author: Muzahid Maruf
Subscription LTV attribution credits every renewal, upgrade and refund to the channel that won the customer. See the Stripe join, the math and where it breaks.
Subscription LTV attribution credits every renewal, upgrade and refund on a subscription to the channel that won the customer. A $49 plan that renews for 12 months produces $588, and a first-invoice report credits the channel with $49 of it. In Stripe the fix takes one join and one rule: tie the first charge to a click, then let every later invoice on the same subscription ID inherit that channel.
> **Key takeaways:**
>
> - At constant monthly churn, the first invoice equals the churn rate as a share of lifetime revenue: $49 of an expected $980 on a $49 plan at 5% churn.
> - Every later invoice inherits the channel of the subscription's first charge, keyed by subscription ID, so renewals and upgrades credit the channel that won the customer.
> - Count revenue from invoice.paid, and treat customer.subscription.updated as state, since it also fires on renewals, coupons and plan changes.
> - A 14-day trial plus a 20-day gap between click and signup puts the first charge outside a 30-day attribution window, and every renewal then inherits no channel.
> - Compare channels on cohorts of equal age and the same plan, because all-time revenue per customer favors older channels.
### What the first invoice leaves out
Assume a customer pays the same price every month and each month carries the same chance of ending the subscription. Lifetime revenue is then the price divided by the monthly churn rate, the arithmetic [Paddle's CLV guide](https://www.paddle.com/resources/customer-lifetime-value) gives as average revenue per user divided by churn. The first invoice is one month of that lifetime, so its share equals the churn rate.
| Monthly churn | Expected lifetime | Lifetime revenue at $49 | First invoice as a share | Still subscribed after 12 months |
| --- | --- | --- | --- | --- |
| 1% | 100 months | $4,900 | 1% | 89% |
| 2% | 50 months | $2,450 | 2% | 78% |
| 3% | 33.3 months | $1,633 | 3% | 69% |
| 5% | 20 months | $980 | 5% | 54% |
| 8% | 12.5 months | $612.50 | 8% | 37% |
| 12% | 8.3 months | $408 | 12% | 22% |
| 20% | 5 months | $245 | 20% | 7% |
*Constant-churn model on a $49 monthly plan, with no expansion, discounts or margin. Arithmetic, not customer data.*
Take two channels that both deliver $49 on the first invoice, with newsletter readers churning at 3% a month and cold paid social at 8%. A first-invoice report calls them equal. Over a lifetime the newsletter customer is worth $1,633 and the paid-social customer $612.50, a 2.7x gap. Both churn rates are assumptions.
Real churn is not constant. David Skok's [SaaS metrics essay](https://www.forentrepreneurs.com/saas-metrics-2/) uses cohort analysis to check whether a business loses most of its customers in the first couple of months, so use actual paid invoices for any cohort old enough to have them.
### How subscription LTV attribution works in Stripe
Four links connect an ad click to the ninth invoice of a subscription. Each lives in a different system, and a break at any one of them orphans every invoice after it.
| Link | What holds it | Where it lives |
| --- | --- | --- |
| 1. Click to visitor | A first-party visitor ID | Your tracking script and cookie |
| 2. Visitor to first charge | client_reference_id, metadata or the buyer's email | Checkout Session, PaymentIntent or Customer |
| 3. First charge to subscription | The subscription ID on the invoice | Invoice parent.subscription_details.subscription |
| 4. Subscription to each renewal | The same subscription ID | Every later invoice, with billing_reason subscription_cycle |
The first two links are identity problems. If the visitor ID never reaches Stripe Checkout, nothing downstream can recover the channel, and [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) covers the write side.
When you start from a charge, as a refund event does, links 3 and 4 depend on your Stripe API version. [Stripe's subscription webhook documentation](https://docs.stripe.com/billing/subscriptions/webhooks) moves the subscription ID at 2025-03-31.basil, and a handler written for one version reads an empty field on the other.
| Stripe API version | Charge to invoice | Invoice to subscription |
| --- | --- | --- |
| Before 2025-03-31.basil | charge.invoice | invoice.subscription |
| 2025-03-31.basil and later | No invoice field: take the PaymentIntent and list its invoice payments | invoice.parent.subscription_details.subscription |
*Field paths from Stripe's subscription webhook documentation, October 2026.*
You can also stamp the source on the subscription once. [Stripe's metadata guide](https://docs.stripe.com/metadata) says each invoice a subscription creates gets a one-time snapshot of its metadata under `parent.subscription_details.metadata`, so every `invoice.paid` event carries the channel without a lookup. Fixing a typo after month 3 leaves invoices 1 to 3 as they were.
### Stripe events that change a channel's lifetime revenue
| Event | What Stripe says it means | What to do with it |
| --- | --- | --- |
| invoice.paid | The invoice was successfully paid | Add amount_paid to the subscription's channel. billing_reason separates the first invoice (subscription_create), a renewal (subscription_cycle) and a plan change (subscription_update). |
| customer.subscription.updated | A subscription starts or changes, including renewals, coupons and plan changes | Track MRR movement. Add no revenue from it. |
| invoice.payment_failed | A payment for an invoice failed | Add nothing. Smart Retries can still turn the invoice into invoice.paid later. |
| charge.refunded | A subscription charge received a full or partial refund | Subtract the refunded amount from the same channel. |
| charge.dispute.created | A customer or their bank disputed a charge | Flag the revenue as at risk and subtract it if the dispute is lost. |
| customer.subscription.deleted | A customer's subscription ends | Stop accruing revenue and record the churn date for cohorts. |
*Event descriptions from Stripe's subscription webhook documentation, October 2026. The right-hand column is a recommendation.*
Stripe retries a failed live-mode webhook delivery for up to 3 days with exponential backoff, so key each revenue row by invoice ID and a replayed event changes nothing.
### Three ways to credit renewals
A customer who pays $49 for 12 months produces $588, and the credit rule decides how much of it the winning channel books: all of it, 70% of it, or a forecast made on day one.
#### Carry the first credit forward
The channel that won the customer keeps all 12 invoices, $588 on a $49 plan, which answers which channel pays your MRR directly and costs one lookup per invoice. It over-credits acquisition when a lifecycle email sequence or an onboarding call is what keeps people subscribed. I would start here and add complexity only when a budget decision demands it.
#### Decay the credit over time
A decay rule gives the acquisition channel a falling share and moves the remainder to a retention bucket. With 100% for months 1 to 3, 80% for months 4 to 6, 60% for months 7 to 9 and 40% for months 10 to 12, a $49 plan credits the channel 49 x (3 x 1.0 + 3 x 0.8 + 3 x 0.6 + 3 x 0.4) = $411.60 of the $588 paid that year, or 70%. The schedule is arbitrary and earns its place only when someone owns retention spend.
#### Book a projected lifetime value at signup
Forecasting books expected lifetime revenue to the channel at the first payment: $980 for a $49 plan at 5% churn. A team can judge a campaign in its first week instead of its twelfth month. The cost is a churn estimate per channel, and an estimate from a 3-month-old cohort is mostly noise, so keep actual paid revenue beside the projection.
### Upgrades, refunds and trials
Take a newsletter subscriber on the $49 plan who upgrades to $99 at the month 6 renewal, cancels after month 9 and gets the last invoice refunded.
| Months | Stripe activity | Invoices | Channel total after |
| --- | --- | --- | --- |
| 1 | subscription_create | $49 | $49 |
| 2 to 5 | 4 subscription_cycle invoices | 4 x $49 = $196 | $245 |
| 6 | Plan change to $99, billed at renewal | $99 | $344 |
| 7 to 9 | 3 subscription_cycle invoices | 3 x $99 = $297 | $641 |
| 9 | charge.refunded on the month 9 invoice | -$99 | $542 |
*Worked example with round numbers.*
The newsletter ends with $542 credited, and the opening $49 is 9% of it. First-invoice attribution would hold $49 and never see the upgrade or the refund.
A mid-cycle upgrade lands differently. [Stripe's proration documentation](https://docs.stripe.com/billing/subscriptions/prorations) works through a customer who upgrades from a $10 plan to $20 halfway through the period: a $5 credit for unused time plus $10 for the rest of the period on the new plan, so $5 more is billed. The default `create_prorations` creates those items without invoicing them at once, so they usually land on the next invoice. Expansion revenue then arrives one cycle late, and a daily MRR chart disagrees with an invoice-based table until it is paid. Upgrades made through the billing portal are covered in [Stripe Customer Portal attribution](https://www.trackrev.io/blog/stripe-customer-portal-attribution).
#### Trials and the attribution window
A free-trial subscription sits in `trialing` status and becomes `active` when the first payment arrives, so there is nothing to credit before then. The click that won the customer happened before the trial began. A 14-day trial and a visitor who clicked 20 days before signing up put the first charge 34 days after the click, outside a 30-day window. That charge receives no channel, and every renewal after it inherits none either. Set the window to cover the trial plus a normal consideration period.
### Comparing channels by lifetime value
All-time revenue per customer rewards age. Compare cohorts of equal age, or fix one window, such as the first 6 months, and apply it to every channel.
| Cohort age | Invoices at $49 | Most one customer can have paid |
| --- | --- | --- |
| 3 months | 3 | $147 |
| 6 months | 6 | $294 |
| 12 months | 12 | $588 |
| 24 months | 24 | $1,176 |
*Ceiling for a customer who never churns or changes plan.*
Plan mix distorts the comparison too. [ChartMogul's SaaS Retention Report](https://chartmogul.com/reports/saas-retention-report/), covering more than 2,100 SaaS businesses, found net revenue retention above 100% at 2.7% of companies with ARPA under $10 a month and at 41.1% of those with ARPA over $500. A channel that sells your top plan will retain better for reasons unrelated to the channel, so split by plan before crediting the channel with the difference.
TrackRev's [attribution benchmarks](https://www.trackrev.io/data/saas-attribution-benchmarks), built from Q2 2026 workspace data, report a median 12-month LTV multiplier of 2.1x for organic search and 0.8x for paid social, measured against each workspace's average customer, with a median of 12.4 months to first churn for organic search against 6.2 for paid social.
Lifetime revenue becomes a budget signal once it meets cost. Paddle puts the SaaS benchmark for CLV to CAC above 3:1, and Skok adds that many of the best businesses recover CAC in 5 to 7 months, with profitability turning anemic past 12.
| Channel | CAC | Monthly churn | Lifetime revenue | LTV:CAC | Months to recover CAC |
| --- | --- | --- | --- | --- | --- |
| Newsletter sponsorships | $300 | 3% | $1,633 | 5.4:1 | 6.1 |
| Paid social | $250 | 8% | $612.50 | 2.45:1 | 5.1 |
*Illustrative numbers. Recovery time is CAC divided by the $49 monthly price, before churn and gross margin.*
Paid social recovers its cost a month sooner and still fails the 3:1 test, while the newsletter passes it and takes a month longer.
### What TrackRev does with a renewal
TrackRev reads Stripe with a read-only restricted key and syncs charges hourly, with instant syncs from a Stripe webhook when the key allows it. The first charge for a subscription finds its visitor from `metadata.vid`, then the Checkout Session's `client_reference_id`, then the buyer's email. It earns credit from clicks inside the attribution window under your model: last touch (the default), first touch or linear, as [the attribution model comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) lays out. The window defaults to 30 days and accepts 1 to 365.
Every later charge whose invoice carries the same subscription ID copies the first order's channel and link split, rescaled to the renewal amount. A $49 plan that becomes $99 credits $99 to the same channel from then on. The same carry-forward runs for Paddle, Polar and Lemon Squeezy subscriptions, keyed on each provider's own subscription ID.
A Stripe charge reported as refunded drops out of the lifetime table, and a partly refunded charge loses its whole credit instead of only the refunded portion.
The Channels page lists customers, orders including renewals, lifetime revenue and average LTV per customer for each channel, as described on the [channel analytics page](https://www.trackrev.io/products/channel-analytics). It sums all time with no cohort-age cut, so apply the comparison rules above. Revenue figures need a paid plan: Starter at $39 a month, Growth at $99 or Scale at $199 ([pricing](https://www.trackrev.io/pricing)). The free plan tracks links only. Setup steps are on the [Stripe integration page](https://www.trackrev.io/integrations/stripe).
A renewal whose first order earned no credit earns none either, and the first sync reaches back 30 days, so subscriptions that began before you connected arrive without their original click. Changing the attribution model affects new orders only.
### Cases the join can't see
An invoice a sales rep sends by hand has no browser session behind it, so no visitor gets credit. Billing in Chargebee or Recurly sits outside the four processors TrackRev reads: Stripe, Paddle, Polar and Lemon Squeezy. For those deals a CRM field holding the source is the better record. The click-to-charge walkthrough is in [attributing Stripe revenue to marketing channels](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels).
### Frequently asked questions
**Is subscription LTV attribution the same as customer lifetime value?**
No. Lifetime value is a dollar figure for a customer or a cohort, and attribution assigns that figure to a marketing channel.
**Which Stripe event should I use to count renewals?**
Use invoice.paid and read billing_reason. The value subscription_cycle marks a renewal, subscription_create the first invoice and subscription_update a plan change. customer.subscription.updated also fires for coupons, so revenue counted from it can be counted twice.
**How long should the LTV window be?**
Pick one window and apply it to every channel. A 6-month window gives usable data soon after launch and 12 months catches a full upgrade cycle. Annual plans need 12 months or more, since a 6-month view of an annual subscriber holds no renewal.
**Do refunds reduce a channel's lifetime revenue?**
They should. Leaving a refund in flatters channels that run aggressive offers, so subtract the refunded amount from the channel that earned the original charge.
**Can I see lifetime value by channel on the free TrackRev plan?**
No. The free plan covers link tracking with 50 links and 1,000 tracked events a month. Revenue figures, including lifetime value by channel, start on the Starter plan at $39 a month.
**What if my customers start with a free trial?**
Nothing is credited until the first payment, and that payment must still fall inside your attribution window counted from the click. Lengthen the window to cover the trial, or the first charge and its renewals get no channel.
**Does a customer who cancels and resubscribes keep their original channel?**
Not automatically. Stripe issues a new subscription ID when a customer returns after canceling, so a subscription-keyed join sees a new first order and credits whichever click brought them back. Decide once whether win-backs belong to the original channel, perhaps inside a fixed win-back period, and write the rule down before comparing channels.
---
## Tapfiliate alternatives: five tools compared on price, limits and what they track
URL: https://www.trackrev.io/blog/tapfiliate-alternative
Published: 2026-06-09
Author: Muzahid Maruf
Tapfiliate costs $89 or $179 a month and meters clicks and conversions. Compare Rewardful, FirstPromoter, Tolt, LeadDyno and TrackRev on price and limits.
People look for a Tapfiliate alternative when the plan meter, the partner-only view of revenue or a feature held back for a higher plan starts to bite. Tapfiliate charges $89 a month for Launch and $179 for Scale ($74 and $149 on annual billing), limits Launch to 50 affiliates, 5,000 clicks and 500 conversions a month, and measures partner-driven conversions. Rewardful, FirstPromoter and Tolt bill by the revenue affiliates bring in, LeadDyno bills by active affiliates, and TrackRev bills by commission paid and reports every other channel beside the partners.
I run TrackRev, which is one of the five tools below and is judged on the same terms, including where it loses to Tapfiliate.
> **Key takeaways:**
>
> - Tapfiliate Launch is $89 a month for 50 affiliates, 5,000 clicks and 500 conversions, so a program with 70 affiliates moves to Scale at $179.
> - Rewardful, FirstPromoter and Tolt meter affiliate revenue, LeadDyno meters active affiliates and TrackRev meters commission, which put the same 70-affiliate program anywhere from $39 to $179 a month.
> - Tapfiliate credits the last affiliate link clicked inside a 45-day default cookie window, and its docs describe no built-in way to record a newsletter or YouTube visit that came earlier.
> - Tapfiliate stays the better fit for Shopify and other store platforms, for Chargebee and Recurly billing, and for automated payouts through Trolley.
> - A CSV import keeps each partner's code but not the URL, so run both tools through Tapfiliate's 45-day cookie window and pay commissions from only one of them.
### What Tapfiliate costs and what its plans meter
[Tapfiliate's pricing page](https://tapfiliate.com/pricing/) lists three plans, and per [its billing article](https://support.tapfiliate.com/en/articles/1444144-how-is-my-tapfiliate-subscription-billed) payment details are collected before any trial starts.
| Plan | Monthly | Prepaid for a year | Affiliates | Programs | Clicks a month | Conversions a month | Team seats | Trial |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Launch | $89 | $74 a month ($890 a year) | 50 | 1 | 5,000 | 500 | 1 | 7 days |
| Scale | $179 | $149 a month ($1,790 a year) | Unlimited | Unlimited | 100,000 | 10,000 | 5 | 14 days |
| Enterprise | Custom | Custom | Unlimited | Unlimited | Tailored | Tailored | Unlimited | 30 days |
*Tapfiliate's published prices, October 2026. A prepaid year costs 10 times the monthly price.*
Usage past the allowance bills as overage: $1.50 per 1,000 clicks and $15 per 1,000 conversions on Launch, $1 and $10 on Scale.
| Launch usage in a month | Click overage | Conversion overage | Total bill |
| --- | --- | --- | --- |
| 5,000 clicks, 500 conversions | $0 | $0 | $89 |
| 15,000 clicks, 1,500 conversions | $15 | $15 | $119 |
| 25,000 clicks, 2,500 conversions | $30 | $30 | $149 |
*Overage at Tapfiliate's published Launch rates.*
Scale ($179) adds multi-level commissions, group and item-based commissions, bonuses, deep links, short links and Trolley payouts. [Tapfiliate's add-on article](https://support.tapfiliate.com/en/articles/13235077-can-i-mix-match-features-from-different-plans) lists custom domains with Scale, and puts full white labeling, which removes every Tapfiliate logo from the partner portal, in Enterprise, though support will quote it as an add-on on lower plans.
### Where teams hit Tapfiliate's limits
Launch allows one program, so a customer referral program next to a creator affiliate program means Scale. The 50-affiliate ceiling works the same way: growth past it is a move from $89 to $179, a $90 step.
[Tapfiliate's cookie article](https://support.tapfiliate.com/en/articles/13385628-general-program-settings-currencies-languages-and-cookie-duration) gives the commission to the last affiliate link clicked, inside a window that defaults to 45 days and tops out at 365. Crediting the affiliate who first acquired a user takes code on your side, which [its sources guide](https://support.tapfiliate.com/en/articles/11495039-tracking-conversions-via-sources-identify-new-vs-existing-users) walks through. [The tracking page](https://tapfiliate.com/tracking-and-attribution/) describes the job as partner-driven conversions and backs cookies up with server-to-server postbacks, coupon codes and metadata. A newsletter issue or YouTube video earlier in the buyer's path leaves no record that I found in its help center or docs, so the report credits the partner and ignores whatever warmed the buyer.
Billing coverage is the other limit. The [developer docs](https://tapfiliate.com/docs/integrations/) list 28 pre-made integrations, among them Stripe, Chargebee, Recurly, PayPal, Shopify and WooCommerce. Polar and Lemon Squeezy are absent, and Paddle appears in the home page FAQ without a guide among the 28.
### Tapfiliate alternatives compared
| Tool | Entry price a month | What the plan meters | Entry limit | Custom domain from | Trial |
| --- | --- | --- | --- | --- | --- |
| Tapfiliate | $89 (Launch) | Clicks, conversions, affiliates, programs | 5,000 clicks, 500 conversions, 50 affiliates | Scale, $179 | 7 days, payment details up front |
| Rewardful | $49 (Starter) | Affiliate-attributed revenue | $7,500 a month | Growth, $99 | 14 days |
| FirstPromoter | $49 (Starter) | Revenue from affiliates | $5,000 a month, 1,000 affiliates | Business, $99 | 14 days, no card |
| Tolt | $69 (Basic) | Revenue earned from affiliates | $10,000 a month | Basic, $69 | 14 days, no card |
| LeadDyno | $49 (Lite) | Active affiliates | 50 active affiliates | Essential, $129 | 30 days |
| TrackRev | $39 (Starter) | Commission tracked | $10,000 of commission a month | Starter, $39 | Free plan, link tracking only |
*Prices from each vendor's pricing page, October 2026. Rewardful, FirstPromoter and Tolt meter the revenue their affiliates bring in, and TrackRev meters the commission paid out of it.*
#### The same program on each plan
Entry prices hide the meter, so take two programs with a 30% commission and a $60 average sale. Program A has 40 active affiliates, 4,000 clicks and 120 sales a month: $7,200 of affiliate revenue and $2,160 of commission. Program B has 70 affiliates, 7,000 clicks and 230 sales: $13,800 and $4,140.
| Tool | Program A | Program B | Program B over 12 months |
| --- | --- | --- | --- |
| Tapfiliate | Launch, $89 | Scale, $179 | $2,148 |
| Rewardful | Starter, $49 | Growth, $99 | $1,188 |
| FirstPromoter | Business, $99 | Business, $99 | $1,188 |
| Tolt | Basic, $69 | Growth, $99 | $1,188 |
| LeadDyno | Lite, $49 | Essential, $129 | $1,548 |
| TrackRev | Starter, $39 | Starter, $39 | $468 |
*Cheapest plan whose published limits cover the program, billed monthly.*
Tapfiliate's jump from $89 to $179 comes from the 50-affiliate cap on Launch, and Program B's 7,000 clicks barely touch Scale's 100,000. FirstPromoter's Starter stops at $5,000 of revenue, which pushes Program A to Business. Against TrackRev, Program B is a $140 monthly gap and $1,680 a year. Prepaying a year narrows it to $1,439, because Scale's $1,790 sits against Starter's $351.
TrackRev's allowance counts commission, so at 30% its $10,000 covers about $33,333 of referred revenue a month, and at 50% it covers $20,000. At a 100% commission rate it covers only $10,000 of revenue, the same ceiling as Tolt's $69 plan.
#### Rewardful, for a Stripe-first program under $15,000
[Rewardful](https://www.rewardful.com/pricing) meters affiliate-attributed revenue. The $49 Starter plan tops out at $7,500 a month with 1 campaign and 2 team members, the $99 Growth plan at $15,000, and Enterprise begins at $149 with $30,000 on its entry tier. Every plan has a 0% transaction fee, coupon tracking, PayPal and Wise mass payouts and a first-touch or last-touch setting. The branded portal and domain hosting begin at Growth, so a white-labeled Rewardful program costs $99 against the $179 that Tapfiliate lists for Scale. The [Rewardful alternatives guide](https://www.trackrev.io/blog/best-rewardful-alternatives-2026) covers where it runs out.
#### FirstPromoter, for Chargebee, Recurly and Braintree billing
[FirstPromoter](https://firstpromoter.com/pricing) stops its $49 Starter plan at $5,000 a month of affiliate revenue and 1,000 affiliates. Business ($99) reaches $15,000 with no limit on affiliates, and Enterprise ($149) goes above that. Its [integrations page](https://firstpromoter.com/integrations) says Stripe, Chargebee, Paddle, Recurly and Braintree connect directly, with other systems through its API. Multi-tier commissions across up to 3 levels and a first-click or last-click choice come on every plan, and a dashboard on your own domain starts at Business. It is the closest swap for a Tapfiliate setup on Chargebee or Recurly, and the [FirstPromoter alternatives post](https://www.trackrev.io/blog/best-firstpromoter-alternatives-2026) lists what to check first.
#### Tolt, for the lowest list price with a branded portal
[Tolt](https://tolt.com/pricing) has three priced plans: $69 for $10,000 a month earned from affiliates, $99 for $20,000 and $199 for $50,000. The $69 plan already includes its own domain, a branded portal and 2 programs, though payouts are manual until the $99 plan, where automatic payouts carry a 2% processing fee. It connects to Stripe, Paddle and Chargebee. For a SaaS on one of those, it costs $20 less than Tapfiliate Launch and already includes the domain, and the [Tolt alternatives post](https://www.trackrev.io/blog/tolt-alternative) compares it with the rest.
#### LeadDyno, for few affiliates and heavy traffic
[LeadDyno](https://www.leaddyno.com/pricing) puts no limit on clicks or conversions and caps the roster instead. Lite is $49 for 50 active affiliates, Essential is $129 for 150 and adds multi-level marketing and a dashboard on your domain, Advanced is $349 for 500 and adds a white-labeled dashboard, and Unlimited is $749. The trial lasts 30 days and yearly billing saves 15%. A small roster with heavy traffic costs less here than on Tapfiliate, which meters traffic. Past 150 affiliates the order flips, since Tapfiliate Scale at $179 has no affiliate cap and LeadDyno's 500-affiliate tier is $349. The [LeadDyno alternative post](https://www.trackrev.io/blog/leaddyno-alternative) goes deeper.
#### TrackRev, for partners next to every other channel
TrackRev starts at $39 a month, and every paid plan includes the affiliate program, link tracking and revenue attribution. Starter meters up to $10,000 of partner commission in one workspace, Growth costs $99 and meters $100,000 across unlimited workspaces, and Scale is $199. Revenue syncs from Stripe, Polar, Lemon Squeezy and Paddle. Commissions can be recurring, one-time or multi-tier, paid as cash or credit, held for 0 to 180 days per program (the default is 0) and reversed on refunds. Partners get a white-label portal and upload W-9 or W-8 tax forms while onboarding.
A partner link sits on the same data model as every other tracked link, so one channel report ranks affiliates, newsletter, YouTube and paid ads by the MRR each pays, under last-touch, first-touch or linear credit. Switch when partners are one channel of several, and see the [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) for the report.
### Where Tapfiliate is still the better pick
Tapfiliate's [home page](https://tapfiliate.com/) sells 6 program types from one platform: affiliate, referral, influencer, content creator, brand ambassador and reseller. Its integration list reaches past SaaS to Shopify, WooCommerce, BigCommerce, Magento, PrestaShop and Wix Stores. A Shopify store belongs on Tapfiliate, and a Chargebee account on Tapfiliate or FirstPromoter, because TrackRev has no Shopify, WooCommerce or Chargebee connection.
Tapfiliate leaves payment to your own processor. Its [payout process](https://support.tapfiliate.com/en/articles/13272686-the-payout-process-settling-balances-and-generating-a-payout-file) settles balances into a CSV for your processor, the same manual routine TrackRev uses with PayPal and Wise files. Scale adds Trolley for automated payouts, and a Hands-Free Payout Service is planned for Scale in 2026, starting in beta.
Scale also carries multi-level marketing with sales goals, a different model from TrackRev's Partner Accelerator, which pays up a referral chain from a pool capped at 30% by default and stops paying a level once its share falls under $1. Tapfiliate also ships an MCP server that connects a workspace to Claude, ChatGPT or Google Antigravity, and its partner portal comes in 6 languages. If affiliates are the only channel you will measure, TrackRev's attribution report goes unused and Tapfiliate's integration list is worth the higher price.
### Moving a program off Tapfiliate
- Export from Tapfiliate. Its [cancellation guide](https://support.tapfiliate.com/en/articles/16888772-how-to-cancel-your-tapfiliate-subscription) says affiliates, conversions and customers each export to CSV. Keep the referral code and coupon columns.
- On a paid TrackRev plan, open the Import data page in settings, choose Tapfiliate as the source and upload the file, up to 1,000 rows and 900 KB per upload. Only an email per row is required. The wizard keeps each referral code as the partner's TrackRev link, carries coupon codes and approval status, writes each unpaid balance as one carried-over commission, and loads past clicks, leads, sales and revenue as opening balances. Re-uploading a file skips partners who already exist.
- Swap the tracking. [Tapfiliate's Stripe guide](https://tapfiliate.com/docs/integrations/stripe/) loads `tapfiliate.js` on every page, then calls `tap('conversion')` with the charge and customer IDs on the thank-you page, or `tap('trial')` with the customer ID when sign-up comes first, because its automation depends on the Stripe Charge ID (`ch_`) and Stripe Customer ID (`cus_`). TrackRev needs the pixel below and a read-only restricted key from the Stripe Dashboard. It matches each charge to a click through the customer's email, tied to the visitor ID at sign-up or checkout, with an hourly sync and an optional webhook for real-time updates.
- Run both through the cookie window. Check your program's cookie time in its general settings, since the default is 45 days: a visitor who clicked a Tapfiliate link last week still converts to that partner on Tapfiliate. Keep its script in place that long, and pay each commission from one system so no sale is paid twice. Do not archive the Tapfiliate program early, because an archived program stops tracking and its referral links stop working.
- Give partners their new link. The code carries over and the URL does not: `yoursite.com/?ref=sam` is a Tapfiliate link, while TrackRev partner links sit on a branded trackrev.io subdomain, on your custom domain or on trackrev.io itself, ending in the same code. A code that is already taken is reported as a warning on that partner. Ask partners to swap the links they have posted.
- Settle and cancel. The cancellation guide says to pay outstanding commissions, export the data and download invoices first. A cancelled Tapfiliate account keeps its data for up to 12 months.
TrackRev pixel
```
```
### Test one sale before you cancel Tapfiliate
Run a purchase through your real checkout with a fresh email. Click a test partner's TrackRev link, pay with the 4242 4242 4242 4242 card from [Stripe's testing guide](https://docs.stripe.com/testing), and check that the sale and its commission reach that partner after the next hourly sync. Then refund the charge. TrackRev re-reads charge status on every sync, so a refund or dispute removes the commission, and Tapfiliate's Stripe guide lists the same handling once its Stripe connection is on. The [refunds and upgrades post](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) covers the awkward cases.
Set the hold period before the first payout run. It accepts 0 to 180 days per program and starts at 0, so match it to your refund window.
TrackRev's free plan covers 50 links and 1,000 tracked events a month, enough to try the redirect and the click log. The affiliate program and revenue figures start on Starter at $39, and annual billing charges for 9 months and gives 12. The [pricing page](https://www.trackrev.io/pricing) lists every plan.
### Frequently asked questions
**What is the best Tapfiliate alternative for a SaaS company on Stripe?**
Start from program size and the meter. Rewardful suits a Stripe-only program under $7,500 a month, FirstPromoter adds Chargebee and Recurly, Tolt includes a custom domain at $69, and TrackRev fits when newsletter, YouTube or paid channels need the same report as the partners.
**Does Tapfiliate take a percentage of affiliate sales?**
No. According to its billing article it takes no commission on tracked conversions, so the bill is the plan plus any overage. Rewardful lists a 0% transaction fee as well, and TrackRev charges a flat plan price.
**Does Tapfiliate have a free plan?**
No. Launch gives 7 days and Scale 14 days of trial, and both collect payment details first. Tolt and FirstPromoter run 14-day trials with no card, and TrackRev's free tier stops at link tracking.
**Can Tapfiliate track newsletter, YouTube or paid ad revenue?**
Tapfiliate records partner clicks, coupon codes and server-to-server calls. A newsletter or video visit is not recorded unless your own code stores it, as its sources guide shows for tagging a signup as direct. Every tracked link in TrackRev lands in the same report.
**Can I keep Tapfiliate for affiliates and add TrackRev for other channels?**
Yes, with one gap. Partner clicks on Tapfiliate links never pass through TrackRev, so its channel report cannot rank partner revenue against the other channels until the partner links move over.
**Do my affiliates have to change their links when I leave Tapfiliate?**
Yes. The import preserves codes, but each link moves to a TrackRev host, so every partner swaps the old URLs. Tapfiliate keeps tracking the old ones until you cancel or archive the program.
**Does TrackRev pay affiliates automatically?**
No. You export a PayPal or Wise CSV, pay from your own account and mark each payout paid with its payment reference. Tapfiliate Scale pays through Trolley, and Tolt's $99 plan sends them for a 2% processing fee.
**Which Tapfiliate alternative supports multi-level commissions?**
FirstPromoter includes multi-tier commissions across up to 3 levels on every plan, and LeadDyno adds multi-level marketing from its $129 plan. TrackRev's Partner Accelerator pays up a referral chain from one capped pool on every paid plan.
**Is Tapfiliate a better choice than TrackRev for an online store?**
Usually, yes. Tapfiliate lists pre-made integrations for Shopify, WooCommerce, BigCommerce and Magento, and TrackRev has none of the four.
---
## TinyURL alternatives: 7 tools compared on free limits, domains and price
URL: https://www.trackrev.io/blog/tinyurl-alternatives
Published: 2026-10-03
Author: Muzahid Maruf
TinyURL alternatives compared on free plan limits, custom domains, analytics, API access and price, using each vendor's October 2026 pricing page.
The best TinyURL alternatives to try first are Short.io and Dub. Short.io's $0 plan allows 5 custom domains and 50,000 tracked clicks a month, and Dub's adds 3 custom domains, API access and 30 days of analytics. TinyURL's free plan stops at 30 links a month with no analytics and no way to add your domain; those arrive with Pro at $9 a month billed annually. Rebrandly, Bitly, Cuttly and the open-source Kutt fill out the list, and I run TrackRev, which is entry 7.
> **Key takeaways:**
>
> - TinyURL's Free plan has no analytics, no destination edits and no option to add your own domain. All three start on Pro at $9 a month billed annually, or $11 billed monthly.
> - Short.io, Dub, Rebrandly, Cuttly and Kutt let you connect a domain and see click statistics for $0. Bitly's free plan has no custom domain and no data history.
> - Link allowances differ widely: Short.io gives 1,000 in total, Dub 25 a month, Rebrandly 10 and Bitly 5.
> - TrackRev Starter costs $351 a year because it adds revenue attribution and affiliate tracking. Short.io or Dub fits better for short links alone.
### What TinyURL gives you on each plan
[TinyURL's pricing page](https://tinyurl.com/app/pricing) lists four plans. Free marks the analytics dashboard, tracked clicks, tags, destination edits and link deletion as paid. Bringing your own domain is paid as well, starting on Pro; the page says only that users who downgrade to Free keep one domain active.
| Plan | Billed annually | Billed monthly | Links a month | Branded domains | Analytics history |
| --- | --- | --- | --- | --- | --- |
| Free | $0 | $0 | 30 | None to add | None |
| Pro | $9 a month ($108 a year) | $11 | 125 | 3 | 2 years |
| Bulk 50K | $69 a month ($828 a year) | $83 | 50,000 | 3 | 2 years |
| Enterprise | From $3,999 a year | Custom | Custom | Custom | 2 years |
*TinyURL plans and prices, October 2026.*
Pro treats tracked clicks as unlimited, sells extra links at $1.50 per 10 and includes a free first year on selected domains. Bulk 50K caps tracked clicks at 50,000 a month and charges $0.60 per 1,000 beyond that, with extra links at $2.00 per 1,000.
In TinyURL's favor, a [help article](https://tinyurl.com/blog/can-use-api-shorten-links-tinyurl-free/) says Free plan users can use the API, and another says its links [never expire](https://tinyurl.com/blog/do-tinyurls-expire/). The pricing page agrees for Free and Pro, where Never Expires is the default; Bulk 50K defaults to 90 days. Links created while signed out belong to your browser session, so clearing the cache can end your ability to manage them, per its [missing links article](https://tinyurl.com/blog/cant-find-links-from-free-plan/).
> **Free links cannot be edited:** A link made on the Free plan cannot be edited afterward, and [TinyURL's help center](https://tinyurl.com/blog/change-destination-short-links-tinyurl-free/) says changing where it points takes a paid plan. For anything printed or embedded, that limit matters more than the 30-link cap.
### How the free plans compare
| Tool | Free plan | Domain on free | Analytics on free | API on free | Paid from |
| --- | --- | --- | --- | --- | --- |
| TinyURL | 30 links a month | No | None | Yes | Pro: $11 a month, $108 a year |
| Short.io | 1,000 links in total | 5 | 50,000 clicks a month | 50 requests a second | Hobby: $5 a month, $50 a year |
| Dub | 25 links a month | 3 | 1,000 events a month | Yes | Pro: $30 a month, or $27 a month yearly |
| Rebrandly | 10 links a month | 1 | Totals and country | 100 calls a minute | Essentials: $9 a month, $96 a year |
| Bitly | 5 links a month | No | No data history | 1,000 requests a month | Core: $120 a year, no monthly option |
| Cuttly | 30 links a month | 1 | 30 days of history | 3 calls per minute | Starter: $12 a month, $132 a year |
| Kutt | 10 links a month hosted, or self-host free | 1 hosted | 100 stats hosted | Yes | Silver: $9 a month, $99 a year |
| TrackRev | 50 links in total, 1,000 events a month | Shared trackrev.io domain | Clicks, geo, device, referrer | Link endpoints | Starter: $39 a month, $351 a year |
*Prices from each vendor's pricing page, October 2026.*
### Seven TinyURL alternatives, one at a time
#### 1. Short.io, for the most room on a free plan
[Short.io](https://short.io/pricing)'s $0 plan includes 1 user, 5 custom domains, 1,000 branded links, 50,000 tracked clicks a month and 50 conversions a month. The link allowance is issued once and lasts the life of the account, and its FAQ confirms you can delete links to stay under it. API access, QR codes, a UTM builder, A/B testing and link import come with every plan. One wrinkle: the plan table says 50,000 tracked clicks a month while the FAQ says detailed statistics cover the first 50,000 clicks, so confirm whether the cap resets before you plan around statistics at volume.
Hobby ($5 a month, $50 a year) adds country targeting and referrer hiding. Pro ($18 a month, $180 a year) brings password protection, expiration, cloaking and unlimited tracked clicks, and Team ($48 a month, $480 a year) adds deep links and a 99.9% uptime SLA. The [Short.io and TrackRev comparison](https://www.trackrev.io/blog/short-io-vs-trackrev) covers where a plain shortener stops.
#### 2. Dub, for open source with API access on the free plan
[Dub](https://dub.co/pricing/links) is the open-source pick: its core is AGPLv3, and about 1% of the codebase sits under a commercial license, per its [GitHub README](https://github.com/dubinc/dub). The free plan includes 3 custom domains, API access, QR codes, tags and 30 days of analytics, with room for 25 new links and 1,000 tracked events a month and a single user.
Pro costs $30 a month, or $27 a month on the yearly option, which the page labels a 10% discount with 12x usage upfront. It lifts the allowances to 1,000 new links and 50,000 events a month, 10 domains and a year of analytics, adds a free .link domain and brings in deep links, cloaking, expiration, passwords and geo and device targeting. A/B testing, conversion tracking and webhooks start at Business ($90 a month, or $81 a month yearly). Dub also sells an affiliate product, Dub Partners, from the same pricing page; the [Dub and TrackRev comparison](https://www.trackrev.io/blog/dub-co-vs-trackrev) sets its attribution beside ours.
#### 3. Rebrandly, for a cheap paid tier with conversion tracking
[Rebrandly](https://www.rebrandly.com/pricing)'s catch is the edit allowance. The free plan has no destination edits, Essentials ($9 a month, $96 a year) allows 10 a month, Professional 50 and Growth 150, so a long campaign list can use them up. What the free plan does include: 10 links and 10 QR codes a month, 1 custom domain, 5 tags, total clicks and country data (detail on 100 clicks a month) and a 100-calls-a-minute API.
Essentials adds a second domain, 250 links a month and device and time-of-day data. Professional ($27 a month, $264 a year) is the cheap way into conversion tracking, along with city-level data, password protection and link expiration. Growth ($83 a month, $828 a year) brings mobile deep linking.
#### 4. Bitly, for SSO and group permissions at enterprise scale
[Bitly](https://bitly.com/pages/pricing) labels its free plan "With ads" and allows 5 links, 1 QR code and 3 custom back-halves a month, 1,000 API requests a month and no analytics history. Core costs $120 a year with no monthly option and adds 100 links a month, 30 days of click data and a UTM builder, yet still has no branded links. Those start at Growth ($35 a month, $348 a year), along with a complimentary custom domain, 500 links a month, 120 days of data and bulk creation.
Premium ($300 a month, $2,388 a year) brings 3,000 links, a year of data, city and device data and mobile deep linking, and only Enterprise allows more than one custom domain. Enterprise also adds SSO, group permissions and 2 years of data. Growth runs $240 a year above TinyURL Pro, $348 against $108, which makes Bitly the expensive route to a branded link. The [Bitly alternatives guide](https://www.trackrev.io/blog/best-bitly-alternatives-2026) goes deeper on that switch.
#### 5. Cuttly, for TinyURL's 30 links plus 30 days of analytics
[Cuttly](https://cutt.ly/pricing)'s free plan mirrors TinyURL's 30 links a month, then adds 1 branded domain, 3 custom back-halves and 30 days of analytics, with API calls capped at 3 every 60 seconds. It shares TinyURL's other limit too: no destination edits on free. Starter ($12 a month, $132 a year) allows 300 links a month and edits within the same domain.
Single ($25 a month, $275 a year) brings 5,000 links, 5 branded domains, a year of analytics, password links, expiration and retargeting pixels. Team ($99 a month, $1,089 a year) permits edits to any URL, 730 days of history, 3 teams and 5 members. Yearly billing charges 11 months for 12.
#### 6. Kutt, for running the shortener yourself
[Kutt](https://github.com/thedevs-network/kutt) is an MIT-licensed shortener you can host. Its README lists custom domains, link passwords and expiration times, private statistics, an admin page, a REST API and OpenID Connect login. Setup needs Node.js 20 or newer, with SQLite by default or Postgres, MySQL or MariaDB, and Redis if you want a cache. Self-hosting has no subscription fee, and you run the server, apply updates and keep backups yourself.
The hosted version at [kutt.to](https://kutt.to/premium) has a free Stone plan with 10 links a month, 100 tracked stats, 1 custom domain and API access. Silver ($9 a month, $99 a year) allows 2,500 links a month, 20,000 tracked stats and 3 domains. The README warns that kutt.it is not run by the project and could be a phishing site, so use kutt.to.
#### 7. TrackRev, for links that need to show revenue
I run TrackRev, so weigh this entry accordingly. The [link tracking product](https://www.trackrev.io/solutions/links-and-analytics) logs every click server-side with its geo, device and referrer. The free plan allows 50 links in total and 1,000 tracked events a month with no card, on the shared trackrev.io short domain, and custom domains are listed with the paid plans. Links can expire by date or click count, take a password, import from a CSV and carry a QR code.
Starter ($39 a month, $351 a year, since annual billing pays for 9 months of 12) removes the link and event caps, connects your domain with one CNAME record and automatic SSL, and opens the REST API's analytics endpoints, which free workspaces cannot read. See [pricing](https://www.trackrev.io/pricing) and [custom tracking domains](https://www.trackrev.io/products/custom-tracking-domains) for the detail. What the price adds is revenue matching: each click is joined to the Stripe, Paddle, Polar or Lemon Squeezy payment it produced, and the affiliate program runs on the same data.
If you only need branded short links with click statistics, Short.io or Dub costs far less. TrackRev earns its price when the links point at something you sell and you want to know which one earned the money.
### What a year costs with your own domain
| Tool | Plan | Year on annual billing | Year on monthly billing |
| --- | --- | --- | --- |
| Short.io, Dub, Cuttly, Rebrandly, Kutt | Free | $0 | $0 |
| TinyURL | Pro | $108 | $132 |
| Bitly | Growth | $348 | $420 |
| TrackRev | Starter | $351 | $468 |
*Cheapest plan with a custom domain and click analytics, October 2026 prices.*
Each figure is a monthly price times 12: $9 and $11 for TinyURL Pro on annual and monthly billing, $29 and $35 for Bitly Growth, and $39 for TrackRev Starter, whose 25% annual discount takes $117 off the $468. A domain name costs extra unless the plan includes one, and Short.io's page says registration fees are not in its plan prices.
### Which one to pick
| What you need | Start with |
| --- | --- |
| A custom domain and click statistics for $0 | Short.io, with 5 domains, or Dub, with 3 |
| Code you can read and run | Kutt (MIT) or Dub (AGPLv3 core) |
| The lowest paid price | Short.io Hobby at $50 a year |
| A few links with no signup | TinyURL itself, or Pro at $108 a year to see analytics |
| Signups or purchases counted after a click | Rebrandly Professional at $27 a month, or Dub Business at $90 |
| Revenue from your payment processor matched to each link | TrackRev, from $39 a month |
### Moving your links off TinyURL
Links on tinyurl.com stay on tinyurl.com, so the move covers the links you create from now on. Old ones keep working under the never-expire default, which makes the editing limit the thing to plan around: treat any Free-plan TinyURL that is printed, embedded or posted as permanent.
For new material, choose a plan that lets you change a destination. Short.io lists destination updating on every plan, free included. Rebrandly's Essentials allows 10 edits a month, and Cuttly's Starter edits only to URLs on the same domain until Team lifts that. Put the links on a domain you own, as the [branded short link guide](https://www.trackrev.io/blog/what-is-a-branded-short-link) explains, so printed links survive a later change of tool once you recreate the slugs there and update DNS. Tag each destination with UTM parameters first; the free [UTM builder](https://www.trackrev.io/tools/utm-builder) does that.
### Frequently asked questions
**Is TinyURL free to use?**
Yes, for up to 30 links a month, and you can shorten a link without an account. Analytics, edits and your own domain cost extra, starting at $9 a month on annual billing.
**Can I change a TinyURL link after creating it?**
Not on the Free plan. Pro and above can edit a destination and set an expiration date.
**Is TinyURL cheaper than Bitly?**
At the tier that adds your own domain, yes: TinyURL Pro is $108 a year for 3 branded domains, where Bitly asks $348 for Growth. Bitly's entry plan, Core at $120 a year, has no branded links.
**What is the cheapest paid plan among these tools?**
Short.io Hobby is lowest at $50 a year, followed by Rebrandly Essentials at $96, Kutt Silver at $99, TinyURL Pro at $108, Bitly Core at $120 and Cuttly Starter at $132. Dub Pro, at $27 a month yearly, and TrackRev Starter, at $351, cost more.
**Can I use a free shortener for business links?**
Short.io's FAQ says its free plan allows commercial use. Terms differ by vendor, so read the terms of service before putting a free-plan link on a campaign.
**Do I need my own domain for short links?**
It is optional, though a link on your domain looks like yours and moves with you if you change tools. A tinyurl.com link stays on TinyURL's domain for good.
**How does TrackRev count tracked events on the free plan?**
Each click on a TrackRev link counts, along with each pixel pageview. Conversions do not, and bot traffic is filtered out before counting. The 1,000 events reset on your workspace's monthly anniversary.
**Which of these tools can show revenue per link?**
TrackRev matches clicks to Stripe, Paddle, Polar or Lemon Squeezy payments from Starter at $39 a month. Rebrandly Professional ($27 a month) and Dub Business ($90 a month) list conversion tracking too.
---
## Tolt alternatives: which one fits the reason you are leaving
URL: https://www.trackrev.io/blog/tolt-alternative
Published: 2026-07-11
Author: Muzahid Maruf
Tolt costs $69, $99 or $199 a month by affiliate revenue. Five alternatives, from PromoteKit to TrackRev, judged on cost, billing support and payouts.
Pick the Tolt alternative that matches your reason for leaving: PromoteKit or Affonso for a lower entry price, FirstPromoter for more billing systems, Rewardful for a Stripe-first tool, TrackRev to rank partners against your other channels. Tolt bills $69, $99 or $199 a month depending on the revenue your affiliates bring in ($10,000, $20,000 or $50,000), pays affiliates by hand until the $99 plan, and connects to Stripe, Paddle and Chargebee.
I run TrackRev, so it is one of the five tools below and gets the same scrutiny, including where it loses to Tolt. For a two-way comparison, see [Tolt vs TrackRev](https://www.trackrev.io/blog/tolt-vs-trackrev).
> **Key takeaways:**
>
> - Tolt's $69, $99 and $199 plans cover up to $10,000, $20,000 and $50,000 a month earned from affiliates, so the bill steps up as the program grows.
> - The same $18,000-a-month program needs Affonso Elite at 79, Tolt Growth at $99, or Enterprise plans at Rewardful (from $149), FirstPromoter ($149) and PromoteKit (contact sales). TrackRev Starter stays at $39 because its meter counts commission, and the others count revenue.
> - Tolt's help center has no setup guide for Polar, Lemon Squeezy, Recurly or Braintree, which Affonso, TrackRev and FirstPromoter cover in different combinations.
> - On payouts, Tolt's $99 plan can send the money and file 1099s, while TrackRev hands you a batch to pay yourself.
> - TrackRev fits when partners are one channel of several and you want every channel's MRR on a single report.
### What Tolt costs and where its limits sit
[Tolt's pricing page](https://tolt.com/pricing) sells four plans and offers a 14-day trial that asks for no card.
| Plan | Price a month | Limit a month | Programs | Seats | Payouts |
| --- | --- | --- | --- | --- | --- |
| Basic | $69 | $10,000 | 2 | 3 | Manual |
| Growth | $99 | $20,000 | 5 | 5 | Automatic at a 2% fee, or manual |
| Pro | $199 | $50,000 | Unlimited | Unlimited | Automatic, custom payout methods |
| Enterprise | Custom | $50,001 and up | No limits | No limits | Automatic, priority support |
*Tolt's published prices, October 2026. Tolt words its limit as earned from affiliates, which I read as referred revenue, so confirm the meter with Tolt before sizing a plan.*
The meter is where Tolt's price changes. A program growing from $9,000 to $11,000 of monthly affiliate revenue moves from the $69 plan to the $99 plan, and one passing $20,000 moves to $199, which roughly doubles the bill. Automatic payouts carry a 2% fee, so paying affiliates $5,000 in a month adds $100. Basic includes a custom domain and branded portal, and Tolt's 30-day refund policy covers a plan that turns out wrong.
### Why teams look for a Tolt alternative
Billing coverage cuts the list quickly. [Tolt's integrations collection](https://help.tolt.com/en/collections/10506423-integrations) covers Stripe, Paddle Billing, Paddle Classic, Chargebee and an API, and I found no setup guide for Polar or Lemon Squeezy. Teams on those, or on Recurly or Braintree, need a tool that reads them directly.
Payouts differ by plan. On Basic, [Tolt's manual routine](https://help.tolt.com/en/articles/9335977-how-to-manually-pay-affiliates) is a NET-15, NET-30 or NET-60 schedule, a CSV export, payment through PayPal Payouts, Wise Batch Payment or bank transfer, and a mark-as-paid step. Automatic payouts start at Growth.
Tolt is built to run an affiliate program. I found nothing in its help center or on its pricing page that ranks affiliates against ads, SEO or email.
### Tolt alternatives compared on price, billing systems and payouts
| Tool | Entry price a month | Entry limit (revenue) | Billing systems | Payouts | Free option |
| --- | --- | --- | --- | --- | --- |
| Tolt | $69 | $10,000 | Stripe, Paddle, Chargebee | Manual on Basic, automatic from $99 at 2% | 14-day trial |
| PromoteKit | $29 | $10,000 | Stripe | PayPal and Wise, or one-click for a fee | Free plan, 3 referrals |
| Affonso | 15 on yearly billing | $1,000 | Stripe, Paddle Billing, Polar, Creem, Dodo Payments | Bulk payouts, managed from Growth | Trial, 14 days |
| Rewardful | $49 | $7,500 | Stripe, Paddle | Mass payouts, managed at 3% | Trial, 14 days |
| FirstPromoter | $49 | $5,000 | Stripe, Paddle, Chargebee, Recurly, Braintree | Mass payouts by PayPal, Wise, Stripe, crypto, bank | Trial, 14 days |
| TrackRev | $39 | $10,000 of commission | Stripe, Paddle, Polar, Lemon Squeezy | PayPal or Wise CSV, then mark paid | Free plan, link tracking only |
*Prices from each vendor's pricing page, October 2026. Affonso shows euros in its page metadata and dollars in its plan cards, so check the currency at checkout.*
#### The same program on each plan
Entry prices hide the meter. Take a program that refers $8,000 and then $18,000 a month at a 25% commission rate, which makes TrackRev's meter read $2,000 and $4,500 of commission against its $10,000 Starter limit.
| Tool | $8,000 referred | $18,000 referred |
| --- | --- | --- |
| Tolt | Basic, $69 | Growth, $99 |
| PromoteKit | Pro, $29 | Enterprise, contact sales |
| Affonso | Growth, 29 | Elite, 79 |
| Rewardful | Growth, $99 | Enterprise, from $149 |
| FirstPromoter | Business, $99 | Enterprise, $149 |
| TrackRev | Starter, $39 | Starter, $39 |
*Cheapest plan whose published limit covers the revenue. PromoteKit lists no price above $10,000.*
At $8,000 the plans run from $29 to $99, and at $18,000 from $39 to $149, mostly because Rewardful's Starter stops at $7,500 and FirstPromoter's at $5,000. TrackRev's meter helps most at low commission rates: at 30%, its $10,000 covers $33,333 of referred revenue, and at 50% it covers $20,000, the ceiling of Tolt Growth for $60 less.
### How each alternative differs from Tolt
#### PromoteKit, for the lowest price and a free plan
[PromoteKit's free plan](https://www.promotekit.com/pricing) allows 3 referrals and 1 campaign, with unlimited affiliates and PayPal and Wise payouts, so it is the only tool here whose free plan can run a real affiliate program. Pro costs $29, or 25% less on yearly billing, with a $10,000 limit, and adds API access, webhooks, self-referral detection and commission tiers. Its [integrations page](https://www.promotekit.com/integrations) names only Stripe. One-click global payouts add 5% for a bank account or 8% for a card, against Tolt's 2%. Choose it over Tolt for a Stripe-only program under $10,000 that wants the smallest bill.
#### Affonso, for the lowest list price and newer billing systems
[Affonso](https://affonso.io/pricing) lists Launch at 15 a month on yearly billing (19 monthly) for up to $1,000 from partners, Growth at 29 for $10,000 and Elite at 79 for $30,000. Every plan reads Polar and four other billing systems, with unlimited affiliates, custom commission rules and fraud checks. Managed payouts start at Growth, with fees that may apply, and W-8 and W-9 collection is listed only on Elite. Choose it over Tolt when you bill through Polar and stay under $30,000 a month. The [Affonso alternative post](https://www.trackrev.io/blog/affonso-alternative) compares it with TrackRev.
#### Rewardful, for the established Stripe option
[Rewardful](https://www.rewardful.com/pricing) meters affiliate-attributed revenue. Starter is $49 for $7,500 with 1 campaign and 2 team members, Growth is $99 for $15,000, and Enterprise starts at $149 and covers $30,000 on its entry tier. All plans carry a 0% transaction fee, a 14-day trial, coupon tracking and self-referral detection, and yearly billing gives 2 months free. The branded portal and custom domain wait until Growth, where Tolt includes both at $69. Its [integrations page](https://www.rewardful.com/integrations) names Stripe and Paddle, plus plugins for other platforms. Rewardful makes more sense than Tolt when referred revenue stays under $7,500 and you want a tool built around Stripe.
#### FirstPromoter, for more billing systems and recruited partners
[FirstPromoter's](https://firstpromoter.com/pricing) entry plan, Starter, is $49 and tops out at $5,000 of affiliate revenue, 1,000 affiliates and 3 campaigns. Business, at $99, lifts the limit to $15,000 and removes the caps on affiliates and campaigns, and Enterprise is $149 beyond that. It adds Recurly and Braintree to Tolt's billing list, and every plan includes multi-tier commissions across up to 3 levels, cookie life up to 9,999 days and W-9 and W-8BEN collection. Managed auto payouts, postback URLs and SSO sit on Enterprise. Take it over Tolt when billing runs through Recurly or Braintree, or when affiliates should earn on the partners they recruit.
#### TrackRev, for partner revenue next to every other channel
TrackRev starts at $39 a month, and every paid plan includes the affiliate program, link tracking and revenue attribution. Starter meters up to $10,000 of partner commission in one workspace, Growth costs $99 and meters $100,000 across unlimited workspaces, and Scale is $199. Revenue syncs from Polar and Lemon Squeezy as well as Stripe and Paddle. Commissions can be recurring, one-time or multi-tier, paid as cash or credit, held for 0 to 180 days per program (the default is 0), and reversed on refunds and disputes. Partners get a white-label portal and upload tax forms during onboarding.
A partner's link sits on the same data model as every other tracked link, so one channel report ranks affiliates, newsletter, YouTube and paid ads by the MRR each pays under last-touch, first-touch or linear credit. Switch when partners are one channel of several. The [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows the report.
### Where Tolt is still the better pick
Tolt Growth pays affiliates for you through PayPal, Wise, local bank, crypto or wire, generates invoices for affiliates, collects W-9 and W-8 forms and files 1099s. TrackRev exports the batch as a PayPal or Wise CSV for you to pay and mark paid, the routine Tolt Basic uses, and it does not file 1099s.
Tolt's [programs collection](https://help.tolt.com/en/collections/3809121-programs) also documents commission flows (3 on Basic, 5 on Growth, unlimited on Pro) with triggers on a new signup or payment, time-limited rates and tiers by customer count, plus settings that block commissions from ad platforms or social media and partners from specific countries. Its [self-referral block](https://help.tolt.com/en/articles/9996886-how-to-block-self-referrals) compares the referrer's email with the customer's. TrackRev lists fraud and self-referral detection without that detail, so compare your flows with its per-program commission rules. TrackRev does not read Chargebee.
If affiliates are the only channel you will measure, TrackRev's attribution goes unused, and the [Stripe affiliate software comparison](https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026) helps you choose among the others.
### Moving a program off Tolt
- Export your affiliates from Tolt as a CSV, keeping the referral link or code column.
- Upload it to TrackRev on a paid plan. The import wizard needs only an email per row, reuses each referral code as the TrackRev link code, imports coupon codes and status, and writes each unpaid balance as one carried-over commission. Past clicks, leads, sales and revenue arrive as opening balances.
- Connect billing and add the new tracking beside Tolt's.
- Keep both running through your cookie window, since a visitor who clicked a Tolt link before the switch still carries a Tolt identifier, and pay commissions from one system only so no sale is paid twice. Then remove Tolt's script, which exposes `window.tolt_referral`, and the checkout code that passes `tolt_referral` to Stripe metadata.
- Ask affiliates to swap any link on a vendor domain for one on yours, and pay out what Tolt already tracked before you cancel.
### Test the tracking before you cancel Tolt
Run one test purchase through your real checkout. Click a test affiliate's link, pay with [Stripe's](https://docs.stripe.com/testing) 4242 4242 4242 4242 test card, confirm the commission lands on that affiliate, then refund it and confirm it reverses. Tolt's pricing FAQ says commissions stop when Stripe or Paddle reports a cancellation and are deducted on refunds, which is the behavior to match. TrackRev reverses refunds and disputes from Stripe webhooks, and the [refunds and upgrades post](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) covers the cases.
Ask how the tool remembers the click. [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) says Safari Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without user interaction, so a visitor who clicks on day 1 and buys on day 9 can arrive unattributed when a script wrote the cookie. [Tolt's Stripe guide](https://help.tolt.com/en/articles/6843411-how-to-set-up-stripe-with-tolt) documents the script and metadata key but not the cookie, so ask the vendor. TrackRev logs the click server-side at the tracked redirect, and the [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers the effect on SaaS conversions.
Check where the referral ID is stored. Stripe's [metadata documentation](https://docs.stripe.com/metadata) allows 50 key-value pairs, with 40-character keys and 500-character values, and says metadata does not copy to related objects except in listed cases such as a Subscription's snapshot onto its Invoices. A checkout outside the paths a vendor documents (Stripe Checkout, Payment Links, Pricing Tables, Buy Button) is the first place to look when referral IDs arrive empty.
TrackRev's free tier covers link tracking (50 links, 1,000 tracked events a month), enough to test redirects and click logging, while the affiliate program and revenue figures start on Starter at $39. Annual billing charges for 9 months and gives 12. [Pricing](https://www.trackrev.io/pricing) lists the plans, and the [Tolt comparison page](https://www.trackrev.io/compare/tolt) sets the two tools side by side.
### Frequently asked questions
**What is the best Tolt alternative for a Stripe SaaS?**
It depends on program size and billing system. Under $10,000 of referred revenue, PromoteKit ($29) and Affonso Growth (29) cost least. Between $10,000 and $15,000, Affonso Elite (79) undercuts the $99 plans at Tolt, Rewardful and FirstPromoter. TrackRev suits teams that also run paid, content and newsletter channels.
**Is there a free Tolt alternative?**
PromoteKit offers a free plan limited to 3 referrals and 1 campaign. On TrackRev the free tier stops at link tracking, since the affiliate program needs Starter. The others sell 14-day trials.
**Which Tolt alternative supports multi-level commissions?**
FirstPromoter includes multi-tier commissions across up to 3 levels on every plan, and Affonso lists multi-level commissions from Growth. TrackRev's Partner Accelerator pays up the referral chain from one capped pool, so a deeper chain divides the same pool.
**Can I move my affiliates and their balances out of Tolt?**
Yes, from a CSV export. Affonso lists affiliate import and migration help on every plan, and FirstPromoter says it imports historical Stripe data when you migrate.
**Does TrackRev pay my affiliates automatically?**
No. You pay from your own account and mark each payout paid with its payment reference. Tolt Growth and higher plans can send the money for you at a 2% processing fee.
**Can I keep Tolt for affiliates and add TrackRev for other channels?**
You can, with one gap: partner clicks on Tolt's links never pass through TrackRev, so its channel report cannot show partner revenue.
---
## Tolt vs TrackRev: what $69 and $39 a month each buy
URL: https://www.trackrev.io/blog/tolt-vs-trackrev
Published: 2026-07-24
Author: Muzahid Maruf
Tolt vs TrackRev in October 2026: Tolt costs $69, $99 or $199 a month and can pay partners for you. TrackRev starts at $39 and ranks every channel.
Tolt vs TrackRev comes down to price steps, billing systems, who sends partner payouts, and whether partner revenue belongs next to your other channels. Tolt costs $69, $99 or $199 a month depending on how much your affiliates bring in, reads Stripe, Paddle and Chargebee, and pays partners for you from the $99 plan. TrackRev starts at $39, reads Stripe, Paddle, Polar and Lemon Squeezy, leaves the paying to you, and ranks partners against every other channel you run.
I build TrackRev, so weigh my read accordingly. Tolt's figures come from its [pricing page](https://tolt.com/pricing), its [Help Center](https://help.tolt.com/en/) and its [public tracking script](https://files.tlt-cdn.com/tlt.js), all read in October 2026. The [Tolt alternatives post](https://www.trackrev.io/blog/tolt-alternative) covers other options.
> **Key takeaways:**
>
> - Tolt charges $69, $99 or $199 monthly for $10,000, $20,000 or $50,000 earned from affiliates, and TrackRev charges $39, $99 or $199 by partner commission ($10K, $100K or unlimited). At a 25% rate, $45,000 of partner sales needs Tolt Pro at $199 and TrackRev Growth at $99.
> - Billing can decide it outright: Tolt reads Chargebee, and TrackRev reads Polar and Lemon Squeezy.
> - Tolt sends partner payments from its $99 plan for a 2% fee and files 1099 forms, while TrackRev gives you a payout CSV.
> - Tolt's flows vary commission by plan, billing interval and customer count. TrackRev sets one rate per program, with partner-group overrides, and ranks partners next to newsletter, YouTube and paid ads.
### Tolt vs TrackRev at a glance
| Area | Tolt | TrackRev |
| --- | --- | --- |
| Billing systems | Chargebee, Paddle Billing, Paddle Classic, Stripe | Lemon Squeezy, Paddle, Polar, Stripe |
| Click recording | 4KB script posts the click to Tolt's API | Redirect host logs the click on the server |
| Commission rules | Flows: 3 on Tolt Basic, 5 on Tolt Growth, unlimited on Tolt Pro | One rate per program, overridden by partner group |
| Paying partners | Manual on Tolt Basic, automatic from Tolt Growth at 2% | Export a CSV, pay it, mark paid |
| Channel reporting | Partner reporting only, per its docs | Partners ranked with every other channel |
### Pricing: Tolt's three paid steps against TrackRev's three
The two price lists word their limits differently. Tolt's is money earned from affiliates, and TrackRev's is the commission partners earn.
| Plan | Price per month | Monthly limit | Programs |
| --- | --- | --- | --- |
| Tolt Basic | $69 | $10,000 | 2 |
| Tolt Growth | $99 | $20,000 | 5 |
| Tolt Pro | $199 | $50,000 | Unlimited |
| TrackRev Starter | $39 | $10K | Unlimited |
| TrackRev Growth | $99 | $100K | Unlimited |
| TrackRev Scale | $199 | No limit | Unlimited |
*Prices from each vendor's pricing page, October 2026. Tolt Enterprise starts above $50,000 with no listed price, and TrackRev's limit counts partner commission tracked.*
[Tolt's pricing page](https://tolt.com/pricing) adds a 14-day trial that asks for no card, a 30-day refund policy and a 0% commission claim on top of the plan price. Tolt Basic also has 3 partner groups, 3 team members and 3 commission flows, Tolt Growth has 5 of each, and Tolt Pro has no limit. The page shows no yearly rate.
Every paid TrackRev plan includes the full affiliate program, white-label partner pages and unlimited partners, and TrackRev Scale adds priority support. Paying yearly buys 12 months for the price of 9, so Starter costs $351.
#### The same program on each plan
Assume partners earn 25% of every sale. The table finds the cheapest plan whose published limit covers each month, reading Tolt's limit as referred sales.
| Monthly partner sales | Commission owed at 25% | Tolt plan | TrackRev plan |
| --- | --- | --- | --- |
| $9,500 | $2,375 | Tolt Basic, $69 | TrackRev Starter, $39 |
| $19,000 | $4,750 | Tolt Growth, $99 | TrackRev Starter, $39 |
| $45,000 | $11,250 | Tolt Pro, $199 | TrackRev Growth, $99 |
| $80,000 | $20,000 | Enterprise, price on request | TrackRev Growth, $99 |
| $440,000 | $110,000 | Enterprise, price on request | TrackRev Scale, $199 |
*Tolt doesn't say whether its limit counts referred sales or commissions, so confirm that before sizing a plan.*
The commission rate moves TrackRev's column. TrackRev Starter's $10,000 covers $100,000 of sales at 10%, $40,000 at 25% and $20,000 at 50%. Past the limit, new commission stops accruing until you upgrade or the month rolls over. Tolt's pricing page doesn't say what happens above a limit.
### Billing systems
[Tolt's integrations collection](https://help.tolt.com/en/collections/10506423-integrations) has 14 articles, with setup guides for Stripe (Checkout, Payment Links, Pricing Tables and the Buy Button), Paddle Billing, Paddle Classic and Chargebee. The FAQ on its pricing page still says Tolt works only with Stripe or Paddle, though the Help Center and the comparison block above that FAQ both list Chargebee.
TrackRev has no Chargebee connector but reads [Polar](https://www.trackrev.io/integrations/polar) and Lemon Squeezy as well as Stripe and Paddle. A Chargebee shop therefore picks Tolt, a Polar or Lemon Squeezy shop picks TrackRev unless it wants to build on Tolt's API, and everyone on Stripe or Paddle Billing can choose on other grounds.
### How each tool connects a click to a charge
#### Tolt: a script on your site, then metadata in your checkout
Tolt's [4KB tracking script](https://files.tlt-cdn.com/tlt.js) reads the referral from a parameter in the URL of the page a visitor lands on. It checks 11 parameter names, including ref, via and fpr, posts the click to Tolt's API and writes a referral cookie with JavaScript, for as long as the API says or 30 days if it says nothing.
The last step is yours. [Tolt's Stripe guide](https://help.tolt.com/en/articles/6843411-how-to-set-up-stripe-with-tolt) has your backend pass the referral ID to Stripe as metadata when it creates a subscription or a Stripe Checkout Session, as below. Payment Links get a snippet that appends the ID to each link, and a signup call attaches the referral to an email address.
Tolt: recording a signup, then passing the referral ID to a Checkout Session (adapted from its help center)
```
// Browser: after the visitor signs up
if (window.tolt_referral) {
window.tolt.signup(email);
}
// Server: when you create the Checkout Session
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
metadata: { tolt_referral: req.body.referral },
success_url: "https://example.com/success",
cancel_url: "https://example.com/cancel",
});
```
#### TrackRev: a redirect host, then a pixel
TrackRev partner links point at a redirect host: your own go.yourbrand.com after one CNAME record, a hosted trackrev.io subdomain or the shared short host. The redirect logs the click on the server and hands a visitor ID to your pixel in the URL. The pixel tags Stripe Payment Links and Buy Buttons itself, and for Checkout Sessions your server creates, you pass the vid cookie along, as below. Revenue arrives through an hourly Stripe sync on a read-only restricted key, and a buyer who skips the ID is matched by the email you passed to identify.
TrackRev: passing the visitor ID to a Checkout Session (Next.js)
```
import { cookies } from "next/headers";
const vid = (await cookies()).get("vid")?.value;
const session = await stripe.checkout.sessions.create({
line_items: [{ price: "price_123", quantity: 1 }],
mode: "subscription",
success_url: "https://example.com/thanks",
client_reference_id: vid,
});
```
#### Safari and the 7-day cookie rule
Both scripts write their ID cookie with JavaScript, and [WebKit says](https://webkit.org/tracking-prevention/) Safari Intelligent Tracking Prevention deletes those after 7 days of no user interaction. A visitor who clicks on day 1 and buys on day 9 can arrive without an ID in either tool. An email captured earlier survives the gap, so call Tolt's signup or TrackRev's identify from your signup form on day one.
### Commission rules and fraud controls
Tolt's rule engine is the part I would copy. Per [its flows guide](https://help.tolt.com/en/articles/10044884-what-are-flows), a flow pairs a trigger (a new signup or a new payment, renewals included) with an action (issue a commission or move the partner to another group) and optional conditions on the partner, the customer or the transaction. Help Center recipes include 20% on one plan and 15% on another, a rate that climbs from 25% to 35% to 50% at 5 and 20 customers, and commissions that end 12 months after conversion. Tolt Basic includes 3 flows, Tolt Growth 5 and Tolt Pro no limit.
TrackRev's settings are plainer. A program sets a percent or flat commission, paid once, for a number of months or for life, with a cookie window that defaults to 60 days and runs from 1 to 3,650. Partner groups override the rate, term, cookie window and minimum payout. [Partner Accelerator](https://www.trackrev.io/products/partner-accelerator) pays commission up a referral chain from one pool capped at 30% by default, and I found no multi-level commissions in Tolt's Help Center. No TrackRev rule varies the rate by plan, billing interval or customer count.
Tolt's Radar settings go deeper on fraud, with [blocks for ad traffic](https://help.tolt.com/en/articles/13343013-how-to-block-commissions-from-ad-platforms) from YouTube, Google and Bing, social traffic from 5 networks, same-email self-referrals, chosen parameter keywords and chosen countries. TrackRev lists fraud and self-referral detection as built in, without a rule list that long.
### Paying partners, holds and tax forms
On Tolt Basic you pick a NET-15, NET-30 or NET-60 schedule, download a CSV, pay through PayPal Payouts, Wise Batch Payment or a bank transfer, and mark the payout paid, per [its manual payout guide](https://help.tolt.com/en/articles/9335977-how-to-manually-pay-affiliates). From Tolt Growth, [automatic payouts](https://help.tolt.com/en/articles/9924816-how-do-auto-payouts-work) have Tolt draft an invoice before each payout date, you pay it by bank transfer or card, and Tolt sends the partners their money. Tolt also collects W-9 and W-8 forms and files 1099 forms, and partners without tax details or a payout method are left off the invoice.
TrackRev closes a payout batch weekly, every 2 weeks, monthly, quarterly or by hand. You download one PayPal or Wise CSV, pay it from your own account and mark each payout paid with its reference. Partners upload W-9 or W-8 forms during onboarding. TrackRev neither moves money nor files 1099 forms, and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers the rails and tax rules.
#### The same $5,000 month
A program near the top of Tolt Growth, $20,000 of partner sales at 25%, owes partners $5,000. Tolt Growth with automatic payouts costs $99 plus a 2% fee, which is $100 if the fee applies to the amount paid out, so $199 and no payout work. TrackRev Starter costs $39 and leaves you to pay the CSV, which makes the monthly upload worth $160 of your time.
Set the hold before the first payout on either tool. TrackRev's hold period counts days after a payout period closes, runs from 0 to 180 and defaults to 0, so a new program pays as soon as a period closes. Match either to your refund window, because commission paid on a refunded sale has to be clawed back, and [affiliate commissions on Stripe refunds](https://www.trackrev.io/blog/stripe-affiliate-commission-refunds-upgrades) covers the reversal rules.
### What TrackRev adds: partner revenue beside your other channels
I read 48 articles in Tolt's Programs collection, which covers partners, customers, commission flows, fraud rules and messaging, and found nothing that ranks partners against Google Ads, newsletter or organic search traffic. TrackRev's links, pixel and affiliate program share one data model, so a single [revenue attribution report](https://www.trackrev.io/solutions/revenue-attribution) ranks partners, newsletter, YouTube and paid ads by the MRR each one pays.
The credit rule is set once for the whole workspace, so choose it before launch. Take a buyer who clicks partner A's link, then partner B's, then subscribes at $60 a month with commission at 25%, which is $15.00.
| Credit rule | Who earns the commission | Amount per month |
| --- | --- | --- |
| Last click | Partner B | $15.00 |
| First click | Partner A | $15.00 |
| Shared | Partners A and B | $7.50 each |
### When Tolt is the better pick
- Tolt Growth ($99) handles partner payments and tax filing, where TrackRev stops at a CSV.
- Flows can pay a different rate per plan, per billing interval, or once a partner passes a customer count.
- Chargebee billing works with Tolt and not with TrackRev.
- Tolt's trial and refund window let you test with real partners, while TrackRev's free plan covers link tracking only, with 50 links and 1,000 events a month.
- Tolt's script reads a parameter on your own pages, so you set up no redirect host.
- If partners are your only channel, TrackRev's channel report would sit unused.
### When TrackRev is the better pick
Entry price is the plain reason: $39 against $69, and because the meter counts commission, a program stays on TrackRev Starter until partners earn $10,000 a month. At 25% that is $40,000 of sales, where the same sales put you on Tolt Pro at $199. TrackRev Starter also has unlimited programs against Tolt Basic's 2, and Tolt has no native Polar or Lemon Squeezy connector. The channel report matters once a newsletter, a YouTube channel or paid search is worth comparing with partners on one axis, and TrackRev Growth and Scale add unlimited workspaces for agencies and multi-product companies.
### Moving partners from Tolt to TrackRev
TrackRev lists Tolt as a CSV import source on every paid plan, from TrackRev Starter at $39. Export your partners from Tolt with the referral code column, then upload the file. Only email is required. Each referral code becomes the slug of that partner's TrackRev link, coupon codes keep crediting the partner, historical clicks, leads and sales arrive as opening balances, and each unpaid balance becomes a single carried-over commission.
Links partners already posted carry Tolt's parameter, which TrackRev's pixel doesn't read, so they need the new URLs. Run both scripts for at least your longest cookie window (Tolt's 30-day fallback, TrackRev's 60-day default), pay each sale from one system only, then remove Tolt's script and the checkout code that sends the referral ID to Stripe metadata. The [Tolt comparison page](https://www.trackrev.io/compare/tolt) lines the two tools up row by row, and [pricing](https://www.trackrev.io/pricing) lists every TrackRev plan.
### Frequently asked questions
**How much does Tolt cost compared with TrackRev?**
Tolt's plans are $69, $99 and $199 and step up at $10,000 and $20,000 earned from affiliates. TrackRev's are $39, $99 and $199 and step up at $10K and $100K of commission. Tolt also gives a 14-day trial without a card.
**Does Tolt work with Paddle, Chargebee, Polar or Lemon Squeezy?**
Tolt has setup guides for Stripe, both Paddle versions and Chargebee, and none for Polar or Lemon Squeezy. TrackRev covers the reverse: Polar and Lemon Squeezy yes, Chargebee no.
**Can TrackRev pay affiliates automatically like Tolt?**
No. You pay the batch from your own PayPal or Wise account and mark each payout paid. Tolt Growth and Tolt Pro send the money themselves.
**Does Tolt track newsletter, SEO or paid traffic?**
The 48 programs articles I read describe no report that ranks other channels. TrackRev's attribution report ranks all of them.
**Does Safari break Tolt or TrackRev tracking?**
Neither tool is immune, because both scripts write their cookies with JavaScript and Safari deletes those after 7 days without a visit. An email address captured at signup lets a late purchase still match.
**Can I import my Tolt partners into TrackRev?**
Yes, from a CSV export, on any paid plan from $39. Email is the only required column, and referral codes, coupon codes, historical totals and unpaid balances come across when the file has them.
---
## How to track links in newsletters and tie each one to revenue
URL: https://www.trackrev.io/blog/track-links-in-newsletters-revenue
Published: 2026-07-11
Author: Muzahid Maruf
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.
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](https://mailchimp.com/help/enable-and-view-click-tracking/) when a request passes through its servers, and it says [bot activity such as Apple's Mail Privacy Protection](https://mailchimp.com/help/about-open-and-click-rates/) 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](https://www.apple.com/newsroom/2021/06/apple-advances-its-privacy-leadership-with-ios-15-ipados-15-macos-monterey-and-watchos-8/) 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](https://support.google.com/analytics/answer/10917952) 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](https://support.google.com/analytics/answer/9756891) 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](https://www.trackrev.io/tools/utm-builder) writes the strings.
| Placement | utm_source | utm_medium | utm_campaign | utm_content |
| --- | --- | --- | --- | --- |
| Hero button | newsletter | email | 2026-10-06-weekly | hero |
| First body link | newsletter | email | 2026-10-06-weekly | body-1 |
| Second body link | newsletter | email | 2026-10-06-weekly | body-2 |
| PS line | newsletter | email | 2026-10-06-weekly | ps |
*One issue, four placements, one destination.*
> **Write the tags in one place:** Mailchimp's [Google Analytics integration](https://mailchimp.com/help/integrate-google-analytics-with-mailchimp/) 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](https://www.trackrev.io/products/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.
newsletter-oct-06.csv: one row per placement
```
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,newsletter
```
#### Step 3: Keep scanner and prefetch clicks out of the count
Mailchimp's page on [bot activity](https://mailchimp.com/help/about-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](https://www.trackrev.io/blog/bot-traffic-filtering-for-links) 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](https://webkit.org/tracking-prevention/) 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](https://docs.stripe.com/payment-links/url-parameters), 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](https://docs.stripe.com/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.*
Checkout Session that carries the visitor ID onto the subscription
```
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](https://www.trackrev.io/blog/stripe-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](https://www.trackrev.io/blog/attribution-models-saas-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](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data) 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 logs each newsletter click on its own server, adds the link's saved UTM tags, and joins clicks to payments from Stripe, Paddle, Polar and Lemon Squeezy. 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 Starter at $39 a month, and Growth is $99 and Scale $199, with annual billing charging 9 months for 12 ([pricing](https://www.trackrev.io/pricing)). TrackRev does not send or segment email. The [Links and Analytics page](https://www.trackrev.io/solutions/links-and-analytics) 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.
### Frequently asked questions
**Can I track newsletter clicks without changing my email tool?**
Yes. Swap each raw URL in the issue for a tracked short link and keep sending from your current tool.
**Why do my newsletter links get clicks seconds after I send?**
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.
**How long should I wait before judging an issue by revenue?**
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.
**Do I need the pixel to track newsletter clicks?**
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.
**Can Google Analytics 4 alone show newsletter revenue?**
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.
**Does newsletter link tracking work on the free plan?**
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 $39 a month.
---
## Tracking links shared in Slack and Discord: a six-step setup that ignores preview bots
URL: https://www.trackrev.io/blog/track-links-shared-slack-discord
Published: 2026-07-11
Author: Muzahid Maruf
Slack and Discord clicks often carry no source, and preview bots hit your link first. Give each place its own short link and count clicks on your own server.
To track links shared in Slack and Discord, give each channel or server its own short link on a domain you control and count clicks at that redirect. A click from a chat app often reaches your site with no referring page, which Google Analytics 4 reports as Direct, and both apps fetch the URL themselves within moments of the post, so your log shows a bot request before the first person clicks. This works for links you control: ones you post, or hand to a customer or community manager to post.
> **Key takeaways:**
>
> - Google Analytics 4 files a session as Direct when its source is exactly (direct) and its medium is (none) or (not set), which is how an untagged click from a chat app can land.
> - Slackbot-LinkExpanding 1.0 and Discordbot/2.0 fetch a link the moment it is posted, and Slack ignores robots.txt and caches for about 30 minutes, so the filter has to live in your own click log.
> - One short link per channel, server or workspace carries the source even when the app sends no referrer.
> - Flag crawler requests and still redirect them. Then rank links by revenue per 100 clicks once the trial and confirmation time have passed: in the invented example, 86 clicks earn $181.40 per 100 and 1,190 clicks earn $9.83.
> - TrackRev's Free plan covers 50 links and 1,000 tracked events a month, and revenue per link starts on Starter at $39.
### Why Slack and Discord clicks arrive without a source
Alexis Madrigal named the problem in [The Atlantic](https://www.theatlantic.com/technology/archive/2012/10/dark-social-we-have-the-whole-history-of-the-web-wrong/263523/) on October 12, 2012. He called it dark social: visits with no referrer data, which he traced to email programs, instant messages, some mobile apps and secure-to-non-secure links. Analytics tools file them as direct. Google Analytics 4 does so by rule. Its [default channel group](https://support.google.com/analytics/answer/9756891) defines Direct as a source of exactly (direct) with a medium of (none) or (not set), and Google's [direct traffic help](https://support.google.com/analytics/answer/15258820) adds that redirects and URL shorteners can strip the details that identify a source.
Web clients can drop the referrer too: `rel="noreferrer"` makes the browser omit the Referer header, [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/noreferrer) says. Whether each Slack and Discord client sends one today is worth measuring in step 2, and an app update can change the answer.
### What the preview crawlers do to your click count
Both apps request a link when someone posts it, to draw a preview card, and those requests reach your server before any reader does.
| Crawler | User agent | What it does | Source |
| --- | --- | --- | --- |
| Slackbot-LinkExpanding | Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots) | Reads oEmbed, Twitter Card and Open Graph tags with HTTP Range headers, then fetches any image, video or audio file those tags name | [Slack Robots page](https://api.slack.com/robots) |
| Slack-ImgProxy | Slack-ImgProxy 0.19 (+https://api.slack.com/robots) | Fetches and caches images posted to channels | Slack Robots page |
| Slackbot | Slackbot 1.0 (+https://api.slack.com/robots) | Makes every other HTTP request Slack needs, such as API calls and outgoing webhooks | Slack Robots page |
| Discordbot | Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com) | Visits a link when it is shared in a message to build the preview card, and does no continuous crawling | [Discord Support](https://support.discord.com/hc/en-us/articles/42500550752919-About-Discord-Link-Previews-and-the-Discordbot) |
| Rule | Threshold | Source |
| --- | --- | --- |
| Slackbot-LinkExpanding responses are cached across the service | Around 30 minutes, at most 1 request per URL | Slack Robots page |
| No preview expands for a link already shared in the same conversation | Within 1 hour | [Slack Help Center](https://slack.com/help/articles/204399343-Share-links-and-set-preview-preferences) |
| No preview expands in a message with | More than 5 links | Slack Help Center |
*Slack preview rules that shape what reaches your log.*
Slack ignores robots.txt, saying it acts for a human and does not follow links like a crawler. Because the cache is service-wide, one link posted in 3 workspaces within half an hour can produce a single Slackbot request that no log can assign to a workspace. Version numbers drift: Slack's page shows Slack-ImgProxy 0.19, while the [crawler-user-agents list](https://github.com/monperrus/crawler-user-agents) on GitHub records 0.59, 0.66, 1.106, 1.138 and 149. Discord's help article, updated October 3, 2026, says to match the word Discordbot anywhere in the string.
| Time (UTC) | Link | User agent | Counted |
| --- | --- | --- | --- |
| 14:02:09 | sl-tools | Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots) | No |
| 14:02:11 | dc-launches | Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com) | No |
| 14:03:40 | dc-launches | iPhone 15, Safari 17.5 | Yes |
| 14:05:27 | sl-tools | Windows 11, Chrome 130 | Yes |
| 14:09:12 | dc-launches | Windows 10, Firefox 131 | Yes |
| 14:21:58 | sl-tools | MacBook Air, Safari 17.4 | Yes |
| 14:31:15 | dc-launches | Ubuntu 24.04, Chromium 130 | Yes |
| 14:48:30 | dc-launches | Pixel 8, Chrome 130 | Yes |
| 15:02:44 | sl-tools | iPad Air, Safari 17.5 | Yes |
| 15:20:03 | sl-tools | Galaxy S23, Chrome 129 | Yes |
*Invented log for 2 links over about an hour. Counting every row reports 10 clicks for 8 visits, 25% too many.*
### How to track links shared in Slack and Discord
The examples below follow one page, example.com/pricing, posted in 1 Discord server, 2 Slack workspaces and a set of founder DMs, with a $39 monthly plan.
#### Step 1: Give every place its own short link
Create one link per place, each pointing at the same destination, and name it after the place: Discord #launches, Community Slack #tools, Acme customer Slack. Every click then belongs to that place whether or not the app sends a referrer.
In TrackRev's New campaign form, pick "A link per channel" and add a custom short link. The channel picker offers 9 channels and neither Slack nor Discord is one, but bulk CSV import (up to 500 rows) and the REST API accept both. A `slack` or `discord` row stamps `utm_source` and `utm_medium=social` on the destination, unless the destination already has its own tags.
bulk-import.csv: one row per place, all pointing at the same page
```
url,name,channel,utm_campaign,utm_term,utm_content,tags
https://example.com/pricing,Discord #launches,discord,oct-launch,,launches,community
https://example.com/pricing,Community Slack #tools,slack,oct-launch,,tools,community
https://example.com/pricing,Acme customer Slack,slack,oct-launch,,acme,customer
```
Skip Smart Links for these two apps. A Smart Link guesses the channel from the referrer. Slack proxies or strips the referrer, so TrackRev has no Slack mapping and those clicks land in Other or Direct. Discord is on the recognized list, but only a click carrying a discord.com referrer gets the label.
Put the links on your own domain with one CNAME record ([custom tracking domains](https://www.trackrev.io/products/custom-tracking-domains)). If you tag destination URLs by hand, the [free UTM builder](https://www.trackrev.io/tools/utm-builder) writes the tags, and medium `social` lands in Organic Social under Google's channel rules. A redirect that forgets to forward the query string drops them, and the [5-step stripped-UTM test](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) finds the hop that does it.
#### Step 2: Post a test link in each app
Post a fresh link in a private channel or test server on each client: desktop, web and phone. That is 6 test posts across the 2 apps. Use a new link per test because of the 1-hour rule above, and one link per message because Slack expands none in a message with more than 5, then click each one from each client and read the report. A client that sends no referrer costs you nothing, because the link's name carries the source.
| What to read | Where | What you may find |
| --- | --- | --- |
| The preview fetch | `GET /api/v1/clicks?bots=include` | A row with a Slackbot-LinkExpanding or Discordbot user agent and `is_bot` set to true |
| The referrer | The Top referrers card on the link's page | Nothing, a chat domain, or the browser's own page, depending on the client |
| Device and browser | The breakdown cards on the same page | Whatever you clicked from, so check it against the phone or laptop in your hand |
#### Step 3: Flag preview fetches and still redirect them
Match crawlers on a user-agent substring (Slackbot, Discordbot), flag the request as a bot, store it, and leave it out of the counts. I would not block them, because a refused fetch leaves the post bare. Discord publishes its public IP ranges in 2 formats, JSON and TXT, for anything that needs more than a spoofable user agent. The [bot filtering guide](https://www.trackrev.io/blog/bot-traffic-filtering-for-links) covers prefetch headers and empty user agents.
TrackRev does this at the redirect with the isbot 5 user-agent list, which matches all 4 crawlers in the first table, plus empty user agents and prefetch headers. A flagged request is still redirected and stored with `is_bot` set, and the link page, attribution and partner reports leave it out.
#### Step 4: Carry the click to the signup and the payment
A click becomes revenue when the visitor ID reaches the payment. TrackRev's first-party pixel reads the ID on your first pageview, an email address binds the visitor to the customer at signup or checkout, and Stripe is read with a restricted key every hour, or by webhook for updates within seconds. Built by hand, the shape is the same:
| Hop | Field | Limit |
| --- | --- | --- |
| Redirect response | `vid` cookie, plus a `_vid` URL parameter in TrackRev | 1 year for the cookie |
| Stripe Payment Link | [client_reference_id](https://docs.stripe.com/payment-links/url-parameters), returned in `checkout.session.completed` | 200 characters |
| Stripe objects with metadata | [Metadata](https://docs.stripe.com/metadata) key-value pairs | 50 pairs, keys to 40 characters, values to 500 |
The [Payment Links walkthrough](https://www.trackrev.io/blog/stripe-payment-links-attribution) has the setup. Two gaps stay open: a click in the phone app followed by a laptop visit to your address arrives as Direct, and a signup email that differs from the payment email can slip past the join.
#### Step 5: Rank links by revenue per 100 clicks
Raw clicks reward the biggest audience. Divide by counted clicks to compare places of different sizes.
| Link | Counted clicks | Signups | Paid | Signups per 100 clicks | MRR | MRR per 100 clicks |
| --- | --- | --- | --- | --- | --- | --- |
| Discord #launches | 1,190 | 14 | 3 | 1.18 | $117 | $9.83 |
| Community Slack #tools | 640 | 9 | 1 | 1.41 | $39 | $6.09 |
| Acme customer Slack | 302 | 11 | 6 | 3.64 | $234 | $77.48 |
| Founder DM shares | 86 | 6 | 4 | 6.98 | $156 | $181.40 |
*Invented numbers on a $39 monthly plan. The Discord link has the most clicks and the founder DMs have the highest revenue per 100 clicks.*
Discord #launches brings 53.7% of the 2,218 clicks and 21.4% of the $546 MRR. The founder DMs bring 3.9% of the clicks and 28.6% of the MRR. Acme converts 6 of 11 signups to paid (54.5%) against 3 of 14 for Discord (21.4%). Four paying customers from 86 clicks is too small a sample to repeat on purpose, so test the lead with a second batch of DMs.
#### Step 6: Wait out the trial before you judge a link
A link's revenue arrives after the click by the length of your trial plus the payment's confirmation time, and some payment methods, such as SEPA Direct Debit, confirm later. For a 14-day trial and a click on October 1 (a 30-day trial moves the charge to October 31):
| Event | Date | Days after click |
| --- | --- | --- |
| Click | October 1 | 0 |
| Trial ends, first card charge in Stripe | October 15 | 14 |
| Alternative: a 30-day trial ends, first card charge | October 31 | 30 |
| Earliest fair comparison | Some days after October 15, once Stripe reports the debit as paid | 15 or more |
### What these links can't tell you
A redirect logs a device, a place and a time, and a name appears only when the visitor later signs up. A Slack link copied into a DM keeps crediting its original place, and a teammate who types your domain without the link sends Direct traffic. A signup field asking how people heard about you catches those, and the post on [self-reported versus tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data) covers weighing the two.
### What TrackRev does here, and when you don't need it
TrackRev logs each click on the server with time, country, city, device, browser, operating system and referrer, adds the link's saved UTM tags to the destination, and joins clicks to payments from Stripe, Paddle, Polar and Lemon Squeezy. Revenue per link needs a paid plan ([pricing](https://www.trackrev.io/pricing)).
| Plan | Price | Links | Tracked events | Revenue per link |
| --- | --- | --- | --- | --- |
| Free | $0 | 50 | 1,000 a month | Hidden |
| Starter | $39 a month | Unlimited | Unlimited | Shown |
| Growth | $99 a month | Unlimited | Unlimited | Shown |
| Scale | $199 a month | Unlimited | Unlimited | Shown |
*TrackRev plans for link tracking, October 2026.*
If you only need to know whether Slack sends sessions, a UTM link and Google Analytics 4 are free and enough, and any shortener with bot filtering covers plain click counts. The [Links and Analytics page](https://www.trackrev.io/solutions/links-and-analytics) lists what a link records.
### Frequently asked questions
**Why does traffic from Slack show up as Direct in Google Analytics 4?**
A click from a chat app often carries neither a referrer nor UTM tags. Add the 3 core tags (utm_source, utm_medium and utm_campaign) to the destination, or share a short link that adds them.
**Can I see which Slack or Discord members clicked my link?**
No. A redirect records device, browser, location, time and referrer, and no member name. A name appears only after the visitor signs up or pays.
**How do I stop Slackbot and Discordbot from inflating click counts?**
Flag requests whose user agent contains Slackbot or Discordbot, count only the rest, and keep redirecting the flagged ones. A robots.txt Disallow rule will not help, because Slack says it ignores that file.
**Can I track a link in a Slack workspace or Discord server I don't run?**
Yes, when the link is yours. The count happens when someone requests your short link, so you need no access to the workspace.
**Can I track clicks on a Discord server invite?**
Share a short link that redirects to the invite URL. You count clicks, and a click is not a join. Discord's invite settings control how long an invite lasts and how many times it can be used.
**Should I use UTM parameters or a short link in Slack and Discord?**
A tagged URL is enough for Google Analytics 4 sessions by source when the whole URL stays intact. A short link adds a server-side click log, a bot flag and, with a payment connection, revenue per link.
---
## Trackdesk alternatives for SaaS: what six tools cost and who each fits
URL: https://www.trackrev.io/blog/trackdesk-alternative
Published: 2026-07-14
Author: Muzahid Maruf
Trackdesk lists no free plan and starts at $299 a month on yearly billing. Six Trackdesk alternatives for SaaS affiliate programs, with October 2026 prices.
The best Trackdesk alternative for a SaaS affiliate program billed through Stripe is usually a tool that starts under $100 a month: TrackRev at $39, Rewardful and FirstPromoter at $49, or Tolt at $69. Tapfiliate suits programs that sell on Shopify and by subscription, and PartnerStack suits B2B partner ecosystems with a budget to match. Trackdesk stays the better pick for affiliate networks, automated payouts and a marketplace of ready-made affiliates.
Trackdesk's [pricing page](https://trackdesk.com/pricing) lists no free plan, only a 14-day trial, so entry means Business at $299 a month on yearly billing. Every other price here comes from each vendor's own page, read in October 2026. I build TrackRev, so it is entry 6 and gets judged on the same terms as the rest.
> **Key takeaways:**
>
> - Trackdesk lists no free plan. After a 14-day trial, Business costs $299 a month on yearly billing and $399 month to month.
> - Rewardful, FirstPromoter, Tolt and TrackRev start between $39 and $69. The first three cap affiliate revenue at $5,000 to $10,000 on the entry tier, while TrackRev meters partner commission.
> - Affiliates bringing in $12,000 of sales a month at a 20% commission cost $99 on Rewardful or FirstPromoter, $39 on TrackRev Starter and $299 or more on Trackdesk Business.
> - Trackdesk is stronger on bulk payouts, a 100,000+ affiliate marketplace and network-style tracking, so staying put makes sense when two of them matter to you.
### What Trackdesk costs in October 2026
Trackdesk sells three plans, and none caps affiliates, clicks or conversions. Seats, offers and support are what change.
| Plan | Yearly billing | Monthly billing | Seats | Active offers | Coupons |
| --- | --- | --- | --- | --- | --- |
| Business | $299 a month | $399 a month | 5 | 10 | 100 |
| Enterprise | $499 a month | $599 a month | Unlimited | Unlimited | Unlimited |
| Enterprise PLUS | From $1,199 | From $1,199 | Unlimited | Unlimited | Unlimited |
*Trackdesk's own figures, October 2026.*
Business has chat and email support and 900+ integrations through Zapier or the API. Enterprise adds white-label branding, a custom domain, the full API and dedicated support. Enterprise PLUS adds custom development on private infrastructure. Marketplace presence grows from 1 offer on Business to 3 plus a featured position on Enterprise, and ad click ID capture and an MCP connection for AI assistants come with every plan.
The [home page](https://trackdesk.com/) also lists separate plans for affiliate networks (Seed Network from $449) and iGaming (Slot from $1,499).
### Why teams look for a Trackdesk alternative
#### The $299 starting price
Business costs $299 a month before the first partner signs up. A program paying out $2,000 in commissions spends about 15 cents on software per commission dollar ($299 ÷ $2,000), against 2 cents on a $39 plan. A small Stripe-billed program rarely uses what the difference buys, which is 900+ integrations, uncapped clicks and a marketplace slot.
#### A product built for more than SaaS
Trackdesk's use-case menu has 13 entries, from SaaS and DTC brands to iGaming, prop trading, forex and crypto. Its [feature list](https://trackdesk.com/features) counts 22 tracking features, among them server-to-server tracking and postbacks. A SaaS team pays for the whole set while mostly needing one part, recurring commissions on Stripe subscriptions.
#### It measures partner traffic
Per its [help center](https://help.trackdesk.com/en/articles/14751720-ad-click-ids-on-clicks-fbclid-gclid-ttclid), Trackdesk stores one ad click ID per click (gclid for Google Ads, fbclid for Meta Ads, ttclid for TikTok Ads, with gclid winning when several arrive) and passes it on through postback variables. That covers a partner who buys ads. Ranking your own Google Ads, SEO and newsletter traffic by Stripe revenue is a different job, and nothing I read in its documentation describes it. It takes a second tool, or a platform that credits each payment to the channel whose click came first, last or shared.
### What you give up by leaving Trackdesk
Trackdesk is a capable Stripe affiliate tool. Its [Stripe integration](https://trackdesk.com/integrations/stripe) connects with read-only access, and according to a [help article](https://help.trackdesk.com/en/articles/8671449-track-coupons-in-stripe-app) a refund in Stripe flips the matching conversion, found through the Stripe Charge ID, to Refunded without manual work. Its [on-hold status](https://help.trackdesk.com/en/articles/8512734-conversion-statuses-and-on-hold) is set in hours for each conversion type. Four things are harder to replace.
- Bulk payouts through PayPal, Wise, Tipalti, bank transfer or crypto, where TrackRev gives you a CSV.
- A marketplace that the pricing page puts at 100,000+ affiliates. PartnerStack and Tapfiliate run marketplaces too, and TrackRev has none.
- Postbacks, server-to-server calls and direct linking for network and media-buyer tracking.
- No meter on volume, plus Zapier and API links to 900+ tools.
### Trackdesk alternatives compared by price
The last column prices one hypothetical program: affiliates bring in $12,000 of sales a month at a 20% commission, so $2,400 goes out as commission. Revenue-metered tools bill on the $12,000, and TrackRev meters the $2,400. Tolt's page says only "earned from affiliates", so its cell shows both readings.
| Tool | Starts at | Free trial | What the entry plan caps | Cost of the $12,000 program |
| --- | --- | --- | --- | --- |
| Trackdesk | $299 yearly, $399 monthly | 14 days | 5 seats, 10 active offers | Business, $299 to $399 |
| Rewardful | $49 | 14 days | $7,500 of affiliate revenue | Growth, $99 ($15,000 limit) |
| FirstPromoter | $49 | 14 days, no card | $5,000 of affiliate revenue, 1,000 affiliates | Business, $99 ($15,000 limit) |
| Tolt | $69 | 14 days, no card | $10,000 earned from affiliates | Growth, $99 if sales count; Basic, $69 if commission counts |
| Tapfiliate | $89 ($74 yearly) | 7 days | 50 affiliates, 5,000 clicks, 500 conversions | Launch, $89, if it stays under 500 conversions and 5,000 clicks |
| PartnerStack | Not published | Demo | Not published | Not published |
| TrackRev | $39 | Free plan, link tracking only | $10K of partner commission | Starter, $39 ($2,400 of commission) |
*Prices from each vendor's pricing page, October 2026.*
### The six alternatives, one at a time
#### 1. Rewardful, for Stripe-first programs priced on revenue
[Rewardful](https://www.rewardful.com/pricing) charges $49 for Starter, $99 for Growth and $149 and up for Enterprise, covering $7,500, $15,000 and $30,000 of affiliate-attributed revenue a month. Every plan has unlimited affiliates, a 0% transaction fee and 14 days free, and annual billing gives 12 months for the price of 10. Starter has 1 campaign and 2 team members, and the branded portal and custom domain start on Growth.
It syncs both ways with Stripe, one of 20+ integrations, and adjusts commissions when a customer downgrades, upgrades, cancels or starts a trial. PayPal and Wise payouts come with every plan, and optional Managed Payouts adds a 3% fee. The page lists no marketplace or network features, so it suits a SaaS-only program.
#### 2. FirstPromoter, for the widest billing support
[FirstPromoter](https://firstpromoter.com/pricing) starts at $49 for up to $5,000 of affiliate revenue, 1,000 affiliates and 3 campaigns. Business is $99 for $15,000 with unlimited affiliates and 2 workspaces, and Enterprise begins at $149 above that. The 14-day trial needs no card. It connects to Stripe, Paddle, Chargebee, Recurly and Braintree, which makes it the pick when billing is not on Stripe.
Rules include a separate first-order rate, 3 levels of sub-affiliates and automatic negative commissions on refunds. Attribution is first-click or last-click with a cookie life up to 9999 days, and reports cover 22 data points. Mass payouts cover PayPal, Wise, Stripe, crypto and bank transfer in 190 currencies. White-labeling starts at Business, and post-back URLs for media buyers sit on Enterprise only.
#### 3. Tolt, for automatic payouts and tax forms
[Tolt](https://tolt.com/pricing) charges $69 for Basic, $99 for Growth and $199 for Pro, covering $10,000, $20,000 and $50,000 a month earned from affiliates across 2, 5 and unlimited programs, with 3, 5 and unlimited team members. Each plan has a 14-day trial with no card and a custom domain.
Basic payouts are manual. Growth adds automatic payouts over PayPal, Wise, local bank, crypto or wire for a 2% processing fee, plus W-9 and W-8 collection and 1099 filing. Tolt works with Stripe, Paddle and Chargebee. It is the closest match when Trackdesk's automated payouts are what you would miss.
#### 4. Tapfiliate, for stores that also sell subscriptions
[Tapfiliate](https://tapfiliate.com/pricing/) meters clicks and conversions instead of revenue. Launch is $89 ($74 on annual billing) for 1 program, 50 affiliates, 5,000 clicks and 500 conversions, with overage at $1.50 per 1,000 clicks and $15 per 1,000 conversions. Scale is $179 ($149 annually) with unlimited affiliates and programs, 5 team members, 100,000 clicks and 10,000 conversions. Trials run 7 days on Launch and 14 on Scale.
It has 30+ integrations, including Stripe, Shopify, BigCommerce and WooCommerce, and Zapier reaches 5,000+ apps. A marketplace lets active affiliates find your offer. Scale adds multi-level commissions and automated payouts through Trolley. It fits a program selling Shopify products and SaaS plans together, for less than Trackdesk.
#### 5. PartnerStack, for B2B partner ecosystems
[PartnerStack](https://partnerstack.com/pricing) publishes no prices. It lists 3 tiers, Launch, Growth and Enterprise, each booked through a demo, with cost set by program size, features and support. Launch includes marketplace access, partner payments, CRM integrations and either affiliate link tracking or lead and deal registration. Growth adds partner challenges, MDF management and a learning management system.
That suits programs where resellers, agencies and affiliates mix and deals take months to close. It is the wrong size for a founder launching a Stripe affiliate program this week. [PartnerStack vs TrackRev](https://www.trackrev.io/blog/partnerstack-vs-trackrev) covers the fit.
#### 6. TrackRev, for partners that run beside other channels
This one is mine, so weigh it accordingly. TrackRev runs an [affiliate program](https://www.trackrev.io/solutions/affiliate-program), link tracking and revenue attribution on one data model. The free plan has 50 links and 1,000 tracked events a month, hides revenue figures and locks the affiliate program. Paid plans are Starter at $39, Growth at $99 and Scale at $199, each with the whole product and unlimited partners and programs. The meter is partner commission tracked in a month: $10K on Starter, $100K on Growth, none on Scale. Sales revenue is never capped, and annual billing pays for 9 months and gives 12, which puts Starter at $29.25.
Partners earn recurring, one-time or tiered commissions, which reverse automatically when a charge is refunded or disputed. They sign in to a portal on your domain and upload a W-9 or W-8 during onboarding, and fraud and self-referral detection are built in. Payout batches close weekly, every 2 weeks, monthly or quarterly, and each program sets its own commission hold from 0 to 180 days with a default of 0, so match it to your refund window. Revenue syncs from Stripe, Paddle, Polar and Lemon Squeezy.
The reason to pick it over the cheaper Stripe tools is the attribution layer. A partner's link and a Google Ads click land in the same ranking, ordered by the revenue each earned under [last-touch, first-touch or linear credit](https://www.trackrev.io/solutions/revenue-attribution). The other five are built around partner-driven revenue, so your remaining channels need a second product.
It loses on payouts and recruiting. TrackRev does not send money, so you pay from a PayPal or Wise CSV export and mark each payout paid. It has no marketplace and has webhooks instead of a Zapier app. Tolt fits better when automated payouts decide the purchase, and Trackdesk fits better when you run a network.
### Which alternative fits which situation
| If this describes you | Look at |
| --- | --- |
| Stripe is your only billing system and the bill must stay small | TrackRev Starter at $39 or Rewardful Starter at $49 |
| You bill through Recurly, Braintree or Chargebee | FirstPromoter, which supports all three |
| You want automatic payouts with 1099 filing | Tolt Growth at $99 |
| You sell Shopify products and SaaS plans | Tapfiliate Launch at $89 |
| You manage B2B resellers and deal registration | PartnerStack, priced through a demo |
| You run a network or buy media | Trackdesk, or the [Everflow](https://www.trackrev.io/blog/everflow-alternative) and [TUNE](https://www.trackrev.io/blog/tune-alternative) alternatives |
| You want partner revenue ranked beside ads, SEO and email | TrackRev |
### Moving partners from Trackdesk to TrackRev
TrackRev's partner import takes a CSV. In Trackdesk, open Affiliates and export the list. In TrackRev, create a program, then upload the file on the import page, where a preview shows how each column maps and lets you re-point any field. Email is the only required column. Importing affiliates is part of the paid plans.
A tracking code in the file can become the partner's TrackRev link slug, so the code partners already share stays the same. Historical clicks, leads, sales and revenue arrive as an opening balance, and an unpaid balance becomes one carried-over commission so the next payout is right. Links partners posted earlier still point at Trackdesk's tracking, so keep that account running until they swap them. [How to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers the payout side.
The [pricing page](https://www.trackrev.io/pricing) lists every TrackRev plan, and [Trackdesk vs TrackRev](https://www.trackrev.io/blog/trackdesk-vs-trackrev) compares the two feature by feature.
### Frequently asked questions
**What is the best Trackdesk alternative?**
It depends on what you would miss. Tolt Growth ($99) replaces automated payouts and tax forms. FirstPromoter ($49) covers Recurly, Braintree and Chargebee billing. Tapfiliate ($89) fits stores that also sell subscriptions. TrackRev ($39) ranks partner revenue beside paid and organic channels. Networks and media buyers should look at Everflow or TUNE.
**Does Trackdesk have a free plan?**
No free plan is listed. Trackdesk offers a 14-day assisted trial, and the cheapest plan, Business, includes 5 seats and 10 active offers.
**Why is Trackdesk more expensive than Rewardful or Tolt?**
The cheaper tools cap monthly affiliate revenue at $5,000 to $10,000 on entry plans and move you up a tier as you grow. Trackdesk lists no cap on affiliates, clicks or conversions even on Business, and it includes marketplace presence and network-style tracking on every plan.
**Which Trackdesk alternative pays affiliates automatically?**
Tolt Growth sends payouts for a 2% fee over PayPal, Wise, local bank, crypto and wire. Rewardful's optional Managed Payouts charges 3%, Tapfiliate Scale pays through Trolley, and FirstPromoter's mass payouts cover 190 currencies. TrackRev sends no money: you pay from a CSV and mark each payout paid.
**Is there a Trackdesk alternative with an affiliate marketplace?**
PartnerStack includes marketplace access from its Launch tier, and Tapfiliate runs a marketplace where active affiliates find offers. PartnerStack publishes no prices. TrackRev, Rewardful, FirstPromoter and Tolt list none, so you recruit partners yourself.
**Can I move my affiliates from Trackdesk to TrackRev?**
Yes, through a CSV import, and Trackdesk is one of the listed sources. The preview lets you fix any column the export renamed, and an unpaid balance arrives as a single carried-over commission.
**Does TrackRev have a free plan for affiliates?**
No. The free plan stops at link tracking, with 50 links and 1,000 tracked events a month, and the affiliate and referral program needs a paid plan from $39.
---
## Trackdesk vs TrackRev: $299 or $39, and what the gap buys
URL: https://www.trackrev.io/blog/trackdesk-vs-trackrev
Published: 2026-07-27
Author: Muzahid Maruf
Trackdesk vs TrackRev in October 2026: Trackdesk has no free plan and starts at $299 a month, TrackRev at $39. How each tracks Stripe revenue and pays partners.
Trackdesk vs TrackRev starts with a price gap: $299 a month against $39. Trackdesk lists no free plan, and Business costs $299 on yearly billing or $399 month to month. It sets no cap on affiliates, clicks or conversions, describes a network of 100,000+ affiliates and supports postback tracking. TrackRev costs $39 for the whole product, reads revenue from Stripe, Paddle, Polar and Lemon Squeezy, and ranks partner revenue beside your other channels. It has no marketplace and no postback URL, and you pay partners from a CSV.
I build TrackRev, so weigh my read accordingly. Trackdesk's figures come from its [pricing page](https://trackdesk.com/pricing) and [help center](https://help.trackdesk.com/), read in October 2026.
> **Key takeaways:**
>
> - Trackdesk lists no free plan: Business is $299 yearly or $399 monthly after a 14-day assisted trial, against $39 for TrackRev Starter.
> - Both read Stripe billing events and reverse commission on refunds. Trackdesk documents 4 ways to join a click to a charge. TrackRev checks 3 visitor ID locations in Stripe, then falls back to the customer's email.
> - Trackdesk suits networks and media buyers: postbacks, 100,000+ marketplace affiliates, Zapier to 900+ tools.
> - TrackRev ranks partner revenue beside your other channels, but it pays from a PayPal or Wise CSV and has no marketplace.
### Trackdesk vs TrackRev at a glance
| Feature | Trackdesk | TrackRev |
| --- | --- | --- |
| Cheapest plan | Business, $299 yearly or $399 monthly | Starter, $39 monthly or $29.25 yearly |
| Free option | None, 14-day assisted trial | Link tracking only: 50 links, 1,000 events |
| Entry limits | 5 seats, 10 active offers, 100 coupons | 1 workspace, $10K of partner commission tracked monthly |
| Volume caps | None on affiliates, clicks or conversions | None on partners, programs or events |
| White-label | Enterprise, $499 | Every paid plan |
| Stripe connection | App with read-only access, polled every 15 minutes | Restricted key, hourly sync, optional webhook |
| Click-to-charge join | Click ID, email or coupon | Visitor ID, with an email fallback |
| Postbacks | Yes | No |
| Marketplace | 100,000+ affiliates, 1 offer on Business | None |
| Payouts | Settlements with CSV or PayPal export, Tipalti | Batches with a PayPal or Wise CSV, mark paid |
| Hold | Hours per conversion type | 0 to 180 days per program, default 0 |
| Own-channel credit | Not found in its docs | Last-touch, first-touch, linear |
*Prices from each vendor's pricing page, October 2026.*
### Trackdesk pricing in October 2026
For affiliate programs Trackdesk sells 3 plans and marks affiliates, clicks and conversions uncapped on all of them, and affiliate networks get separate plans. Business includes 5 seats, 10 active offers and 100 coupons. Enterprise, at $499 yearly or $599 monthly, lifts those limits and adds white-label, a custom domain and 1000+ integrations. Enterprise PLUS starts at $1,199 and goes through sales, while Business and Enterprise begin with a 14-day assisted trial.
### What twelve months costs on each plan
| Plan | Per month, yearly billing | 12 months, yearly billing | 12 months, monthly billing |
| --- | --- | --- | --- |
| TrackRev Starter | $29.25 | $351 | $468 |
| TrackRev Growth | $74.25 | $891 | $1,188 |
| TrackRev Scale | $149.25 | $1,791 | $2,388 |
| Trackdesk Business | $299 | $3,588 | $4,788 |
| Trackdesk Enterprise | $499 | $5,988 | $7,188 |
| Trackdesk Enterprise PLUS | From $1,199 | From $14,388 | From $14,388 |
*Prices from each vendor's pricing page, October 2026. TrackRev bills 9 months for 12 on yearly plans.*
Six months of Trackdesk Business at $299 comes to $1,794, about what a full year of TrackRev Scale costs at $1,791.
#### Software cost against partner commission
| Partners earn | TrackRev plan | TrackRev share | Trackdesk Business share |
| --- | --- | --- | --- |
| $2,000 | Starter, $39 | 1.95% | 14.95% |
| $10,000 | Starter, $39 | 0.39% | 2.99% |
| $40,000 | Growth, $99 | 0.25% | 0.75% |
*Monthly software price divided by monthly commission. Trackdesk charges a flat fee, TrackRev meters commission, and Business is taken at its $299 yearly rate.*
> **The Starter commission cap:** TrackRev never caps sales revenue, but on Starter new partner commission stops accruing once $10,000 has been tracked in a calendar month. Accrual resumes after an upgrade to Growth ($99, up to $100K) or when the counter resets on the 1st. Trackdesk's pricing page lists no cap on Business, though it says volumes above 20M clicks a month may need a private server.
### How each tool ties a Stripe payment to a partner
Both tools read Stripe billing events, so renewals, refunds and cancellations reach a partner's ledger. Trackdesk documents 4 ways to join a click to a charge, and TrackRev has 1 main route with a fallback.
| Method | What you add | Join key |
| --- | --- | --- |
| Trackdesk, Stripe Payment Links | Helper script on the page with the links | Click ID in client_reference_id |
| Trackdesk, customer email | Snippet on the thank-you page | Email |
| Trackdesk, Stripe Checkout | Your code passes the click ID to the Checkout Session | Click ID in client_reference_id |
| Trackdesk, coupons | Promotion code in Stripe matching the Trackdesk coupon | Coupon code |
| TrackRev, hosted checkouts | TrackRev pixel decorates Stripe Payment Links, Buy Button and Pricing Table | Visitor ID |
| TrackRev, API-created checkouts | Pass window.trk.vid as client_reference_id or metadata | Visitor ID |
| TrackRev, fallback | None | Email, if identify() ran |
*Trackdesk's help center also documents Stripe Pricing Table, Buy Button, Wix and GoHighLevel setups.*
Trackdesk documents each route in its help center: the [Stripe app with the email snippet](https://help.trackdesk.com/en/articles/7348516-stripe-via-customer-email), [Payment Links](https://help.trackdesk.com/en/articles/6867895-stripe-via-payment-links), a [custom Checkout](https://help.trackdesk.com/en/articles/10747886-stripe-checkout-custom-integration) and [coupon tracking](https://help.trackdesk.com/en/articles/8671449-track-coupons-in-stripe-app). The email and Payment Links routes start with the Trackdesk app in Stripe, a tenant ID and a personal token, and the click script goes on every page of your site. The app polls Stripe every 15 minutes, or on demand through its Check Now button, and the recurrence limit on each offer decides how many subscription charges a partner earns on.
Passing the Trackdesk click ID to Stripe Checkout (Node.js sketch from Trackdesk's docs)
```
// Trackdesk spells the cookie trakdesk_cid and stores JSON with a cid field.
const raw = req.cookies["trakdesk_cid"];
const cid = raw ? JSON.parse(raw).cid : undefined;
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: priceId, quantity: 1 }],
client_reference_id: cid,
success_url: "https://app.example.com/success",
});
```
On a Payment Link, [Stripe's documentation](https://docs.stripe.com/payment-links/url-parameters) limits `client_reference_id` to 200 characters of letters, numbers, dashes and the _ character, and drops any other value silently.
TrackRev needs 1 pixel and 1 restricted key, which [Stripe recommends](https://docs.stripe.com/keys) over a secret key. It pulls new paid charges hourly, or within seconds with the rak_webhook_write scope. Each charge joins by `charge.metadata.vid`, then the Checkout Session's client_reference_id, then its `metadata.vid`. Email comes last and misses buyers who pay under another address, as Trackdesk's email method does.
### Refunds, holds and fraud rules
| Situation | Trackdesk | TrackRev |
| --- | --- | --- |
| Refunded charge | Conversion flips to Refunded through the Stripe charge ID | Commission comes back out on its own |
| Disputed charge | Not mentioned in its Stripe help article | Commission comes back out on its own |
| Hold for a 30-day refund window | 720 hours, set per conversion type | 30 days, set per program |
| Fraud checks | 13 rules, all on by default | Self-referral checks on credit programs, manual controls on cash programs |
Trackdesk documents its [on-hold times](https://help.trackdesk.com/en/articles/8512734-conversion-statuses-and-on-hold) and publishes its [fraud rules](https://help.trackdesk.com/en/articles/8347946-fraud-prevention): 6 for clicks, 5 for conversions and 2 for affiliate accounts. Defaults flag the 4th click from one IP within 24 hours and a conversion less than 30 seconds after its click. TrackRev's documentation describes 3 automatic self-referral checks for credit programs: same browser, same device and same IP on a different device. On cash programs you set approval to review each application and mark a commission void or fraud yourself, and [preventing affiliate self-referral fraud](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) lists what to check by hand on either tool.
### Paying partners
| Step | Trackdesk | TrackRev |
| --- | --- | --- |
| Payout unit | Settlement of Approved conversions from the Open Balance report | Batch closed weekly, every 2 weeks, monthly or quarterly |
| Filters | Minimum balance, method, tier, conversion type, offer | Payout threshold set per program |
| Paying | Copy details by hand, or export a CSV or PayPal file and upload it | Export a PayPal or Wise CSV, pay it, mark each payout paid |
| Rails listed | PayPal, Wise, Tipalti, bank transfer, Bitcoin, Ether | PayPal and Wise exports |
[Trackdesk's payout guide](https://help.trackdesk.com/en/articles/8205737-how-do-i-pay-affiliates) ends in a file you upload to your payment system. Its features page lists bulk payouts through PayPal, Wise and Tipalti, and its pricing page limits automated payouts to marketplace affiliates, so ask on a demo which routes skip the upload. TrackRev partners upload a W-9 or W-8 at onboarding, and [how to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers the manual route.
### Where Trackdesk is the better pick
- You run an affiliate network or buy media. Its features page counts 22 tracking features, among them Server to Server Tracking and Direct Linking, and every plan captures gclid, fbclid and ttclid ad click IDs. [Postback tracking](https://www.trackrev.io/blog/postback-url-vs-pixel-tracking-affiliate) is the model networks expect.
- You want help finding partners. The pricing page describes 100,000+ affiliates, with 1 marketplace offer on Business and 3 plus a featured position on Enterprise.
- Stripe is only one of your checkouts. Its help center has guides for Shopify, WooCommerce, BigCommerce, PayPal Checkout and Calendly, and Zapier or the API connect 900+ integrations. TrackRev reads 4 billing systems and offers webhooks instead of a Zapier app.
- A security review may ask for certifications. Trackdesk shows ISO 27001 certification and a 99.99% uptime guarantee on Google Cloud.
### Where TrackRev is the better pick
A buyer may click a partner's link, a newsletter link and then a Google Ads ad before paying $48, and TrackRev splits that $48 by the model you pick.
| Credit model | Who gets the $48 |
| --- | --- |
| Last-touch | Google Ads, $48 |
| First-touch | The partner link, $48 |
| Linear | Partner link, newsletter and Google Ads, $16 each |
Trackdesk's Revenue Intelligence feature describes insight into partner performance and channel ROI. I found nothing that ranks your own newsletter, SEO and ad channels by Stripe revenue, so I expect that report to need a second tool. TrackRev's version is on the [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution), [last-touch vs first-touch vs linear](https://www.trackrev.io/blog/attribution-models-saas-comparison) explains the 3 models, and the [affiliate program page](https://www.trackrev.io/solutions/affiliate-program) lists what each paid plan includes.
### Which one fits your program
| Your situation | Better fit |
| --- | --- |
| SaaS billed through Stripe, partners earn under $10K a month, budget under $100 | TrackRev Starter at $39 |
| Partner revenue should rank beside ads, email and SEO | TrackRev |
| You run a network or buy media with postbacks | Trackdesk |
| You want a marketplace of 100,000+ affiliates to recruit from | Trackdesk |
| You want to try affiliate features before paying | Trackdesk, through its 14-day trial; TrackRev's free plan stops at link tracking |
### Moving partners from Trackdesk to TrackRev
TrackRev lists Trackdesk as an import source. Export the affiliates as a CSV and upload the file on the import page. Email is the only required column, a tracking code can become the partner's link slug, and unpaid earnings become 1 carried-over commission. Links partners already posted still point at Trackdesk, so keep that account running until they swap them. Importing needs a paid plan, from $39.
The post on [6 Trackdesk alternatives compared by price](https://www.trackrev.io/blog/trackdesk-alternative) sets each against Business, and the [pricing page](https://www.trackrev.io/pricing) lists every TrackRev plan.
### Frequently asked questions
**Does Trackdesk have a free plan?**
No. Business, Enterprise and Enterprise PLUS are the only plans listed, and the way in is a 14-day assisted trial. TrackRev's free tier covers link tracking only, so an affiliate or referral program there begins on Starter at $39.
**Is Trackdesk worth $299 a month for a small SaaS?**
It pays off when you need postbacks, a marketplace, Zapier connections or checkouts beyond Stripe. A program of 20 newsletter writers paid through PayPal on Stripe subscriptions uses few of those.
**Is TrackRev a good Trackdesk alternative?**
For a SaaS billed through Stripe, Paddle, Polar or Lemon Squeezy that wants partners ranked beside its other channels, yes. A network operator who relies on postbacks should stay put.
**Can I run an affiliate program on TrackRev's free plan?**
No. The free tier allows 50 links and 1,000 tracked events and hides revenue figures. Programs, revenue sync and payouts begin on Starter.
**How much do TrackRev's plans cost against Trackdesk's?**
TrackRev charges $39, $99 and $199 monthly for Starter, Growth and Scale. Trackdesk charges $299 and $499 for Business and Enterprise on yearly billing, plus $100 more each on monthly billing.
**Does TrackRev have a Zapier app or an API?**
No Zapier app, but a sale.created webhook, a REST API, a CLI and an MCP server.
---
## HasOffers alternatives: what to use instead of TUNE, by program type
URL: https://www.trackrev.io/blog/tune-alternative
Published: 2026-07-21
Author: Muzahid Maruf
HasOffers is now TUNE. Compare its $1,500 and $899 plans with Everflow, Affise, CAKE and SaaS affiliate tools, and see which kind of program should switch.
HasOffers is the old name of TUNE, so a HasOffers alternative is a TUNE alternative, and the right one depends on what you run on it. Network owners shop Everflow, Affise and CAKE. A SaaS company paying affiliates on Stripe subscriptions needs something smaller: Rewardful ($49), FirstPromoter ($49), Tolt ($69) and TrackRev ($39) start under $70 a month, while TUNE's advertiser plan is $1,500 a month on annual billing. Prices come from each vendor's own pricing page, checked in October 2026.
I build TrackRev, which is one of the options below.
> **Key takeaways:**
>
> - TUNE dropped the HasOffers name in 2019, so searches for either lead to the same platform and the same set of rivals.
> - TUNE's published plans run $1,500 monthly for advertisers and $899 for networks on annual billing, and the advertiser tier includes 2,500 conversions.
> - Networks have direct rivals in Everflow, Affise (from $499) and CAKE, while a SaaS program billed through Stripe or Paddle needs a lighter tool at $39 to $99.
> - TUNE's flat fee equals 10% of $15,000 in monthly affiliate revenue, against 0.7% for FirstPromoter's $99 plan.
### HasOffers is TUNE: history and published pricing
TUNE launched in 2009 as HasOffers, white-label software for managing affiliate offers. According to [TUNE's about page](https://www.tune.com/about/), it added Attribution Analytics in 2011, sold that product to Branch in 2018, retired the HasOffers name in 2019 and was acquired by Constellation Software in 2020. Prices sit on separate pages for [advertisers](https://www.tune.com/solutions/advertisers/compare-plans/) and [networks](https://www.tune.com/solutions/networks/compare-plans/), and anything above the listed tiers is a custom quote.
| Plan | Monthly price | Per year | What the page lists |
| --- | --- | --- | --- |
| Advertisers, Scale | $1,500, paid annually | $18,000 | 2,500 conversions a month, a Customer Success Manager, SOC 2 Type II and SOC 1 Type II accreditation; onboarding and partner payments cost extra |
| Advertisers, Contract | Custom quote | Custom | 2,500+ conversions a month, dev team support, program migration |
| Networks, Enterprise | $899, paid annually | $10,788 | Unlimited offers and partners, TUNE Pay as an add-on, up to 13% off for paying upfront |
| Networks, Contract | Custom quote | Custom | Unlimited offers and partners, up to 10% off for an annual contract |
*Prices from each vendor's pricing page, October 2026.*
> **Ask what counts as a conversion:** Scale includes 2,500 conversions a month. The page defines no conversion and lists no price beyond 2,500, so ask whether renewals count and what overage costs before you sign.
### What TUNE does that most alternatives do not
TUNE says it invented the postback. Its [platform page](https://www.tune.com/platform/) lists a two-way API with 650+ endpoints, and its [advertiser page](https://www.tune.com/solutions/advertisers/) lists mobile measurement partner integrations, TUNE Marketplace access and TUNE Pay for global partner payments and tax paperwork. The [subscription services page](https://www.tune.com/affiliate-marketing/subscription-services/) adds cookieless tracking and promo codes, so a SaaS team can run on it, though a small program uses little of it.
### Why teams look for a HasOffers alternative
#### The price floor
TUNE's fee is the same at $5,000 of affiliate revenue as at $50,000.
| Affiliate revenue a month | TUNE Scale | Rewardful | FirstPromoter | TrackRev |
| --- | --- | --- | --- | --- |
| $5,000 | $1,500 (30%) | Starter $49 (1.0%) | Starter $49 (1.0%) | Starter $39 (0.8%) |
| $15,000 | $1,500 (10%) | Growth $99 (0.7%) | Business $99 (0.7%) | Starter $39 (0.3%) |
| $50,000 | $1,500 (3%) | Enterprise $299 (0.6%) | Enterprise, from $149 | Growth $99 (0.2%) |
*Each fee divided by the revenue its plan covers. TrackRev meters commission, so its column assumes a 20% rate.*
At $15,000 a month TUNE costs about 15 times FirstPromoter's Business plan. A program that lands 100 customers a month through affiliates pays $15 each on Scale, and the $0.60 rate appears only at the full 2,500 conversions. At $50,000 the fee falls to 3%, where the marketplace and mobile integrations can start to justify it.
#### How conversions reach the tracker
TUNE's pages describe conversions arriving by postback, cookieless tracking, promo codes and API calls, with no billing integration listed on those pages, so renewals and refunds reach it only when something you build sends them. The SaaS tools below read Stripe or Paddle events themselves. [Postback URL vs pixel tracking](https://www.trackrev.io/blog/postback-url-vs-pixel-tracking-affiliate) covers the trade-off.
#### Contract terms
Scale is billed annually, so ask what happens to unused months if you leave mid-term. Replacements have terms too: Everflow requires 6 months, and Affise asks for 30 days of written notice.
### HasOffers alternatives for networks and large programs
| Platform | Published price | Per year | Terms and limits on the page |
| --- | --- | --- | --- |
| Everflow | None, quoted on request | Quoted | 6-month commitment, one-time onboarding, free migrations including API-based ones from TUNE, CAKE and HitPath |
| Affise | From $499 on a signed contract, $625 without | $5,988 on contract | Beginner: 7,000 conversions, 5 million impressions, 50 offers. Core: $699 ($888 without a contract), 40,000 conversions. Expand: $999 ($1,239), 50,000 conversions. 14-day trial, 7% off for yearly payment |
| CAKE | Request a quote | Quoted | Bought by Constellation Software in 2019, a year before TUNE; ask for current plan limits |
| impact.com | Starter from $30, Essentials from $500, Pro from $2,500 | $360, $6,000, $30,000 | Starter needs a Shopify, BigCommerce, WooCommerce, Adobe Commerce or Squarespace store; Essentials adds a 90,000-partner marketplace; Pro tracks across mobile and web |
| PartnerStack | None, confirmed in a demo | Quoted | Launch, Growth and Enterprise plans; marketplace access from Launch |
*Published prices, October 2026.*
[Everflow](https://www.everflow.io/pricing) is the closest match for a network leaving TUNE, and [our Everflow alternative guide](https://www.trackrev.io/blog/everflow-alternative) covers where it stops fitting. [Affise](https://affise.com/pricing/) targets small agencies and networks. [impact.com](https://impact.com/integrated-platform-prices/) and [PartnerStack](https://partnerstack.com/pricing) suit brands that want existing partners.
### HasOffers alternatives for a SaaS affiliate program
| Tool | Starts at | Year on annual billing | Trial | What the plan meters | Where sales come from |
| --- | --- | --- | --- | --- | --- |
| TUNE Scale | $1,500 | $18,000 | Demo | 2,500 conversions a month | Postback, API, promo codes |
| Rewardful | $49 | $490 | 14 days | Affiliate revenue, $7,500 on Starter | Stripe, Paddle |
| FirstPromoter | $49 | $490 | 14 days, no card | Affiliate revenue, $5,000 on Starter | Stripe, Paddle, Chargebee, Recurly, Braintree |
| Tolt | $69 | $828 at monthly rates | 14 days, no card | Affiliate revenue, $10,000 on Basic | Stripe, Paddle |
| TrackRev | $39 | $351 | Free plan, 1,000 events | Commission tracked, $10K on Starter | Stripe, Paddle, Polar, Lemon Squeezy |
*Plan prices as listed in October 2026.*
[Tolt](https://tolt.com/pricing) sends payouts from its $99 Growth plan for a 2% fee and files 1099s. TrackRev produces a PayPal or Wise file and leaves the sending to you, and TUNE Pay is fee based. [How to pay affiliates](https://www.trackrev.io/blog/how-to-pay-affiliates) covers methods and tax forms.
#### TUNE vs FirstPromoter
[FirstPromoter](https://firstpromoter.com/pricing) meters affiliate revenue, $5,000 on the $49 Starter plan and $15,000 on the $99 Business plan. It fits when billing runs through one of its five systems and affiliate revenue stays under $15,000 a month. TUNE fits when partners drive app installs, or when the program needs a marketplace and managed payments more than a low meter. The [FirstPromoter alternatives guide](https://www.trackrev.io/blog/best-firstpromoter-alternatives-2026) covers the other direction, and [Rewardful](https://www.rewardful.com/pricing-schedule) prices the same way, rising to $299 for $75,000.
### HasOffers vs CAKE
Both are performance marketing platforms for advertisers and networks, and Constellation Software bought both: [CAKE announced its acquisition](https://web.archive.org/web/20191202182701/https://getcake.com/press-release/cake-announces-acquisition-pr/) on June 26, 2019, and TUNE's about page dates its own to 2020. TUNE posts $1,500 and $899, while I could not confirm CAKE's current prices from its own site. Request a quote and put the conversion and overage questions from the warning above to both vendors, along with onboarding cost and exit terms.
### Where TrackRev fits and where it does not
TrackRev runs [an affiliate program](https://www.trackrev.io/solutions/affiliate-program), link tracking and [revenue attribution](https://www.trackrev.io/solutions/revenue-attribution) on one data model. Revenue syncs from Stripe, Paddle, Polar and Lemon Squeezy, so a refund or dispute reverses its commission. Partners sign in to a [portal on your domain](https://www.trackrev.io/products/white-label-branding), and each program sets a payout hold from 0 to 180 days, 0 by default. It fits one product with its own partners, where affiliate revenue should be ranked against ads and email.
One meter drives the [plans](https://www.trackrev.io/pricing): partner commission tracked in a month, $10K on Starter ($39), $100K on Growth ($99) and unlimited on Scale ($199). Annual billing charges for 9 months and gives 12. The free plan covers link tracking only, with 50 links and 1,000 tracked events a month, so an affiliate program needs a paid plan.
It has no partner marketplace, no multi-advertiser offer management and no mobile measurement partner integrations, and it never sends the money: you export a PayPal or Wise file, pay from there and mark each payout paid. A `sale.created` webhook can post to Zapier, Make or your own endpoint.
### Moving a program off TUNE
- Ask TUNE for exports of partners, offers, conversions and payouts. Its [developer hub](https://developers.tune.com/) documents Network, Affiliate and Advertiser APIs.
- TrackRev imports partners from any affiliate CSV, with email as the only required column and 1,000 rows per upload. Referral codes, approval status and unpaid balances come across, while order history stays in TUNE, so export it before you cancel.
- Run both platforms for one payout cycle, as Everflow's migration FAQ describes, and keep the old tracking live until your longest attribution window ends.
### Which alternative fits which program
| Your situation | Shortlist |
| --- | --- |
| You operate an affiliate or ad network | Affise from $499, Everflow or CAKE by quote, or stay on TUNE |
| Partners drive app installs | TUNE, or impact.com Pro at $2,500 |
| You want a marketplace of existing partners | impact.com Essentials ($500), PartnerStack or TUNE |
| Subscriptions billed in Stripe or Paddle | TrackRev ($39), Rewardful ($49), FirstPromoter ($49) or Tolt ($69) |
| Billing runs on Recurly or Braintree | FirstPromoter, the only tool in the SaaS table that lists them |
| Affiliates run beside ads and SEO, and you want channels ranked by revenue | TrackRev, with every channel on one data model |
TrackRev's free plan tests link tracking before you invite a partner, and paid plans start at [$39 a month](https://www.trackrev.io/pricing). Teams billed only through Stripe can also read the [best affiliate software for Stripe](https://www.trackrev.io/blog/best-affiliate-software-for-stripe-2026) comparison.
### Frequently asked questions
**Is HasOffers the same as TUNE?**
Yes. HasOffers launched in 2009, and TUNE dropped the name in 2019. The platform continues as the TUNE Partner Marketing Platform.
**How much does HasOffers (TUNE) cost?**
TUNE lists $1,500 a month for advertiser Scale and $899 a month for network Enterprise, both on annual billing. Bigger programs get a custom contract, and onboarding and partner payments carry fees the pricing page leaves unitemized.
**What is the best HasOffers alternative for a SaaS company?**
With Stripe or Paddle billing, four tools start between $39 and $69: TrackRev, Rewardful, FirstPromoter and Tolt. Teams on Recurly or Braintree should look at FirstPromoter, and teams that want affiliate revenue ranked against ads, email and SEO should look at TrackRev.
**What is the best HasOffers alternative for running a network?**
Everflow, Affise and CAKE are the usual shortlist. Test each against TUNE's $899 network plan using your own conversion volume.
**Does TUNE work for a SaaS affiliate program?**
It can. TUNE markets to subscription businesses with cookieless tracking, promo-code tracking and multi-action payouts. The tradeoffs are a $1,500 monthly floor and conversions that reach TUNE by postback or API instead of from Stripe charges.
**Can TrackRev replace TUNE for mobile app install tracking?**
No. TrackRev has deep links that open an app, but it has no mobile measurement partner connection. Stay on TUNE for install tracking, or compare a tier that lists tracking across mobile and web.
**Is there a free HasOffers alternative?**
No affiliate platform in this comparison stays free past its trial. Rewardful, FirstPromoter, Tolt and Affise run 14-day trials, and TrackRev's free plan tracks links only, up to 50 links and 1,000 events a month, so its affiliate program starts at $39.
---
## UTM builder vs link tracking tool in 2026: what each one records, and when you need both
URL: https://www.trackrev.io/blog/utm-builder-vs-link-tracking-tool
Published: 2026-07-11
Author: Muzahid Maruf
A UTM builder tags a URL; a link tracking tool logs each click on its own server. Compare 5 tools from $0 to $90 a month and see which ties clicks to revenue.
UTM builder vs link tracking tool comes down to where the data gets written. A UTM builder adds up to 9 tags to a URL, and Google Analytics 4 reads them only when the page loads and its tag fires. A link tracking tool logs each click on its own server, then sends a 302 redirect, so the click exists even if no page loads. A team that sells online usually wants both, plus a Stripe join to show which link earned the payment.
I run TrackRev, so weigh my opinions accordingly.
> **Key takeaways:**
>
> - A UTM builder only edits a URL. Google Analytics 4 records the visit later, if the page loads and its tag fires.
> - A link tracking tool logs each click on its own server before the 302 redirect, so it counts visits that never load your page.
> - Short.io lists a UTM builder on all 5 plans, Dub lists UTM templates on Free, and Bitly adds its builder at Core, $10 a month billed annually.
> - Tags and clicks reach Stripe only if something copies them there: client_reference_id holds 200 characters and metadata 50 pairs.
> - Tracker clicks and Google Analytics 4 sessions differ, so watch whether the gap moves, such as 29% jumping to 50%.
### UTM builder vs link tracking tool at a glance
| Question | UTM builder | Link tracking tool |
| --- | --- | --- |
| Output | A URL with up to 9 tags | A short link plus a click log |
| Click recorded | Nowhere; Google Analytics 4 logs a session later | On the tool's server, at the request |
| Script on your page | Yes, the Google Analytics 4 tag | None for click counts |
| Click that never loads your page | Missed | Recorded |
| Site you don't own | No data | Clicks, device, location |
| Revenue per link | No | With a Stripe, Paddle, Polar or Lemon Squeezy join |
### What a UTM builder gives you
A builder is a form: it returns your address with a query string added
```
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=october-launch
```
[Google Analytics Help](https://support.google.com/analytics/answer/10917952) lists 9 UTM parameters and says to always set the 3 that name source, medium and campaign. Values are case sensitive, so `google` and `Google` land in 2 rows of one report. With Google Ads auto-tagging on, [Google Analytics 4 uses the auto-tagged source and medium](https://support.google.com/analytics/answer/11242870). Where the Google Ads click ID can't be used, any UTM tag makes Google Analytics 4 derive every cross-channel source dimension from UTM tags alone, so a link with only a campaign tag can report its source as (not set). The [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming.
### What a link tracking tool does
The browser requests the short link, the server records it and answers with a redirect
```
GET /spring HTTP/1.1
Host: go.example.com
Referer: https://mail.example.com/
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X)
HTTP/1.1 302 Found
Location: https://example.com/pricing?utm_source=newsletter&utm_medium=email
```
Each request carries a timestamp, a `Referer` header, a user agent and an IP address. [MDN's 302 reference](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/302) says the browser then requests the `Location` address by itself, so a tracker works for a destination you can't add code to, such as a Substack post or a YouTube description. A tracker is better off with a temporary redirect, because [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html) (June 2022) calls 301 and 308 responses heuristically cacheable, and a cached redirect never reaches the tracker again.
| Status code | RFC 9110 section | What the RFC says | Effect on a tracker |
| --- | --- | --- | --- |
| 301 Moved Permanently | 15.4.2 | Heuristically cacheable | A browser may skip the tracker on repeat clicks |
| 302 Found | 15.4.3 | Temporary; keep using the original URI | Clicks keep reaching it unless cache headers say otherwise |
| 307 Temporary Redirect | 15.4.8 | Temporary; the method must not change | Counts like a 302 |
| 308 Permanent Redirect | 15.4.9 | Cacheable like a 301 | Repeat visitors may bypass it too |
### Where the two overlap
Most link trackers include a UTM builder, so the choice is usually about which plan carries it.
| Tool | UTM builder | Cheapest plan with it | Allowance on that plan |
| --- | --- | --- | --- |
| Free UTM builder (TrackRev) | Runs in your browser | $0, no signup | No links or clicks |
| Short.io | Listed on all 5 plans | Free, $0 | 1,000 branded links, 50,000 tracked clicks a month |
| Dub | UTM templates on Free, builder with templates from Pro at $30 | Free, $0 | 25 new links and 1,000 tracked events a month, 30-day retention |
| Bitly | UTM Builder from Core, none on Free | Core, $10 a month, annual plan only ($120 a year) | 100 links a month, 30 days of click and scan data |
| TrackRev | UTM fields on every link, plus channel defaults | Free, $0 | 50 links, 1,000 tracked events a month |
*Prices from each vendor's pricing page, October 2026.*
### Where each setup loses data
| What happens | UTM builder only | Link tracker |
| --- | --- | --- |
| An ad blocker stops the Google Analytics 4 tag | [Filed as (direct) / (none)](https://support.google.com/analytics/answer/15258820) | Click still recorded |
| A shortener or redirect strips the UTM parameters | Source lost | Campaign kept on the link |
| The link is shared in Messages, Mail or Safari Private Browsing | Tracking information may be removed, with no parameters named ([Apple, June 5, 2023](https://www.apple.com/newsroom/2023/06/apple-announces-powerful-new-privacy-and-security-features/)) | Logged before the redirect |
| The visitor leaves before the page loads | No session | Click recorded anyway |
| A bot or link preview requests the link | Ignored, since no script runs | Counted unless filtered |
### Why the two counts never match
| Measure | Count |
| --- | --- |
| Emails delivered | 8,000 |
| Tracker clicks after bot filtering | 640, or 8.0% of delivered |
| Google Analytics 4 sessions, newsletter / email | 455, or 71.1% of clicks |
| Gap | 185 clicks, or 28.9% of tracker clicks |
*A hypothetical newsletter send with invented numbers, used to show the arithmetic.*
The 185 missing sessions can come from visitors who left early, ad blockers and tags lost on the way. One gap figure is hard to judge, but a gap that jumps from 29% to 50% the week you change a redirect points to a broken link, and the [5-step test for stripped UTM parameters](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) finds the hop.
### Joining a click to a Stripe payment
Neither a tracker click nor a UTM tag reaches Stripe unless something copies it there. Stripe's [payment link tracking documentation](https://docs.stripe.com/payment-links/url-parameters) says UTM codes come back in the redirect URL after payment, while a `client_reference_id` travels in the `checkout.session.completed` webhook. Stripe's [metadata page](https://docs.stripe.com/metadata) says metadata does not copy to related objects by default, apart from a few listed cases.
| Where the value goes | What Stripe does with it | Limit |
| --- | --- | --- |
| UTM codes on a Payment Link | Returned on the redirect | 150 characters; letters, digits, - and _ |
| `client_reference_id` on a Payment Link | Sent in the webhook | 200 characters, same character set |
| Checkout Session `metadata` | Stored on the session | 50 pairs; keys 40 characters, values 500 |
| `subscription_data.metadata` | Saved on the subscription | Same limits |
*Limits from Stripe's documentation, October 2026.*
The usual join stores a visitor ID in one of those fields; the [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post shows the code.
| Day | What happens | Builder tags in Google Analytics 4 | Tracker alone | Tracker joined to Stripe |
| --- | --- | --- | --- | --- |
| 0 | Clicks a newsletter link | Session, if the tag loads | Click logged | Click logged, visitor ID stored |
| 3 | Starts a 14-day trial of a $39 plan | Event, if you configured one | Nothing | Visitor ID travels with the checkout |
| 17 | Pays $39 | Only if you send a purchase event | Nothing | $39 credited to the newsletter link |
| 47 | Renews for $39 | Nothing | Nothing | $78 credited in total |
*A hypothetical customer on a $39 monthly plan, over 47 days.*
### Which to use for each situation
| Situation | Use |
| --- | --- |
| Google Ads clicks read in Google Analytics 4 | Auto-tagging, no builder |
| A newsletter or email send | Both |
| A link in a social bio or chat message | Tracker |
| A QR code on print or packaging | Tracker |
| A link to a Substack post or YouTube video | Tracker |
| Revenue by channel on Stripe | Tracker plus payment join |
| A content site with no sales | Builder |
### How TrackRev covers each layer
The [free UTM builder](https://www.trackrev.io/tools/utm-builder) runs in your browser with no signup. Each TrackRev link's redirect logs the click on the server and sends a 302, with no script on your site. Each link holds a channel and UTM fields, and the redirect adds a tag only when the destination lacks it, so hand-written tags survive.
| Plan | Price a month | Links and events a month | Commission tracked a month |
| --- | --- | --- | --- |
| Free | $0 | 50 links, 1,000 events | None; revenue figures hidden |
| Starter | $39 | Unlimited | $10,000 |
| Growth | $99 | Unlimited | $100,000 |
| Scale | $199 | Unlimited | No cap |
*TrackRev's published plans, October 2026. Annual billing charges 9 months for 12.*
Revenue by link needs a paid plan and the pixel on your own site, and it runs on Stripe, Paddle, Polar and Lemon Squeezy ([pricing](https://www.trackrev.io/pricing)). A query string added to a short link at send time is not forwarded, so make one link per placement. Links to a site you don't own record clicks but no conversions. Keep Google Analytics 4 for pageviews, since the click log is not a session report.
### What each layer costs
| Layer | Question it answers | Example plans | Price a month |
| --- | --- | --- | --- |
| Label | Which tagged link did a session come from? | Free UTM builder | $0 |
| Capture | How many clicks, from where? | Short.io Free, 50,000 tracked clicks | $0 |
| Join | Which link earned the payment? | Dub Business (conversion tracking, 250,000 events) or TrackRev Starter | $90 or $39 |
*Prices from each vendor's pricing page, October 2026.*
Stay with a builder if you only need Google Analytics 4 channel groupings and your sales don't run through Stripe, Paddle, Polar or Lemon Squeezy. Pick a plain shortener such as Short.io for click counts without revenue. [Links & Analytics](https://www.trackrev.io/solutions/links-and-analytics) has a Free plan for click tracking, and revenue per link starts at $39 a month.
### Frequently asked questions
**Is a UTM builder the same as a link tracking tool?**
No. A builder returns a longer URL, and a tracker logs each click and redirects it. Short.io Free, Dub Free and Bitly Core each build UTM tools into the tracker.
**Do I still need UTM parameters with a link tracking tool?**
Yes, for channel reports in Google Analytics 4, which groups sessions by the 3 core tags on the landing URL. The tracker's own click log works without them.
**Can a UTM builder show which link produced a Stripe payment?**
No. Revenue per link needs a visitor ID in client_reference_id (200 characters) or metadata (50 pairs), read back from the Stripe webhook.
**Is Google's Campaign URL Builder enough for a small team?**
For labeling Google Analytics 4 sessions on a site with no checkout, yes. Keep a shared naming sheet, since values are case sensitive.
**Why do tracker clicks and Google Analytics 4 sessions differ?**
A click is a request to the redirect, and a session needs the page and its tag to load. The example above loses 185 of 640 clicks, or 28.9%.
**Can a Stripe Payment Link carry UTM codes?**
Yes. Stripe accepts the 5 standard UTM codes at up to 150 characters each and returns them in the redirect URL when the confirmation behavior is redirect.
---
## UTM parameters: the 9 tags Google Analytics 4 documents and how to name them
URL: https://www.trackrev.io/blog/utm-parameters-guide
Published: 2026-06-16
Author: Muzahid Maruf
UTM parameters are tags that tell analytics where a visit came from. Learn the 9 tags Google Analytics 4 documents, its 19 channels, and how to name each one.
UTM parameters are short name=value tags added to the end of a URL, such as `utm_source=newsletter`, that tell an analytics tool where a visit came from. UTM stands for Urchin Tracking Module. Google Analytics 4 documents 9 of them and says to always set 3: `utm_source`, `utm_medium` and `utm_campaign`. People shorten them to UTMs or UTM params, and tagging links and reading the results is UTM tracking.
A tag is written once, when the link is created, and Google Analytics 4 treats each spelling as its own value: Google's example is that `SpringSale` and `Spring_Sale` are distinct. UTMs also end at the visit, so they record where someone came from and nothing about what that person paid.
> **Key takeaways:**
>
> - Google Analytics 4 documents 9 UTM parameters and says to always set 3: utm_source, utm_medium and utm_campaign.
> - With any UTM tag on the URL and no usable Google click ID, Google Analytics 4 reads every source dimension from UTM tags alone, so a missing tag shows as (not set).
> - The medium picks 1 of 19 default channels: email reaches Email and affiliate reaches Affiliates, while owned-email falls into Unassigned.
> - Values are case sensitive, so SpringSale and Spring_Sale are 2 values. Use lowercase and put the year first in campaign names, as in launch-2026-10.
> - UTM tags carry no revenue. Stripe metadata holds 50 pairs of up to 500 characters a value, so copy the tags there to see revenue by channel.
### What UTM parameters are and how UTM tracking works
A tagged link is a normal URL followed by a query string: a question mark, then name=value pairs. [Google Analytics 4 documentation](https://support.google.com/analytics/answer/10917952) says they can come in any order.
A tagged link with four tags
```
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=pricing-update-2026-10&utm_content=header-cta
```
Tagged visits appear in Google Analytics 4 under Acquisition, in the Traffic acquisition report, with Session source / medium or Session campaign as the dimension. Google leaves UTM tags out of 2 dimensions, Landing page + query string and Page path + query string, and populates Page location with them instead.
The tags came from Urchin Software Corp., a San Diego company that [Google agreed to buy in March 2005](https://www.eweek.com/news/google-to-buy-web-analytics-provider/). [Wikipedia](https://en.wikipedia.org/wiki/UTM_parameters) names Urchin as the predecessor of Google Analytics.
### The 9 UTM parameters Google Analytics 4 documents
Wikipedia lists 5. Google Analytics 4 documentation lists 9, adding 4 to the original source, medium, campaign, term and content.
| Parameter | What it identifies | Example | Set it |
| --- | --- | --- | --- |
| `utm_source` | The referrer | `google`, `newsletter4` | Every link |
| `utm_medium` | The marketing channel type | `cpc`, `email` | Every link |
| `utm_campaign` | The product, slogan or promo | `spring-sale-2026-03` | Every link |
| `utm_id` | A campaign ID that matches uploaded cost data | `cmp-2026-017` | With cost data |
| `utm_term` | The paid keyword | `attribution-software` | Paid search |
| `utm_content` | Which creative or link was clicked | 2 calls to action in 1 email | To compare links |
| `utm_source_platform` | The platform directing the traffic | Search Ads 360, Display & Video 360 | When a platform directs the traffic |
| `utm_creative_format`, `utm_marketing_tactic` | The creative type and the targeting criteria | `video`, `remarketing` | Skip: not reported |
*Descriptions and examples from Google Analytics 4 documentation, October 2026; the campaign, ID and term values are illustrative.*
Google asks for 1 unique source per platform and 1 unique medium per channel. It also documents that when a click ID can't be used and any UTM tag is on the URL, Google Analytics 4 derives every source dimension from UTM tags alone, and missing tags show as (not set). A link with only `utm_campaign=spring-sale-2026-03` reports a campaign with no source or medium.
### How Google Analytics 4 turns UTM tags into channels
The Google Analytics 4 default channel group has [19 channels](https://support.google.com/analytics/answer/9756891), with fixed rules that ignore case and can't be edited. For hand-tagged links, source and medium do the sorting, and the medium does most of it.
| utm_medium value | Channel | Rule from Google |
| --- | --- | --- |
| `email` | Email | Source or medium is 1 of 4 spellings of email |
| `affiliate` | Affiliates | Medium is affiliate |
| `social`, `sm` | Organic Social | Medium is 1 of 6 social values, or the source is a known social site |
| `cpc`, `ppc`, `paid-social`, `paid_social` | Paid Search, Paid Social, Paid Video, Paid Shopping or Paid Other | Medium matches `^(.*cp.*\|ppc\|retargeting\|paid.*)$`; the source picks the channel |
| `display`, `banner`, `cpm` | Display | Medium is 1 of 5 display values |
| `referral`, `link`, `app` | Referral | Medium is referral, app or link |
| `video` | Organic Video | Medium matches `^(.*video.*)$`, or the source is a known video site |
| `owned-email`, `sponsorship` | Unassigned | No rule matches |
*Rules from the Google Analytics 4 default channel group definitions, October 2026. Google keeps its own lists of social, search and video sites.*
A medium invented for internal tidiness, such as `owned-email`, matches no rule and lands in Unassigned unless the source is on one of Google's site lists. I'd take Google's value even when mine reads better, because the default group then does the grouping for free; the alternative is to map your own with a [custom channel group](https://support.google.com/analytics/answer/13051316).
#### When Google Ads auto-tagging takes over
With auto-tagging on, the `gclid` parameter carries the click data, and [Google's traffic-source documentation](https://support.google.com/analytics/answer/11242870) says Google Analytics 4 then uses the auto-tagged values for source and medium. The same page lists auto-tagging dimensions for Search Ads 360 and Campaign Manager 360 too, and [Google Ads Help](https://support.google.com/google-ads/answer/3095550) adds that there is no override option. Hand-typed source and medium lose to the auto-tagged values, but manual `utm_content` and `utm_term` still feed their own dimensions.
### How to build a UTM link
Hand-built links go wrong in 2 places.
- Put the query before any `#`. [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986.html) ends the query at the first number sign, so tags written after a # belong to the fragment.
- Skip spaces. A space must be percent-encoded as `%20`, and an encoded value is easy to encode again into `%2520`. Use a hyphen.
A tag written after the # and the same link fixed
```
Broken: https://example.com/pricing#plans?utm_source=newsletter&utm_medium=email
Fixed: https://example.com/pricing?utm_source=newsletter&utm_medium=email#plans
```
The [free UTM builder](https://www.trackrev.io/tools/utm-builder) here assembles the URL in your browser, with no signup and nothing stored. Google's Campaign URL Builder is the other common choice. Neither remembers what your team called a channel last month, so the shared list has to live somewhere else.
### A UTM naming convention that holds up
Reports aggregate by exact string, and Google recommends lowercase as standard practice. Use hyphens as the single separator and put the year first in campaign names so they sort in time order: `launch-2026-06` comes before `launch-2026-10`, while `launch-jun26` lands after `launch-aug26`.
> **Example: one capital letter, 2 rows:** A $2,000 newsletter sponsorship drives 4,000 tagged clicks in a quarter: 3,100 tagged `newsletter` and 900 tagged `Newsletter`. The report shows 2 rows, 77.5% and 22.5% of the channel, and dividing $2,000 by the 3,100-click row gives $0.65 a click against the true $0.50. The numbers are invented for the arithmetic.
Source is 1 value per sender from a shared list, medium comes from a closed list of about 8, and campaign is the initiative plus year and month.
| Placement | Source | Medium | Campaign | Channel in Google Analytics 4 |
| --- | --- | --- | --- | --- |
| Launch email | `weekly-digest` | `email` | `launch-2026-10` | Email |
| LinkedIn post | `linkedin` | `social` | `launch-2026-10` | Organic Social |
| Google Ads search ad | `google` | `cpc` | `launch-2026-10` | Paid Search |
| Facebook retargeting ad | `facebook` | `paid-social` | `launch-2026-10` | Paid Social |
| Partner review post | `acme` | `affiliate` | `launch-2026-10` | Affiliates |
| Podcast sponsor read | `devtools-weekly` | `audio` | `launch-2026-11` | Audio |
| YouTube video description | `youtube` | `video` | `demo-2026-10` | Organic Video |
| Banner on a partner site | `acme-network` | `display` | `spring-sale-2026-03` | Display |
| SMS reminder | `sms` | `sms` | `trial-reminder-2026-10` | SMS |
| QR code on a flyer | `flyer` | `offline` | `conf-booth-2026-10` | Unassigned |
*Example links by placement. Channels follow Google's default channel group rules, October 2026.*
Keep 1 shared list of sources and mediums, name 1 person to approve additions, and build links through a form with dropdowns, since a written convention reaches only the people who open it.
### What breaks UTM tracking
| What goes wrong | What the report shows | Fix |
| --- | --- | --- |
| A capital letter or variant spelling | 1 sender split across 2 or more rows | Lowercase every value and use the shared list |
| A redirect or URL shortener that strips the tags | The visit filed as (direct) / (none) | Click the live link and read the address bar |
| 1 or 2 tags in place of all 3 | (not set) in source or medium | Set source, medium and campaign together |
| A cookie rewritten on every visit | Later visits overwrite the first source | Write the first touch only when the cookie is empty; copy the tags onto the user record at signup |
| A return from a payment processor's page | The processor's domain filed as a referral | List it under [unwanted referrals](https://support.google.com/analytics/answer/10327750) |
*Redirects, shorteners and missing tags are the causes Google Analytics 4 documentation gives for (direct) / (none) traffic.*
### Limits that shape UTM data
| Where | Limit or default | What it means for tags |
| --- | --- | --- |
| Google Analytics 4 page location | 1,000 characters | Keep a tagged URL under it; [Google's collection limits](https://support.google.com/analytics/answer/9267744) set the cap |
| [Custom channel groups](https://support.google.com/analytics/answer/13051316) | 2 per standard property, 50 channels each | The place to map your own mediums |
| [Unwanted referrals](https://support.google.com/analytics/answer/10327750) | 50 per data stream | List payment processors here |
| [Stripe metadata](https://docs.stripe.com/metadata) | 50 pairs, 40-character keys, 500-character values | Where a tag becomes revenue by channel |
| [Stripe Payment Links](https://docs.stripe.com/payment-links/url-parameters) | 5 UTM codes of up to 150 characters, using letters, digits, dashes and _ | Stripe discards invalid values, so a dot or space can lose the tag |
| [Browser query stripping](https://firefox-source-docs.mozilla.org/toolkit/components/antitracking/anti-tracking/query-stripping/index.html) | Firefox Strict mode strips 8 parameters, none a utm_ tag; Apple's Safari 17 notes name none | A [5-step test](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) finds the hop that does drop a tag |
*Limits from Google Analytics 4, Stripe and Mozilla documentation, October 2026.*
### Carrying UTM tags into forms, CRMs and payments
Lead records keep tags only if something copies them off the landing URL. On WordPress, [Gravity Forms Dynamic Population](https://docs.gravityforms.com/using-dynamic-population/) fills a field from a named query parameter, though aggressive page caching can break it, and WPForms has a [query string smart tag](https://wpforms.com/docs/how-to-use-smart-tags-in-wpforms/). Test any other form tool or CRM with 1 tagged link and read the saved record.
Stripe copies metadata between related objects in only 4 documented cases, and a Checkout Session to a Subscription isn't one of them, so set `subscription_data.metadata` too. The [UTM and Stripe walkthrough](https://www.trackrev.io/blog/utm-parameters-stripe-attribution-saas) covers the hand-off, and [last-touch vs first-touch vs linear](https://www.trackrev.io/blog/attribution-models-saas-comparison) compares which tag earns the credit.
### UTM tracking in TrackRev
TrackRev adds the tags at the redirect: each tracked link carries a channel, and the channel supplies the source and medium, such as `newsletter` and `email` or `youtube` and `video`, matching Google's rules for Email and Organic Video. Tags already on the destination URL are left alone, so a hand-set `utm_medium=paid-social` survives.
Each click is logged on the server at the redirect, and on a paid plan revenue from Stripe, Paddle, Polar or Lemon Squeezy is attributed to the clicks that led to it. The free plan covers link tracking, 50 links and 1,000 tracked events a month, with revenue figures hidden. Revenue and the [affiliate and referral tools](https://www.trackrev.io/solutions/affiliate-program) start on Starter at $39 a month; Growth is $99 and Scale is $199 ([pricing](https://www.trackrev.io/pricing)).
If you only need a correctly formed URL, the free builder or Google's is enough. [UTM builder vs link tracking tool](https://www.trackrev.io/blog/utm-builder-vs-link-tracking-tool) shows where a link tool starts to pay off.
### Frequently asked questions
**What is a UTM parameter?**
One name=value pair in a URL's query string, such as utm_campaign=spring-sale-2026-03. Google Analytics 4 documents 9 of them and files each visit under the values it finds.
**What is UTM tracking?**
Tagging outbound links with source, medium and campaign values, then comparing channels by those values in a report such as Google Analytics 4's Traffic acquisition. Spend or revenue appear only if you join that data in.
**Do I need all 9 UTM parameters on every link?**
No. Google Analytics 4 documentation says to always use 3: source, medium and campaign. The other 6 each suit a narrower job, such as paid keywords or cost imports.
**Are UTM parameters case sensitive?**
Yes. Google Analytics 4 documentation gives utm_source=google versus utm_source=Google as 2 different values. Channel grouping ignores case, but the values themselves keep it.
**Do UTM parameters hurt SEO?**
A tagged URL duplicates the clean one. Google Search's duplicate-URL guidance recommends rel=canonical, redirects or sitemap entries for parameter variants, with ?gclid=ABCD as its example, so point a canonical link on each landing page at the clean address.
**Can I put an email address or name in a UTM value?**
No. Google Analytics policies bar sending data it could recognize as personally identifiable, and its PII guidance names campaign parameters among the risks. Use campaign names or numeric IDs.
---
## UTM parameters and Stripe: 6 steps to revenue by source
URL: https://www.trackrev.io/blog/utm-parameters-stripe-attribution-saas
Published: 2026-06-24
Author: Muzahid Maruf
UTM tags don't reach Stripe on their own. Store the 3 core tags on your server, write a visitor ID into Stripe metadata, and join each payment to its source.
UTM parameters reach Stripe only when your own code carries them there. The tags sit in the landing URL, a Stripe Checkout Session is created later on the server, and nothing joins the two unless you save the tags on the first visit and write a visitor ID onto the Stripe objects that hold the payment. Payment Links forward 5 UTM codes to your redirect URL after payment, and Stripe's documentation describes no place where it saves them.
Without that bridge, Google Analytics 4 holds the campaign, Stripe holds the amount, and a revenue report shows those payments as Direct.
> **Key takeaways:**
>
> - A Stripe payment carries a UTM tag only when your code puts it there. Payment Links hand 5 codes to a redirect page; other checkouts take metadata or a reference ID.
> - Metadata holds 50 pairs, with 40-character keys and 500-character values, and Stripe copies it between objects in just 4 documented cases, so each subscription needs its own.
> - Safari lets a JavaScript cookie idle for 7 days at most, so write the attribution cookie in your server's response.
> - In the worked example, 10 of 45 paying customers, 22.2% of MRR, have no stored source and sit in Direct.
### What happens to UTM parameters in Stripe
A Payment Link accepts 5 UTM codes of up to 150 characters each, using letters, digits, dashes and _. With the confirmation behavior set to redirect, Stripe appends them once payment completes and silently discards invalid values, per [Stripe's Payment Links tracking page](https://docs.stripe.com/payment-links/url-parameters). Every other surface takes a field you fill yourself.
| Surface | Field you write | Limit |
| --- | --- | --- |
| Checkout Session | `metadata`, `client_reference_id` | 50 pairs; keys of 40 characters, values of 500; ID of 200 |
| Subscription or PaymentIntent from Checkout | `subscription_data.metadata` or `payment_intent_data.metadata` | Same 50, 40 and 500 |
| Payment Link | `client_reference_id` in the URL, or `metadata` on a link per channel | ID of 200 characters, same allowed set as the codes |
| Buy Button or pricing table | The `client-reference-id` attribute | 200 characters |
*Stripe documentation, October 2026.*
### Pick a route by checkout type
| Route | What you build | Weak point |
| --- | --- | --- |
| Your own Checkout code, for server-created Sessions | A few lines at session creation and 1 webhook handler | Needs a developer |
| A reference ID on Payment Links, Buy Buttons and pricing tables | 1 URL parameter or attribute per click | A value with a dot or colon is silently dropped |
| A Measurement Protocol call to Google Analytics 4 | A server call with the client_id that gtag stored at signup | 25 events per request, and Google calls it a supplement to tag-based collection |
| A tool that reads Stripe and joins | A restricted API key and 1 tracking script | A monthly fee |
*Stripe and Google documentation, October 2026.*
I start with the visitor ID: 1 value in client_reference_id and metadata, joined to a visit table you control. Google's [Measurement Protocol overview](https://developers.google.com/analytics/devguides/collection/protocol/ga4) lists the limits of the Google Analytics 4 route, and the [guide to connecting Google Analytics to Stripe revenue](https://www.trackrev.io/blog/connect-google-analytics-stripe-revenue) covers it.
### From click to charge in 6 steps
A gap at any of the 6 steps leaves the payment in Direct.
#### Step 1: Tag every link the same way
Google's [URL builder help](https://support.google.com/analytics/answer/10917952) says to always include utm_source, utm_medium and utm_campaign, and values are case sensitive, so google and Google count as 2 utm_source values. The [free UTM builder](https://www.trackrev.io/tools/utm-builder) assembles the URL, and the [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers Google's 9 supported parameters. Keep each channel's spelling lowercase.
| Channel | Source | Medium | Campaign |
| --- | --- | --- | --- |
| Newsletter | weekly-digest | email | launch-2026-10 |
| Google Ads | google | cpc | brand-2026-10 |
| LinkedIn post | linkedin | social | webinar-2026-11 |
| Partner link | acme | affiliate | spring-2026-03 |
*Example values.*
#### Step 2: Capture tags on the server
Read the tags from the first request your server receives and set the cookie in that response. Per [WebKit's tracking prevention page](https://webkit.org/tracking-prevention/), Safari Intelligent Tracking Prevention deletes cookies created in JavaScript after 7 days without user interaction and caps them at 24 hours after link decoration, while a cookie set in an HTTP response escapes both rules unless a CNAME or third-party IP address cloaks it. Write it only when empty, so a later channel cannot replace the first source. The [stripped parameters guide](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) has an Express middleware for this.
#### Step 3: Save tags at signup
Copy the tags and a visitor ID onto the user row at signup. A buyer who confirms an email on a phone has no cookie there, and the email typed at Stripe Checkout can differ from the signup email, while the saved ID still matches.
#### Step 4: Write the source to Stripe
Stripe's metadata guide lists 4 cases where Stripe copies metadata between objects, and Checkout Session to Subscription is not one, so a subscription needs `subscription_data.metadata`. Each invoice then holds a snapshot in `parent.subscription_details.metadata`. The 3 core tags and a visitor ID use 4 of the 50 slots. A Checkout Session expires 30 minutes to 24 hours after creation (24 by default), so create it when the buyer clicks Subscribe if you store last-touch tags.
Server: write the stored source onto a subscription Checkout Session
```
// The tags were saved on the user row at signup (step 3)
// Stripe unsets a metadata key whose value is empty, so skip the blanks
const tags = Object.fromEntries(
Object.entries({
utm_source: user.utm_source,
utm_medium: user.utm_medium,
utm_campaign: user.utm_campaign,
})
.filter(([, value]) => value)
.map(([key, value]) => [key, String(value).trim().toLowerCase().slice(0, 500)]),
);
const session = await stripe.checkout.sessions.create({
mode: "subscription",
customer: user.stripeCustomerId,
line_items: [{ price: priceId, quantity: 1 }],
client_reference_id: user.visitorId, // up to 200 characters
metadata: { vid: user.visitorId }, // on the Checkout Session
subscription_data: {
metadata: { vid: user.visitorId, ...tags }, // on the Subscription, then each invoice
},
success_url: "https://example.com/welcome",
});
```
The [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post has the full key map, and the [Payment Links attribution guide](https://www.trackrev.io/blog/stripe-payment-links-attribution) covers the per-click ID.
#### Step 5: Read the payment back
Handle `checkout.session.completed` for the first order and `invoice.paid` for renewals. Stripe sends a separate event when a delayed payment method such as ACH Direct Debit succeeds later, so handle `checkout.session.async_payment_succeeded` too. Key each row by the object's ID so a repeated delivery overwrites instead of adding.
#### Step 6: Test in a sandbox
In a Stripe sandbox, pay with the Visa test card 4242 4242 4242 4242, any future expiry and any 3-digit CVC, per [Stripe's testing guide](https://docs.stripe.com/testing). For a user with all 3 tags, the Checkout Session should then show 1 metadata key, the Subscription 4, and the first invoice's snapshot the same 4.
### What the report looks like
A hypothetical month: one $49 monthly plan and 45 paying customers, each joined to a stored source.
| Source | Clicks | Customers | Click to paid | MRR | MRR per click | Share of MRR |
| --- | --- | --- | --- | --- | --- | --- |
| newsletter / email | 400 | 12 | 3.0% | $588 | $1.47 | 26.7% |
| google / cpc | 2,000 | 18 | 0.9% | $882 | $0.44 | 40.0% |
| linkedin / social | 900 | 5 | 0.6% | $245 | $0.27 | 11.1% |
| No stored source | n/a | 10 | n/a | $490 | n/a | 22.2% |
| Total | 3,300 | 45 | | $2,205 | | 100% |
*Illustrative figures for a $49 plan, not customer data.*
Ranked by clicks, google leads with 2,000 and the newsletter has the fewest at 400. Ranked by MRR per click the order changes: the newsletter moves from last to first at $1.47 a click, against $0.44 for google and $0.27 for linkedin. The last row is the one to shrink, since steps 2 and 3 keep a buyer's source from going missing. Each later invoice takes the source of its subscription, so month 12 still credits the click that started it. First click, last click or an even split is a reporting rule you can change without touching Stripe.
SQL: revenue by source, one row per payment joined to its visit
```
select v.utm_source,
v.utm_medium,
count(distinct p.subscription_id) as customers,
sum(p.amount_cents) / 100.0 as revenue
from payments p
join visitors v on v.vid = p.vid
where p.status = 'paid'
group by v.utm_source, v.utm_medium
order by revenue desc;
```
### The same pattern in Pipedrive
In Pipedrive the tags live in custom fields, which cover deals, leads, contacts, projects and products, per its [custom fields article](https://support.pipedrive.com/en/article/custom-fields). In the [deal fields API](https://developers.pipedrive.com/docs/api/v1/DealFields) a varchar field holds 255 characters, enough for any UTM value. Create 1 field per tag plus 1 for the visitor ID and fill them from the step 3 values when your signup code creates the deal. The same ID in Stripe's client_reference_id lets a payment find its deal.
### Where the chain leaks
| Leak | What happens | Fix |
| --- | --- | --- |
| Cookie written in JavaScript | Safari drops it after a week idle, so a buyer who returns on day 8 has no source | Set the cookie from the server response |
| Checkout metadata not copied down | A Checkout Session's metadata does not reach its Subscription, so renewals carry no source | Write it onto the Subscription at checkout |
| UTM codes on a Payment Link | Stripe passes the 5 codes on after payment, keeps none on the payment record, and drops a reference ID with any character outside the allowed set | Add a UUID as `client_reference_id` |
| Return from Stripe's domain | A payment processor's domain can appear as a referral source in Google Analytics 4 | Add it to [unwanted referrals](https://support.google.com/analytics/answer/10327750), which allow 50 per data stream |
| Partial tags in Google Analytics 4 | With any UTM present and no usable GCLID, every source dimension comes from UTMs, so a missing utm_source shows (not set), per Google's [traffic-source documentation](https://support.google.com/analytics/answer/11242870) | Tag every link with all 3 basics |
*Behaviors documented by Stripe, WebKit and Google, October 2026.*
### What TrackRev does with the tags
A TrackRev link carries a channel and saved UTM tags. The redirect logs the click on the server, appends the tags to the destination, and passes a `_vid` parameter that the pixel stores as a `vid` cookie on your domain. On Payment Links, Buy Buttons and pricing tables the pixel adds that ID as the client reference, while a Session you create in code needs the cookie value passed in `client_reference_id`.
The hourly sync reads Stripe with a read-only restricted key and checks 4 places in order.
| Order | Where the sync looks |
| --- | --- |
| 1 | `metadata.vid` on the charge |
| 2 | `client_reference_id` on the Checkout Session |
| 3 | `metadata.vid` on the Checkout Session |
| 4 | The buyer's email, if `identify()` ran at signup |
Renewals inherit the first order's visitor through the subscription ID, and setup is on the [Stripe integration page](https://www.trackrev.io/integrations/stripe). The pixel does not read UTM tags from a page URL, so hand-tagged traffic with no TrackRev link in the path still needs steps 2 to 5. If one server-created Checkout covers all your sales, those steps cost no subscription; a tool earns its place with Payment Links, several partners and channels, or more than 1 billing provider. Paid plans also sync Paddle, Polar and Lemon Squeezy.
The Free plan covers link tracking only, with 50 links and 1,000 tracked events a month, and revenue figures stay hidden. Revenue attribution needs a paid plan, from Starter at $39 a month ([pricing](https://www.trackrev.io/pricing)).
### Frequently asked questions
**Does Stripe track UTM parameters?**
Not by itself. Outside Payment Links, Stripe records only what your code puts in metadata or a reference ID.
**How do I see which UTM source a Stripe customer came from?**
Retrieve the Checkout Session, Subscription or Invoice with a secret key and read its metadata. Stripe redacts metadata from publishable-key requests, so run the lookup on a server.
**Can I add UTM parameters to a Stripe Payment Link?**
Yes, up to 5 codes of 150 characters. They reach your site only when the link redirects after payment, so append client_reference_id for a value that stays on the payment record.
**Which UTM source gets credit when a buyer clicks several campaigns?**
That is a reporting rule: first-touch keeps the earliest source, last-touch keeps the latest, and linear splits credit evenly. Storing both touches costs 7 of the 50 metadata slots, visitor ID included.
**Does Google Ads auto-tagging work with UTM parameters?**
Yes. Google says Google Analytics 4 then uses the auto-tagged values for source and medium, while manual utm_content and utm_term fill the ad content and term dimensions. Keep the 3 core tags on the final URL so your server can store them for Stripe.
**How do I keep UTM parameters in Pipedrive?**
Create custom deal fields for the tags and a visitor ID, then write the saved values when your signup code creates the deal. A varchar field holds 255 characters.
---
## UTM source, medium and campaign: what each means, with examples by channel
URL: https://www.trackrev.io/blog/utm-source-medium-campaign
Published: 2026-10-02
Author: Muzahid Maruf
What utm_source, utm_medium and utm_campaign mean, with tagged examples for 10 channels, how Google Analytics 4 sorts them, and naming rules that hold up.
The UTM source (`utm_source`) names where a click came from, such as `google`, `weekly-digest` or `linkedin`. It is 1 of 5 standard tags added to a link's query string, and UTM stands for Urchin Tracking Module. `utm_medium` adds the channel type (`email`, `cpc`, `social`) and `utm_campaign` names the promotion.
Google Analytics 4 also uses source and medium to file each session under a default channel such as Paid Search or Email, so one mislabeled value moves conversions to the wrong row. The [free UTM builder](https://www.trackrev.io/tools/utm-builder) assembles the URL.
> **Key takeaways:**
>
> - Set utm_source, utm_medium and utm_campaign on every link. Google lists 9 parameters and says to always use these 3.
> - 17 of the 19 manual-traffic rules in the Google Analytics 4 default channel group read the medium, so newsletter or offline lands in Unassigned.
> - Values are case sensitive: Facebook, facebook and fb are 3 separate rows in one report.
### What UTM means in marketing
Urchin Software Corp. of San Diego built the tagging scheme, and [Google agreed to buy the company in March 2005](https://www.eweek.com/news/google-to-buy-web-analytics-provider/). The tags carried over into Google Analytics, and Adobe Analytics and other tools now parse [the 5 original parameters](https://en.wikipedia.org/wiki/UTM_parameters) too.
A UTM link is a normal URL plus a query string of name=value pairs joined by `&`, in any order. [Google's URL builder page](https://support.google.com/analytics/answer/10917952) says to always include `utm_source`, `utm_medium` and `utm_campaign`.
A tagged link
```
https://example.com/pricing?utm_source=weekly-digest&utm_medium=email&utm_campaign=pricing-update-2026-10&utm_content=top-button
```
### What each UTM parameter answers
Google's Analytics Help lists 9 parameters, and 6 do the daily work. The other 3 are `utm_source_platform`, for the buying platform (Search Ads 360, Display & Video 360 or Campaign Manager 360), plus `utm_creative_format` and `utm_marketing_tactic`. Google says neither of the last 2 is currently reported in Google Analytics properties.
| Parameter | Question it answers | Example values |
| --- | --- | --- |
| `utm_id` | Which campaign record? | `cmp-2026-017` |
| `utm_source` | Where did the click come from? | `google`, `linkedin`, `weekly-digest` |
| `utm_medium` | Which channel type? | `cpc`, `email`, `paid_social` |
| `utm_campaign` | Which promotion or launch? | `spring-sale-2026-03` |
| `utm_term` | Which paid keyword? | `attribution+software` |
| `utm_content` | Which link or creative? | `top-button`, `footer-link` |
### UTM source: where the click came from
Give `utm_source` the specific sender. Google's examples are `google`, `newsletter4`, `billboard` and `summer-mailer`, and its table asks for 1 unique value per platform. It also suggests `insta` for Instagram, but Google's published source list has no `insta`, so write `instagram`.
### UTM medium: the kind of channel
`utm_medium` sorts sources into channel types, and 17 of the 19 manual-traffic rules in Google Analytics 4's default channel group read it. Google asks for 1 unique medium per channel, such as `paid_social` or `organic_search`. A TikTok video you posted and a TikTok ad you bought share the source `tiktok`; the post gets `social` and the ad gets `paid_social`.
My working list has 8 values: `cpc`, `paid_social`, `social`, `email`, `affiliate`, `referral`, `audio` and `sms`, each matching a rule by name.
### UTM campaign: the promotion a link belongs to
Google describes `utm_campaign` as the product, slogan or promo code, and wants 1 name that exactly matches the ad platform's campaign name, for example through `{{campaign.name}}`.
Put the year and month in the name. `summer-sale` reused in 2027 merges 2 seasons into 1 row, and `summer-sale-2026-06` keeps them apart. A pattern I would use is goal, audience or offer, then the date: `trial-retargeting-2026-10`.
### utm_term, utm_content and utm_id
`utm_term` is the paid keyword. With Google Ads auto-tagging, Google records keyword data itself. `utm_content` separates links inside 1 campaign: Google's example is 2 call-to-action links in a single email, each with its own value such as `top-button` or `footer-link`.
`utm_id` matters once you upload ad spend. In [Google's campaign data import](https://support.google.com/analytics/answer/10071305), source, medium and date are required, and campaign ID and name are optional but highly recommended. Imported values must match what visitors logged exactly: Google's own example is that Facebook and facebook do not match. In the row below, $1,200.00 over 3,400 clicks works out to $0.35 a click.
| Date | Source | Medium | Campaign ID | Campaign name | Cost | Currency | Clicks |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 2026-10-14 | `facebook` | `paid_social` | `cmp-2026-017` | `trial-retargeting-2026-10` | 1,200.00 | USD | 3,400 |
*Made-up values for fields in Google's import schema.*
### UTM examples by channel
Ten places a link might live and the default channel Google Analytics 4 gives each. The flyer row shows where defaults stop: `offline` matches no rule.
| Where the link lives | utm_source | utm_medium | utm_campaign | Default channel |
| --- | --- | --- | --- | --- |
| Google Ads text ad | `google` | `cpc` | `brand-search-2026-10` | Paid Search |
| Facebook ad | `facebook` | `paid_social` | `trial-retargeting-2026-10` | Paid Social |
| LinkedIn post | `linkedin` | `social` | `founder-launch-2026-10` | Organic Social |
| Newsletter send | `weekly-digest` | `email` | `pricing-update-2026-10` | Email |
| Partner link | `acme-reviews` | `affiliate` | `partners-2026-q4` | Affiliates |
| Podcast sponsor read | `devtools-weekly` | `audio` | `sponsor-2026-11` | Audio |
| Guest post | `exampleblog` | `referral` | `guest-post-2026-10` | Referral |
| YouTube description | `youtube` | `video` | `demo-2026-10` | Organic Video |
| SMS reminder | `sms` | `sms` | `trial-reminder-2026-10` | SMS |
| QR code on a flyer | `flyer` | `offline` | `conf-booth-2026-10` | Unassigned |
*Tag values are examples. Channels follow Google's default channel group definitions, checked October 2026.*
Three finished links
```
https://example.com/pricing?utm_source=linkedin&utm_medium=social&utm_campaign=founder-launch-2026-10&utm_content=post-link
https://example.com/signup?utm_source=facebook&utm_medium=paid_social&utm_campaign=trial-retargeting-2026-10&utm_content=video-a&utm_id=cmp-2026-017
https://example.com/docs?utm_source=devtools-weekly&utm_medium=audio&utm_campaign=sponsor-2026-11
```
### How Google Analytics 4 turns source and medium into channels
[Google's channel definitions](https://support.google.com/analytics/answer/9756891) compare the source with lists of known search, social, video and shopping sites, and the medium with fixed words and regular expressions.
#### Traps that follow from those rules
- The paid channels read the medium. Google's pattern is `^(.*cp.*|ppc|retargeting|paid.*)$`, so cpc, cpm, ppc, retargeting and paid_social count as paid. A Facebook ad tagged `facebook` / `ads` matches none of it, and because facebook is on the social list the session is Organic Social.
- Email, affiliate, audio and sms need exact words in the medium, and Email and SMS also accept the same word as the source. A medium of newsletter, partner or podcast matches nothing, so with an unlisted source the session is Unassigned. Referral takes referral, app or link. Display takes display, banner, expandable, interstitial or cpm, and a paid medium with a source on no list becomes Paid Other.
- Campaign names are read too. Google's Paid Shopping and Organic Shopping rules match a campaign name with shopping anywhere in it, or with shop at the start or after a hyphen, so `shop-launch-2026-10` can be filed under a shopping channel.
- Direct is the empty case. Google's [(direct) / (none) page](https://support.google.com/analytics/answer/15258820) lists untagged links, typed URLs, PDF links, ad blockers and redirects that strip UTMs, shorteners such as bit.ly included.
- Auto-tagging wins when both are present. Google Ads adds a GCLID and Campaign Manager 360 a DCLID, and with either one Google Analytics uses the auto-tagged source and medium while still reading `utm_content` and `utm_term`, per [its traffic-source documentation](https://support.google.com/analytics/answer/11242870).
The source lists live in a sources-and-categories file linked from the channel group page, and the copy downloaded in October 2026 has 819 entries.
| Category | Entries | Share | Sample entries |
| --- | --- | --- | --- |
| Social | 592 | 72.3% | linkedin, facebook, fb, instagram, ig, twitter, t.co, tiktok, reddit |
| Search | 129 | 15.8% | google, bing, yahoo, duckduckgo, baidu, ecosia.org |
| Shopping | 52 | 6.3% | amazon, alibaba, shopify, etsy, ebay |
| Video | 46 | 5.6% | youtube, vimeo, twitch, dailymotion |
> **Worked example: meta versus facebook:** A Facebook ad built in Meta Ads Manager and tagged `utm_source=meta&utm_medium=paid_social` has a paid medium, but the file has no entry called meta, insta, x.com or threads. By Google's published rules the session should land in Paid Other instead of Paid Social, so test any new source in your own Traffic acquisition report.
#### When the defaults do not fit
Print, and any medium outside Google's list, needs a custom channel group. [Google's custom channel group page](https://support.google.com/analytics/answer/13051316) allows 2 per standard property and 5 per 360 property, with up to 50 channels each. Groups apply to past data, and traffic goes to the first matching channel in the group's order, so place yours above any they collide with.
### Naming conventions that hold up
| Field | Do this | Avoid |
| --- | --- | --- |
| Case | `linkedin` | `LinkedIn` |
| Separator | 1 hyphen style, and no spaces (links turn them into + or %20) | `spring_sale` and `spring-sale` mixed |
| Source | The sender: `weekly-digest` | The channel word: `email` |
| Medium | A word Google Analytics matches: `email` | `newsletter` |
| Campaign | Goal and ISO month: `trial-retargeting-2026-10` | `campaign1` |
| ID | 1 stable ID: `cmp-2026-017` | 1 ID reused for 2 campaigns |
Google treats Meta and meta as different values. With made-up numbers, 1 Facebook campaign tagged 3 ways at $79 per purchase shows what that does to a report.
| utm_source | Sessions | Share | Purchases | Rate | Revenue |
| --- | --- | --- | --- | --- | --- |
| `facebook` | 1,240 | 68.9% | 31 | 2.5% | $2,449 |
| `Facebook` | 410 | 22.8% | 14 | 3.4% | $1,106 |
| `fb` | 150 | 8.3% | 2 | 1.3% | $158 |
| Combined | 1,800 | 100% | 47 | 2.6% | $3,713 |
*Illustrative numbers: 1 campaign, 3 spellings of the same source.*
Split this way, one campaign shows conversion rates of 3.4% and 1.3%. Its real rate is 2.6%: 47 purchases from 1,800 sessions.
### Common UTM mistakes
- Setting only some tags. Google recommends source, medium, campaign, utm_id and utm_source_platform together, and warns that gaps appear as (not set).
- Tagging links between your own pages. UTM tags belong on links into your site, and internal clicks are better recorded as events.
- Putting personal data in a tag. [Google's PII guidance](https://support.google.com/analytics/answer/6366371) names all 5 standard parameters, and a mail-merge field that drops a subscriber's address into `utm_content` is the usual leak.
- Letting a redirect eat the tags. Click the final link in a fresh browser and check the address bar. The post on [why UTM parameters get stripped](https://www.trackrev.io/blog/why-utm-parameters-get-stripped) lists the usual causes.
- Expecting tags to carry revenue. When sessions show but no money by channel, [Google Analytics 4 not showing revenue by channel](https://www.trackrev.io/blog/ga4-not-showing-revenue-by-channel) covers the fixes.
### How TrackRev handles UTM tags
The [UTM builder](https://www.trackrev.io/tools/utm-builder) is free with no signup. It takes a destination URL plus 5 fields, builds the link in your browser and stores nothing. It leaves values as typed, so lowercase them yourself, and it has no `utm_id` field.
Inside TrackRev, each short link is created with a channel whose default tags are added to the destination on click, skipping any UTM already there: LinkedIn is `linkedin` / `social`, a newsletter is `newsletter` / `email`, YouTube is `youtube` / `video`. The [channel analytics](https://www.trackrev.io/products/channel-analytics) view groups clicks by the source, medium and campaign it reads. The Free plan covers 50 links and 1,000 tracked events a month with revenue hidden, and paid plans sync revenue from Stripe, Polar, Lemon Squeezy and Paddle: Starter is $39 a month, Growth $99 and Scale $199, with 9 months billed for 12 on annual plans ([pricing](https://www.trackrev.io/pricing)).
If you only need sessions and conversions in Google Analytics, the builder and a naming sheet are enough. To see which campaign produced paying customers, [UTM parameters and Stripe attribution](https://www.trackrev.io/blog/utm-parameters-stripe-attribution-saas) shows the join, and the [complete UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers tag types.
### Frequently asked questions
**What does UTM stand for in marketing?**
Urchin Tracking Module, named for the analytics company Google bought in 2005. In daily use, a UTM is any URL parameter that begins with utm_.
**What is the difference between utm_source and utm_medium?**
Source is the specific sender and medium is the channel type. Reddit as the source with social as the medium is a post; with paid_social it is an ad.
**Are UTM parameters case sensitive?**
In Google Analytics they are, so SpringSale and Spring_Sale count as different campaigns. Imported ad cost data has to match logged values exactly too, so use lowercase from the first link.
**Which UTM parameters are required?**
No tool rejects a link for missing tags, but Google says to always use 3 of its 9 parameters: utm_source, utm_medium and utm_campaign. Add utm_id when you import ad costs, and treat the other 5 as optional.
**What should utm_source be for X (Twitter)?**
Use twitter, which is on the Google Analytics 4 source list along with t.co. The copy downloaded in October 2026 has no x.com entry, so a source of x reaches Organic Social only through a medium of social. For ads, pair twitter with paid_social.
**Why does my campaign show as Unassigned or (not set)?**
Unassigned means no default channel rule matched the pair, usually because the medium is a word like newsletter or offline. The value (not set) means a parameter is missing. Add Session source / medium as a secondary dimension in Traffic acquisition to see which.
**Do UTM parameters show revenue by campaign?**
Not by themselves. A UTM labels a visit, and Google Analytics reports the conversions and purchase values it receives. Revenue by campaign needs Stripe payments joined back to the original click, which TrackRev does on its paid plans.
---
## What is a branded short link?
URL: https://www.trackrev.io/blog/what-is-a-branded-short-link
Published: 2026-09-12
Author: Muzahid Maruf
A branded short link is a short URL on a domain you own. How its DNS and TLS setup works, what 5 tools charge for a custom domain, and when to skip it.
A branded short link is a short URL on a domain you own, such as `go.yourbrand.com/launch` where a generic shortener would give you `bit.ly/3xYz9`. A server answering for your hostname looks up the slug, records the click and sends the visitor on with a 302 redirect.
I would put a branded domain on every link a customer or prospect will see and skip it for links that live an afternoon. Short.io allows 5 custom domains, Dub 3 and Rebrandly 1 on $0 plans, and setup is 1 DNS record plus a decision about who controls the hostname.
> **Key takeaways:**
>
> - Setup is 1 DNS record plus an automatic certificate. A subdomain takes a CNAME, and a root domain cannot, per RFC 2181 and RFC 1912.
> - Bitly claims a 2.3x lift in clicks and Rebrandly claims 39%, and neither page shows a method. In Bitly's survey of 1,006 consumers, 48% named a branded link as the top factor that encourages a click.
> - A hostname you own outlives a vendor. Firebase Dynamic Links ended on August 25, 2025, and custom-domain owners kept their addresses, but the slug list sits in the vendor's database, so export it.
> - Short.io (5 domains), Dub (3) and Rebrandly (1) allow custom domains on $0 plans, while Bitly requires Growth at $35 a month.
### What makes a short link branded
Ownership of the hostname is the whole test. `go.yourbrand.com/launch` is branded, and `bit.ly/yourbrand` is not, because Bitly's domain still sits in front of it: [Bitly's pricing page](https://bitly.com/pages/pricing) shows the Free plan allowing 3 custom back-halves a month and no custom domain. A vanity URL is any memorable address, and a custom short link has a slug you picked. A branded link needs a hostname you own.
### How a branded short link works
A click passes through 5 steps.
| Step | What happens | Protocol detail |
| --- | --- | --- |
| 1 | The browser asks DNS for go.yourbrand.com, and your CNAME record points it at the link tool | DNS, port 53 |
| 2 | The browser opens HTTPS, and the tool presents a certificate issued for your hostname | TLS, port 443 |
| 3 | The server looks up the slug /launch and finds the destination | HTTP GET, port 443 |
| 4 | The server logs the click with time, country, device and referrer, and flags bots | Before the response goes out |
| 5 | The server replies with a Location header and the browser loads the destination | HTTP 302 |
Illustrative DNS record and response
```
; zone file for yourbrand.com
go CNAME
$ curl -I https://go.yourbrand.com/launch
HTTP/2 302
location: https://yourbrand.com/pricing?utm_source=newsletter&utm_medium=email
```
#### DNS: one record per hostname
The Domain Name System (DNS) handles a subdomain with a CNAME, an alias to the tool's hostname. [RFC 2181](https://www.rfc-editor.org/rfc/rfc2181#section-10.1) section 10.1 allows only DNSSEC record types beside one, and [RFC 1912](https://www.rfc-editor.org/rfc/rfc1912#section-2.4) section 2.4 says it may not coexist with any other data. A root domain always carries NS and SOA records and usually MX records, so it cannot hold one. Some tools offer an A record for the root instead, and TrackRev's Domains page warns that it replaces whatever site runs there and that every other A or AAAA record on that name must go.
#### TLS: a certificate for your hostname
Transport Layer Security needs a valid certificate for your hostname, or browsers show a warning before the redirect runs, so the tool obtains one, usually from Let's Encrypt. Its [HTTP-01 challenge](https://letsencrypt.org/docs/challenge-types/) works on port 80 only and cannot issue wildcard certificates, while DNS-01 can. [Short.io's pricing page](https://short.io/pricing) promises a free certificate, and TrackRev's [custom tracking domains page](https://www.trackrev.io/products/custom-tracking-domains) calls issuing and renewal automatic.
#### Why the redirect is a 302
[RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-301-moved-permanently) (STD 97, June 2022, Internet Engineering Task Force) lets caches reuse 301 and 308 responses without asking the server again. A browser that cached a 301 can skip the link tool, so that click goes uncounted and a changed destination is ignored. A tool that counts every click and allows edits needs a 302 or 307, and TrackRev sends a 302.
| Status | Cacheable by default (RFC 9110) | Google Search treats it as |
| --- | --- | --- |
| 301 | Yes | Permanent: target is canonical |
| 308 | Yes | Permanent: target is canonical |
| 302 | No | Temporary: source stays in results |
| 307 | No | Temporary: source stays in results |
*Cache behavior from RFC 9110 sections 15.4.2 (301), 15.4.3 (302), 15.4.8 (307) and 15.4.9 (308). Search treatment from the [Google Search Central redirect documentation](https://developers.google.com/search/docs/crawling-indexing/301-redirects).*
### Branded short link vs generic shortener
| Dimension | Shared shortener domain | Your own domain |
| --- | --- | --- |
| Name in the preview | The shortener's | Yours |
| Spam-filter reputation | Pooled across all customers | Yours alone, from zero |
| If the vendor shuts down | Every link stops | You keep the hostname |
| Setup | None | 1 DNS record and 1 certificate |
| Typical cost | $0 on free plans | $0 on Short.io, Dub and Rebrandly, $35 on Bitly Growth, plus a domain |
Twilio SendGrid's [documentation](https://www.twilio.com/docs/sendgrid/ui/account-and-settings/how-to-set-up-link-branding) says spam filters and inbox providers judge a message's links by the reputation score of the root domain. Your own domain carries your reputation, while a shortener's root domain is shared with every customer.
### Do branded short links get more clicks?
Vendors that sell custom domains quote lifts. Bitly's [Click Expectation Report](https://bitly.com/blog/click-expectation-report/) says links with a custom domain see a 2.3x lift in clicks over unbranded ones, which reads as 130% more, and [Rebrandly's branded links page](https://www.rebrandly.com/branded-links) says 39% more. Neither page shows how it measured the figure.
The same report includes a survey with a stated method: 1,006 US consumers and 501 US marketers and creators on an online panel, fielded between July 27 and August 5, 2026, with a consumer margin of error near 3.1 points at 95% confidence. It records stated attitudes, so it shows what people say they weigh and says little about how your own list behaves.
| Finding among 1,006 US consumers | Share |
| --- | --- |
| Encourages a click: recognizing the brand in a custom branded short link | 48% |
| Encourages a click: personal trust in the sender | 44% |
| Encourages a click: clear destination copy | 43% |
| Causes a pause: safety concerns about the URL | 57% |
| Causes a pause: the link feels like clickbait | 52% |
| Causes a pause: long URLs full of tracking characters | 28% |
| Causes a pause: generic shorteners that hide the brand's name | 23% |
*Bitly Click Expectation Report, September 29, 2026, consumer sample of 1,006.*
> **Worked example: sizing your own test:** Send 10,000 emails per half. The generic link collects 200 clicks (2.0%) and the branded link 240 (2.4%), a 20% relative lift. The z-score is about 1.93, just under the 1.96 needed for 95% confidence (two-sided p near 0.054). The same rates clear the bar at roughly 10,300 recipients per half. These figures are illustrative, and a lift this size needs more volume than most single campaigns have.
### What happens when a vendor shuts down
| Service | Date | What happened to links |
| --- | --- | --- |
| goo.gl | August 25, 2025 | Warning pages began August 23, 2024, and links with no activity in late 2024 stopped working while the rest kept running |
| Firebase Dynamic Links | August 25, 2025 | All links returned a 404, including those on custom domains, and page.link subdomains could not be transferred |
*Sources: [Google's developers blog](https://developers.googleblog.com/en/google-url-shortener-links-will-no-longer-be-available/) and the [Firebase Dynamic Links FAQ](https://firebase.google.com/support/dynamic-links-faq).*
A company that owned its hostname lost the service but kept the address, and could point DNS at a new tool. Its slugs had to be re-created. Export your slug list on a schedule and keep the domain on auto-renew.
### Set up a branded domain in 6 steps
- Pick a hostname on a domain you own. Dub's [custom domain guide](https://dub.co/help/article/how-to-add-custom-domain) suggests go, try, links and l, and advises against www.
- Add the hostname in your link tool, which lists the DNS records to create.
- Create a CNAME named go with the tool's value pasted exactly (Dub suggests a TTL of 86400), after deleting any A or AAAA record on that name. On Cloudflare, check whether your tool wants DNS only, which Dub's [Cloudflare guide](https://dub.co/help/article/using-cloudflare-domains) recommends because proxying can skew analytics.
- Wait for verification and the certificate. A new subdomain has nothing cached, and TrackRev's product page quotes about 5 minutes.
- Run curl -I on a test link and expect a 302, an https:// destination in the Location header and a valid certificate.
- Move the links that matter. TrackRev links made earlier keep working on the default short host.
### What custom domains cost
Short.io, Dub, Rebrandly and TrackRev all allow a custom domain on a $0 plan, and Bitly Core, at $10 a month, has none. Registration is usually extra, though Bitly Growth and Dub Pro each include 1 complimentary domain.
| Tool | Cheapest plan with a custom domain | Domains it allows | Free plan links |
| --- | --- | --- | --- |
| Bitly | Growth, $35/mo ($29/mo billed annually) | 1 (Enterprise: multiple) | 5 a month |
| Rebrandly | Free, $0 (Essentials: $11/mo, $8/mo billed annually) | 1 (Essentials: 2, Professional: 3, Growth: 10) | 10 a month |
| Short.io | Free, $0 | 5 (Hobby: 7, Pro: 10, Team: 50) | 1,000 in total |
| Dub | Free, $0 | 3 (Pro: 10, Business: 100, Advanced: 250) | Not stated |
| TrackRev | Free, $0 (Starter: $39/mo, $351 billed annually) | Unlimited on paid plans | 50 links |
*Prices from each vendor's pricing page, October 2026. Dub's domain counts are from its help center.*
### Branded short links in TrackRev
Once a domain verifies, TrackRev serves links as `go.yourbrand.com/slug` through a 302, and the [custom tracking domains](https://www.trackrev.io/products/custom-tracking-domains) page says affiliate partner links on paid plans use it too. The server logs each click, flags bots and appends a visitor ID that the pixel on your site reads on the first page view, tying the click to a later signup and, on a paid plan, to Stripe, Polar, Lemon Squeezy or Paddle revenue.
Server-side logging does not rely on the script-written cookies that [Safari Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/) deletes after 7 days without interaction; [our Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers what survives afterward. The Free plan has 50 links and 1,000 tracked events a month with revenue hidden, and annual billing charges 9 months for 12 on [Starter ($39 a month), Growth ($99) and Scale ($199)](https://www.trackrev.io/pricing).
If branded redirects with click counts are the whole job, Short.io's Free plan (50,000 tracked clicks a month) costs less. [Short.io vs TrackRev](https://www.trackrev.io/blog/short-io-vs-trackrev), [Dub vs TrackRev](https://www.trackrev.io/blog/dub-co-vs-trackrev) and the [Bitly alternatives roundup](https://www.trackrev.io/blog/best-bitly-alternatives-2026) show where each fits, and [link tracking](https://www.trackrev.io/solutions/links-and-analytics) adds revenue to those clicks.
### When a generic shortener is fine
Skip the domain for a link pasted into a single Slack thread, a 1-hour incident redirect or a project with no domain yet. A link in an email template or a printed code outlives the campaign and carries your name.
### Frequently asked questions
**What is a branded short link?**
A short redirect URL on a hostname you own, so people read your company's name where a shortener's would be.
**Do I need to buy a new domain?**
No. A subdomain of a domain you own works. A new domain costs a yearly registration fee, although Bitly's $35 Growth plan includes registering 1 custom domain.
**How long does setup take?**
Usually minutes, because a new subdomain has nothing cached in DNS resolvers. If verification still fails after 1 hour, check the record for a typo.
**Do existing links break?**
In TrackRev they keep working on the default short host and report to the same dashboard. Other tools differ, so check first.
**Are they good for SEO?**
Google Search treats a 302 as a temporary redirect, so keep canonical tags and internal links on the real destination URLs.
**Can affiliates use my domain?**
In TrackRev, yes: partner links use your domain by default. The affiliate and referral program needs a paid plan from $39 a month, and the Free plan covers link tracking only.
---
## What Is Referral Marketing? How a Referral Program Works
URL: https://www.trackrev.io/blog/what-is-a-referral-program
Published: 2026-10-04
Author: Muzahid Maruf
Referral marketing rewards customers for new signups. How a referral program works, 6 reward types with costs, and how it differs from affiliate programs.
Referral marketing rewards existing customers for introducing your product to others. A referral program is the system behind it: each customer gets a unique link or code, a visitor who arrives through it is recorded, and when that visitor pays, the referrer, the friend or both earn a reward such as credit, a discount or cash. An affiliate program uses the same plumbing with outside publishers.
Dropbox's [refer page](https://www.dropbox.com/refer) shows the pattern. When a friend signs up through your link, you both get storage: 500 MB per referral on Basic, capped at 16 GB, and 1 GB on Plus, capped at 32 GB.
> **Key takeaways:**
>
> - A referral program rewards customers who bring in buyers. An affiliate program pays outside partners, with a median of 20% of each payment for 12 months in B2B SaaS.
> - In a 2011 study of 9,814 customers of a German bank, referred customers earned about 25% more contribution margin, 82.0% were still customers after 33 months against 79.2%, and six-year value ran at least 16% higher.
> - Pay after the first invoice clears and your refund window closes. On a $49 plan, a $25 referrer credit plus 20% off the friend's first 3 months costs $54.40, or 11.6% of first-year gross profit.
> - Referral volume tracks your customer count: 1,000 customers produced 24 paid referrals in the worked example. Add an affiliate program for reach beyond your own base.
### Referral marketing compared with word of mouth
Word of mouth happens without you. Referral marketing adds a record of who sent whom, a reward, and a rule tying the reward to a purchase. Nielsen's April 2012 [Global Trust in Advertising survey](https://www.nielsen.com/insights/2012/consumer-trust-in-online-social-and-mobile-advertising-grows/) of 28,000 internet respondents in 56 countries found that 92% trusted earned media such as recommendations from friends and family, up 18% since 2007.
Employee referral programs, which pay staff for recruiting, belong to HR.
### What the research says about referred customers
A paid recommendation may carry less weight than a free one, so the evidence on rewarded referrals matters. A German bank paid existing customers a 25 euro voucher per new customer. Researchers at Goethe University Frankfurt and the Wharton School (Philipp Schmitt, Bernd Skiera and Christophe Van den Bulte) followed 5,181 referred customers and 4,633 others through September 2008 and reported the results in a [Journal of Marketing paper](https://faculty.wharton.upenn.edu/wp-content/uploads/2012/04/Schmitt-Skiera-vandenBulte-2011-Referral-Programs-Customer-Value.pdf) in January 2011.
Referred customers produced 7.6 cents a day (27.74 euros a year) more contribution margin on a base of 30 cents, about 25% more, and after 33 months 82.0% were still customers against 79.2%. Acquiring them cost about 20 euros less than customers won by mailing. The margin gap shrank over time and the retention gap did not, and six-year value came out at least 16% higher. One bank says little about a SaaS plan, and the gain varied by segment, so run your own cohort test.
### How a referral program works from click to reward
A referral program has to carry one fact, who sent this customer, from the first click to the first payment. [Affiliate tracking](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) shows where each hand-off breaks.
| Step | What happens | Where it breaks |
| --- | --- | --- |
| 1. Issue an identifier | A link such as yourapp.com/?ref=sarah-k, a code such as SARAH20, or both. | A generic code that anyone can post on a coupon site. |
| 2. Capture the visit | The landing page stores the ref value in a first-party cookie. | Safari deletes cookies created in JavaScript after 7 days of no user interaction with your site, under [WebKit's Intelligent Tracking Prevention](https://webkit.org/tracking-prevention/). |
| 3. Attach it to the signup | The ref value is saved on the new account at registration. | A signup on a second device, or after cookies were cleared. |
| 4. Carry it to billing | It rides into checkout as Stripe Checkout metadata or a typed promotion code. | A checkout that never receives the value. |
| 5. Wait for payment | The reward fires on the first paid invoice, then waits out a refund window such as 30 days. | Paying at signup or at trial start. |
| 6. Deliver the reward | Credit lands on the referrer's next invoice, or cash goes out in a monthly batch. | A refund after the reward has gone. |
#### Links, codes and the billing side
A link records the click; a code needs none, since the friend types it at checkout. In Stripe a code is a [promotion code](https://docs.stripe.com/billing/subscriptions/coupons) that maps to a coupon and can be limited to first-time customers or capped at, say, 100 redemptions. Accept both and decide in advance which wins when they disagree. A Checkout Session and its subscription keep separate [metadata fields](https://docs.stripe.com/api/checkout/sessions/create), so set both: renewals invoice on the subscription. [Coupon code tracking](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) has more.
Stripe API: the friend's coupon, then a Checkout Session that records the referrer
```
# 1. The friend's reward: 20% off for 3 months
curl https://api.stripe.com/v1/coupons \
-u "<>:" \
-d id=friend-20-for-3-months \
-d percent_off=20 \
-d duration=repeating \
-d duration_in_months=3
# 2. A Checkout Session that applies it and records the referrer
curl https://api.stripe.com/v1/checkout/sessions \
-u "<>:" \
-d mode=subscription \
-d "line_items[][price]"="<>" \
-d "line_items[][quantity]"=1 \
-d "discounts[][coupon]"=friend-20-for-3-months \
-d "metadata[referrer]"=sarah-k \
-d "subscription_data[metadata][referrer]"=sarah-k \
-d success_url="https://example.com/welcome"
```
### Reward types and what they cost
| Reward | Example | Cost to you | Watch for |
| --- | --- | --- | --- |
| Credit for the referrer | $25 off the next invoice | $25 of revenue, only after the friend pays | Your product needs somewhere to apply credit. |
| Discount for the friend | 20% off the first 3 months | 3 months at $9.80 is $29.40 | In Stripe, a repeating coupon with duration_in_months set to 3. |
| Free months | 1 month free | $49 | It delays the first payment, so the referrer's reward waits too. |
| Cash | $50 once, sent by PayPal or Wise | $50 | Every referrer becomes a payee with a tax form. |
| Product usage | Dropbox Basic: 500 MB per referral, up to 16 GB | Storage costs and no cash | Works only when the reward is cheap for you to provide. |
| Recurring commission | 20% of each payment for 12 months | $9.80 a month, $117.60 over 12 months | Cost grows with retention, and it starts to resemble an affiliate program. |
*Costs assume a $49 monthly plan.*
> **Worked example: $49 plan, 80% gross margin:** The plan earns $39.20 of gross profit a month. Give the referrer a $25 credit and the friend 20% off the first 3 months ($29.40), and rewards total $54.40 per referred customer. If the customer stays 12 months, gross profit is $470.40 at list price and $416.00 after rewards, so rewards take 11.6% of it. Month 1 alone leaves $4.40 ($39.20 less the $9.80 discount and the $25 credit). If the friend would have bought anyway, the whole $54.40 bought nothing, so a first cohort needs a comparison group.
### Types of referral programs
| Type | Who is paid | Example |
| --- | --- | --- |
| Single-sided | The referrer only | $25 credit to the referrer, nothing for the friend |
| Two-sided | Referrer and friend | Dropbox Basic: 500 MB to each side per referral |
| Milestone | The referrer, with rewards that grow | A free month at 3 referrals, a free quarter at 10 |
| Recurring commission | The referrer, monthly | 20% of each payment for 12 months |
Dropbox's [April 3, 2012 post](https://blog.dropbox.com/topics/company/dropbox-referrals-are-now-twice-as-nice) says the company first gave 250 MB per invite, then doubled that so both sides get 500 MB, and a free account could invite 32 people for 16 GB in total. Pro accounts earned 1 GB per referral, 32 GB in total.
### Measuring whether it works
Track participation, invites per sharer, invite-to-paid conversion and reward cost per paid customer, then compare referred customers' 90-day retention and revenue with everyone else's, as the bank researchers did over 33 months.
| Stage | Rate | Result |
| --- | --- | --- |
| Customers | | 1,000 |
| Share at least once | 6% | 60 |
| Invites sent | 5 each | 300 |
| Become paying customers | 8% | 24 |
| Reward cost | $54.40 each | $1,305.60 |
*Illustrative rates for a 1,000-customer base, not benchmarks.*
Those 24 customers equal 2.4% of the base. Dividing new customers by existing ones gives the viral coefficient, here 0.024, and a program grows on its own only above 1. Volume tracks customer count: 250 customers at the same rates yield 6. Compare the $54.40 with what other channels cost you per customer, and [check each signup for self-referral](https://www.trackrev.io/blog/prevent-affiliate-self-referral-fraud) before you count it.
### Referral program or affiliate program
| Attribute | Referral program | Affiliate program |
| --- | --- | --- |
| Who promotes | Existing customers | Outside publishers, creators and consultants |
| Example reward | $25 credit, or 20% off 3 months for the friend | Cash commission, such as 20% of each payment for 12 months |
| Cost per customer on a $49 plan | $54.40 once, from the worked example | $117.60 over 12 months if the customer stays (20% of $49, 12 times) |
| Volume limit | Your customer count and whom they know | The partners you can recruit and activate |
| Main fraud pattern | Duplicate accounts claiming the reward | Self-referral and ads bidding on your brand name |
#### When a referral program fits
Start here when customers already recommend you unprompted and buyers know each other, as teams and agencies with clients do, and a $25 credit is an easy reward for you to give.
#### When an affiliate program fits
Choose it when you need reach beyond your customers: buyers who research tools through blogs, newsletters and YouTube reviews, or a segment with no customers yet. TrackRev's [affiliate benchmark tables](https://www.trackrev.io/data/affiliate-program-benchmarks) for Q2 2026, compiled from public Impact, PartnerStack and Awin research, put the median B2B SaaS commission at 20% for 12 months across 564 programs, and [starting an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) covers setting yours. Running both works too: credit for customers, commission for outside partners.
### Abuse and legal rules to plan for
Expect second accounts that claim the reward. The bank study's authors note most programs pay however long the new customer stays. Pay only on a paid invoice, hold through your refund window (30 days, for example), cap redemptions, and use the first-time-customer restriction on Stripe promotion codes.
The Federal Trade Commission's [Endorsement Guides Q&A](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking), covering guides revised in 2023, says a disclosable connection extends past money to gifts, sweepstakes entries and deals between acquaintances. Put a disclosure rule in your terms and on the share screen; [FTC, GDPR and consent rules](https://www.trackrev.io/blog/affiliate-program-compliance-ftc-gdpr) covers the rest.
For emailed invites, the [CAN-SPAM guide](https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business) says a seller who gives money, coupons or discounts for forwarding a message, or for any form of referral, may be responsible for compliance: accurate headers, a postal address, opt-outs honored within 10 business days, and penalties up to $53,088 per violating email.
### Running a referral program in TrackRev
TrackRev's Affiliate Program runs referral and partner programs in one workspace. Each advocate gets a unique link, the friend's reward (a percentage discount, free months or an extended trial) shows on the signup page, and the advocate earns cash or credit.
Cash is tracked as commission against revenue from Stripe, Polar, Lemon Squeezy or Paddle, reversed on a refund or dispute, and held for 0 to 180 days (the default is 0, so match your refund window). You pay from a PayPal or Wise CSV export. Self-referral detection is built in, and partner revenue appears in the same channel reports as your other sources.
The free plan covers 50 links, 1,000 tracked events a month and 1 workspace, with revenue hidden. Every paid plan includes the whole product: Starter is $39 a month for 1 workspace and up to $10,000 of commission tracked a month, Growth is $99 a month for unlimited workspaces and up to $100,000 a month, and Scale is $199 with priority support. A checkout outside those 4 billing systems calls for a tool built for it. See [two-sided referral campaigns](https://www.trackrev.io/products/referral-campaigns) and the [Affiliate Program](https://www.trackrev.io/solutions/affiliate-program) page.
### Frequently asked questions
**What is a referral program?**
It is a rule set that fixes who qualifies, the reward, the trigger and the payout. "The friend's first paid invoice triggers a $25 credit" is a complete program.
**How is a referral program different from an affiliate program?**
A customer who earns a $25 credit when a friend subscribes is in a referral program. A newsletter writer earning 20% of each payment from readers for 12 months is an affiliate. The tracking matches, and the people, reward size and reach differ.
**How much should a referral reward be?**
Work backward from what a customer costs elsewhere. If paid ads cost $120 per customer, a $54.40 reward package undercuts them by $65.60 and is paid only after the first invoice clears.
**When should a referrer be paid?**
After the friend's first payment clears and your refund window closes: with 30 days, a March 1 charge becomes payable March 31. The bank study's authors flag paying at signup as prone to abuse.
**Should referral rewards be cash or credit?**
Credit needs no payout rails but suits only people who keep using you. Cash suits anyone and makes each referrer a payee, so collect a tax form such as a W-9 first.
**How do you track a referral without cookies?**
Use a code the friend types at checkout, which avoids Safari's 7-day limit on script-written cookies. For emailed invites, the invited address is a second identifier.
---
## What is Linktree used for, and is the free plan enough?
URL: https://www.trackrev.io/blog/what-is-linktree
Published: 2026-10-02
Author: Muzahid Maruf
What Linktree is used for, how a page works, what the free and paid plans cost in October 2026, the limits people hit and when another tool fits better.
What is Linktree used for? Putting many links behind one URL. You paste linktr.ee/yourname into an Instagram or TikTok bio, and a tap lands visitors on a page of buttons leading to a shop, video, booking page or newsletter. [Instagram's help center](https://help.instagram.com/362497417173378) allows up to 5 links in a profile, while a free Linktree page takes unlimited basic links. I run TrackRev, which has its own free link-in-bio page.
> **Key takeaways:**
>
> - Linktree puts many links behind one linktr.ee/yourname address. Linktree Free accounts get unlimited basic links, 1 featured link and 28 days of analytics.
> - The footer comes off with Linktree Pro for $144 a year on annual billing, and no plan offers a custom domain.
> - Linktree Insights reports views and clicks. A sale on your own checkout needs UTM tags and the Google Analytics integration on Linktree Pro.
> - TrackRev's free link-in-bio page publishes without signup, holds up to 50 items and takes your own domain with a free account, but it has no store or email capture.
### What is a Linktree page?
Linktree is a link-in-bio tool. Per its [help center](https://linktr.ee/help/en/articles/5434130-what-is-linktree), each account gets a page at linktr.ee/yourusername, and edits made in the Linktree Admin appear on the live page right away. The company claims over 70 million users.
### What is Linktree used for? Job by job
| Job | What the page does | Plan it starts on |
| --- | --- | --- |
| Share links | Unlimited basic links on one page | Linktree Free |
| Highlight a link | Featured layout: 1 on Linktree Free, unlimited on paid plans | Linktree Starter |
| Collect contacts | Email and phone sign-ups on the page | Linktree Free |
| Sync contacts | Mailchimp, Klaviyo, Kit or Google Sheets | Linktree Pro |
| Reply to comments | A keyword in an Instagram comment triggers a DM | Linktree Free |
| Sell and earn | Digital products, courses, affiliate links, and paid communities (US only) | Linktree Free, with reduced fees on paid plans and 0% on Linktree Pro |
| Schedule posts | Social posts go live across platforms | Linktree Premium |
| Style a QR code | Custom colors or your own logo on the code that opens the page | Linktree Pro |
*Linktree jobs by plan, from its pricing page and help center, October 2026.*
[The pricing page](https://linktr.ee/s/pricing) lists Instagram auto-replies under Premium, yet the [help center article](https://linktr.ee/help/en/articles/5434140-an-overview-of-paid-features-available-on-linktree) updated July 30, 2026 gives Linktree Free 1,000 DMs a month. Selling is regional: Earn features run in selected countries only.
### How a Linktree page works, step by step
- Sign up and claim linktr.ee/yourusername; the Accounts section of the Linktree Admin renames it later.
- Add buttons and pick a theme. Linktree Free allows unlimited basic links.
- Paste the URL into the bio field of Instagram, TikTok, YouTube or LinkedIn, an email signature, or a printed QR code.
- Visitors tap through, and Linktree Insights counts views, unique views, clicks, unique clicks and a click rate, which is clicks divided by views.
### Is Linktree free? Plans and prices
Yes. [Linktree's pricing page](https://linktr.ee/s/pricing) labels the free plan "Free with restrictions". A custom Agency or Enterprise tier sits above the four self-serve plans.
| Plan | Per month, annual billing | Per year | Per month, monthly billing | Analytics history | Instagram DMs a month |
| --- | --- | --- | --- | --- | --- |
| Free | $0 | $0 | $0 | 28 days | 1,000 |
| Starter | $6 | $72 | $8 | 90 days | 1,500 |
| Pro | $12 | $144 | $15 | 365 days | 2,500 |
| Premium | $30 | $360 | $35 | Account lifetime | Unlimited |
*Linktree prices and limits, October 2026, from its pricing page and help center.*
Linktree Pro and Premium start with a 7-day free trial. Annual billing saves $24 on Starter, $36 on Pro and $60 on Premium against 12 months at the monthly rate. For a plain list of links, Linktree Free is enough.
On selling, the pricing page promises 0% fees from Pro and publishes no percentage below it. Its FAQ lists a US$0.25 charge per payout, and a footnote says transaction and processing fees may apply.
### Limits people run into
#### The linktr.ee address never changes
Linktree's [help center](https://linktr.ee/help/en/articles/6571689-can-i-change-the-linktree-url-to-a-custom-domain) says it offers no custom domain to replace the linktr.ee URL, and suggests a Redirect link instead. The article is dated October 15, 2024, and none of the plans on the pricing page lists a domain. A [branded short link](https://www.trackrev.io/blog/what-is-a-branded-short-link) on a domain you own can be pointed elsewhere later, while a linktr.ee address belongs to Linktree.
#### Removing the footer costs $144 a year
Linktree Pro removes the footer. At $12 times 12 months that is $144 on annual billing, and $15 times 12 is $180 month to month. [Carrd Pro Lite](https://carrd.com/pro) removes Carrd's badge for $9 a year on 3 sites, although Carrd is a page builder where you place every element yourself.
#### Free analytics cover 28 days
Linktree Free shows the last 28 days, Linktree Starter 90, Linktree Pro 365 and Linktree Premium the account's lifetime, per the [Linktree Insights article](https://linktr.ee/help/en/articles/5434178-understanding-your-insights) of March 27, 2026. The Most Clicked list and the Visitors section (traffic sources, locations, devices) belong to Pro and Premium, and CSV export needs Premium. Your own test taps count, and the article does not mention bot filtering.
#### Linktree Insights stops at the click
Linktree Insights shows earnings and conversions only for links that earn money, such as Earn links, paid courses and digital products.
> **Worked example:** Linktree's own example is 1,000 clicks on 2,000 views, a 50% rate. Say 20 of those clickers buy a $29 product on your own checkout. That is $580 in revenue and a 2% purchase rate, and the Insights article lists no way to record either.
Linktree Pro adds UTM parameters, a Google Analytics integration and a Meta Pixel, but you can tag links by hand on any plan, since a tag is part of the URL. [Google's documentation](https://support.google.com/analytics/answer/10917952) lists 9 UTM parameters and says to always set 3.
A bio link tagged for Google Analytics
```
https://yourbrand.com/pricing?utm_source=instagram&utm_medium=bio_link&utm_campaign=october_launch
```
The free [UTM builder](https://www.trackrev.io/tools/utm-builder) assembles these URLs, and the [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming. Joining a tagged visit to the payment that followed takes [link tracking software](https://www.trackrev.io/blog/best-link-tracking-software-saas-2026).
### When another tool makes more sense
| If you need | Look at | What it costs |
| --- | --- | --- |
| Your own domain | Carrd Pro Standard | $19 a year for 10 sites, $39 for 25 |
| No badge, no custom domain | Carrd Pro Lite | $9 a year for 3 sites, $14 for 10 |
| Your own domain, free to start | TrackRev link in bio | $0, with a free account for the domain |
| Revenue per button | TrackRev tracking links | Paid plans from $39 a month |
*Prices from each vendor's pricing page, October 2026. A domain you own costs extra.*
#### TrackRev's free link-in-bio page
TrackRev's [link-in-bio tool](https://www.trackrev.io/tools/link-in-bio) publishes without an account: choose a name, add links, and the page is live at trackrev.io/yourname. A free account lets you serve it from a domain you own, such as links.yourbrand.com.
| Feature | Linktree Free | TrackRev free page |
| --- | --- | --- |
| Links | Unlimited basic links | Up to 50 items |
| Footer | Linktree footer until Pro, $144 a year | Made with TrackRev footer stays |
| Analytics | 28 days of views and clicks | None on pages published without an account |
| Selling and email | Products, courses, sign-ups | None |
| Design | Custom designs on Pro | 12 theme presets, 5 fonts, 12 social icons |
*Linktree's free plan beside TrackRev's free page, October 2026.*
For per-button numbers, put a TrackRev tracking link behind each button. It records each click and matches it to the Stripe, Paddle, Polar or Lemon Squeezy payment it led to ([how link tracking works](https://www.trackrev.io/solutions/links-and-analytics)). Revenue figures stay hidden on the free plan and show on every paid one, which differ on workspaces and affiliate commission volume ([pricing](https://www.trackrev.io/pricing)).
| Plan | Per month | Per year, annual billing | Monthly limits |
| --- | --- | --- | --- |
| Free | $0 | $0 | 50 links, 1,000 events |
| Starter | $39 | $351 | $10K partner commission tracked |
| Growth | $99 | $891 | $100K partner commission tracked |
| Scale | $199 | $1,791 | No commission cap |
*TrackRev plans, October 2026, from its pricing page.*
Stay on Linktree when the page is a storefront, since its selling, contact collection, Instagram auto-replies and scheduling have no match in TrackRev's builder.
### Frequently asked questions
**Is Linktree worth paying for?**
Linktree Pro at $12 a month on annual billing is the cheapest way to remove the footer. If the address is the problem, no Linktree plan fixes it. Linktree Premium suits heavy Instagram automation and scheduled posts.
**Do I need Linktree if Instagram allows 5 links?**
Not for a short list. Five or fewer destinations can live in the profile itself. A page earns its place when the list is longer, when the same list has to work on other platforms, or when you want selling and sign-ups behind the link.
**Does Linktree show who clicked my links?**
It shows counts, plus traffic sources, locations and devices on Linktree Pro, but no named visitors. People who subscribe through your page appear in the Audience CSV export (Linktree Pro and Premium) with the email or phone number they shared.
**Is there a free alternative to Linktree Premium?**
Linktree Premium bundles link rules and routing, AI integrations, all-time analytics, data export, social scheduling and Instagram auto-replies. Linktree Free already includes 1,000 auto-reply DMs a month. For analytics history, compare each tool's free retention, since Linktree Free keeps 28 days and TrackRev's free page has none until you sign up.
**Can I reset my Linktree click counts?**
No. Linktree keeps the data for the life of the account and points you to the date picker to chart a custom range. Your own test taps can take up to 30 minutes to appear.
**What happens to my bio link if I leave Linktree?**
Every bio field, signature and printed code pointing at linktr.ee needs editing, because Linktree owns that address. A domain you own makes a later move a DNS change.
---
## What Is Marketing Attribution? Data, Models and Tools
URL: https://www.trackrev.io/blog/what-is-marketing-attribution
Published: 2026-10-04
Author: Muzahid Maruf
Marketing attribution credits each sale to the touchpoints behind it. See the data it needs, 5 models on one $120 sale, where it breaks and how to pick a tool.
Marketing attribution is the practice of assigning credit for a conversion, such as a signup or a payment, to the marketing touchpoints that came before it. Take a buyer who reads a blog post on March 3, clicks a newsletter link on March 17, then clicks a Google ad on March 24 and pays $120 that day. Attribution is the rule that splits the $120 across those 3 touches, and the output is a ranked list of channels by the credit they earned. Under one rule the blog post gets all $120, under another the ad does, and under a third each touch gets $40.
> **Key takeaways:**
>
> - Marketing attribution splits the credit for a conversion across the touches before it, so a $120 sale can credit one touch $120 or three touches $40 each, depending on the model.
> - Four inputs feed it: UTM parameters, a first-party cookie, ad click IDs such as gclid and fbclid, and billing records. Safari deletes script-written cookies after 7 days without a visit.
> - Google Analytics 4 has offered only 3 models since November 2023: data-driven, paid and organic last click, and Google paid channels last click.
> - At median rates, paid search brings 24 customers and $2,200 per 1,000 clicks and organic search brings 22 customers and $2,900, so a conversion report and a revenue report rank them differently.
> - Pick a tool by where revenue is recorded: ad platforms for an ecommerce store (Triple Whale), a CRM for long B2B deals (Dreamdata), or the billing system for subscriptions (TrackRev).
### How marketing attribution works
Every attribution setup runs 4 steps: (1) log each touch with its source and a timestamp, (2) keep a visitor ID so later visits join earlier ones, (3) record the conversion with its value, and (4) apply a credit rule to the joined path. Steps 2 and 3 fail without an error message. The payment still appears in your reports, with the wrong channel or none.
### Where the attribution data comes from
Four kinds of signal feed most setups, and each has its own way of going missing.
| Signal | What it carries | Where it breaks |
| --- | --- | --- |
| UTM parameters | Source, medium and campaign, typed into the link | utm_source=google and utm_source=Google count as 2 rows |
| First-party cookie | A random visitor ID that ties repeat visits together | Safari deletes script-written cookies after 7 days without a visit |
| Ad click ID | gclid from Google Ads, fbclid from Meta | Safari can cap a script-written cookie at 24 hours when it detects one |
| Billing record | Amount, plan, renewals and refunds from Stripe or Paddle | Carries no channel unless you pass one into checkout |
*Sources: Google Analytics Help, WebKit tracking prevention documentation, Meta for Developers and the Stripe API reference.*
#### UTM parameters
Google Analytics 4 reads UTM parameters when a visitor lands. [Google's campaign URL documentation](https://support.google.com/analytics/answer/10917952) lists utm_id, utm_source, utm_medium, utm_campaign and utm_source_platform, says to set them together or reports show "(not set)", and says values are case sensitive, so Email and email become 2 rows. The [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) covers naming conventions, and the free [UTM builder](https://www.trackrev.io/tools/utm-builder) generates links from a fixed list of values.
#### Cookies and visitor IDs
Per [WebKit's tracking prevention policy](https://webkit.org/tracking-prevention/), Safari Intelligent Tracking Prevention deletes cookies created in JavaScript, plus LocalStorage and IndexedDB data, after 7 days of no user interaction with the site. A buyer who clicks on day 1 and pays on day 9, with no visit between, looks like a new visitor. A cookie your own server sets in an HTTP response sits outside that cap, while WebKit separately caps cookies set through third-party CNAME or IP address cloaking at 7 days. [Safari ITP and SaaS attribution](https://www.trackrev.io/blog/safari-itp-attribution-saas) covers what this means for a pixel.
#### Ad platform click IDs
Google Ads [auto-tagging](https://support.google.com/google-ads/answer/3095550) appends a GCLID to the landing URL, and Meta uses fbclid. Meta's [developer documentation](https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/fbp-and-fbc) recommends reading fbclid on the server and storing it in an _fbc cookie with a 90-day expiry. WebKit says ITP detects click IDs added to links and caps cookies created in JavaScript on the landing page at 24 hours, and [Safari 17.0](https://webkit.org/blog/14445/webkit-features-in-safari-17-0/) blocks known tracking query parameters in Private Browsing.
#### Billing and server-side records
Billing data is the one source that records what a customer paid, and joining it to a visit takes an identifier passed into checkout. [Stripe Checkout](https://docs.stripe.com/api/checkout/sessions/create) takes a client_reference_id of up to 200 characters for reconciling a session with your own systems. Stripe [metadata](https://docs.stripe.com/metadata) holds up to 50 key-value pairs, with 40-character keys and 500-character values, and [Payment Links](https://docs.stripe.com/payment-links/url-parameters) return UTM parameters on the redirect URL within a 150-character limit. The [walkthrough for Stripe revenue by channel](https://www.trackrev.io/blog/stripe-revenue-attribution-marketing-channels) shows the full join.
### The main attribution models
A model is the rule for splitting credit. Here is the $120 sale from the opening under 5 rules, using the blog post (March 3), the newsletter click (March 17) and the Google ad click (March 24).
| Model | Rule | Blog post | Newsletter | Google ad |
| --- | --- | --- | --- | --- |
| First-touch | 100% to the first touch | $120.00 | $0.00 | $0.00 |
| Last-touch | 100% to the last touch | $0.00 | $0.00 | $120.00 |
| Linear | Equal share to every touch | $40.00 | $40.00 | $40.00 |
| Position-based | 40% first, 40% last, 20% to the middle | $48.00 | $24.00 | $48.00 |
| Time decay | Weight halves for every 7 days before the sale | $9.23 | $36.92 | $73.85 |
*Every row sums to $120. Time decay uses a 7-day half-life, so the weights are 0.125, 0.5 and 1.*
Last-touch pays $120 to the March 24 ad and $0 to the March 3 blog post that started the journey, and first-touch reverses that. Linear pays every touch whether or not it mattered, and position-based and time decay hard-code a guess. Data-driven models learn the weights instead. [Google's attribution documentation](https://support.google.com/analytics/answer/10596866) describes its version as machine learning over converting and non-converting paths, built separately for each advertiser and each key event. Google adds that conversions can be reattributed for up to 7 days after they happen.
Google Analytics 4 now lists 3 models: data-driven, paid and organic last click, and Google paid channels last click. First-click, linear, time decay and position-based stopped being available in November 2023, so comparing fixed rules on the same sales takes another tool. In TrackRev's Q2 2026 [benchmark data](https://www.trackrev.io/data/saas-attribution-benchmarks), 64% of workspaces default to last-touch, 22% to linear and 14% to first-touch. The [comparison of last-touch, first-touch and linear](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers when each one misleads a subscription funnel.
### Attribution windows
A window caps how far back a conversion can look for a touch to credit, and each tool picks its own default.
| Setting | Default | Range or percentile |
| --- | --- | --- |
| Google Analytics 4 lookback, acquisition events | 30 days | 7 or 30 days |
| Google Analytics 4 lookback, other key events | 90 days | 30, 60 or 90 days |
| Google Ads click-through window | 30 days | 1 to 90 days, by conversion source |
| TrackRev benchmark, first click to first charge | 6.3 days at the median | 21.0 days at the 75th percentile, 48.2 at the 90th, 73.5 at the 95th |
*Sources: Google Analytics Help (key event lookback window), Google Ads Help (conversion windows) and the TrackRev benchmark, Q2 2026.*
With a 90th percentile of 48.2 days, a 30-day window misses at least the slowest 10% of buyers, and the benchmark counts only conversions inside each workspace's own window, so the true tail is longer. [Google Ads](https://support.google.com/google-ads/answer/3123169) also keeps separate windows for engaged-view and view-through conversions, so its totals can differ from analytics totals, and it recommends windows of at least 7 days.
### Marketing attribution vs revenue attribution
Marketing attribution credits conversions: a signup, a trial start or a purchase event. Revenue attribution applies the same rules to money read from billing, meaning the charge amount, upgrades, renewals and refunds, with a refunded charge subtracted from the channel that earned it. On a one-time sale at one price the two rank channels almost alike. A subscription separates them, because its value arrives over months and can be reversed. TrackRev's Q2 2026 benchmark shows how far apart they land.
| Channel | Click-to-paid | Revenue per click | Customers per 1,000 clicks | Revenue per 1,000 clicks | 12-month LTV multiplier |
| --- | --- | --- | --- | --- | --- |
| Newsletter | 4.8% | $4.40 | 48 | $4,400 | 1.9x |
| Affiliate or partner | 3.9% | $4.10 | 39 | $4,100 | 1.4x |
| Paid search | 2.4% | $2.20 | 24 | $2,200 | 0.9x |
| Organic search | 2.2% | $2.90 | 22 | $2,900 | 2.1x |
| Paid social | 1.2% | $1.30 | 12 | $1,300 | 0.8x |
| Display | 0.6% | $0.50 | 6 | $500 | 0.5x |
*Per-workspace medians, Q2 2026. The 2 per-1,000 columns multiply the medians by 1,000 clicks, so they illustrate the arithmetic and are not a forecast.*
Paid search converts more often than organic search, 2.4% against 2.2%, and earns $700 less per 1,000 clicks. A conversion report ranks paid search third and a revenue report ranks it fourth, and the lifetime multipliers, 0.9x against 2.1x, put an organic customer at more than twice the 12-month value. Prices differ too. For example, 12 conversions at $9 outrank 1 conversion at $149 in a count and total $108 against $149 in dollars. Renewals and upgrades keep adding value after the conversion is logged, and refunds and chargebacks remove value that a count never subtracts.
### Advertising attribution and ad platform reports
Advertising attribution is the ad platform's own version of the same job. Google Ads and Meta Ads Manager credit conversions to campaigns, ad sets and creatives, using their click IDs and windows. Each counts the conversions it can link to its own ads, so one purchase can appear in two reports. Suppose Google Ads and Meta together report 150 purchases in a month while Stripe shows 100 new customers: the extra 50 are overlap, or conversions with no payment behind them.
On October 17, 2025, Google said it would [retire the Attribution Reporting API](https://privacysandbox.google.com/blog/update-on-plans-for-privacy-sandbox-technologies) for Chrome and Android, along with other Privacy Sandbox technologies, and pointed to the W3C's Private Advertising Technology Working Group for a future standard. Until one ships, click IDs, first-party records and server-side events are the working tools.
### Where attribution breaks
Attribution fails in a few recurring ways, and each has a standard fix.
| Break | What you see | Fix |
| --- | --- | --- |
| Inconsistent UTM values | Email, email and e-mail show up as 3 channels | Lowercase every value and build links from a fixed list |
| Parameters stripped in transit | Some tagged clicks arrive with their parameters removed, as in Safari 17 Private Browsing | Log the click on a server before the redirect |
| Script cookie expires | A day-9 payment from a day-1 click looks like a new visitor in Safari | Set the visitor ID from your server |
| Checkout on another domain | The payment page becomes the referrer | Add the payment domain to Google Analytics 4's [unwanted referrals](https://support.google.com/analytics/answer/10327750) list and pass an ID into checkout |
| Cross-device journey | A phone click and a laptop payment count as 2 people | Match on login or email at conversion |
| Consent declined | 0 touches recorded for that visitor | Treat visit data as a sample and reconcile totals against billing |
Consent has a legal side too. The European Data Protection Board's [Guidelines 2/2023](https://edpb.europa.eu/system/files/2024-10/edpb_guidelines_202302_technical_scope_art_53_eprivacydirective_v2_en_0.pdf) (version 2.0, adopted 7 October 2024) analyze URL and pixel tracking under Article 5(3) of the ePrivacy Directive and treat tracking links and pixels as covered, even when the storage is not permanent. Their example of a tracked link is an affiliate link carrying an identifier in the URL. Covered means consent is required unless an exemption applies, and the guidelines leave exemptions to case-by-case analysis under national law, so ask a lawyer about the markets you sell into.
A podcast mention or a group-chat recommendation leaves no click, and a "How did you hear about us?" field at signup records it. For how to combine the two, see [self-reported versus tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data).
### Marketing mix modeling and incrementality
Attribution shows which touches preceded a sale and cannot show whether the sale would have happened anyway. Marketing mix modeling fits weekly spend against weekly sales with no user-level tracking, and Google's open-source [Meridian](https://developers.google.com/meridian) is one option. An incrementality test holds back a slice of the audience, say 10%, and compares its conversions with the exposed 90%. For a small paid budget, a holdout test or a survey question usually tells you more than a model can.
### How to pick a marketing attribution tool
Start from where the revenue is recorded and which decision the report will drive. Ad-first tools begin at ad spend, and billing-first tools begin at the charge.
| Tool | Built for | Models | Entry price |
| --- | --- | --- | --- |
| Google Analytics 4 | Behavior on your site and app | Data-driven, paid and organic last click, Google paid channels last click | Free |
| [Triple Whale](https://www.triplewhale.com/pricing) | Ecommerce brands tracking orders back to ads | First and last click on Free; 7 models including Linear and Total Impact on paid plans, with lookback windows of 1, 7, 14 or 28 days or lifetime | Free plan with 10 users and 12 months of data; paid plans sold through a walkthrough, price not published |
| [Northbeam](https://www.northbeam.io/pricing) | Brands spending from under $1.5 million a year to over $500,000 a month on ads | Multi-touch attribution, with media mix modeling and incrementality as options | Professional lists $3,500 a month; every plan is sold by quote |
| [Dreamdata](https://dreamdata.io/pricing) | B2B teams that report on CRM data | Custom attribution models on Advanced; Free covers B2B web analytics and company identification | Free at $0 a month with 5 seats and 2 months of history; Advanced is custom |
| [Cometly](https://www.cometly.com/pricing) | B2B SaaS teams syncing conversions to 7 ad platforms | Multi-touch attribution with server-side tracking | Usage-based on monthly pageviews; no free trial; 20% off annual |
| TrackRev | Subscription revenue by channel | First-touch, last-touch, linear | Free plan with 1,000 tracked events a month; paid plans $39, $99 and $199 a month |
*Prices from each vendor's pricing page, October 2026.*
Triple Whale and Northbeam are built around a store with heavy Meta and Google spend, where ad-level data matters every day. Dreamdata fits B2B teams that report from CRM data. Cometly's pricing page lists server-side Conversion API connections to Meta, Google, LinkedIn, TikTok, Microsoft, Reddit and Snapchat. Subscriptions whose channels are content, email, affiliates and partners fit a billing-first tool such as TrackRev, because the channel behind each renewal is the number they need. Google Analytics 4 is enough when you only need behavior on your own site.
Ask each vendor four questions. Does conversion value come from an ad platform's report or from your billing records? Does the tool keep the raw touches, so a new model can rerun on old sales? How does the visitor ID get past Safari's 7-day script cap? What happens to a channel's revenue when a charge is refunded?
### What TrackRev does for revenue attribution
TrackRev records each click on its own server, sets a first-party visitor ID on your domain, and ties charges from Stripe, Paddle, Polar and Lemon Squeezy back to the click that earned them. Renewals, upgrades and refunds adjust the channel that earned the first sale. It stores the raw clicks apart from any model, so you can view the same sales under first-touch, last-touch or linear without re-tagging a link.
The Free plan covers 50 links and 1,000 tracked events a month and hides revenue figures, which every paid plan shows. Starter costs $39 a month for 1 workspace, and Growth at $99 and Scale at $199 allow unlimited workspaces. The plans also differ in affiliate commission tracked a month, $10,000 on Starter, $100,000 on Growth and unlimited on Scale, while attributed sales revenue has no cap. Annual billing pays for 9 months of 12.
TrackRev has no data-driven model, no media mix modeling and no incrementality testing, and it does not adjust Meta or Google bids. Pick Triple Whale, Northbeam or Cometly for that, and Dreamdata if your deals live in a CRM. The [revenue attribution page](https://www.trackrev.io/solutions/revenue-attribution) shows the connections and models in the product.
### Frequently asked questions
**What is marketing attribution in simple terms?**
A rule that divides a sale's value among the visits that led to it. A $60 signup that followed 4 touches can credit one source $60 or four sources $15 each, and the resulting ranking tells you which sources to fund.
**What is the difference between attribution and marketing mix modeling?**
Attribution needs visitor-level identifiers such as cookies, click IDs and logins. A mix model needs only totals of spend and sales per week, so it works without tracking individuals, but it needs many weeks of data and enough variation in spend to separate channels.
**Which attribution model should I start with?**
Start with last-touch, because it ties out to billing records, then rerun the same 90 days of sales under first-touch. A channel that gains under first-touch starts journeys, and one that gains under last-touch closes them. Add a linear view once typical paths have 3 or more touches.
**How long should an attribution window be?**
List the days from first visit to first payment for your last 100 customers and cover the slowest 10%. If 12 of the 100 took longer than 30 days, a 30-day window gives those 12 sales to the wrong touch or to nothing.
**Do I need a paid attribution tool, or is Google Analytics enough?**
Google Analytics 4 is enough when conversions happen on your own pages and you need channel counts. It records revenue only if you send purchase events or import data, so once payments sit in Stripe or Paddle and you want renewals and refunds by channel, a tool that joins billing records to visits earns its price.
**Can attribution prove that a channel caused a sale?**
No. It shows which touches preceded a sale and shares credit by a rule. A holdout test, where a randomly chosen 5% of the audience never sees the campaign, measures cause. Brand search and retargeting often look strong in attribution reports because they reach people who were already about to buy.
**How accurate is marketing attribution?**
Treat it as directional. Total the revenue attributed to channels for a month and compare it with what Stripe or Paddle collected. If channels show $41,000 and billing shows $52,000, 21% of revenue has no source, and the rankings should wait until you find where identity leaks.
---
## Why SaaS affiliate programs fail, and how to find your cause
URL: https://www.trackrev.io/blog/why-saas-affiliate-programs-fail
Published: 2026-07-10
Author: Muzahid Maruf
Why SaaS affiliate programs fail: 6 causes backed by benchmark data and worked commission math, plus a symptom table that points to the first fix.
SaaS affiliate programs fail for six reasons, all inside the program: affiliates who are approved and then ignored, a commission that loses the comparison with a competitor's, recruiting by volume, tracking that drops credit, terms that invite refunds and abuse, and no check against the billing ledger. No study I could find measures a failure rate, so the figures below come from two datasets: [Reditus's analysis of 10,596 affiliate-months](https://www.getreditus.com/blog/saas-affiliate-marketing) and the [TrackRev affiliate benchmarks](https://www.trackrev.io/data/affiliate-program-benchmarks), which compile public reports from Impact, PartnerStack, Awin, Rakuten Advertising and CJ Affiliate.
> **Key takeaways:**
>
> - A normal program is a few productive partners and a long quiet roster: only 18 of every 100 affiliates make a sale in their first 30 days at the median, and the top 10% bring 71% of revenue.
> - Activation is the most controllable lever. Top-quartile programs reach 31% with a welcome sequence and a first-week check-in, and bottom-quartile programs that never follow up reach 6%.
> - On a $99 plan a one-time 30% payout is $29.70, while 20% recurring for 12 months is $237.60. Affiliates compare that number across programs.
> - Tracking loses credit three ways: a window shorter than your buyers' 48.2-day 90th percentile, script-written cookies that Safari deletes after 7 days without a visit, and renewals that never touch a browser.
> - Match the commission hold to your refund window and reverse commission automatically on refunds and disputes, since card disputes can arrive up to 120 days after a payment.
> - Check the break-even first. In the worked example, 18 retained affiliate customers cover $1,039 a month of software and time.
### What the data says about programs that stall
| Measure | Figure | Source |
| --- | --- | --- |
| Affiliate-months with no paid referral | Over 90% | Reditus |
| Monthly revenue from affiliates with zero clicks that month | 30% to 88% | Reditus |
| Time to a first paid referral | 3 to 6 months typical; 5 to 6 with no active recruiting | Reditus |
| Median days to a first commission | 14 (top quartile 5, third quartile 27) | TrackRev benchmarks |
| Lifetime chance of a first sale after 60 days without one | 3.7% | TrackRev benchmarks |
*Reditus is an affiliate platform vendor, and its figures come from its own three programs (August 2026). TrackRev benchmark figures are medians compiled from public network reports, Q2 2026.*
By these numbers a normal program is a few productive partners and a long quiet roster. The top 10% of affiliates bring 71% of revenue in the median program, Reditus found the top 20% of active affiliates produced 80% to 87% of monthly revenue, and only 18 of every 100 affiliates make a sale in their first 30 days. Past referrals keep paying after a partner stops sending clicks, so this month's click count undercounts a program. A program fails when the partners who would carry it never show up or never get started, or when the offer or the tracking drives them away.
### Why SaaS affiliate programs fail: six causes
#### 1. Approved affiliates never get activated
Top-quartile programs get 31% of new affiliates to a sale within 30 days and typically run a welcome sequence, ready-made creative and a first-week check-in. The median program sends an approval email and a dashboard link and reaches 18%, and the bottom quartile approves and never follows up, reaching 6%. Send the first message the day someone is approved, with the tracked link, the one page it should point to, the terms in one line, 100 words of ready copy and a name that replies within a day.
The [guide to creating an affiliate program](https://www.trackrev.io/blog/how-to-create-an-affiliate-program) has the week-one sequence. To see where you stand, list the affiliates approved in the last 60 days and count how many have a single click.
#### 2. The commission loses the comparison
An affiliate choosing what to feature compares what a referred customer pays them. On a $99 monthly plan, four common structures pay very differently.
| Commission | Payout per customer | Share of year-one revenue | If the customer cancels after 4 months |
| --- | --- | --- | --- |
| 30% of the first payment only | $29.70 | 2.5% | $29.70 |
| 15% recurring for 6 months | $89.10 | 7.5% | $59.40 |
| 20% recurring for 12 months | $237.60 | 20% | $79.20 |
| 30% recurring for 12 months | $356.40 | 30% | $118.80 |
*Worked example: $99 a month plan, $1,188 of revenue from a customer who stays 12 months unless the last column says otherwise.*
The one-time payout is an eighth of the 20% recurring one ($29.70 against $237.60). The benchmarks put the median B2B SaaS program at 20% for 12 months and B2C SaaS at 15% for 6 months, and 39% of programs pay fixed-term recurring commission, 33% pay once at the sale and 18% pay for life. Reditus calls 20% to 30% for 12 to 24 months the normal shape for an established company.
The cost side matters too. At an 80% gross margin, 20% for 12 months takes 25% of a customer's year-one gross profit ($237.60 of $950.40) and 30% takes 37.5%. Lifetime commission is the other trap: Reditus calls it the hardest term to walk back once affiliates have signed up on it. I would start with a fixed term, extend it for partners who earn it, and write down what your two closest competitors advertise before settling on a rate.
#### 3. Recruiting by volume instead of fit
The bottom half of affiliates brings 2% of revenue, so approving every applicant mostly grows the part that does not matter. Reditus ties its best case, $30K MRR in 3 months, to aggressive recruiting plus letting affiliates bid on the brand name in paid search. A hand-built list of 20 names beats an open sign-up page, and it has three sources:
- customers who already post or write about your product
- authors of comparison and "best tools" pages that rank for your category
- owners of newsletters and channels whose readers match your buyer
Decide early about coupon and deal sites. A publicly posted code reaches every shopper about to check out, so the site collects commission on customers already at your checkout. I would keep them out for the first 6 months or issue each a code that belongs to that partner alone, as the [coupon code tracking](https://www.trackrev.io/blog/coupon-code-affiliate-tracking) guide explains.
#### 4. Tracking drops the credit
Three things drop credit, and one program can have all three. The first is window length. In the benchmark data 28% of programs use 30 days or less, 41% use 60, 24% use 90 and 7% use 180 or more, and Reditus calls 90 days a reasonable default for considered purchases. TrackRev's [workspace data](https://www.trackrev.io/data/saas-attribution-benchmarks) shows why: the 75th percentile of days from first click to first paid charge is 21, the 90th is 48.2 and the 95th is 73.5, so a 30-day window cuts off roughly 10% to 25% of buyers, and the affiliate who sent them sees a click and no sale.
The second is the browser. [WebKit's Intelligent Tracking Prevention policy](https://webkit.org/tracking-prevention/) says Safari deletes cookies created in JavaScript after 7 days without the visitor interacting with your site, and caps them at 24 hours when it detects link decoration, meaning click IDs added to a URL and read by script on the landing page. Cookies set in an HTTP response get the 7-day cap when it detects CNAME or IP cloaking, and the policy names no general cap otherwise. So a 60-day window stored by a script can be 7 days long for a Safari visitor who does not return within a week.
The third is renewals. A thank-you-page pixel fires once, at signup, while a subscription renews as a paid invoice that [Stripe announces](https://docs.stripe.com/billing/subscriptions/webhooks) with an `invoice.paid` event and no browser involved. The [client_reference_id](https://docs.stripe.com/api/checkout/sessions/object) on a Checkout Session is one place to carry the referral ID, and [how affiliate tracking works](https://www.trackrev.io/blog/affiliate-tracking-how-it-works) shows where each link in that chain breaks. To size your own loss, compare 90 days of paid invoices for affiliate-referred customers with the sales the affiliate dashboard shows.
#### 5. Terms and payouts that invite disputes
Commission paid before the refund window closes leaves you chasing money from someone who has spent it: $19.80 per refunded sale at 20% on a $99 plan. A hold that matches the refund window removes most of that. Disputes run longer: [Stripe says](https://docs.stripe.com/disputes/how-disputes-work) card networks typically allow 120 days from the original payment, and an opened dispute debits the amount plus a fee from your balance. I would not make partners wait 120 days, so commission has to reverse on its own when `charge.refunded` or `charge.dispute.created` arrives, and [clawback handling](https://www.trackrev.io/blog/affiliate-refund-clawback-handling) covers partners already paid.
Self-referral, an affiliate buying through their own link, earns commission on a sale that involved no marketing. The [FTC says](https://www.ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking) affiliates must disclose the relationship near the recommendation and that advertisers need a reasonable program to train and monitor them, so put both rules in the first message, along with a request for a Form W-9 or W-8BEN before the first payout.
#### 6. Nobody checks the program against the ledger
Signups and clicks say little. Track affiliates with a click in the last 30 days, revenue per active affiliate, affiliate share of new MRR, 12-month retention of referred customers against everyone else, and commission paid as a share of affiliate revenue.
TrackRev's workspace benchmarks show why to measure partners beside other channels: the affiliate and partner channel has a median click-to-paid rate of 3.9% and a 12-month LTV multiplier of 1.4x, against 2.4% and 0.9x for paid search, and its customers wait a median 9.6 months before first churn against 7.1. These are medians across workspaces, so yours may sit well above or below them.
### Which cause to check first
| What you see | Likely cause | First check |
| --- | --- | --- |
| Many approved affiliates, almost no clicks after week 2 | 1. Activation | Count affiliates approved in the last 60 days with at least 1 click |
| Affiliates ask for a higher rate or lead-based pay, or leave for a competitor | 2. Commission, or 4. a short window | Compare rate and term with your 2 closest competitors, and the window with your own 90th-percentile click-to-charge time |
| Clicks arrive, sales do not | 3. Recruiting by volume | Read what your 5 highest-traffic partners publish and who their audience is |
| The affiliate dashboard shows fewer sales than Stripe shows for the same customers | 4. Tracking | Match 90 days of paid invoices to affiliate-reported sales |
| Commission is paid, then the sale is refunded or disputed | 5. Terms and payouts | Compare the hold with your refund window and the 120-day dispute period |
| Revenue is flat and you cannot say which partners matter | 6. Measurement | Rank partners by revenue and compare 12-month retention across channels |
### When an affiliate program is the wrong channel
Before fixing anything, check that the economics can work. Take a $99 plan at an 80% gross margin, a 20% commission, software at $39 a month, and 20 hours a month of your time valued at $50 an hour.
| Line | Monthly amount |
| --- | --- |
| Commission per referred customer (20% of $99) | $19.80 |
| Gross profit per customer before commission (80% of $99) | $79.20 |
| Contribution per customer after commission | $59.40 |
| Software (TrackRev Starter) | $39 |
| Your time (20 hours at $50) | $1,000 |
| Total cost | $1,039 |
| Break-even | 18 active referred customers (1,039 / 59.40 = 17.5) |
*Illustrative arithmetic. Replace the price, margin, rate and hourly value with your own.*
Eighteen counts customers paying at the same moment. Five partners who each send one customer a month that sticks reach 20 active customers in month 4, ignoring churn, and if you add 30 customers a month overall, 5 from partners is one in 6. Three situations make the channel a poor fit:
- checkout is not self-serve, so no payment event exists to credit
- the gross margin cannot absorb 15% to 30% for 6 to 12 months
- you cannot name 20 people who write or talk about your category
### What TrackRev covers and what it leaves to you
TrackRev's [Affiliate Program](https://www.trackrev.io/solutions/affiliate-program) covers the mechanical causes and leaves the human ones to you.
| Cause | In TrackRev | Left to you |
| --- | --- | --- |
| Activation | Partner portal on your domain with links and earnings | Welcome message and assets |
| Commission | Recurring, one-time or tiered rates; Partner Accelerator pays recruiters from one capped pool | Choosing the rate and term |
| Recruiting | Invites and application approval | Finding partners; there is no marketplace |
| Tracking | Server-side click capture, a first-party pixel and cookie, per-program windows, revenue sync from Stripe, Polar, Lemon Squeezy and Paddle, renewals credited to the original click | Installing the pixel, choosing the window |
| Terms | Hold of 0 to 180 days (default 0), automatic reversal on refunds and disputes, self-referral detection, W-9 and W-8 upload | Setting the hold, writing the disclosure rule |
| Payouts | Batches from weekly to quarterly; one PayPal or Wise CSV export, then mark each payout paid | Sending the money; payouts are not automatic |
| Measurement | Partners beside every other channel on one data model | Reading it monthly |
Every paid plan includes all of it, from $39 a month for Starter. The free plan covers link tracking only (50 links, 1,000 tracked events a month), so a program needs a paid plan. For a marketplace of affiliates to recruit from, see [Reditus vs TrackRev](https://www.trackrev.io/blog/reditus-vs-trackrev).
### Frequently asked questions
**What percentage of SaaS affiliate programs fail?**
No reliable figure exists. Network reports and vendor datasets cover programs still running, so shut-down programs drop out and any failure rate drawn from them runs low. Use your own break-even: a program has stalled when affiliate-attributed gross profit stays below the cost of software, commission and your time after 2 full quarters of recruiting.
**Should I shut down a program with only a few active affiliates?**
Not on roster size alone, since a few partners carrying most revenue is the normal shape. Check three things: whether your top 5 partners earn enough to keep promoting you (at 20% on a $99 plan, each retained customer pays them $19.80 a month), whether referred customers stay as long as customers from other channels, and whether your break-even count looks reachable.
**Do affiliate programs work for SaaS priced under $20 a month?**
The arithmetic is tight. At $15 a month, 20% for 12 months pays $36 per customer, so a partner needs 14 retained customers to earn $500 in a year. I would test a low-priced product with a few high-reach creators, or with account credit for customer referrals, before building a roster.
**How should commission work on annual plans?**
Commission is a percentage of each payment, so an annual plan pays once a year. A $99 plan billed annually at a 25% discount costs $891, and 20% of that is $178.20, against $237.60 for the same customer on monthly billing. If you discount annual plans, raise the rate for them or accept the smaller payout, and remember the refund window covers the whole $891.
**Who is responsible for what affiliates say about my product?**
Under FTC guidance in the United States, you are. Keep a written disclosure rule in your terms, search periodically for how partners describe you, and remove any partner who ignores it. Rules differ outside the US.
**Can I fix a failing program without changing tools?**
Partly. Causes 1 to 3 (activation, commission, recruiting) need only email, a spreadsheet and a decision. Causes 4 to 6 (tracking, terms, measurement) depend on what the tool records, so ask whether it reads billing events or only a thank-you-page pixel, whether renewals credit the original referral, and how it sets its cookie.
**What does it cost to run a program on TrackRev?**
Starter is $39 a month for 1 workspace and tracks up to $10K of partner commission a month. Growth is $99 for unlimited workspaces and up to $100K, and Scale is $199 with unlimited commission tracked. Annual billing pays for 9 months and gives 12. Sale revenue is never capped; the limit is on commission tracked. The free plan is link tracking only.
---
## Why UTM parameters get stripped, and a 5-step test to find the hop that does it
URL: https://www.trackrev.io/blog/why-utm-parameters-get-stripped
Published: 2026-07-11
Author: Muzahid Maruf
UTM parameters get stripped by redirects, malformed links and a few privacy features. A 5-step test finds the hop that drops yours, with the fix for each.
UTM parameters get stripped wherever a hop rebuilds the destination URL without its query string: a redirect rule, a shortener, a login redirect on your own site, or a router that rewrites the address bar before the analytics tag reads it. Safari 17 and Firefox 102 strip tracking parameters too, but Firefox's list has 8 entries and none is a `utm_` tag, and Apple's documentation names no parameters. When Google Analytics 4 files a tagged click under Direct, trace the link's path first.
[Google Analytics Help](https://support.google.com/analytics/answer/15258820) names redirects, URL shorteners such as bit.ly and ad blockers among the causes of (direct) / (none) traffic. In a revenue report that credits renewals to the first click, one lost tag misfiles every later payment.
> **Key takeaways:**
>
> - Tags vanish where a hop rebuilds the URL, and 5 checks (private window, curl, iPhone apps, server log, Google Analytics 4 sessions) find the hop.
> - Firefox 102 strips 8 named parameters in Strict mode and none is a utm_ tag. Apple names none, so test a tagged link in Messages, Mail and Private Browsing.
> - Save the first-touch tags in a cookie your server sets, then copy them into Stripe metadata (50 keys, 500 characters per value) so renewals keep their source.
### Where UTM parameters get stripped
| Where it disappears | What happens | Test with | Fix |
| --- | --- | --- | --- |
| Redirect with a fixed destination | The Location header holds only the configured URL | Step 2 | Forward the query |
| Hand-built link | A second `?`, a raw `&` or a `#` before the `?` splits or hides tags | Step 1 | Use the [free UTM builder](https://www.trackrev.io/tools/utm-builder) |
| Value encoded twice | `spring%20sale` becomes `spring%2520sale` | Step 2 | Encode once |
| Login, locale or canonical redirect | A hop inside your app drops the query | Step 2 | Link to the final URL |
| Router or late tag | [history.replaceState](https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState) or a consent wait leaves the tag a clean URL | Step 4 | Read tags before the router runs |
| Safari 17 and Firefox 102 features | Known tracking parameters are removed in Messages, Mail, Private Browsing and Strict mode | Step 3 | Capture tags on your server |
| Half-stripped tags | One surviving `utm_` value makes Google Analytics 4 read every source dimension from UTMs alone | Step 5 | Set all 3 core tags |
| Return from Stripe Checkout | The processor's domain can count as a referral | Step 5 | Add it to unwanted referrals |
#### Redirects that rebuild the URL
A redirect answers with a Location header, and the browser requests exactly that URL, so a rule that names a destination without a query turns `/spring?utm_source=news` into a plain `/pricing` request. [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-location) (June 2022) section 10.2.2 carries a fragment across a redirect when the Location has none and sets no such rule for the query.
| Tool | Original query string | Change it with | Status code |
| --- | --- | --- | --- |
| [nginx rewrite](https://nginx.org/en/docs/http/ngx_http_rewrite_module.html) | Previous arguments are appended after new ones | End the replacement with `?` | 302 with `redirect`, 301 with `permanent` |
| nginx `return 301` | Dropped: the written URL is the whole Location | Append `$is_args$args` | The one you write |
| [Apache RewriteRule](https://httpd.apache.org/docs/current/rewrite/flags.html) | Copied unless the new URL has its own query | Add `[QSA]` to merge | 302, or 301 with `R=301` |
| [Cloudflare single redirects](https://developers.cloudflare.com/rules/url-forwarding/single-redirects/settings/) | Dropped, since Preserve query string is off by default | Turn it on | 301 by default, or 302, 307, 308 |
| [Next.js redirects()](https://nextjs.org/docs/app/api-reference/config/next-config-js/redirects) | Passed through to the destination | Nothing to change | 308 permanent, 307 temporary |
*Behavior as documented by nginx, Apache 2.4, Cloudflare and Next.js 16, October 2026.*
nginx: the first rule drops the query string, the second keeps it
```
# Drops it: the Location header is exactly this URL
location = /spring {
return 301 https://www.example.com/pricing;
}
# Keeps it: $is_args adds the ? and $args adds the original query
location = /summer {
return 301 https://www.example.com/pricing$is_args$args;
}
```
#### Links that are built wrong
- A second `?`. `/pricing?plan=pro?utm_source=news` yields 1 parameter, `plan`, with the value `pro?utm_source=news`.
- A `#` before the `?`. [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986.html) (January 2005) section 3.5 splits the fragment off before the request goes out, so `/pricing#plans?utm_source=news` reaches your server as `/pricing`.
- An unescaped `&` inside a value. `utm_campaign=q&a` ends the campaign at `q` and opens a parameter named `a`. Write `%26`.
- A value encoded twice. RFC 3986 section 2.4 requires a percent sign used as data to be written `%25`, so a second pass turns `spring%20sale` into `spring%2520sale`. Any hop that wraps your whole URL in one of its own parameters encodes it again.
The same link, built wrong and built right
```
Wrong: https://example.com/pricing#plans?utm_source=news&utm_campaign=q&a
Right: https://example.com/pricing?utm_source=news&utm_campaign=q%26a#plans
```
#### Privacy features in Safari and Firefox
| Feature | Where it applies | Parameters named | utm_ tags stripped? | Source |
| --- | --- | --- | --- | --- |
| Safari 17 Link Tracking Protection | Messages, Mail and Private Browsing | None named by Apple | Stape reports no, in Private Browsing | [Apple, June 2023](https://www.apple.com/newsroom/2023/06/apple-announces-powerful-new-privacy-and-security-features/); [WebKit, Safari 17.0](https://webkit.org/blog/14445/webkit-features-in-safari-17-0/); [Stape, iOS 26](https://stape.io/news/safari-ios26-advanced-fingerprinting-protection) |
| Firefox 102 query stripping | Strict mode of Firefox's tracking protection | 8, including `mc_eid`, `mkt_tok` and `fbclid` | No | [Mozilla engineering docs](https://firefox-source-docs.mozilla.org/toolkit/components/antitracking/anti-tracking/query-stripping/index.html); [release notes, June 28, 2022](https://www.firefox.com/en-US/firefox/102.0/releasenotes/) |
Either list can grow in any release, so confirm your own links with step 3. Our [iOS 17 Link Tracking Protection post](https://www.trackrev.io/blog/ios-17-link-tracking-protection-saas) covers what else changed.
#### What Google Analytics 4 does with what arrives
When any UTM parameter is present, Google Analytics 4 derives all cross-channel source dimensions from UTMs exclusively, per its [traffic-source documentation](https://support.google.com/analytics/answer/11242870). A link that keeps `utm_campaign` but loses `utm_source` can show (not set).
Stripe Checkout runs on `checkout.stripe.com` unless you set up a [custom domain](https://docs.stripe.com/api/checkout/sessions/object), and Google's [unwanted referrals](https://support.google.com/analytics/answer/10327750) page, which allows 50 domains per data stream, uses payment processors as its first example. Between 2 domains you own, [cross-domain measurement](https://support.google.com/analytics/answer/10071811) carries the visitor ID in a `_gl` parameter, and a query-dropping redirect breaks it.
### A 5-step test for the hop that drops them
| Step | What to do | If the tags are missing |
| --- | --- | --- |
| 1 | Open the link from its real placement, such as the newsletter draft or the ad's URL field, in a private window | A hand-built link or a redirect: go to step 2 |
| 2 | Trace every hop with the curl command below | The first hop without the query string needs a forwarding setting |
| 3 | Open it from Messages, Mail and Private Browsing on an iPhone, and through [Microsoft Safe Links](https://learn.microsoft.com/en-us/defender-office-365/safe-links-about), which rewrites email links onto a `safelinks.protection.outlook.com` address | A privacy feature or a scanner hop |
| 4 | Read the landing request in the access log or an edge function | Tags in the log but not the address bar mean a router or script removed them |
| 5 | Compare your link tool's clicks with Google Analytics 4 sessions per source; [values are case sensitive](https://support.google.com/analytics/answer/10917952) | A gap that reappears as Direct sessions on the same days; a small, steady gap is bots and ad blockers |
Step 2: print the status line and Location header of every hop (GET, because some servers answer HEAD differently)
```
curl -sL -o /dev/null -D - "https://go.example.com/spring?utm_source=news&utm_medium=email" \
| grep -i -E "^(HTTP|location):"
```
### Capture the first touch on your own server
Redirect fixes protect the tags only as far as the landing page. I prefer to read them on the first request, because nothing after that can rewrite what the server stored. This Express middleware saves the 5 standard tags in an HTTP-only cookie on the first tagged visit:
Store the first tagged visit in a cookie your server sets (needs cookie-parser)
```
const KEYS = ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term"];
app.use((req, res, next) => {
const tags = {};
for (const key of KEYS) {
if (typeof req.query[key] === "string") tags[key] = req.query[key];
}
if (Object.keys(tags).length > 0 && !req.cookies.first_touch) {
res.cookie("first_touch", JSON.stringify(tags), {
maxAge: 90 * 24 * 60 * 60 * 1000, // 90 days, in milliseconds
httpOnly: true,
secure: true,
sameSite: "lax",
});
}
next();
});
```
At checkout, copy the cookie into the Stripe session. [Stripe's metadata documentation](https://docs.stripe.com/metadata) allows 50 key-value pairs per object, with keys up to 40 characters and values up to 500, and does not copy Checkout Session metadata to the subscription, so set `subscription_data.metadata` too. Each invoice the subscription creates then carries a snapshot. The [Stripe metadata attribution setup](https://www.trackrev.io/blog/stripe-metadata-attribution-setup) post covers the field mapping.
Pass the stored tags to Stripe Checkout
```
const tags = JSON.parse(req.cookies.first_touch ?? "{}");
const attribution = Object.fromEntries(
Object.entries(tags).map(([key, value]) => [key, String(value).slice(0, 500)]),
);
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: "price_123", quantity: 1 }],
success_url: "https://example.com/welcome",
metadata: attribution,
subscription_data: { metadata: attribution },
});
```
### Why a tag that survives can still lose the sale
[WebKit's tracking prevention page](https://webkit.org/tracking-prevention/) caps JavaScript-created cookies at 24 hours after link decoration from a tracker, and deletes them, with other script-writeable storage, after 7 days without user interaction. A visitor who clicks on a Monday and subscribes 8 days later, with no visit in between, has lost the cookie. The server-set cookie above sits outside both rules as written, since WebKit caps HTTP-response cookies at 7 days only for CNAME and IP-address cloaking. Our [Safari ITP post](https://www.trackrev.io/blog/safari-itp-attribution-saas) has more.
| Tags lost | Share of cohort | MRR credited to Direct | First-year revenue credited to Direct |
| --- | --- | --- | --- |
| 5 | 12.5% | $195 | $2,340 |
| 10 | 25% | $390 | $4,680 |
| 15 | 37.5% | $585 | $7,020 |
| 20 | 50% | $780 | $9,360 |
*Invented numbers: 40 signups a month on a $39 plan with no cancellations, so each customer pays $468 in 12 months and the cohort is worth $18,720. MRR is what the misfiled customers pay each month; first-year revenue is their 12-month total, and the two should not share a line in a report.*
### What TrackRev does with tags and clicks
TrackRev stores the channel on the link, so a click lands in the right channel even when no query string survives.
| Step | What the TrackRev redirect does |
| --- | --- |
| 1 | Looks up the link and checks its expiry and password |
| 2 | Logs the click on the server, with the link's channel (Smart Links infer it from the referrer) |
| 3 | Adds the link's saved UTM tags to the destination, skipping any the destination already has |
| 4 | Adds a `_vid` visitor parameter that the TrackRev pixel reads, and sets a `vid` cookie for new visitors |
| 5 | Sends a 302 to the destination |
Query parameters appended to a short link at send time are not forwarded, so per-send tags belong in the saved link. A redirect of yours that drops the query string drops `_vid` too, and the pixel falls back to a `vid` cookie when it finds one. On Stripe the visitor ID rides in `client_reference_id`, which the pixel adds to Payment Links and Buy Buttons. The Free plan covers 50 links and 1,000 tracked events a month with revenue hidden, and paid plans run Starter $39, Growth $99 and Scale $199 a month ([pricing](https://www.trackrev.io/pricing)). If you only need sessions in Google Analytics 4, forwarding redirects and the naming rules in the [UTM parameters guide](https://www.trackrev.io/blog/utm-parameters-guide) fix this without a new tool.
### Frequently asked questions
**Does Safari 17 strip utm_source and utm_medium?**
Reports say no for Private Browsing, and Apple names no parameters. Test your own link in Messages and Mail on iOS 17 and iOS 26.
**Why does Google Analytics 4 show (not set) for a tagged campaign?**
A source, medium or campaign value was missing or misspelled when the session started. Add Session source / medium as a secondary dimension in Traffic acquisition and compare each row with the links you sent.
**Do 301, 302, 307 and 308 redirects keep the query string?**
None forwards it on its own, because the Location header decides. The codes differ on caching and on whether the request method survives: 307 and 308 keep it.
**How many UTM parameters should every link carry?**
Google's UTM best-practices help page says to always use utm_source, utm_medium and utm_campaign. With only some of them, Google Analytics 4 reads a partial set.
**Is a stripped UTM the same as a missing referrer?**
No. The referrer is an HTTP header and the UTM tags are part of the URL. A visit with neither is filed as direct in Google Analytics 4.
**Can I rebuild a lost source after the signup?**
Partly. Server logs and the landing URL sometimes show where a visitor came from. Otherwise file that signup under Direct, as Google Analytics 4 would.
---
## YouTube revenue attribution: tie each video to the payments it brings in
URL: https://www.trackrev.io/blog/youtube-revenue-attribution-tracking
Published: 2026-05-15
Author: Muzahid Maruf
YouTube Analytics can't see Stripe. Add 1 tracked link per video, join each click to a payment, and rank videos by the MRR they bring in per 100 clicks.
YouTube revenue attribution connects each video to the Stripe payments it brought in. Every video gets 1 tracked link per placement, your server logs each click, and a first-party visitor ID follows the viewer from the click to the signup to the first charge. The video's MRR then sits beside its view count, a number neither YouTube Analytics nor Google Analytics 4 can produce.
> **Key takeaways:**
>
> - YouTube Analytics reports how viewers reach a video, and its revenue is RPM from ads, memberships and Premium, so a $39 Stripe subscription never appears in it.
> - Shorts descriptions and comments are non-clickable, long-form links need advanced features, and cards and end screens need the YouTube Partner Program.
> - Rank videos by MRR per 100 clicks: in the invented table a 4,800-view tutorial earns $351 and a 61,000-view launch video earns $117.
> - Size the attribution window from your own click-to-payment gaps, since a 30-day window misses a payment on day 31, and treat tracked revenue as a lower bound.
### Why YouTube revenue attribution needs more than YouTube Analytics
YouTube Analytics describes how viewers arrive at a video. Its [traffic source types](https://support.google.com/youtube/answer/9314355) (Browse features, Suggested videos, YouTube search, Shorts and external sources) are all inbound. Its revenue is money YouTube pays you: the [RPM metric](https://support.google.com/youtube/answer/9314357) adds up ads, channel memberships, YouTube Premium, Super Chat and Super Stickers, so a $39 subscription to your product never appears.
Google Analytics 4 sees the other half. Its [default channel group](https://support.google.com/analytics/answer/9756891) files non-ad visits from video sites such as YouTube under Organic Video.
| System | What it records | What it can't tell you |
| --- | --- | --- |
| YouTube Analytics | Views, impressions, watch time and the source of each view | What the viewer did on your site |
| Google Analytics 4 | Sessions and events by source, medium and campaign | Whether a session ended in a Stripe charge |
| Stripe Dashboard | Charges, customers, subscriptions and refunds | Which video sent the customer |
| Tracked link with billing sync | Click, visitor, signup and payment for each video link | Viewers who watched and never clicked |
*What each system can say about one video.*
### How to set up YouTube revenue attribution in 6 steps
The examples follow 1 product at example.com that sells a $39 monthly plan with a 14-day trial. The product, its viewers and its videos are invented.
#### Step 1: Check where your channel can place a link
YouTube's page on [sharing links with your audiences](https://support.google.com/youtube/answer/13748639) lists what is clickable. External links in long-form descriptions and comments need advanced features, which the [verification page](https://support.google.com/youtube/answer/9891124) ties to phone verification plus either channel history or an ID or video check. The [end screen](https://support.google.com/youtube/answer/6388789) and [info card](https://support.google.com/youtube/answer/6140493) help pages say external links in those 2 places require YouTube Partner Program membership, and an end screen needs a video of at least 25 seconds.
| Placement | Clickable external link | What YouTube requires | Limit |
| --- | --- | --- | --- |
| Long-form description | Yes | Advanced features | 5,000 characters; only the first few lines show before Show more |
| Pinned comment | Yes | Advanced features | Pinning is itself an advanced feature |
| End-screen link element | Yes | YouTube Partner Program | Video of 25 seconds or more; up to 4 elements on 16:9 video |
| Link info card | Yes | YouTube Partner Program | Up to 5 cards per video |
| Channel profile links | Yes | None listed | Up to 14 links |
| Shorts description or comment | No | Not available | URLs are non-clickable |
| Related video on a Short | Yes, to a YouTube video rather than an external site | Listed as clickable | Points at another video |
*Link placements as YouTube documents them in October 2026.*
I would stop tagging Shorts. Point a Short's related-video link at a long video whose description carries the tracked link.
YouTube's [description tips](https://support.google.com/youtube/answer/12948449) say viewers see only the first lines before tapping more on mobile or Show more on desktop, out of a 5,000-character field, and advise using those lines for a search-friendly summary. Put the tracked link on line 1 with 1 sentence on why to click, and the summary on line 2.
#### Step 2: Name one link per video and placement
Make 1 link for every placement of every video, so a description click and a pinned-comment click land on different rows. Google's [campaign URL guide](https://support.google.com/analytics/answer/10917952) says to set all 3 of utm_source, utm_medium and utm_campaign, that values are case sensitive (Youtube and youtube make 2 sources), and that utm_content exists to tell 2 similar links apart.
| Field | Value | Example |
| --- | --- | --- |
| utm_source | youtube | youtube |
| utm_medium | video | video, which Google Analytics 4 files under Organic Video |
| utm_campaign | Video slug in lowercase | stripe-metadata-tutorial |
| utm_content | Placement | description, pinned-comment, end-screen or card |
*A naming scheme for one video's links.*
Google Analytics 4 files a session under Organic Video when the medium matches `^(.*video.*)$`, so utm_medium=video puts these visits where you would look for them. In TrackRev a campaign folder rolls a series of links up to a single total, and the channel profile link gets its own link with utm_campaign set to channel-profile.
#### Step 3: Install the pixel and connect billing
Connect Stripe with a restricted, read-only key and add the pixel, which is 1 script tag, to your site. On Stripe Payment Links and Buy Buttons the pixel adds the visitor ID as client_reference_id. A click becomes revenue only if the visitor's identity travels to the charge.
| Day | Event | What gets recorded |
| --- | --- | --- |
| 0 | Viewer taps the description link | The redirect logs the click, sets a vid cookie for 365 days and adds _vid to the destination |
| 0 | Landing page loads | The pixel reads _vid and keeps the ID in a first-party cookie |
| 5 | Viewer starts the 14-day trial with an email | Your signup code calls trk.identify(email) and the ID is bound to that email |
| 19 | First $39 charge | The hourly Stripe sync matches the customer's email to the click, inside a 30-day window |
| 49 | First renewal, $39 | The credit carries forward to the same video link |
*One invented viewer, from the video to the second invoice.*
To build the join without TrackRev, pass the visitor ID as a client_reference_id when your server creates the Checkout Session, and the video slug as metadata. The [Checkout Session API](https://docs.stripe.com/api/checkout/sessions/create) allows 200 characters for the reference ID, so a 36-character UUID fits, and [Stripe metadata](https://docs.stripe.com/metadata) allows 50 pairs with 40-character keys and 500-character values. The [Stripe Checkout attribution guide](https://www.trackrev.io/blog/stripe-checkout-attribution-tracking) covers the webhook side.
The signup email also covers Safari. John Wilander's [WebKit post of March 24, 2020](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) recaps that Intelligent Tracking Prevention caps the expiry of client-side cookies at 7 days, so a cookie written by the pixel can vanish before a slow trial ends, while the email bound at signup keeps the match alive.
#### Step 4: Pick the attribution model and window
Say 1 buyer clicks a video's description link on day 0 and a newsletter link on day 6, then pays $39 on day 9. Each of the 3 models splits that payment differently.
| Model | YouTube link (day 0) | Newsletter link (day 6) |
| --- | --- | --- |
| Last touch | $0 | $39 |
| First touch | $39 | $0 |
| Linear | $19.50 | $19.50 |
*One invented buyer, one $39 payment, split by each model.*
TrackRev defaults to last touch, and first touch and linear are 1 setting away. Linear divides credit by clicks, so 2 clicks on one video link count twice. A model change affects new orders only, so choose before payments arrive. To learn which videos bring buyers in, I would pick first touch, because a video usually introduces the buyer and a newsletter or search closes the sale. The [attribution model comparison](https://www.trackrev.io/blog/attribution-models-saas-comparison) covers the trade-offs.
The window is a workspace setting from 1 to 365 days, and it defaults to 30. TrackRev's [benchmark page](https://www.trackrev.io/data/saas-attribution-benchmarks) reports 41% of workspaces on 30 days and a median configured window of 27 days. To size yours, list the days from first click to first payment for recent customers, as the table does for 20 invented ones.
| Window | Customers credited | Customers missed | Share credited |
| --- | --- | --- | --- |
| 7 days | 11 | 9 | 55% |
| 14 days | 15 | 5 | 75% |
| 21 days | 18 | 2 | 90% |
| 30 days | 19 | 1 | 95% |
| 45 days | 20 | 0 | 100% |
*Share of 20 invented customers that each window credits.*
#### Step 5: Create the links in bulk and test them
TrackRev's [bulk import](https://www.trackrev.io/products/bulk-links) takes up to 500 rows per upload, which at 2 placements each covers 250 videos, with url, name and channel columns plus optional utm_campaign, utm_term, utm_content and tags. Setting the channel to youtube writes utm_source=youtube and utm_medium=video onto the destination unless it already carries its own tags. The free plan holds 50 links, which is 25 videos at 2 placements each, so start with the videos that still get views. Tap each link from the YouTube app on iOS and Android and confirm the click is logged.
youtube-links.csv: one row per placement
```
url,name,channel,utm_campaign,utm_term,utm_content,tags
https://example.com/pricing,Stripe metadata tutorial (description),youtube,stripe-metadata-tutorial,,description,youtube
https://example.com/pricing,Stripe metadata tutorial (pinned comment),youtube,stripe-metadata-tutorial,,pinned-comment,youtube
https://example.com/signup,Founder Q&A (description),youtube,founder-qa,,description,youtube
```
#### Step 6: Rank videos by MRR per 100 clicks
Wait until trials have ended, then divide each video's MRR by its link clicks and multiply by 100: for the tutorial, $351 over 310 clicks times 100 is $113.23. A video from last week still has 14-day trials running.
| Video | Views | Link clicks | New customers | MRR | MRR per 100 clicks |
| --- | --- | --- | --- | --- | --- |
| Launch walkthrough | 61,000 | 1,830 | 3 | $117 | $6.39 |
| Stripe metadata tutorial | 4,800 | 310 | 9 | $351 | $113.23 |
| Founder Q&A | 12,500 | 540 | 0 | $0 | $0 |
*Three invented videos, every customer on a $39 monthly plan, read after trials ended.*
The tutorial has 8% of the launch video's views (4,800 of 61,000 is 7.9%) and 3 times its MRR, and the Q&A shows what a views-ranked channel hides: 540 clicks and no paying customer. Renewals inherit the original click's credit, so the tutorial's $351 (9 customers at $39) keeps growing as they renew, and a refund takes its share back out. Recheck your 5 oldest tutorials every quarter, because old videos keep collecting clicks.
### Tracking creator and sponsor videos
Give each creator 1 link of their own, with the creator's name as utm_campaign, or an affiliate link when you pay commission. The guide to [influencer attribution](https://www.trackrev.io/blog/influencer-attribution-saas) covers contracts and reporting.
The FTC's [Disclosures 101 for Social Media Influencers](https://www.ftc.gov/business-guidance/resources/disclosures-101-social-media-influencers) says disclosures are likely to be missed behind a click on MORE, at the end of a video, or among hashtags and links. A creator's description has to hold the disclosure and your link above the fold, so put that in the brief. TrackRev's affiliate program gives each partner a link and reports commissions against the same Stripe payments, from $39 a month. A promo code per creator catches viewers who type your name.
### What link tracking can't see on YouTube
A viewer who watches, says nothing and searches your name 2 weeks later arrives as organic search or direct, so the video gets no credit. Tapping a link on a phone and signing up on a laptop gives the laptop a second visitor ID with no click behind it. TrackRev's longest window is 365 days, so a sales cycle past 12 months needs CRM-based attribution. Google Analytics 4 files Google Ads campaigns on the YouTube network under Paid Video, so judge those apart from description links.
Treat each video's tracked revenue as a lower bound, and put a how-did-you-hear question on the signup form with YouTube as 1 of the options, then reconcile the answers using the guide to [self-reported versus tracked attribution](https://www.trackrev.io/blog/self-reported-attribution-vs-tracked-data).
### What TrackRev does for YouTube attribution
TrackRev's [revenue attribution](https://www.trackrev.io/solutions/revenue-attribution) runs the chain above in 1 product. You create links on your own domain, such as go.yourbrand.com with 1 CNAME record, choose YouTube as the channel and import a back catalog from 1 CSV. A Stripe, Paddle, Polar or Lemon Squeezy connection supplies the payments, and TrackRev sorts every link by the revenue it produced under the model you chose.
The free plan covers 50 links and 1,000 tracked events a month and shows clicks only. Revenue figures need a paid plan: Starter is $39 a month, Growth $99 and Scale $199. If you only want sessions by video in Google Analytics 4, tagged links are enough. Revenue that arrives through the App Store or Google Play is outside those connections, and contracts that take longer than a year to close suit a CRM better. The [pricing page](https://www.trackrev.io/pricing) lists every plan.
### Frequently asked questions
**Can YouTube Analytics show which videos led to Stripe payments?**
No. It has no link to payment processors, and its revenue columns report YouTube's payouts to you. You need a tracked link plus a billing sync, or your own client_reference_id on Stripe Checkout.
**How do I track a link in a YouTube Short?**
A Short's description and comments can't hold a clickable URL. Use the related-video link to reach a long video with your tracked link, add a channel profile link (YouTube allows up to 14), or use a spoken domain and a promo code.
**Do I need the YouTube Partner Program to track links?**
Only for link info cards (up to 5 per video) and end-screen link elements (up to 4). Description and pinned comment links need advanced features, and channel profile links list no requirement.
**Why does a video show clicks but no revenue?**
Check for a free workspace (revenue figures are hidden), a pixel missing from the signup page, a payment on day 31 of a 30-day window, or a phone click with a laptop signup.
**Does this work with Paddle, Polar or Lemon Squeezy?**
Yes. TrackRev syncs revenue from Stripe, Paddle, Polar and Lemon Squeezy, and its pixel adds the visitor ID to hosted checkout links, including Stripe Payment Links and Stripe Buy Buttons.
**What if a buyer clicked links from two different videos?**
Last touch credits the video clicked last, first touch credits the earlier one, and linear splits the payment, so a $39 plan gives each of 2 videos $19.50.
**Can Google Analytics 4 replace a tracked link?**
For sessions, yes: UTM-tagged links appear under Organic Video. Without a Stripe import it ranks videos by visits and has no MRR figure.
---