Overview
Promo codes give clients a discount at checkout. They can be percentage-based or fixed-amount, apply once or recur on every renewal, and be restricted to specific products or applied across the whole order.
Creating a Promo Code
- Go to Admin → Promo Codes → New Code.
- Fill in the fields (see table below).
- Save.
Promo Code Fields
| Field | Required | Notes |
|---|---|---|
| Code | Yes | Case-insensitive; shown to clients (e.g. SAVE20) |
| Type | Yes | percent or fixed |
| Value | Yes | 20 = 20% off; 500 = $5.00 off (stored as cents for fixed) |
| Recurring | Yes | yes = applies on every invoice; no = first invoice only |
| Applies To | Yes | All products, or select specific products |
| Max Uses | No | Leave blank for unlimited |
| Start Date | No | Code is invalid before this date |
| End Date | No | Code is invalid after this date |
Discount Types
Percent
A percentage off the order total (or selected products' subtotal).
value = 20→ 20% off- Applied to base price + configurable options pricing
Fixed
A fixed amount deducted from the order total.
value = 500→ $5.00 off (the value is stored as cents)- If the discount exceeds the order total, the order total is set to $0.00 — it does not create a negative invoice
[!TIP] For fixed discounts in multi-currency stores, create separate promo codes per currency (e.g.
SAVE5USD,SAVE5EUR) since the fixed value is stored as a currency-neutral integer.
Recurring vs First-Payment
| Setting | When discount applies |
|---|---|
recurring = yes |
Every invoice for the life of the service |
recurring = no |
First invoice only |
Recurring discounts are tracked via a reference on the service record. The discount is re-applied automatically on each renewal invoice generation.
Applying a Code at Checkout
- On the order form, the client enters the code in the Promo Code field.
- An AJAX request validates the code in real time.
- If valid, the discount is shown immediately in the order summary.
- If invalid (expired, exhausted, wrong product), an error message is shown inline.
[!IMPORTANT] Usage count increments when the order is completed (invoice paid), not when the code is typed. Abandoned orders do not consume a use.
Status Badges
| Badge | Meaning |
|---|---|
| Valid | Code is active and has remaining uses |
| Expired | Past the end date |
| Exhausted | Max uses reached |
| Not Started | Before the start date |
Stacking with Client Group Discounts
Promo codes stack on top of any client group discounts. If a client group gets 10% off and they use a 20% promo code, both discounts apply (applied sequentially, not combined into 30%).