Customers & Money
Coupons
Discount codes: types, limits, schedules, and how they validate.
Ride Booking → Coupons creates the discount codes customers type into the booking form — your tool for promotions ("SAVE20 this weekend"), partnerships ("PARTNER5 for the hotel's guests"), and win-backs ("WELCOME10 on your next ride").
The list
Columns tell the whole story per code: Code (always uppercase), Discount (a percentage or a fixed amount in your currency), Min. order, Used (redemptions so far, shown as 34 / 100 when capped), Validity (the start → expiry window, ∞ when open-ended), and Status. Search finds codes instantly; clicking a row opens it for editing.
The Status pill is computed live, in priority order:
- Inactive — the Active switch is off; the code can't be applied regardless of anything else.
- Expired — its expiry date has passed.
- Used up — it reached its usage cap (like the screenshot's VIP50 at 20 / 20).
- Active — redeemable right now.
Deleting a coupon never touches history: existing bookings keep their applied discount; the code just stops working.
Creating a coupon
Add Coupon opens the dialog:
- Coupon code (required) — what the customer types. It's normalized to uppercase automatically, and matching at checkout is case-insensitive, so
save20,Save20, andSAVE20all work. - Discount type + value (required) — Percentage (e.g. 15% off the fare) or Fixed amount (e.g. CA$15 off). The value field's unit adornment follows the type.
- Minimum order — the smallest fare the code applies to; 0 means no minimum. Use it to keep a big fixed discount off your cheapest trips (VIP50 in the screenshot needs a CA$200 fare).
- Max uses — total redemptions across all customers; 0 means unlimited. The counter increments automatically each time a booking is created with the code, and the code stops working when the cap is hit.
- Schedule — optional Starts on and Expires on dates, interpreted in your site's timezone (no UTC surprises at midnight). Set both for a weekend flash sale; leave both empty for an evergreen code.
- Active switch — the master kill switch. Flip it off to pause a code immediately without losing its settings or usage count.
How it behaves at checkout
The customer enters the code on the booking form and the server validates it — active, within its date window, under its usage cap, fare meets the minimum. Each failure gets a specific, friendly rejection (invalid, expired, not started yet, fully redeemed, or minimum not met) rather than a generic error. A tampered page can't force a discount: the server recalculates everything at booking time.
The discount applies to the base fare + stops portion of the price, shows as its own line in the price breakdown, and is stored on the booking permanently.
Stacking with corporate discounts: if a corporate account discount also applies, the two are added together, capped at the base + stops amount — a combined discount can zero out the fare portion but never go negative. Tax is calculated on the discounted amount, so customers are never taxed on money they didn't pay.
Tips
- Only one coupon per booking — there's no code stacking to police.
- The coupon field can be hidden per booking form (see Form Editor → Settings) — run codes on your main form but not on a corporate-only form.
- To retire a promotion gracefully, flip Active off instead of deleting — you keep the usage stats for next time.