How do promo codes and automatic offers work?
Shared codes for posters, one-per-person codes for targeted emails, and automatic triggers that apply an offer with no code at all.
Every promotion reaches customers one of three ways, set under How customers get it in the builder: a shared code, one-per-person codes, or no code at all (automatic).
Shared codes
One code everyone types — right for posters, table talkers and social media. It's 4–24 characters (letters, numbers and hyphens, like SUMMER-20), and you can pause the promotion at any time to stop the code working. Total-use and per-guest caps still apply, so a shared code on a poster can't run away from you. A code can only belong to one promotion at a time — try to reuse one and the save is refused with a message naming exactly which promotion owns it and whether it's live, paused, scheduled or ended, so you know which one to delete if you want the code back.
One-per-person codes
Codes for targeted sends — each code works exactly once. When you save a new one-per-person promotion, the Generate one-per-person codes window opens by itself with the batch size pre-filled from your total-use limit; you can also open it any time via Codes on the promotion's card:
- Enter How many codes? — up to 500 per batch, 2,000 per promotion.
- Optionally set a prefix (2–6 letters or numbers — codes come out like VIP-XX7KQ2M4).
- Click generate, then Copy all or Download CSV — and don't worry if you close the window: View codes shows every code again later, marked Used, Unused or Switched off, with copy and CSV download. A code that a marketing campaign has handed out also shows Sent to with the recipient's email address, and the CSV carries a matching sent_to column.
Hand codes out individually, or let the marketing composer do it for you: attach the promotion to a campaign and its Give each recipient their own code switch gives every recipient one unused code, locked to their email address so nobody else can use it — see How do I send a marketing campaign?. Once any one-per-person codes exist, the promotion can't be switched back to a shared code.
Automatic triggers
An offer can apply by itself, with nothing to type. The options under Conditions are:
- Around the customer's birthday — within a set number of days of their birthday (7 by default; needs a birthday on their customer profile).
- The customer's first booking — applies to a customer who hasn't visited you yet. Any customer counts, not just loyalty members: it looks at the visits on the customer profile matching their email — no profile, or no visit yet, means it applies, and bookings still to come don't count as visits. Your Uses per customer limit still applies.
- The customer's first order — for Order & Pay orders only (collection, delivery or table — tick those and nothing else under Where it works). You choose what counts as their first: First order on that channel (their first collection order, first delivery order or first table order — a regular diner still gets it on a channel they've never ordered on; with several channels ticked it's first on whichever channel the order is placed on), First order of any kind (they've never placed a collection, delivery or table order with you — bookings don't count), or First visit of any kind (they've never ordered and never had a booking with you; a cancelled or no-show booking doesn't count). It goes by the email the customer enters at checkout — an order placed with no email can't get it. On a shared code the checkout refuses honestly ("This code is for a customer's first collection order."); with no code the discount simply applies itself at checkout to customers who qualify. It never shows on the ordering menu's banner, because the menu doesn't yet know who is looking.
- Certain days of the week — e.g. Monday–Wednesday only.
- Off-peak times — a time window, on every day or just the days you pick.
- What's in the basket — for money discounts on Order & Pay orders: a minimum number of qualifying items and/or a minimum spend on them.
Several conditions at once. On a promotion whose places are all Order & Pay orders (collection, delivery or table) you can press Add another condition and stack them — every condition has to be met before the offer applies. "Free dessert when you buy two mains, Tuesdays only" is a Free item when you buy promotion with a Certain days of the week condition; "20% off on Tuesdays when the order has two mains" is a percentage-off promotion with a day condition and a basket condition. A promotion can't carry two conditions of the same type, and the builder's summary joins them with "and" so you can read exactly what you've built. Promotions on bookings, tickets or at the venue take one condition.
Free item when you buy is its own promotion type, not a condition: you pick what the customer must buy (any 2 of the Mains category, say) and what they get free (the Desserts category), and the cheapest qualifying item in their order comes off at its real price — Once per order, or Once for every multiple, up to a cap you set. Anyone can get it with no sign-in, it works with No code (applies itself at checkout, with a banner on the ordering menu) or with a shared code, and it combines with other automatic promotions dish by dish like any other. See How do I create a promotion?.
Self-applying (no code at all) works on table bookings — the offer attaches itself when a matching booking is made — and on Order & Pay orders (collection, delivery and table alike), where a matching money-off promotion discounts the order automatically at checkout (the happy-hour pattern: an off-peak window plus a percentage off, applied by itself while the window is open, with a banner on the ordering menu — when more than one automatic offer is live at once the banner takes turns showing each of them, and every qualifying offer still applies at checkout, each dish getting whichever suits it best). On offers that do carry a code, the trigger instead sets when the code works (a Tuesdays-only code simply refuses on a Wednesday). The builder's What this does summary box spells out exactly how your combination behaves.
Birthday, first-visit and first-order offers are checked against the customer's customer profile, so the customer needs to have entered their email before the offer can recognise them — the booking, ticket and ordering pages handle that prompt for you.
Protection against code guessing
Public code checks are bot-protected and rate-limited per device, and a wrong guess sees the same neutral message — "That code isn't valid right now." — whether the code doesn't exist, is paused or has run out. Guessers learn nothing; genuine customers with a typo just try again. The one deliberate exception: a real, publicly-advertised shared code that's outside its date, day or time window explains itself plainly (for example "This offer is only valid on Tuesdays") — those conditions are already public. One-per-person codes never explain themselves.
Related: How do I create a promotion? · How do promo codes work on event tickets? · How do I send a marketing email?