Percent off or a fixed amount, scoped to one offer or every offer, capped by redemptions, expiring on a date — and now switchable off without deleting the history that references it. This page covers what a buyer sees, exactly when the code field appears on your checkout, where the discount lands in the charge, what happens on subscriptions and trials, and how to end a promo.
01 — The idea
What a coupon is
A code a buyer types at checkout, or that you bake into a link so they never have to. It takes a percentage off or a fixed amount off — never both — and you can scope it to one offer, cap how many times it is used, and give it an expiry.
Discount
% or amountone or the other
Scope
One offeror every offer
Cap
1–1,000,000total redemptions
Floor
NZ$0.50Stripe's minimum charge
02 — The one that surprises people
When the code field appears
The "Have a coupon?" field is not always on your checkout, and this catches people out — including us, in testing. It appears only when a coupon could actually be used on that offer right now. All four have to be true:
the coupon is active (not switched off),
it has not expired,
it is scoped to this offer, or to no offer at all, and
the page is not in test mode.
A missing code box almost always means no coupon currently applies to that offer — it has expired, been switched off, or is scoped somewhere else. Create one that applies and the field returns by itself.
03 — The money
Where the discount lands
The discount comes off on the server, before tax. Tax is then calculated on the discounted amount, which is what your accountant expects and what most tools get wrong.
Discount first, then tax on what is left, then the charge — and a floor underneath the whole thing. A 100% code does not produce a free order; it produces a fifty-cent one, which is worth knowing before you send it to a list.
04 — Doing it
Making one
Say this to your agent
Create a 20% coupon called SAVE20 for my Joinery Course offer, limited to 50 uses, expiring Friday midnight.
Or use Offers → Coupons → New coupon in the dashboard. Both write the same thing under the same rules.
Six fields and there is no publish step: the code works at the next checkout the moment you press Create. It cannot be edited afterwards — deactivating and reactivating is the whole lifecycle, and switching one off needs an admin even though anyone on the team can make one.
Codes are stored in UPPERCASE however you type them, so save20 and SAVE20 are the same coupon — and a buyer typing either gets the discount. A code must be 3–40 characters of letters, numbers, hyphens or underscores, and unique on your account.
Coupons cannot be edited after they are created. A code is a promise you have already made to whoever holds it, so changing what it does under them is not something this product will do. Switch it off and make another.
05 — The easier path
Pre-applied links
Asking people to type a code loses some of them. Every coupon has a Copy link in the dashboard that gives you a checkout URL with the code already applied — the buyer lands on the discounted price with nothing to remember and nothing to mistype.
This is usually the better way to run a promotion. Keep the typed code for the cases that need it: a podcast read, a printed card, anywhere someone cannot click.
The link is just that offer's checkout with the code on the end — /c/<account>/<offer-slug>?coupon=SAVE20 — so once you have seen one you can write them by hand. Clicking the button swaps its label to Copied ✓ for a second so you know it took.
The button is not on every row.Copy link only appears on a coupon that is switched on and scoped to a single offer. A coupon set to All offers never gets one, because there is no single checkout to point at — which is easy to miss, since the panel above the table recommends the button without saying that. For an everywhere-code, share the code itself, or make a second coupon scoped to the one offer you are actually promoting.
The button, the URL it puts on your clipboard, and the checkout the buyer opens with the discount already on it. Rows scoped to All offers, and rows you have switched off, have no button at all.
06 — The exceptions
Subscriptions & trials
On a subscription, the discount applies to the first payment. Renewals bill at the full price — a coupon is a way in, not a permanent price change.
Two rail-specific rules worth knowing before you promote something:
On a gocushy subscription a coupon discounts the first payment only: a 20%-off code on a NZ$49.00 /month plan bills 39.20 once and then 49.00 every cycle after, because the Stripe coupon is minted with duration 'once'. A coupon does not combine with a free trial on the Airwallex or PayPal rails — both return HTTP 422 with the identical sentence "Discount codes don't combine with a free trial — the trial is the discount. Remove the code to start your free trial." Stripe is the only rail that allows the combination (the coupon discounts the first post-trial invoice), and the crypto rail (USDC on Base) sells no subscriptions at all.
A coupon and a free trial do not combine on Airwallex or PayPal. The checkout says so plainly and asks the buyer to remove the code — the trial is already the discount. On card (Stripe) a coupon discounts the first invoice after the trial ends.
A discounted subscription is card-only. When an offer sells a subscription and a coupon could apply, the PayPal button is hidden with a note rather than shown as a button that would charge the wrong amount. Your buyer pays the discounted price on a card; the code still works, the rail is just narrower for that one case.
07 — Ending it
Ending a promo
A promotion stops for one of three reasons, and only one of them is something you did. Its expiry passes, its redemption cap fills, or someone switches it off. The status pill in the Coupons table tells you which: expired, fully redeemed, or inactive.
The first two are still switched on. A coupon that has expired or filled its cap is, as far as the product is concerned, still active — it simply stops matching at checkout. So it keeps its Deactivate button rather than a Reactivate one, and if it is offer-scoped its Copy link still copies a perfectly working checkout URL that will discount nothing. When a promotion ends, stop sharing its link too.
To end one early: ask your agent to deactivate the code, or use the Coupons panel. It stops working at checkout immediately.
Deactivating is not deleting. Every order that used the code still references it, so past sales still read correctly and your reporting does not develop a hole. The coupon stays in your list marked inactive, and you can turn it back on.
Four rows, four endings. Only PODCAST10 was switched off by a person, and it is the only one offering Reactivate — the other two stopped themselves and still read as active.
Ending a promo needs an admin. Creating a coupon is open to your team; deactivating and reactivating need an admin or the account owner, because switching a code back on is the same power as minting one.
08 — The rules
Limits
Rule
Detail
Percent or amount, never both
1–100% off, or a fixed amount in the offer's currency.
One offer, or every offer if you leave it unscoped.
Redemption cap
Optional, 1 to 1,000,000 total uses.
Expiry
Optional, and must be in the future when you set it.
Applied before tax
Tax is then calculated on the discounted amount.
Never below NZ$0.50
Stripe's minimum charge sits under every rule.
Immutable once created
Switch it off and make another instead.
09 — When it looks wrong
If something looks wrong
There is no code box on my checkout
No coupon currently applies to that offer. Check it is active, unexpired, and either scoped to this offer or unscoped. See when the field appears.
The code box is missing on a test link
Expected — test mode never draws it. Use the live checkout to see what a buyer sees.
A 100% code still charges something
Fifty cents, and that is Stripe's floor rather than ours. If you need genuinely free, give the thing away rather than selling it at zero.
The PayPal button vanished
On a subscription offer where a coupon could apply, PayPal is hidden deliberately — a button that would charge full price is worse than no button. The buyer pays the discounted price on a card instead.
I made a mistake in a coupon
Deactivate it and create a corrected one. Coupons are immutable on purpose.