Coupons

Create and manage discount codes on a Sway-ticketed event in the Sway web app: discount types, expiry dates and usage limits.

The Coupons screen, headed Discount Coupons, is where you create the codes a buyer types on your event's ticket page. There is one list per event, and the screen exists only for events selling through Sway Tickets.


Open the screen

  1. Open Manage, then click your event.
  2. Click Coupons in the sidebar, under Tickets & Shop.

If the event does not sell through Sway, the list is replaced by Sway Tickets is not enabled, a line explaining that coupons discount Sway ticket sales, and an Open event settings button. Turn the switch on in Settings → Main, save, and come back. See Event settings.

Access is split in two. View coupons opens the screen; without it the sidebar row is greyed out rather than hidden. Manage coupons is what draws the buttons: with viewing alone, every card is readable and there is no Add Coupon, no Export CSV and no menu on the cards.


Past five coupons the list gains a search field — it matches the code, the name and the description — and a Status filter for active, inactive and expired codes. Below that, the whole list fits on one screen and neither appears.


Create a discount

Before the first coupon exists the screen reads No discount coupons yet, with a Create First Coupon button that opens the same form as Add Coupon.

  1. Click Add Coupon.
  2. Fill in Coupon Name. This is the label you will recognise the coupon by in the list.
  3. Fill in Coupon Code. This is what the buyer types. Letters are capitalised as you type, and only A-Z, 0-9, the underscore and the hyphen are accepted.
  4. Optionally write a Description. Its placeholder calls it an internal description, and the public never sees it.
  5. Pick a Discount Type: Percentage (%) or Amount (€).
  6. Enter the value in the field beside it. A percentage is a whole number from 1 to 100. An amount is in euros and cannot go below 1.
  7. Optionally set Min Order (€), Max Uses and an Expiration Date. Each has its own section below.
  8. Leave Status on Active, or set it to Inactive to prepare a code without opening it yet.
  9. Click Create Coupon.

The new card appears at the top of the grid immediately.

Codes are unique across the whole of Sway, not only across your event. The Code already exists message under the field is checked against this event's own coupons alone, so a code another organiser has taken elsewhere passes that check and is refused when you press Create Coupon. The refusal names the code and asks for a different one, and it is written in English whatever language the interface is in. Prefixing codes with something of your own, along the lines of DOUR26-PRESS, avoids the round trip.

Fifty coupons per event. Past that the create button is replaced by a disabled one reading Limit Reached (50/50).


Choose between the two discount types

TypeValue you enterWhat the buyer gets
Percentage (%)A whole number, 1 to 100That share taken off the order
Amount (€)Euros, from 1 upwardThat flat amount taken off the order

Four things are true of both:

  • The discount applies to the order, not to each ticket. A €5 code on a basket of four tickets takes €5 off the basket, once.
  • The percentage is worked out on the total the buyer pays, service fee included. The order summary shows the deduction on its own line.
  • Sway's service fee does not shrink with it. The fee is worked out from the ticket prices before the code is applied, so the discount comes off your side of the sale.
  • A code that brings the total to zero skips payment entirely. No card is asked for, the order is created and the tickets are issued.

Every coupon applies to every ticket type. The Applies to row on each card reads All products, and there is no control for narrowing it. Restricting a discount to a single tier is not available.


Set an expiry

  1. Open the create form, or the ⋮ menu on a card and then Edit.
  2. Click the Expiration Date field and pick a date and a time.
  3. Click Create Coupon or Update Coupon.

The hint under the field states the rule: Leave empty for no expiration. A small ✕ inside the field clears a date already set.

The time you type is read in your computer's timezone, not the event's. A coupon set to expire at 23:59 from a laptop in Brussels stops working at 23:59 Brussels time, whatever timezone the event carries and wherever the buyer is. Reopening the coupon converts the stored moment back into your own timezone, so it round-trips correctly for you, while a colleague editing it from another country reads a different clock time for the same instant. When the exact minute matters, set it from a machine on the event's own time.

Once the date has passed the card's pill turns to Expired, the Expires row turns red and checkout refuses the code, telling the buyer it has expired. Nothing else happens: the coupon stays in the list and works again as soon as you give it a later date. The date shown on the card is written in a French format, day then short month, in every interface language.


Limit how many times a code can be used

Max Uses caps redemptions. Leave it empty for no cap, which is what its Unlimited placeholder means and what the ∞ on the card shows. The Usage row counts redemptions against that cap.

Max Uses counts checkouts, not tickets. A single order that redeems the code for four tickets consumes one use, not four, so a code capped at 50 can release several hundred tickets. When what you mean to limit is the number of tickets, use Max Tickets, described in the next section. Max qty / order, set per ticket type on the Tickets screen, caps a single basket instead.

A use is counted when the order is created, meaning on a completed payment or on a free order. Someone who applies the code and then abandons the payment page consumes nothing, so the count never runs ahead of your sales.

Once the cap is reached, checkout refuses the code and tells the buyer its usage limit has been reached. Max Uses stays editable, so raising it puts the code back in service. Setting it below the number already redeemed does the opposite and exhausts the code at once.


Limit how many tickets a code can discount

Max Tickets caps the total number of tickets the code may ever discount, across every order it is used in. Leave it empty for no cap. Once one is set, the card grows a Tickets row counting what has been spent against it.

This is the other half of Max Uses, and the two answer different questions:

FieldCountsA value of 3 allows
Max Usesordersthree orders, of any size
Max Ticketsthe tickets inside those ordersthree tickets, however they are split

A code capped at three tickets can be spent as one order of three, an order of two and an order of one, or three orders of one — and then nothing. That is what makes it the right field for "here is a code you and your friends can share for three tickets": the holders draw on one budget, in whatever split suits them.

It caps tickets, not people. The code does not know who is holding it, so nothing stops the first person spending all three. If you also want to bound the number of separate purchases, set Max Uses alongside it.

The buyer meets the limit before they can waste time on it. Once the code is applied, the + buttons stop at what it has left, with a line saying so. If they had already selected more tickets than it covers, applying it names the number that would work instead of simply refusing. And checkout checks again: a page left open while someone else spends the budget is refused there too, with the same number.

Tickets are counted when the order is created — a completed payment or a free order — exactly like uses. Setting a cap on a code that has already sold tickets counts those earlier sales too, so the figure on the card is the truth about the code rather than the truth since you edited it.


Set a minimum order

Min Order (€) refuses the code under a certain basket size. Its placeholder spells out the neutral value, 0 = no min, and the card grows a Min order row only when one is set. A buyer below the threshold is told the amount they need to reach.

Set it against ticket value. The check that decides at payment compares your minimum with the tickets alone, service fees excluded, while the total the buyer reads on the page includes them. A minimum sitting within a fee's width of a ticket price can therefore be accepted on the page and refused at payment. Round down and leave room.


Edit a coupon

  1. Click the ⋮ on the card, then Edit.
  2. Change what you need.
  3. Click Update Coupon.

The code, the discount type and the discount value cannot be changed after creation. The three fields are greyed out and the form says so: Discount type and value cannot be changed after creation. To offer a different amount, create a second coupon and deactivate the first.

Everything else stays editable: the name, the description, Min Order (€), Max Uses, the Expiration Date and Status.


Turn one off, copy it, or remove it

The ⋮ menu on each card carries the rest.

Deactivate takes the coupon out of service at once, with no confirmation step. The pill turns to Inactive and checkout stops accepting the code. Activate puts it back.

Duplicate opens the create form pre-filled from the coupon, with _COPY appended to the code, (Copy) appended to the name, no expiry date and Status on Inactive. Nothing is written until you press Create Coupon, so give it a code you would actually print first.

The last entry in the menu changes with usage:

The coupon hasThe menu offersWhat you confirm
Never been redeemedDeleteDelete Coupon, confirmed with Delete Permanently
Been redeemed at least onceArchiveArchive Coupon, behind a Coupon in use notice naming the count, confirmed with Archive

Archiving deactivates the coupon and leaves it in the list. That is deliberate: orders already paid refer to it, and removing the record would take that history with it.

Deleting a coupon that has never been redeemed cannot be undone. The dialog says as much, and there is no archive to recover it from afterwards. If you might want the code back, Deactivate it instead.

Export the list

Export CSV appears once the event has at least one coupon and you can manage them. It downloads coupons_event_<id>.csv, one row per coupon in the list, inactive and archived ones included, under the headings Name, Code, Type, Value, Min Order, Max Uses, Current Uses, Expires At, Active and Created At.

Those headings are fixed English, and so are the words in the cells: Percentage or Fixed for the type, Unlimited for an uncapped Max Uses, Never for no expiry, Yes or No under Active. None of it follows the language of the interface, so a colleague working in French or Ukrainian downloads this same English file. The two date columns do not agree with each other either. Created At is written day before month, French style, in your own computer's timezone, while Expires At is the stored moment exactly as it is held, in UTC. Read that column as UTC rather than as the clock time you typed into the form.


Add ?coupon= to any event link and the code is already applied for whoever opens it:

https://www.sway.events/event/insomnia-fracture?coupon=FRIENDS3
https://www.sway.events/event/3450?coupon=FRIENDS3
https://www.sway.events/event/3450/tickets?coupon=FRIENDS3

The buyer never has to copy the code out of your message and paste it into the field — the discount is on when the page opens. It works on the event page and on the ticket page, on the numeric address and on the custom one, and it survives the move between them: the code stays on for the rest of the visit.

You do not have to build it by hand: on the coupons screen, the ⋯ menu of a live coupon offers Copy share link. It uses the event's custom address when it has one and the numeric one otherwise. The action is only there while the coupon is active and unexpired — a link that applies nothing looks like it worked, which is worse than no link at all.

Codes carried by a link are checked exactly as if they had been typed. An expired, exhausted or misspelled code is refused the same way, with the same message, so a stale link never quietly sells at full price.

A minimum order is judged when the basket is ready, not on arrival. A code carrying a Min Order cannot be judged against an empty basket, so it waits and applies itself the moment the basket clears the threshold. The buyer is never shown an error about a code they have not yet had the chance to use.

Removing the code with the ✕ takes it off for good — it does not come back on the next page.


What the buyer sees

On the event's ticket page, beside the order summary, there is a Promo code field with an OK button. An accepted code confirms itself, adds a line to the summary showing the amount deducted, and can be taken off again with the ✕ beside it.

A refused code is explained in place, and the reason is specific: the code is not found or is inactive, it has expired, it has reached its usage limit, the order does not reach the minimum (the message names the amount), or the code is not valid for this event. Repeated attempts are rate limited. Codes are matched in upper case, so buyers may type them however they like.


Where the surrounding settings live

To changeGo to
Whether the event sells through Sway at allSettings → Main, see Event settings
How many tickets one order may hold (Max qty / order)Tickets
Who can see or manage couponsThe event's Permissions screen, see Manage Permissions
Where the money landsConnect payouts

Orders that used a code, and the discount applied to each, are listed on the event's Orders screen. The event dashboard is the quickest read on how sales are going overall.

Below this list, a separate Ambassadors section carries the personal codes of the people who relay your events, with a Sync ambassador codes button that opens them here at a discount you set for this event. They are kept apart from the list above on purpose, and are set up on the promoter page: see Ambassadors. A code that works on every event you are paid for, with no ambassador attached, is a promoter coupon.