Settings
Create, Test, Redeem and Manage Coupon Codes
Coupons are server-validated bill discounts. Operators define the offer in Marketing, then cashiers type or scan its code on New Sale and accept only the discount returned by Posnic.
- Menu path
- Manage -> Marketing -> Coupons; Sales -> New Sale -> Coupon
- Verified from
- Posnic demo and current POS source reviewed on 2026-09-13
Technical source evidence
Live Posnic demo Coupons form and New Sale reviewed 2026-09-13, frontend/modules/settings_write.html Coupons tab and sales_write.html coupon control, frontend/static/script/js/modules/js/coupons.js and sales.js, api/src/services/coupon.service.js, coupon models and coupon constants, api/src/controllers/sales.controller.js prepareCouponRedemption, applyCoupon and cancel reversal
Before You Create the Offer
A coupon changes the amount collected and can be used across tills. Write the commercial rule first, obtain the owner's approval, then configure and test it with a controlled sale before publishing the code.
- Enable Marketing in Manage -> Features; the Marketing page and till coupon control depend on this switch.
- Write down the offer value, minimum bill, date window, total redemptions and per-customer rule before entering it.
- Decide whether Walk-in customers may use the offer. A per-customer limit needs an identified customer to be meaningful.
- Use a short code that is easy to read, type and print without confusing letters or spaces. Posnic trims it and stores it in uppercase.
- Choose a code not used by any outlet in the license. Code uniqueness is license-wide, not branch-only.
- For multiple outlets, agree where the code may be advertised. Current validation finds a matching code license-wide and does not reject it merely because checkout is in another branch.
Create a Coupon Step by Step
- Open Manage -> Marketing -> Coupons.
- Click New coupon.
- Enter the Code and a staff-readable Description.
- Choose Percentage off or Fixed amount off, then enter Value.
- Enter Min spend when the bill must reach a threshold.
- For a percentage offer, enter Max discount to cap the currency amount; 0 means no cap.
- Set Valid from and Valid until for a timed offer, or leave them empty for no date boundary.
- Set Total uses and Per customer. In either field, 0 means unlimited; Total uses 1 creates a one-use code.
- Keep Active selected only when cashiers should accept the code.
- Select Save and wait for Coupon saved.
- Find the row in the Coupons table and verify Code, Value, Valid, Used and Status.
- Run the controlled test matrix below before distributing or printing the code.
Understand Every Field
| Control | What Posnic actually uses | Operator guidance |
|---|---|---|
| Code | Trimmed, uppercased and required; duplicates are rejected across the license. | Avoid spaces and ambiguous characters on printed material. |
| Description | Staff-facing text stored with the coupon. | State the offer purpose or approval reference. |
| Type | Percentage off or Fixed amount off. | Confirm the unit before entering Value. |
| Value | Percent is clamped to 100; fixed is a positive branch-currency amount. | A zero-value coupon saves but is rejected at checkout because it gives no discount. |
| Min spend | The live bill basis must be at least this amount; 0 means no minimum. | Test one bill below and exactly at the threshold. |
| Max discount | Caps only a percentage coupon's currency discount; 0 means no cap. | Use it to contain high-value baskets. |
| Valid from | The code is refused before the saved start date. | Leave empty for no starting boundary. |
| Valid until | The entire end date is included through 23:59:59.999 server-local time. | Use the advertised final day, not the following day. |
| Total uses | Counts non-voided redemption rows for everyone; 0 means unlimited. | Set 1 for a one-time code. |
| Per customer | Counts non-voided uses for the selected customer; 0 means unlimited. | A positive value refuses Walk-in because identity is required. |
| Active | Must be on during till preview and final sale validation. | Turn it off to pause acceptance without deleting history. |
Check the Discount Maths
Posnic calculates the coupon against the bill basis, rounds the result to two decimals and never lets the coupon alone reduce the running bill below zero.
| RULE | BILL | RESULT |
|---|---|---|
| 10% off, no cap | 1,250 | 125 discount. |
| 20% off, maximum discount 100 | 1,000 | 100 discount; the till marks it capped. |
| Fixed 250 off | 900 | 250 discount. |
| Fixed 250 off | 180 | 180 discount; it cannot exceed the bill. |
| Any type with Value 0 | Any bill | Rejected because it produces no discount. |
| Minimum spend 500 | 499.99 / 500 | Rejected at 499.99 and eligible at 500. |
Redeem the Coupon on New Sale
Applying the code is a preview. When the cashier saves the sale, the server discards any client-supplied discount amount, validates the code again against the current bill, customer, dates and redemption counts, and calculates the discount itself.
- Open New Sale, add every item and finish line edits or manual discounts first.
- Select the correct named customer before applying a code with a Per customer limit or customer binding.
- Place the cursor in Coupon, then type the code or scan a printed voucher barcode into that field.
- Apply the code and read the status returned by Posnic.
- Confirm the green summary shows the normalized code, discount and capped label when relevant.
- Read Discount and Pay Total after applying it; do not calculate change from the original total.
- If items, quantities, customer or other discounts change, clear the coupon and apply it again to refresh the preview.
- Open PAY only after the final displayed total is correct, then complete payment normally.
- Verify the saved receipt or sale record carries the code and expected discount.
Final-Save Revalidation and Stale Codes
The preview does not reserve a use. Another till can consume the final available use, a manager can switch the coupon off, or the bill can change before Save. If final validation fails or errors, Posnic removes the code and coupon value and allows the sale to continue at full price instead of failing the sale. The cashier must verify the final amount before collecting money.
- Never promise that an applied preview guarantees the discount until the sale is saved.
- For a last-use or one-time code, complete the tender promptly and verify the receipt.
- If the customer expected a discount but the saved sale is full price, preserve the Sale ID and escalate; do not create a duplicate sale.
- A coupon may be combined with loyalty redemption in the current calculation path; each is clamped against the running payable amount. Test and approve combined promotions before launch.
When a Coupon Is Rejected
| MESSAGE OR SYMPTOM | MEANING | ACTION |
|---|---|---|
| Coupon code not recognised | No coupon with that normalized code exists in the license. | Retype or scan it; do not guess a replacement. |
| This coupon is not active | Active is off. | Ask an authorized manager to review the offer. |
| Not valid yet / expired | Checkout is outside the saved date window. | Check the store date and advertised period; the end day itself is inclusive. |
| Bill is below minimum spend | The validation bill is below Min spend. | Recheck the current bill, not the tendered amount. |
| Reached usage limit | Non-voided total uses reached Total uses. | Do not override with a manual discount without approval. |
| Customer already used this coupon | That customer reached Per customer. | Verify customer identity and prior sales. |
| Registered customer required | A customer-limited code is being used with Walk-in. | Attach the correct customer and apply again. |
| Belongs to a different customer | The voucher is bound to another customer. | Do not transfer it; verify the intended recipient. |
| Applied preview disappears on save | A rule, count, bill or service result changed before final validation. | Check the final total and receipt, retain the Sale ID and escalate if needed. |
Usage Counters and Redemption Records
A completed coupon sale creates a redemption record containing the coupon, code, customer when present, Sale ID, human sale reference, discount, bill total, currency, branch, date and operator context. The Coupons table's Used value is the running counter, while validation counts active redemption rows.
- Coupon booking is idempotent per sale, so retrying the same sale cannot count a second coupon redemption.
- Booking runs after the sale commits and is protected from failing the sale. If the receipt has a discount but Used did not move, keep the Sale ID and reconcile rather than repeating the transaction.
- Walk-in sales may use unrestricted coupons; their redemption record simply has no customer.
- Per-customer enforcement needs the saved customer ID, not a typed name or phone note.
Void a Coupon Sale
Cancelling a saved sale through the supported whole-sale void workflow marks its coupon redemption voided, records the void date and frees the use by reducing the coupon counter. The redemption row remains as audit evidence.
- Open Sales History and find the exact original Sale ID.
- Verify customer, items, total, coupon code and discount before cancelling.
- Use the authorized whole-sale void action and complete any manager approval.
- Confirm the sale is cancelled and its stock and payment consequences are handled.
- Return to Coupons and verify Used decreased when the coupon still exists.
- Retain the original Sale ID; do not delete and recreate a coupon to repair a counter.
Edit, Pause and Delete Safely
- Use Edit to correct an upcoming offer before launch. Changing a live offer changes what the same code will do on later sales.
- Turn Active off to pause acceptance while keeping the coupon and its counter visible.
- Codes are unique across the license, so another branch cannot create the same code while this record exists.
- Delete asks for confirmation and permanently removes the coupon definition. Historical redemption rows remain, but the coupon disappears from the management list.
- Do not delete a distributed or previously used coupon merely to stop it. Deactivate it so operators can still inspect the definition and Used count.
- If a deleted coupon's old sale is later voided, the redemption can be marked voided but there is no coupon row left whose counter can be reduced.
Multi-Branch Operating Rule
The create screen stores the current branch and currency on the coupon, and the list shows the current branch plus any license-wide records. However, code lookup and validation currently use license plus code and do not enforce branch ownership. Treat every coupon code as potentially redeemable at every outlet in the same license.
- Use a common promotion policy across outlets or encode the intended outlet clearly in the code and cashier instructions.
- Do not create two branch-specific coupons with the same code; license-wide uniqueness prevents it.
- Be especially careful with fixed-amount coupons when branches use different currencies because the saved currency is a display label, not a conversion rule.
- Test the code at every outlet where it should or should not be accepted before publishing it.
Permissions and Scope
| ACTION | CURRENT ACCESS BOUNDARY | RECOMMENDED ROLE |
|---|---|---|
| Open Marketing | Marketing feature must be on; navigation is shown to a user with Branch Write. | Owner or configuration manager. |
| Create, edit or delete coupon | Coupon write endpoints reject only when Branch Write is explicitly false. | Promotion manager with approved rules. |
| List coupons | Protected signed-in route; the branch list includes branch and license-wide records. | Manager or authorized operator. |
| Validate at till | Protected route and normal sale access; customer is additionally required for customer-limited codes. | Cashier with Sales Write. |
| Void coupon sale | Normal protected sale cancellation and manager controls apply. | Authorized supervisor. |
Controlled Test Matrix
| TEST | EXPECTED RESULT | EVIDENCE |
|---|---|---|
| Percent coupon | Discount equals bill x rate, rounded to two decimals. | Bill, code and receipt total. |
| Percent cap | Discount stops at Max discount and preview says capped. | Applied summary and receipt. |
| Fixed coupon above bill | Discount stops at the bill; total never goes negative. | Final Pay Total. |
| Minimum threshold | One bill below fails; a bill exactly at the threshold succeeds. | Both till messages. |
| Final validity day | Coupon remains valid through that day and fails afterward. | Store date and result. |
| Per-customer limit | Walk-in fails; first named use succeeds; next use fails at the limit. | Customer, Sale ID and messages. |
| Total limit | Uses stop when active redemption rows reach the limit. | Used column and final rejection. |
| Stale last use | Only the first completing till gets the final use; the other sale saves without coupon discount. | Both Sale IDs and receipts. |
| Void | Redemption is voided and the available use returns when the coupon still exists. | Original Sale ID and Used before/after. |
| Cross-branch | Record actual behavior for every outlet before launch. | Branch names and test receipts. |