# Coupons (/docs/promotions/coupons)



Creating a Coupon [#creating-a-coupon]

1. Navigate to **Dashboard > Coupons**
2. Click **Add Coupon**
3. Configure the coupon:
   * **Name** — an internal label for the coupon (e.g., "Summer 2026 Promo")
   * **Discount type** — how the discount is calculated (see below)
   * **Amount** — the discount value
   * **Enabled** — toggle to activate or deactivate the coupon

Coupon Codes [#coupon-codes]

Each coupon can have one or more **coupon codes** — the actual strings customers enter at checkout (e.g., "SUMMER20"). Each code has its own settings:

* **Code name** — the text customers type (case-insensitive matching)
* **Unlimited** — if enabled, the code has no usage cap
* **Limit count** — when not unlimited, the maximum number of times this specific code can be redeemed
* **Use count** — tracks how many times the code has been used
* **Created at** — when the code was generated
* **Last used** — timestamp of the most recent redemption

Having multiple codes per coupon lets you distribute different codes to different channels while sharing the same discount configuration.

Discount Types [#discount-types]

Resytech supports three discount modes:

| Type        | Behavior                                                                                                                                                                                           | Example                                             |
| ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- |
| **Percent** | Reduces the subtotal by a percentage. Values above 1 are treated as whole-number percentages (e.g., `20` = 20%).                                                                                   | 20% off a $100 booking = $20 discount               |
| **Flat**    | Subtracts a fixed dollar amount from the subtotal. Capped at the subtotal so the total never goes negative.                                                                                        | $15 off a $100 booking = $85 total                  |
| **Fixed**   | Sets the final price to the specified amount. The discount equals the difference between the current price and the target. If the price is already at or below the target, no discount is applied. | Fixed price of $50 on a $100 booking = $50 discount |

Additional Discount Options [#additional-discount-options]

* **Discount add-ons** — when enabled, the coupon discount also applies to equipment add-ons, not just the base activity price
* **Remove taxes and fees** — when enabled, taxes and fees are stripped from the order when this coupon is applied

Coupon Rules [#coupon-rules]

Control how and when coupons can be used:

Validity Windows [#validity-windows]

Coupons support two types of date/time windows, and you can add multiple windows of each type:

* **Purchase windows** (Type 0) — control *when* the coupon can be used during checkout. The customer's current date and time (in the location's timezone) must fall within at least one purchase window.
* **Arrival windows** (Type 1) — control *which bookings* the coupon applies to. The booking's scheduled date and time must fall within at least one arrival window.

Each window includes:

| Setting                   | Description                                                                                                                                             |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Date range**            | Start and end dates (inclusive or exclusive bounds)                                                                                                     |
| **Time start / Time end** | Optional time-of-day restriction within the date range. Supports overnight ranges (e.g., 10:00 PM to 2:00 AM).                                          |
| **Days of week**          | Optional restriction to specific days (e.g., weekdays only, weekends only)                                                                              |
| **Negate**                | When enabled, this window becomes an exclusion — bookings or purchases that fall within a negated window are rejected even if they match another window |

Window evaluation logic:

* If only normal (non-negated) windows exist, the date/time must match at least one window.
* If negated windows exist, the date/time is assumed valid unless it falls within a negated window.
* Negated windows always take priority — a match on a negated window results in rejection regardless of other windows.

Usage Limits [#usage-limits]

* **Limit type** — `None` (unlimited) or `UseLimit` (capped)
* **Limit** — when limit type is `UseLimit`, the maximum total redemptions across all codes
* **Per-code limits** — each individual coupon code can also have its own usage cap (see Coupon Codes above)

Targeting [#targeting]

Restrict the coupon to:

* **Specific activities** — only applies to selected activities. If the cart's activity does not match, the coupon is rejected.
* **Specific equipment** — only applies when at least one item of matching equipment is in the cart
* **All offerings** — when `IsAllActivities` is enabled, the coupon applies to any activity

Validation [#validation]

When a customer applies a coupon at checkout, the system validates in this order:

1. **Code lookup** — does the code exist for this location?
2. **Enabled check** — is the coupon currently active?
3. **Overall usage limit** — has the coupon's total limit been reached?
4. **Per-code usage limit** — has this specific code's limit been reached?
5. **Activity match** — does the cart's activity match the coupon's allowed activities?
6. **Equipment match** — does the cart contain at least one matching equipment item?
7. **Window validation** — do purchase and arrival windows pass?

If any check fails, the customer sees an appropriate error. Possible error codes: `NotFound`, `Disabled`, `LimitReached`, `InvalidActivity`, `InvalidEquipment`, `InvalidDate`.

Tracking [#tracking]

View coupon performance from the coupon list:

* Total redemptions (per coupon and per individual code)
* Revenue impact
* Which customers used it
* Last-used timestamps per code

Related How-To Guides [#related-how-to-guides]

* [Create a Coupon](/how-to/promotions/create-a-coupon)
* [Configure Coupon Rules](/how-to/promotions/configure-coupon-rules)
* [Apply Coupon to Booking](/how-to/promotions/apply-coupon-to-booking)
* [Track Promotion Usage](/how-to/promotions/track-promotion-usage)
