In brief
Give each affiliate their own discount code, and the sale gets credited when a customer types it in. No link, no click, nothing to track. AffiliateRail stores the partner against Stripe's internal id for that code rather than the text of it, so you can rename the code and nothing breaks, and a checkout session carrying that id goes to that partner. If someone clicks a link and uses a code, the click wins. That makes codes the right tool for podcasts, video, and anywhere nobody can click anything. The catch most founders miss is the cost: a 20% code on a $99 plan at 20% commission costs you $15.84 a month more than a plain link, because you discount the price and then pay commission on what was actually paid.
No card. Cancel in one click.
How does a coupon code credit an affiliate with no click?
In shortEach code belongs to one partner, and the payment carries the code with it. Stripe records which code was used. Your affiliate tool looks up whose it is. The commission is written exactly as it would be for a click.
Attribution is the question of which partner gets credited for a sale. A code answers it differently from a link. A link works by leaving something behind in the browser. It leans on a cookie and a scrap of storage. It also needs a visitor who comes back before any of that gets cleared. A code doesn't lean on the browser at all. It rides on the payment. That's the whole difference. It's why a code reaches people a link never will: listeners, viewers, readers of print.
A promotion code is Stripe's customer-facing code for a coupon. It's the thing your partner reads out. It's the thing your customer types into the box at checkout. It's also the row your commission hangs from. Stripe's own reference lists what you can put on one. A named customer, a cap on redemptions, an expiry date, a first-time-buyer rule, a minimum amount. The code itself can run to 500 characters. But a podcast host has to say it out loud. So make it short enough to hear once.
A promotion code points to an underlying promotion. You can optionally restrict the code to a specific customer, redemption limit, and expiration date.
Now the part where tools differ. AffiliateRail stores the partner against the promotion code's id, the string starting promo_. It does not store it against the letters your customer types. The checkout session carries that id in its discounts list, so the match is exact. Rename JANE to JANE20 next month and nothing breaks, because the id never moved. A tool matching on the letters would have carried on running. It would have stopped paying Jane and told nobody. That kind of silent failure surfaces only when the partner does the sums herself. Jane finds out first. You hear it from her.
You make the code in your own Stripe account and the connection reads it. Nothing is written back. One partner can hold as many codes as you like. That is how a creator gets a fresh one per campaign.
Paddle has the same idea under another name. Discounts there can be one-off or recurring. Either the buyer applies one at checkout or you apply it yourself. AffiliateRail's code path binds on Stripe's promotion-code id today. So a Paddle program credits the partner through the link instead. Worth knowing before you promise a Paddle partner a code.
The click beats the coupon, and you decide why
In shortAffiliateRail looks for a click first. It only checks the discount when there was no click. That order is fixed in code with a test on it. So every sale gets the same answer instead of somebody deciding case by case.
Two partners can turn up in one sale. Jane wrote the review that sent the visitor over. Sam recommended your product on his podcast a fortnight earlier. So Sam's code was the one typed at checkout. Both have a fair claim. Somebody has to be paid. The order is a decision you are making whether you realise it or not.
Putting the click first pays whoever got there earliest. It uses the one thing a stranger cannot copy. Anyone can find a code on a deals page. A click belongs to one visit in one browser. So a code is the backup for a visitor who arrived with nothing on them. It is not a rival claim on one who already had something.
Some platforms document the opposite order, and that's a fair choice too. So read your tool's rule before you write a partner agreement. That one line decides every mixed sale you'll ever have.
One more thing about order. A customer is tied to a partner once, on the first payment carrying anything. Later payments cannot reopen it. So a code used at the second renewal changes nothing. It cannot take a customer away from whoever brought them.
What a code carries, and what it costs you
In shortIt carries credit off the web and through anything that blocks a script. It loses you the click data. It costs a discount on top of the commission. And it's the one marker a stranger can copy and use.
| A link | A code | |
|---|---|---|
| How the sale is matched | A click id stamped onto the checkout | The promotion code on the payment |
| What the audience must do | Click, then buy inside the window | Remember a word and type it |
| Works off the web | No. Audio, print and stage have nothing to click | Yes. A code can be said out loud |
| Blocked scripts, short cookie caps | Costs you click counts, and the referral if storage is cleared | Nothing has to survive in the browser |
| Click data for the partner | Clicks, sources, countries, the journey | None. Sales and earnings only |
| Cost to you | The commission | The commission and the discount, every time |
| Repeat payments | Yes. The customer stays with the partner | Yes. The same binding on the customer |
| If it spreads | A link is copyable but still earns its owner | Anyone who finds the code triggers a commission |
| Where it works | Stripe and Paddle | Stripe today |
The cost line is the one founders undercount, so do the arithmetic once. For example, let's say you sell at $99 a month. You pay 20% recurring. The code gives your customer 20% off.
| Path | Customer pays | Partner earns | You keep | Basis |
|---|---|---|---|---|
| A link | $99.00 | $19.80 | $79.20 | 5 Sep 2026 |
| The same partner's code | $79.20 | $15.84 | $63.36 | 5 Sep 2026 |
Commission is worked out on what the customer actually paid. So the discount shrinks the partner's cut as well as yours. Same partner, same customer. You are worse off every month by the gap between those two bottom figures. You keep 64% of the full price where the link kept 80% (arithmetic, 5 September 2026).
That discount goes somewhere, and it splits three ways. The customer gains. You lose most of what they gained. The partner loses the rest, because their percentage comes off a smaller number. Tell a creator that early. Otherwise they will ask why the code paid them less than their own link would have.
None of which makes a code a bad deal. It makes it a different deal. Most people price it as a single number when it is really two. Keep the last figure. A fifth off plus a fifth in commission takes about a third off your full price.
When is a code the right thing to give a partner?
In shortWhen the audience can't click. Podcast reads, video watched on a television, live talks, print. And anywhere a link would have to be typed from memory anyway.
This is the honest explanation for why creator programs run on codes. A host reading your product out for forty seconds can't hand over a link. Half that audience is driving. What they can do is say a word. A code is the only marker that survives being spoken. The discount is what makes anyone bother to type it.
It also gives the audience a reason to act now. A bare link never manages that. A link is a route; a code is an offer.
Most partners should have both. The link for the blog post and the newsletter. The code for the read, the caption and the video. An AffiliateRail program can also run on codes alone, with links hidden in the portal. That suits partners who are all on camera.
What a creator needs from you fits in one message.
The message to a creator you are giving a code
Hi [first name],
Your code is [CODE]. It gives your audience [discount] off. It pays you [commission] on every payment they make, for as long as they stay subscribed.
Two things worth knowing. The code works whether or not anyone clicks. So it's safe to say out loud in a video or a podcast, and there's no link to remember. And if someone does click your link first, the link takes the credit. So you're covered either way.
Your portal at [portal address] shows every sale the code brought in. It shows what you've earned, and when the next payout runs.
One ask. Please keep the code to your own audience and off deal sites. Codes that end up on coupon aggregators get retired. At that point they're paying for sales that were already happening.
[your name]
Keep that last paragraph in particular. Saying it before the code goes out takes two minutes. Saying it afterwards becomes a negotiation about somebody's earnings.
A code on a deal site pays for sales you already had
In shortA code reaches deal sites. Then it pays commission on customers who were already buying. Nothing prevents that. What you need is a written position taken early. And a signal that knows a popular code from an abused one.
The pattern is ordinary enough, and every founder recognises it. A customer is part way through checkout, notices a discount box, and opens another tab. They search your brand plus the word coupon. They find a partner's code on a deal site, come back and pay. The partner gets credited for a sale they had nothing to do with. Your margin pays for it twice: once in the discount and once in the commission. Nobody did anything wrong.
A browser add-on can do the same without the search. Some write their own referral onto the checkout page, on top of whatever the visitor arrived with. That takes the credit from the creator who made the recommendation. That practice is the subject of a joined civil case in the Northern District of California. The case is In re PayPal Honey Browser Extension Litigation. PayPal answered the second amended complaint in July 2026. The case is still running. So nothing is decided, and nobody should read a finding into it. That said, it's worth knowing about. The mechanism is technically straightforward. And it's aimed at the partners you hand codes to.
Then there's the counting trap. It is where most fraud rules here go wrong. A code is meant to be used by lots of people. So a high count proves nothing. A rule built on that count spends its life flagging your best partner. I wrote AffiliateRail's coupon-abuse rule to ignore the count entirely. Coupon abuse is one code used over and over by what is really one person. So the rule hunts for that instead. One sign is several email addresses reducing to the same mailbox under different aliases. For example, jane+one@ and jane+two@. Another is a burst of redemptions from a single IP address inside an hour. Both thresholds are yours to tune. Both raise a flag with its evidence rather than reversing anything on their own.
The rest is the position you take in writing, before anyone tests it. Module 2 of the manual has the clause. The plainest version credits approved deal partners through their own code only. Never a last-second link. Module 6 covers the leak alongside the other five patterns.
Pay the partner whose code brought the sale
Codes from your own Stripe, mapped to partners, with a click still winning. Fourteen days, no card.
Does a code prove the affiliate caused the sale?
In shortIt proves the customer heard the affiliate. That's more than a last click proves. It's still not proof the sale would have been lost without them.
Typing a code is a deliberate act. So a redemption is a stronger signal than a cookie set by a visit nobody remembers. That's the real argument for codes. What it can't tell you is whether the customer was buying anyway. Some go looking for a discount on the last screen.
You can smell the difference in data you already hold. Module 7 walks through it. Minutes between first contact and payment rather than days. A code that moves in step with your launches rather than the partner's posting. Churn no better than a cold visitor's. The crude test works too. Retire a suspect code for a month. Watch whether new subscriptions fall. If they don't, that's your answer.
No published figure exists for how much of a program's coupon revenue would have arrived anyway. This page isn't going to invent one. Practitioners have argued both sides for years. One exchange from 2022 still frames it best. Codes are what survives a blocked script. The price is your click data, a discount box on your pricing page, and a code that reaches deal sites fast.
So treat a code as exactly what it is. It reaches audiences nothing else reaches. It costs discount plus commission together.
Common questions
Does the discount repeat, or only apply once?
That's yours to set in Stripe, and it changes the sums. A coupon runs once, repeats, or lasts forever. A code set to once costs you the discount on the first payment only. The example above assumes a repeating code, which is the dearer case.
What happens to a coupon commission when the customer refunds?
It follows the money, exactly as a link commission does. One not yet paid out is voided. One already sent comes off the partner's next payout.
Can one partner have more than one code?
As many as you want to give them. Each code is its own row against the same partner. So a creator can have one per campaign or per channel. Each row shows how many customers it brought in. So retiring one is a decision rather than a guess.
Do renewals keep paying the partner behind the code?
They do. The code binds the customer to the partner, not the single payment. So every later invoice is credited the same way.
Is a discount required to run a code?
Technically no, and practically yes. A code worth nothing gives the audience no reason to type it. Typing it is the whole mechanism. Price the discount and the commission as one cost.
What happens to past sales if a code is deleted?
Everything already credited keeps its partner and its commission. Deleting a code stops future matching only. That's why deletion is the off switch. There is no half-retired state to puzzle over later.
Where these facts come from
Fact-checked and reviewed by Jimi Barkway on 8 September 2026. Every figure above was read off the document named here on the date beside it. To contact AffiliateRail about one, email support@affiliaterail.com and the figure is corrected and the date moved.
- The Promotion Code object (Stripe API reference)checked 4 September 2026
- Create a promotion code (Stripe API reference): the customer, redemption limit and expiry restrictions, and the 500-character codechecked 4 September 2026
- The Checkout Session object (Stripe API reference): the discounts list that carries the promotion code, and client_reference_idchecked 4 September 2026
- Discounts (Paddle API reference): one-time or recurring, applied by code at checkout or by the seller, archived rather than deletedchecked 4 September 2026
- In re PayPal Honey Browser Extension Litigation, No. 5:24-cv-09470 (N.D. Cal.): the public docket. Filed 29 December 2024, answer to the second amended complaint 16 July 2026, case schedule order 10 August 2026. The allegations are unprovenchecked 4 September 2026
- A 2022 Show HN thread on affiliate tracking: the exchange weighing codes against links, and the three costs named in the replychecked 4 September 2026
- AffiliateRail docs: Concepts, where a coupon is defined as a Stripe promotion code assigned to a partnerchecked 4 September 2026
- AffiliateRail docs: Attribution and tracking, the four ways a sale binds and the attribution-health split by pathchecked 4 September 2026
- AffiliateRail docs: Safeguards and risk, including the coupon-abuse signal and the blocked traffic sourceschecked 4 September 2026
- AffiliateRail docs: Concepts, where a sale is one payment and commission is calculated on that payment's revenue net of taxchecked 8 September 2026