Appearance
Promo Codes
Create and manage promotion codes (discount codes, voucher codes) that your customers apply at checkout — percentage off, a fixed amount off, or buy-X-get-one-free free tickets. This page covers creating codes, limiting how they're used, sharing them in marketing campaigns, and tracking who redeemed them.
Where to find it: Admin → Promo Codes (/admin/promo-codes)
Who can manage promo codes
Creating, editing, deleting, and activating or deactivating codes requires the marketing campaigns permission. All of the built-in admin roles — Admin, Shop Manager, and Marketing — hold it (see Users for the full role breakdown), so in practice every admin can manage promo codes. An admin without the permission doesn't see Promo Codes in the admin menu at all; if they open the page by its web address, the Create Promo Code button and the edit, delete, and row activate/deactivate actions are hidden, although the Deactivate/Activate button in a code's details panel still appears.
Create a promo code
- Click Create Promo Code (top right). The create panel slides open.
- Enter the Code — the text customers will type, e.g.
SUMMER20. It must be 4–20 letters and numbers (no spaces or symbols) and is automatically uppercased. Click Generate for a random 8-character code. The code text cannot be changed after creation, so check it before saving. - Optionally add a Description — an internal note only admins see. Worth filling in: the search box on the list matches descriptions as well as codes, so a note like "July email campaign" makes the code easy to find later.
- Choose the Discount Type and value (see Choose a discount type).
- Choose the Scope — all competitions or only specific ones (see Restrict a code to specific competitions).
- Set any validity dates and usage limits (see the sections below). Everything left blank means "no limit": blank Valid From starts the code immediately, blank Valid Until never expires, blank use limits are unlimited, blank Minimum Spend means no minimum.
- Leave Active ticked (the default) so the code works as soon as it's saved, or untick it to prepare a code without switching it on yet.
- Click Create Promotion Code.
Choose a discount type
- Percentage Off — enter the percentage, e.g.
20for 20% off the ticket price. - Fixed Amount Off (£) — enter the amount, e.g.
5.00for £5 off the order. - Free Tickets — a buy-X-get-one-free offer. See below, because the value field works differently.
Set up a "Buy 2 Get 1 Free" offer
For a Free Tickets code, the value field is labelled Ticket Divisor. Enter the total group size of the offer — the number of tickets in each "bundle", including the free one:
3= Buy 2 Get 1 Free (every 3rd ticket is free)5= Buy 4 Get 1 Free (every 5th ticket is free)
The offer repeats across the quantity: with a divisor of 3, a customer buying 6 tickets gets 2 of them free. The customer doesn't receive extra tickets — instead the price of the free tickets is deducted from what they pay, so someone who adds 3 tickets pays for 2. The code's usage history shows how many free tickets each redemption granted.
Limit how a code can be used
All of these live in the Validity & Restrictions section of the create/edit panel and can be combined:
- One redemption per customer — set Max Uses Per User to
1. Each customer can redeem the code once; the code as a whole stays available to everyone else. - Cap total redemptions — set Max Total Uses, e.g.
100for a "first 100 customers" offer. The Usage column on the list shows progress asuses / cap(e.g.37 / 100), and the code stops working once the cap is reached. - Minimum Spend (£) — the minimum basket total required before the code applies. Leave blank for no minimum.
- New Customers Only — tick this checkbox to restrict the code to customers who have never completed an order. Ideal for acquisition campaigns; existing customers who try the code are refused.
Schedule a code to start and stop automatically
Use the Valid From and Valid Until date-and-time fields:
- Valid From — the code starts working at this moment. Leave empty for immediate activation. Handy for launching a Black Friday code at midnight without being at your desk.
- Valid Until — the code stops working at this moment. Leave empty for no expiry.
Scheduling is independent of the Active toggle: an expired code still shows an Active status badge, but the details panel adds an Expired marker next to it and highlights the past Valid Until date. If you want the code re-usable later, just edit the dates rather than toggling it.
The Expiring Soon stat card at the top of the page counts active codes whose Valid Until falls within the next 7 days — a prompt to extend or replace them before customers start hitting "expired" errors.
Restrict a code to specific competitions (or exclude some)
In the Scope section of the create/edit panel:
- All Competitions (Global) — the code works site-wide. An Exclude Competitions (Optional) checklist appears so you can carve out competitions where it must not apply (e.g. a low-margin flash sale). The panel confirms how many competitions the code will NOT work for, and the list shows "N excluded" under the Global badge.
- Specific Competitions Only — the code works only for the competitions you tick in the Include Competitions checklist. At least one must be selected.
Two things to know about the competition picker:
- When creating a code, the picker lists active competitions only, and only the 500 most recent — a warning appears on screen if the list has been truncated.
- When editing a code, the picker lists all competitions, so ended competitions you previously scoped still appear ticked.
Share a code with customers
Copy the code
Click the clipboard icon next to any code in the list to copy it, ready to paste into an email, social post, or support reply.
Give customers a link that applies the code automatically
Add ?promo=CODE to any page URL on your site, for example:
https://yoursite.com/competitions?promo=SUMMER20When a customer opens the link, they see a message that the code will be applied to their basket, and the code is remembered on their device for 7 days — so it still applies when they add tickets later in the week. If it can't be applied automatically (for example, the code doesn't cover the items in their basket), they're told they can apply it manually in the basket instead. The code in the link isn't case-sensitive.
This is the main way to use codes in email campaigns, ads, and social posts — the customer never has to type anything. You can build tracked campaign links from the Marketing Hub.
What the customer sees at checkout
Customers apply codes in their basket: on desktop the Promo Code box (with its "Enter code" field) is always visible; on mobile it's tucked behind a Have a promo code? link. Two behaviours worth knowing when you write your offer terms:
- Customers must be signed in to apply a code.
- Only one promo code can be active on a basket at a time — codes never stack. Applying a second code means removing the first.
Find and organise codes
- Stat cards — Total Codes (everything, active and inactive), Active (currently switched on), Total Usage (combined redemptions across all codes), and Expiring Soon (active codes ending within 7 days).
- Search — matches the code text and the internal description.
- Status filter — the list opens filtered to Active codes only. Switch it to All or Inactive to see deactivated codes; this is why a code you've just deactivated seems to vanish.
- Scope filter — All Scopes, Global, or Specific Competitions.
- Sorting — click the Code, Usage, or Validity column headers to sort; click again to reverse. Sort by Usage to see your most-redeemed codes, or by Validity to see which expire soonest.
See who redeemed a code
Click the view (eye) action on any row to open the details panel. It shows:
- Stats — total uses (against the cap, if set), the discount, scope, and status (with the Expired marker where relevant).
- Full settings — validity dates, minimum spend, per-user limit, new-customers-only restriction, plus when the code was created and by which admin.
- Usage summary — above the usage table: Uses, Card Spent, Site Credit Used (shown only when any was used), Discount Given, and Free Tickets (shown only when the code granted any). Card Spent is the new money customers actually paid on orders that used the code, after the code's discount came off — the figure to use when you've given a code to an influencer and owe them a cut of the sales. Site Credit Used is spend funded by customers' existing site credit; it isn't new money coming in, so it's shown separately rather than mixed into Card Spent — most operators won't pay commission on it.
- Date filter — a range picker next to the Usage History heading: All time, Last 7 days, Last 30 days, or Custom with from/to dates. It filters both the summary figures and the table beneath, so you can read off a code's performance for exactly the period you're settling up.
- Usage History — a table of every redemption: the customer (name and email), the order number, the competition, the discount given (and free tickets granted, for Free Tickets codes), and the date. It's paginated at 10 per page — use Previous / Next to browse. Look up the order itself on Orders.
A few things to know about the summary figures:
- Only paid, non-cancelled orders count. Abandoned or failed checkouts never inflate the numbers, and an order drops out automatically once its full order value has been refunded.
- Orders refunded partially (anything less than the full order value) still count at their original value — the summary doesn't subtract those refunds, so knock them off manually if you're paying commission on the figures.
- An order that used the code across several competitions counts as one use, so Uses can read lower than the number of rows in the table. It can also read lower than the list page's Usage column, which is a lifetime count that keeps refunded and cancelled orders — the summary's Uses is the one to use for "how many paid orders did this code drive".
The panel footer has Deactivate/Activate, Delete (only for never-used codes), and Edit buttons.
Edit a code
Click the edit (pencil) action on a row, or Edit in the details panel. Every setting can be changed except the code text itself.
If the code has already been redeemed, a warning at the top of the panel reminds you that changes to the discount, scope, or restrictions apply to future redemptions only — past orders are never recalculated.
Deactivate or reactivate a code
Use the activate/deactivate action on a row (an ✕ circle when the code is active, a ✓ circle when it's inactive) or the Deactivate/Activate button in the details panel footer. Deactivating takes effect immediately — customers can no longer apply the code — but keeps the code and its history intact so you can switch it back on any time.
Remember the list's status filter defaults to Active, so a deactivated code only shows once you switch the filter to All or Inactive.
Delete a code and reuse its name
The delete (trash) action appears only on codes that have never been used — for used codes there is no delete at all; deactivating is the only way to retire them, which preserves their usage history for reporting.
Deleting an unused code removes it permanently and frees the code text, so you can create a fresh code with the same name (useful for re-running WELCOME10 with different terms). One exception: if an unused code is awarded by a prize wheel, it's deactivated instead of deleted so the wheel keeps working — the confirmation dialog warns you this may happen, and the message afterwards confirms which it was. Prize wheels are configured in the Marketing Hub.
Troubleshooting
A customer says their code isn't working
Open the code's details panel and check, in order:
- Is it active? Status must be Active — and check for the Expired marker next to it.
- Is it inside its validity window? A future Valid From or past Valid Until blocks it.
- Has it hit its total cap? Compare total uses against Max Total Uses.
- Has this customer already used it? Check the Usage History against the Max Uses Per User limit.
- Does their basket meet the Minimum Spend?
- Is it New Customers Only? A customer with any completed order will be refused.
- Does the scope cover their competition? A Specific code only works on its included competitions; a Global code won't work on its excluded ones.
- Are they signed in, with no other code applied? Codes require an account, and only one code can be on a basket at a time.
A code has disappeared from the list
The status filter defaults to Active. Switch it to All or Inactive — deactivated codes are still there.
My promo link didn't apply the discount
The ?promo=CODE link stores the code and applies it once the customer is signed in and has tickets in their basket. If the code doesn't cover what's in the basket, the customer sees a message telling them to apply it manually instead — run through the checklist above to find which restriction blocked it. The stored code also lapses after 7 days, so a customer returning from an old email may need to enter it again.
I can't create a code with a name I've used before
Code text must be unique across all codes, including inactive ones. Find the old code (set the status filter to All), and if it has never been used, delete it to free the name. If it has been used it can't be deleted — pick a new name (e.g. WELCOME10B).
The competition I want to scope to isn't in the picker
When creating a code the picker only offers active competitions, and only the 500 most recent. If the competition has ended it won't appear; if you have a very large back catalogue, an on-screen warning tells you the list is truncated. Scope the code while the competition is live, or use a Global code with exclusions instead.
A code shows Active but customers say it's expired
The Active toggle and the validity dates are independent. A code past its Valid Until keeps its Active badge but stops working — the details panel shows an Expired marker. Edit the code and extend or clear Valid Until to bring it back.