Promo codes
Promo codes give buyers a discount at checkout. They’re separate from hidden tickets, which restrict access to a ticket — a promo code reduces the price. You can use both together: a hidden VIP ticket whose price still drops further with a code.
What you can configure
Each code carries five things you choose:
| Field | What it does |
|---|---|
| Type & amount | Percentage (1–100%) or a fixed amount in your account’s currency. |
| Event scope | Optional. Restrict the code to a single event, or leave it open across all events on your account. |
| Expiry | Optional datetime. After that moment, the code stops applying. |
| Total usage cap | Optional integer. Honoured across all buyers; a soft cap under high concurrency. |
| Per-customer cap | Optional integer. Counted by checkout email — refunded orders free up a use. |
Codes are 3–32 characters, letters / digits / dashes only. We uppercase on save, so news10 and NEWS10 are the same code.
When to use them
- Newsletter & loyalty discounts — share a code with your list that gives 10% off any ticket.
- First-time-buyer incentives — set
max_per_customer: 1so each email can only redeem once. - Influencer partnerships — give each partner a unique code so you can see in the order list which ones drove sales.
- Free comps for a specific group — 100% off with a tight total cap, restricted to one event.
- Time-boxed campaigns — set an expiry so you don’t have to remember to deactivate the code later.
How buyers redeem a code
Two ways, both supported out of the box:
- Typed at checkout — there’s a “Have a promo code?” disclosure right above the payment buttons. The buyer expands it, types the code, and the cart total updates immediately.
?promo=CODEin the URL — append?promo=NEWS10to any link on your shop. Usetix captures the code into the buyer’s session, so by the time they reach checkout the discount is already applied. Perfect for newsletter / ad / influencer links.
Codes are silently ignored on the public shop if they don’t match — no scary error appears before the buyer has even decided to buy.
How to create a code
In the admin dashboard, go to Promo codes in the sidebar. Hit New code:
| Field | Notes |
|---|---|
| Code | What buyers type. 3–32 alphanumeric+dashes. Auto-uppercased. |
| Discount type | Percentage or Fixed. |
| Discount amount | For percentage: integer 1–100. For fixed: an amount in your account’s currency (e.g. 1.50 for €1.50 off). |
| Event | Leave as “All events” or pick one to restrict the code. |
| Expires at | Optional. Past this moment the code stops applying. |
| Usage limit | Optional total cap. |
| Max per customer | Optional per-buyer cap. |
| Active | Uncheck to disable the code without deleting it. |
Save. The code is live immediately.
The in-app AI assistant also knows about promo codes. Just say “Create a code FALL26 — 15% off, max 1 per customer” and it will set it up for you.
How the discount lands on Stripe & PayPal
The discount is allocated across the order’s line items proportionally to their original price. The hosted Stripe checkout page shows the discounted unit prices, so the buyer sees the real numbers and pays exactly that. PayPal validates against the discounted total. Free-after-discount orders skip the payment provider entirely — the buyer gets their tickets directly.
VAT is computed on the discounted total, so your customer invoice reads truthfully: line items at the discounted price, a “Promo code” subtotal row, then Net / VAT / Total below.
Caps, races, and refunds
The total usage limit is a soft cap. Under high concurrency on a near-capacity code (e.g. usage_limit: 1 with two buyers in flight simultaneously), a small number of orders may slip past the limit. Hard locking would strand buyers during the payment provider’s async window (Stripe Checkout sessions can live for hours). Soft over-redemption is the correct trade-off.
The per-customer cap is keyed on the buyer’s checkout email and counts paid + currently-reserved orders. Refunded orders free up a slot — so a buyer who cancels in good faith can redeem again, automatically.
redemptions_count is not decremented on refund. An organizer issuing “100 free coupons” doesn’t want refunds to silently restore quota. If you need to allow more redemptions after refunds, edit the code and bump the limit.
Deactivating or deleting a code
In the promo codes list, hit the trash button:
- Codes with no redemptions — hard-deleted immediately.
- Codes with at least one redemption — soft-deactivated (
active: false). The historical orders keep their snapshot of the code label and discount, so receipts and invoices remain truthful even after the code is gone from the admin view.
What’s visible in the order detail
For any order with a code applied, the admin order page shows:
- Subtotal — sum of original prices
- Promo code NAME — the snapshotted code label, with the discount subtracted
- Total — what was actually charged
The webhook payload for that order includes discount_amount, promo_code, and a per-item original_price alongside price, so external integrations can reconstruct the full picture.
API access
Full CRUD over promo codes is available via the API. Same data model, bearer-authenticated, account-scoped — ideal for syncing codes from an external CRM or generating a unique code per influencer partner.