How to offer discounts and promo codes on bookings

A discount is the easiest lever to pull and the easiest one to get wrong. Knock 20% off the wrong service, leave a code live a month too long, or let two promotions stack when you only meant one to apply — and the discount that was supposed to fill a quiet Tuesday quietly eats your margin all week.
This guide covers how booking discounts actually work: the two types, how to target them so they only fire when you want, how to schedule and cap them, and how stacking is decided when more than one matches a cart.
There are two discount types — automatic (applies on its own) and code (the customer types it in). Everything else is targeting and guardrails: which services and staff a discount covers, when it's live, how many times it can be used, and whether it stacks with other discounts. Get those four right and a discount does exactly what you intended and nothing more.
The two kinds of discount
Every discount is one of two methods.
Automatic discounts apply to every qualifying booking with no action from the customer. They're for promotions you want to run quietly in the background — a recurring "Monday mornings 15% off" to fill your slowest window, or a standing 10% off a service you're trying to push.
Code discounts require the customer to enter a promo code at checkout. They're for campaigns you can attribute: WELCOME10 in your onboarding email, INSTA20 in a story, a partner code you hand to a referrer. If you need to know where a booking came from, use a code.
Both share the same value formats — a percentage (15% off) or a fixed amount ($10 off) — and the same scope choice:
- Line-item scope distributes the discount across individual cart lines. "10% off each qualifying service."
- Order scope applies to the cart total after summing line items. Better for flat amounts like "$10 off orders over $50."
Line-item is the common case. Reach for order scope when you're discounting the whole basket rather than a specific service.
Step 1: Target the right bookings
The most common discount mistake is one that applies too broadly. Targeting is how you stop that. A discount can be restricted by:
Products (services)
Pick exactly which services the discount covers. A 'first facial 20% off' should never apply to your gift cards or your premium package unless you say so.
Staff members
Restrict to bookings with specific team members. Useful when you're building up a new stylist's column and want to discount only their slots.
Locations
Limit the discount to one or more locations. Run a grand-opening promo at the new site without touching prices at the others.
Add-ons
An 'include add-ons' toggle decides whether add-on line items get discounted too. Turn it off to discount the base service but charge full price for the upgrade.
Targeting re-evaluates on every cart change. If a customer adds a qualifying service the discount applies instantly; remove it and the discount detaches. You never have to refresh or re-enter anything — the cart keeps itself honest.
The classic welcome offer
Set customer eligibility to "first-order only" and pair it with a promo code. Now WELCOME15 works once per new customer and never again — a self-policing acquisition offer that can't be farmed by existing regulars.
Step 2: Schedule when it's live
A discount you have to remember to switch off is a discount that costs you money. Use the active period instead.
- Always active — for permanent codes like a standing referral discount.
- Weekly recurring — repeat on specific days and times each week. "Monday–Wednesday, 9am–12pm, 15% off" to pull demand into your dead hours, automatically, forever.
- Date ranges — exact start and end with times. "Black Friday: 2026-11-27 00:00 → 2026-11-30 23:59." It turns on and off by itself.
Scheduled discounts pair naturally with automatic mode. A recurring "Tuesday 15% off" set to automatic means every qualifying Tuesday booking gets the price drop with no code, no banner, no manual toggling.
Step 3: Set requirements
Requirements decide the floor a cart has to clear before a discount applies:
- No minimum — any qualifying booking.
- Minimum purchase amount — the cart has to reach a dollar threshold. Keeps "$10 off" from applying to a $12 booking.
- Appointment duration — set a minimum and/or maximum duration. Discount only the long sessions (90 minutes and up) or exclude the quick ones.
Duration accepts natural input like "1h 30m" or "90 minutes," so you can say "only appointments 60–120 minutes" without doing unit math.
Step 4: Control stacking
This is the rule most discount systems handle badly, and the one most likely to surprise you on a busy day. When two discounts both match a cart, what happens?
The combinable toggle decides:
- Combinable discounts stack with other combinable discounts. Two 10% combinables both apply, compounding to roughly 19% off.
- Exclusive discounts never stack. If several exclusive discounts match, the best one for the customer wins and the rest stand down.
- Mixed mode: combinable discounts stack with each other first, then the single best exclusive discount applies on top.
The reason this matters: a single careless "combinable" flag is how a 20%-off welcome code quietly stacks on a 30%-off clearance and you sell at half price. Decide stacking deliberately, per discount.
Step 5: Cap usage
Caps are the difference between a promotion and an open-ended liability.
- Total usage cap — after N redemptions the discount stops applying. "First 50 bookings get 20% off." When the cap is hit, the discount flips inactive on its own; customers who already have it in their cart can still check out, but no new carts pick it up.
- Per-customer cap — each customer can use it up to N times. "Your first three bookings are 20% off" without anyone gaming it on booking four.
Caps work for both automatic and code discounts. On Shopify or multi-store setups, usage is tracked per store — a code burned in Store A doesn't count against the cap in Store B.
Putting it together: three discounts worth running
You don't need a dozen promotions. These three cover most service businesses:
Pros
- Welcome offer: code, percentage, first-order-only, per-customer cap of 1. Converts new customers without discounting regulars.
- Off-peak filler: automatic, weekly-recurring on your slowest days, combinable off. Moves demand into dead hours with zero ongoing effort.
- Seasonal push: code or automatic, fixed date range, total usage cap. Turns itself off when the dates pass or the cap fills.
Cons
- Avoid: a permanent always-active sitewide code — it just becomes your real price.
- Avoid: leaving everything combinable — that's how unintended stacking erodes margin.
- Avoid: discounts with no minimum on low-priced services — fixed-amount discounts can wipe the whole line.
How discounts behave across the rest of a booking
A discount isn't an island. A few interactions worth knowing:
- Add-ons participate only if you enable "include add-ons" on the discount. Off by default thinking is safest — discount the service, charge full price for the extra.
- Deposits are calculated on the discounted total, so a 20% promo also reduces the deposit the customer pays up front.
- Multi-store setups keep separate discount lists per store, with caps and eligibility scoped per store.
Discounts in Opencals
Opencals supports both automatic and code discounts with percentage or fixed values, line-item or order scope, targeting by product, staff, and location, weekly-recurring or date-range schedules, minimum-purchase and duration requirements, combinable/exclusive stacking, and total plus per-customer usage caps — on both the standalone storefront and the Shopify integration. See the full breakdown on the discounts feature page.
Discounts feature
Automatic and code discounts with full targeting, scheduling, and stacking control.
Deposits & cancellations
Take deposits to protect discounted slots against no-shows.
Add-ons
Decide whether a discount applies to add-on line items or just the base service.
Frequently Asked Questions
Early Access — 3 Months Free
Ready to transform your service business?
Join 150+ businesses already using Opencals. Get 3 months completely free with all features unlocked.