← Back to the merchant guide Selling

Coupons

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:

  1. the coupon is active (not switched off),
  2. it has not expired,
  3. it is scoped to this offer, or to no offer at all, and
  4. the page is not in test mode.
The same checkout with and without an applicable coupon Two copies of one checkout. On the left, a coupon scoped to this offer is live, so a "Have a coupon?" line appears above the pay button. On the right the only coupon is scoped to a different offer, so no field is drawn at all — the checkout is otherwise identical. Why the code box is sometimes missing The field is drawn only when a coupon could actually be redeemed on this offer, right now. A LIVE COUPON APPLIES HERE The Joinery Course NZ$49 Have a coupon? Apply Subtotal NZ$49.00 Pay NZ$49.00 SAVE20 is live and scoped to this offer NO COUPON APPLIES HERE The Joinery Course NZ$49 no field is drawn at all Subtotal NZ$49.00 Pay NZ$49.00 the only live code is scoped to a different offer SAME OFFER Deactivate every code on an account and the field disappears from every checkout. That is the feature working, not a bug.
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.

The order of operations in one charge A real order summary: the price, then a twenty percent discount subtracted on the server, then tax calculated on the discounted amount, then the total charged. A note marks the fifty cent floor underneath. One charge, in order SAVE20 on a NZ$49 course. Every step below happens on the server, from your prices. Your price NZ$49.00 SAVE20 comes off here — 20% −NZ$9.80 Tax, worked out on NZ$39.20 at checkout Charged NZ$39.20 + tax Never below NZ$0.50 Stripe's minimum charge, not a GoCushy opinion. A 100% code is not free It stops at the floor above, so the buyer still pays NZ$0.50.
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.

Making a couponThe New coupon dialog with its six fields filled in, the same request said to an AI agent, the table row it produces, and the switch-off and switch-back-on cycle. Making a coupon — six fields, then it is live Fill the dialog, or say the sentence. Both write the same coupon under the same rules, and there is no publish step after. 01 — OFFERS › COUPONS › + NEW COUPON New coupon A code buyers type at checkout. Applied before tax. Code Type SAVE20 % off Value Applies to 20 The Joinery Course Max uses (opt.) Expires (opt.) 50 29 Aug 2026, 11:59pm Create coupon blank max uses = ∞ OR SAY IT TO YOUR AI “Create a 20% code called SAVE20 for the Joinery Course, capped at 50 uses, expiring Friday.” THE ROW IT MAKES SAVE20 20% off 0 / 50 live IT SWITCHES OFF, NOT AWAY live inactive live DEACTIVATE REACTIVATE No publish step — the code works at checkout the moment you press Create. A coupon cannot be edited after it is made. A code is a promise you already handed out, so switch it off and make another.
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.

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:

A subscription coupon discounts the first payment onlyLeft: a checkout summary for a 49.00 per month subscription with LAUNCH20 applied, above four billing bars — the first shortened to 39.20, the next three at the full 49.00. Right: the four payment rails scored on whether a coupon combines with a free trial — Stripe allowed, Airwallex and PayPal refused with a 422, crypto has no subscriptions. Below, the verbatim refusal sentence both rails return. The discount lands once, then the price goes back up /docs/coupons — Subscriptions & trials · Fernwood & Co. · The Joinery Course, NZ$49.00 /month, LAUNCH20 applied 01 — FOUR BILLING CYCLES The Joinery Course NZ$49.00 /month Discount (20% off) −9.80 Total per month NZ$39.20 What actually bills, cycle by cycle: Payment 1 Payment 2 Payment 3 Payment 4 LAUNCH20 full price full price full price 39.20 49.00 49.00 49.00 Renewals bill at the full price. 02 — COUPON + FREE TRIAL RailCapabilities::MAP → coupons_on_trials Card (Stripe) discounts the first post-trial invoice allowed Card (Airwallex) the mandate freezes one recurring amount 422 refused PayPal free-TRIAL-cycle plan; no coupon on top 422 refused USDC on Base (crypto) no pull/mandate primitive on-chain no subscriptions same sentence, both rails THE 422, WORD FOR WORD Discount codes don't combine with a free trial — the trial is the discount. Remove the code to start your free trial. The discount lands once. Coupon + free trial is refused outright on Airwallex and PayPal. Separate trap: on a subscription offer that has any coupon, applying one hides the PayPal button on the hosted checkout — yet /paypal/subscribe itself honours a coupon on cycle 1. The courtesy layer is stricter.
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.

Three ways a promo endsThe coupons table with four rows — live, expired, fully redeemed and inactive — showing that the status pill changes but the buttons do not, because an expired coupon is still active. Three ways a promo ends — and only one of them is “off” A code stops when its date passes, when its cap fills, or when someone switches it off. The pill tells you which. The buttons do not. OFFERS › COUPONS CODE DISCOUNT APPLIES TO USED EXPIRES STATUS LAUNCH20 20% off All offers 3 live Deactivate SAVE20 20% off The Joinery Course 12 Aug 1, 2026 expired Copy link Deactivate EARLYBIRD NZ$10.00 off The Joinery Course 50 / 50 fully redeemed Copy link Deactivate PODCAST10 10% off The Joinery Course 8 inactive Reactivate WHAT THE PILLS ARE TELLING YOU expired — the date passed. fully redeemed — the cap filled. Both stopped themselves. inactive — a person switched it off. Only this one has a Reactivate button. Expired and fully redeemed are still “active” — so they keep Deactivate, and their Copy link still copies. That link opens the checkout perfectly well and discounts nothing. If a promotion has ended, stop sharing the link too.
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

RuleDetail
Percent or amount, never both1–100% off, or a fixed amount in the offer's currency.
Codes are unique per account3–40 characters; letters, numbers, hyphen, underscore. Stored uppercase.
ScopeOne offer, or every offer if you leave it unscoped.
Redemption capOptional, 1 to 1,000,000 total uses.
ExpiryOptional, and must be in the future when you set it.
Applied before taxTax is then calculated on the discounted amount.
Never below NZ$0.50Stripe's minimum charge sits under every rule.
Immutable once createdSwitch 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.