Promo codes
A code at checkout that grants a percent or flat discount — for campaigns and influencers.
A promo code is the most familiar discount there is: the client types a short word at payment and the price drops. In Mountify this is not a separate feature — it is a loyalty rule whose condition is Promo code. This article walks the whole life of a code: where it is created, the rules governing the code text itself, what it looks like to the client, the error messages they can hit, and how to tell whether the campaign is working.
Promo codes require the Growth plan or higher. On Start the Loyalty page opens and reads fine, but saving a new rule is refused. You also need the
manage_loyaltypermission.
1. Creating a code — step by step
- In the left icon rail open the boards product and pick the board you are running the campaign for. Codes belong to the board — if you run two venues as two boards, a code from one does not work in the other.
- In the board column click the Setup hub.
- In the Salon operations group choose the Loyalty row.
- Top right, press New rule.
- On the Pick a template page choose the Promo code card and press Use this template.

The wizard opens pre-filled: −10 % discount, order 50, an empty code field.
The fields you must fill in
| Card | Field | What to put in it |
|---|---|---|
| Meta | Internal name | A name for your team, e.g. “Summer Instagram campaign”. The client never sees it |
| Meta | Customer-facing description | The short line the client sees at payment and in emails, e.g. “Summer discount” |
| Meta | Order | 0–100. Decides who wins a clash with another rule. Defaults to 50 |
| When | Promo code | The code itself — see §2 |
| Reward | Percent off or Flat amount | How much the price drops |
The other two cards — Who qualifies and Advanced — are optional and are covered in §4 and §5.
- Press Save rule. “Rule saved” appears and you return to the list.
The new rule is Active immediately. There is no separate “publish” button — once it is active, the code works.
2. The rules governing the code text
The Promo code field is strict, and it is worth knowing the limits up front so you don’t invent a code that can’t be saved.
| Rule | Value |
|---|---|
| Allowed characters | Latin letters A–Z and digits 0–9 only |
| Length | 2 to 32 characters |
| Case | Doesn’t matter — Mountify upper-cases it |
| Spaces, hyphens, dots | not allowed |
| Cyrillic | impossible |
The hint under the field says exactly this: “Case-insensitive — we’ll upper-case it for the customer. Allowed: A–Z and 0–9, 2–32 characters.”
Errors you can see while typing:
| Message | Cause |
|---|---|
| Enter a promo code. | The field is empty |
| Code must be at least 2 characters. | Too short |
| Code can be at most 32 characters. | Too long |
| Only letters A–Z and digits 0–9 are allowed. | There’s a space, hyphen or non-Latin character |
And one error that comes back from the server on save:
Another active rule already uses this promo code. Pick a different code or archive the other rule first.
Meaning: two active codes with the same text cannot coexist on one board. To reuse an old code, archive the old rule first (⋯ → Archive), then create the new one.
Practical advice for picking a code
- Write it the way you want the client to see it — SUMMER20, not summer-20.
- Avoid characters people mistype: 0 and O, 1 and I.
- Keep it short. Six to eight characters is easy to type on a phone.
- If you hand a code to an influencer, put their name in it (MARIA15) — later you can see which channel brought what.
3. What the client sees
The code is entered only on the public booking page, on the payment screen.
- The client reaches the last step and sees an I have a promo code row.
- They tap it — a field labelled Promo code appears with an Apply button.
- They type the code and press Apply.
- If the code is valid for that booking, the row turns into a confirmation (e.g. “Promo WELCOME (−10%) ✓”) and a Loyalty savings (est.) line appears in the price breakdown.
- There is also a Remove promo code button if they change their mind.
If you set a Discount ceiling, an extra line appears under the field: “Maximum discount with this code: …”.
There is nowhere to enter a promo code on a booking made by your team. Neither admin booking form has a code field. To give a discount to a client booked over the phone, do it from the client card: Clients → the client → the “Loyalty” tab → Apply rule manually. There you pick the booking, the rule and the discount amount, and write a note saying why.
The error messages the client sees
This is the table you will want when a client calls and says “the code doesn’t work”:
| Message the client sees | What it means on your side |
|---|---|
| Invalid promo code. | No such active code — a typo, or the rule is archived |
| This code doesn’t apply to your account. | In Who qualifies → Which customers you picked “First-time” or “Returning” and the client is in the other group |
| This code has reached its usage limit. | Max uses per customer or Total budget · uses is exhausted |
| This code has expired. | Today’s date is outside Valid from / Valid until |
| This code doesn’t apply to the selected service. | That service isn’t in Applies to services |
| Your order doesn’t reach the minimum for this code. | The amount is below Minimum spend |
| Sign in to use this code. | The code has a per-customer cap and the client is a guest — see §6 |
| This booking is paid with a package, so promo codes don’t apply. | The booking is being paid with package credit |
| This code couldn’t be applied. | The generic case — usually a combination of the above |
4. Narrowing: the “Who qualifies” card
Five fields define the scope of the campaign. Every empty field means “no restriction”.
| Field | Empty means | When to use it |
|---|---|---|
| Which customers | Anyone | ”First-time” = a code for newcomers only; “Returning” = for regulars only |
| Applies to services | all services | When you’re promoting one service. Switch All services to Specific services and pick from the list |
| Valid from | no start | A campaign that starts later. A code entered earlier is refused |
| Valid until | runs forever | The campaign’s end date. Bookings up to and including that date get the discount |
| Minimum spend | no minimum | ”−10 on orders over 60.” Measured on the service plus add-ons |
Dates are compared against the booking’s start time, not the moment the code is typed. So a code with Valid until 31 August applies to an appointment scheduled for 31 August even if the client books it on 20 August.
5. Caps: the “Advanced” card
| Field | Empty means | What it’s for |
|---|---|---|
| Combine with other rules | off | See Stacking & budgets |
| Max uses per customer | unlimited | ”Once per person”. Promo codes only |
| Total budget · uses | unlimited | ”The first 100 people”. Counted workspace-wide |
| Discount ceiling | no ceiling | ”−50 %, but never more than 20” |
| Total budget · money | unlimited | ”Give away 500 in discounts, then stop” |
Three things that surprise people:
- Cancelled bookings still count against the caps. If a client books, cancels and books again, a code capped at 1 is already spent. This is deliberate anti-abuse behaviour.
- Total budget · money stops the rule silently. The client just sees “Invalid promo code.” If your campaign suddenly “stops working”, check this field.
- To restore the cap for one specific client, use Clients → the client → the “Loyalty” tab → Eligibility overrides → Add override → Skip cap once.
6. The hidden identity requirement
If you fill in Max uses per customer, the code automatically starts requiring a verified identity. The logic is simple: without it a client could come back with a fresh email every time and “once per person” would mean nothing.
Verified identity means one of two things:
- the client is signed in on the public page; or
- the client confirmed an earlier booking through the link in the email (which proves the address is theirs).
A guest with neither gets “Sign in to use this code.”
If you want the code to work for fully anonymous guests — leave “Max uses per customer” empty and cap the campaign with Total budget · uses instead.
7. Telling whether the campaign works
Above the Loyalty list is a strip of four numbers: Active rules, Applications · 30d, Discount given · 30d, Avg. spend lift.
In the table itself each row shows Uses (how many times the code fired) and Discount (how much money it gave away). Open the row and you get a detailed list of every application.

8. Pausing and deleting a code
From the ⋯ menu on the row:
| Action | What it does |
|---|---|
| Archive | The code stops working immediately. The rule stays under the Archived tab, history is kept, and the code text is freed for reuse |
| Activate | Puts an archived rule back to work |
| Delete | Removes the rule permanently. The dialog warns: “This rule will be removed permanently. Usage history stays in analytics.” |
For a seasonal campaign prefer Archive over Delete — that way you can compare campaigns against each other later.
9. If something isn’t working
| Symptom | Check |
|---|---|
| The client sees “Invalid promo code.” | Is the rule Active? Does the code match exactly? Is Total budget · money exhausted? |
| The code won’t save | Is another active rule using the same code? Are you on Growth? |
| The discount is smaller than expected | The discount is computed without add-ons. Also check Discount ceiling |
| The code works but doesn’t add to another discount | That is the normal behaviour. See Stacking & budgets |
| The code field is nowhere on the page | The I have a promo code row is on the payment screen, not earlier. It is hidden when paying with a package |
| The Loyalty row shows a locked screen | You don’t have the manage_loyalty permission — ask the owner |
What’s next
- Loyalty rule types — the three conditions and two rewards, in tables.
- Stacking & budgets — “Order”, “Combine”, and where the discount lands in the price.
- Loyalty: reward rules — a tour of the whole page.
- Promo banners — how to show the code on the booking page itself.