Coupons live under Growth & Marketing → the "Promotions" card → the Coupons tab (the same page also has a Gift Cards tab, since the two are grouped together as "promotional tools in one place"). It's worth being clear about scope here: Automations, Drip campaigns, Campaigns, and Bulk blast — among the other cards on the Growth & Marketing hub (which also includes Reputation, Win-back, Reviews, Loyalty, Marketing, and Lead forms) — are focused on sending SMS/email to customers. The Coupons tab itself has nothing to do with messaging: a coupon is a discount code applied to a sale, and creating, enabling, disabling, or deleting one never sends anything to anyone. The Gift Cards tab on this same page is a partial exception worth flagging, though — selling a gift card can optionally email the code, PIN, and a personalized note to a recipient — so "Promotions" as a whole isn't fully messaging-free, even though Coupons specifically is.
Creating a coupon
Click "New Coupon" to expand the create form. You'll set a Code (it auto-uppercases as you type, so "tint10" becomes "TINT10"), an optional Description, a Type (Percent or flat dollar Amount), the discount value, a minimum spend in dollars, and a checkbox to limit the coupon to new customers only. Codes must be unique per shop — if you reuse one that already exists, you'll get a clear error (`A coupon with code "X" already exists for this shop.`) rather than a silent failure.
One thing to know before you rely on this form: it does not let you set a redemption limit or an expiration date, even though the coupon list below it displays both ("Used 3 / 50 times · Expires Jan 1, 2027") whenever they're present. Those fields exist in the underlying coupon record and are fully enforced at redemption time, but the current New Coupon form simply doesn't expose inputs for them — every coupon created here today has unlimited uses and never expires unless that changes in a future update. There's also no way to restrict a coupon to a single service from this form — and unlike redemption limit/expiration, this one isn't just a missing form field: a `limitToServiceId` column exists in the data model and can technically be set via the create API, but nothing in the redemption logic actually checks it, so it wouldn't restrict anything even if set. Treat single-service coupons as unsupported for now.
What actually gets enforced when a code is used
This page only manages the coupon definitions — you don't redeem a code here. The coupon system has a `validate` (read-only preflight) and `applyToInvoice` (the real redemption) procedure that, together, check every rule on the coupon: it must be enabled, not past its expiration (if one is set), under its redemption limit (if one is set), the invoice's subtotal must meet the coupon's minimum spend, and if it's marked new-customers-only, the customer on the invoice must have no prior SENT, PARTIAL, PAID, or REFUNDED invoice with your shop — draft and voided invoices don't count as "prior business." Notably, if there's no customer attached to the invoice at all, a new-clients-only coupon is always rejected rather than assumed to qualify. The discount itself is also clamped so it can never exceed the invoice's subtotal — so even a mistakenly-entered 500%-off coupon can only ever zero out the sale, not create a negative invoice. Coupons can only be applied to DRAFT or SENT invoices (not ones that already have payment activity), and the same code can't be applied twice to the same invoice.
Important caveat: as of this writing, there's no invoice or quote screen in the app where staff can actually enter a coupon code to redeem it — the redemption logic above is real and tested, but it isn't wired up to any web or mobile screen yet. In practice, a coupon's rules can only be exercised through a direct API call today, not through a workflow a shop employee can click through. Don't present coupon redemption as a live, in-app checkout feature until that UI ships.
Managing existing coupons
Each coupon in the list shows its code (with a copy button), description or discount summary, and a usage line. The toggle switch enables or disables a coupon without deleting it — disabling is the right move if you want to pause a promotion but keep its usage history intact. The trash icon permanently deletes it after a confirmation prompt, which also frees up that code for reuse. There's no edit option for an existing coupon — if you need to change the discount amount, minimum spend, or any other term, you'll need to delete it and create a new one (and give it a new code, or delete the old one first, since codes are unique per shop).
Who can do this
Creating, enabling/disabling, deleting, or applying a coupon all require the same permission as gift cards (`shop.manageGiftCards`), since both are treated as discretionary discount instruments. By default only the Owner and Admin roles have that permission — Manager and all other roles don't get it by default. Note, though, that the "New Coupon" button and the enable/disable toggle are visible to everyone who can open the Promotions page, regardless of role — there's no permission-based hiding in the UI. If a manager or front-desk staffer without this permission clicks New Coupon, flips a toggle, or tries to delete a coupon, the action will fail and they'll see a clear error message (a toast reading something like "You don't have permission to do this…") rather than the button disappearing or the toggle silently doing nothing. That's expected unless their role's permissions have been customized.