Skip to main content

Open in TWICE Admin

Catalog → Discount Codes
A discount code is easy to create and easy to scope wrongly. Two settings decide almost every “the code doesn’t work” report: which items the code is allowed to touch, and which of the two date windows you set. This guide walks the code from creation to a customer redeeming it, and then covers how to find out why a code was rejected. The storefront will not tell you.

Prerequisites

Required permission: catalog:discount create and manage. Owner, Admin and Manager hold every operation on discount codes. Member does not hold it at all, so a Member cannot see the Discount Codes view, let alone create a code.
Decide which date window you mean before you start. There are two, they look alike, and they answer different questions:
  • Offered from / Offered until: when the code can be redeemed. A window on the order date.
  • Discount period from / Discount period until: which purchases the code covers, by the date a booking starts, a sale is bought, or a subscription cycle is billed.
A summer campaign you want people to book in March, for equipment they pick up in July, needs the second pair. Setting the first pair instead makes the code redeemable only in July, which is the opposite of a campaign.

The walkthrough

1

Create the code, which exists immediately

Go to Catalog → Discount Codes and click Create discount code (hotkey a).There is no dialog. TWICE creates the code straight away and opens it: a placeholder string like NEW-4K2P9X, 10 %, and Enabled switched off. The rest of this walkthrough is editing that code, not filling in a form before it exists.Two consequences worth knowing. The code is safe while you work on it, because it is disabled and no customer can redeem a disabled code. And if you abandon the page half-finished, you have left a NEW-… stub in the list. It does nothing, but it is yours to clean up.
2

Name the code

Replace the placeholder in Code with the string customers will type.The field uppercases as you type, and codes are matched case-insensitively, so Summer25 and SUMMER25 are the same code. Letters (accented ones included, so KESÄ15 is fine), digits, hyphens and underscores are allowed; spaces, slashes and punctuation are not. If you paste something unsupported, the field names the offending characters and Save stays disabled until you fix them.Description is internal. Customers never see it, and a line about which campaign a code belongs to is worth more in six months than the code string itself.
3

Set the discount type and value

Discount type is Percentage or Fixed.A fixed code also asks for a Scope, and this is the setting people get wrong:
  • Per order: Apply the amount once to the whole order. €10 off, spread proportionally across the eligible items.
  • Per item: Apply the amount to each eligible item separately. €10 off every eligible item. On a five-item order that is €50.
Percentage codes have no scope, because a percentage is per item by nature. Percentages are rounded down to the whole currency unit.Either way the discount is clamped to what the item actually costs, so a code can never take an order below zero or produce a refund.
4

Decide who may redeem it

Who can use this code is a select, not a toggle, because it matters:
  • Anyone with the code: an ordinary campaign code. Whoever has the string can redeem it.
  • Only staff and integrations: a staff-only code can’t be entered by customers at checkout. Use this for codes an integration grants automatically, or that staff apply on the customer’s behalf.
Staff-only codes carry a Staff only chip in the Discount Codes table so you can spot them while scanning.A staff-only code still appears by name on the customer’s own order summary once applied. What is restricted is who may use it, not who may see it. Do not treat the string as a secret.
5

Scope it to the right items

Four settings narrow what the discount touches. Each is empty by default, and empty means no restriction.
  • Applies to: Sales, Bookings, Subscriptions. Leave it empty and the code covers every purchase type, including ones not listed here such as buyback.
  • Apply to listings: specific listings.
  • Apply to collections: items belonging to specific collections.
  • Limit to locations: specific service locations. This one gates the whole checkout rather than individual items, so a checkout at an unlisted location gets nothing.
Selected listings and collections show as removable chips. Click Edit to browse your whole catalog in a dialog instead of recalling a name.
6

Get the combination rule right

Read the catalog settings together, because they do not all combine the same way.Apply to listings and Apply to collections combine with OR. An item qualifies by being a targeted listing or by belonging to a targeted collection, so a code carrying both still discounts a listing that is in neither collection.Applies to combines with AND on top of that. A sale-only code targeted at one collection discounts the sales in that collection and nothing else.These restrictions narrow the discount per item, not per order. A code limited to one collection discounts the items from that collection and leaves the rest of the order at full price.
7

Carve out the exceptions

Name the items the code must never touch under Exclude listings and Exclude collections. Both are empty by default, and empty means None.An exclusion beats everything above it. An excluded listing, or a listing in an excluded collection, pays full price even when Apply to listings or Apply to collections covers it. Use this to write “everything except these three”, and to let a collection-targeted code skip one member of that collection.
8

Set the subscription duration when subscriptions are in scope

A Subscriptions section appears when the code can reach subscriptions, and Applies for is required there:
  • First cycle only: one cycle, then full price.
  • A number of cycles: asks for Number of cycles.
  • Every cycle: for as long as the subscription runs.
The section also appears when Applies to is empty, because an unrestricted code covers subscriptions too. That surprises people who never intended a subscription code. If you do not want one, restrict Applies to to Sales and Bookings and the section goes away.
9

Set the usage limit

Usage limit is the total number of redemptions across all customers, not a per-customer limit. Leave it empty for Unlimited. The Times used row shows the count against the limit as the campaign runs.
10

Set the date windows

Set the two date pairs from the Prerequisites:
  • Offered from / Offered until: the redemption window.
  • Discount period from / Discount period until: the dates the discount covers.
All four are day-only dates read in your account’s timezone, and any of them can be left empty.The second pair reads a different date per purchase type: a booking’s start, a sale’s purchase date, and the date a subscription cycle is billed. A run of discounted cycles ends when the discount period does, however many cycles Applies for allows.
11

Decide whether it applies itself

Auto-apply turns the code from something a customer types into something TWICE applies for them. Shoppers see the discounted prices while browsing the storefront, and the discount lands on the order at checkout. In storefronts appears once the switch is on and narrows which storefronts it works in; leave it empty for all of them.Two knock-on effects. A Usage limit on an auto-apply code becomes “the first N orders get the discount” rather than a per-customer cap, because every matching checkout claims it. And the code no longer needs to be typeable. Set Who can use this code to Only staff and integrations unless it should double as a shareable coupon.
12

Decide whether it stacks with other codes

Several auto-apply codes may cover the same shopper. The most specific one wins: limited to locations first, then to storefronts, then targeted at listings or collections, then store-wide. You do not have to keep their scopes from overlapping.Combinable is the other half of the question. Off, the code is the only discount on the items it applies to. On, it can stack with other combinable codes on the same item. Codes covering different items work side by side either way.
13

Turn it on

Switch Enabled on and save. The code is now live for anyone who has the string.Do this last. A code that is enabled while you are still editing its restrictions is redeemable at whatever it happens to say at that moment.

How do I know it worked?

The code appears in Catalog → Discount Codes with Status Enabled, its value, and Usage at 0 (or 0 / 100 against a limit). Apply the code to prove it works. Open a test order, use Discounts → Discount codes → Apply, and confirm two things: the code is accepted, and the amount that comes off is the amount you meant on the items you meant. When customers start redeeming it, Times used climbs.

Troubleshooting / common pitfalls

Working as designed. The storefront collapses every failure into Invalid discount code (expired, disabled, usage limit reached, wrong items, staff-only), so that nobody can probe a code’s state by typing guesses at checkout.Three failures are exempt and do name themselves, because the customer holds a working code: the code cannot combine with a discount already on the checkout, the discounts already applied were compared against it and take more off, and the code is already applied.What to do: apply the code from admin instead. Open any order with representative items, go to Discounts → Discount codes, and apply it there. The admin returns one of these specific reasons:
  • Not found, disabled, not yet valid, or expired
  • Usage limit reached, or staff-only
  • Purchase type, listing, collection or location not applicable
  • Not combinable with the codes already applied, or worth less than them
  • Already applied, no eligible items, or no effect
That message is the diagnosis; the rest of this section is what to do with it.
Cause: the code is valid and resolves to a zero discount. Most often that is a percentage rounding down to nothing on a very small subtotal, or a fixed amount clamped away by an item that is already free.TWICE treats a no-op code as a failure rather than silently applying nothing, so you get no effect rather than a €0 discount line.What to do: check the code’s value against the actual item prices. If a 5 % code is meant to work on €1 items, it cannot, because the discount floors to zero. Use a fixed amount instead.
Cause: this is scoping working as specified. Apply to listings, Apply to collections and Applies to narrow the discount to matching items, and the rest of the order stays at full price.What to do: open the code and read the restrictions together. Apply to listings and Apply to collections combine with OR, so a code carrying both covers more items than either alone. Applies to combines with AND on top of that.If you meant “10 % off the whole order when it contains a tent”, that is not what these settings do: they discount the tent.Check Exclude listings and Exclude collections in the same pass. An exclusion beats the apply targeting, so a listing can be both targeted and excluded, and it pays full price.
Cause: the listing is named under Exclude listings, or it belongs to a collection named under Exclude collections. Exclusions are judged before the apply targeting and they win, so nothing you add to Apply to listings will bring that listing back.What to do: open the code and clear both exclusion fields of it. Take the listing off Exclude listings, or move it out of the excluded collection. Where every item in a cart is excluded, applying the code from admin reports it as not valid for the items in your cart.
Cause: Scope is set to Per item. A €20 per-item code on a six-item order is €120.What to do: switch Scope to Per order if you meant one amount off the order. The wording in the helper text is the reliable test: once to the whole order versus to each eligible item separately.
Cause: Offered from is empty, so the code is redeemable as soon as it is enabled.What to do: set Offered from, and leave Enabled on. A future-dated code is rejected as not yet valid until the window opens, which is what you want. You do not have to remember to switch it on.
Cause: Applies to was left empty. Empty is not “bookings by default”, it is “every purchase type”.What to do: tick the purchase types you actually mean. This is also why the Subscriptions section appears on codes that were never intended for subscriptions.
Cause: removing a discount code archives it rather than deleting it. It leaves the Discount Codes list but still exists.What to do: find it under Settings → Archived assets, where you can unarchive it or delete it permanently. Unarchiving fails if an active code has since taken the same string. Rename one of them first.
Working as designed. The code string and its per-item allocations are recorded on the order when it is applied. Editing or archiving the code afterwards does not rewrite orders that already used it.

Discount Codes

The view reference, field by field.

Discount codes

How a code resolves against an order.

Build a collection

The collections a code can be limited to.

Price a listing

The price a discount comes off.