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

Build the coupon ruleLive demo verified on 2026-09-13. The form keeps the offer value, eligibility window and use limits together for an owner-approved check before activation.
Validate it at the tillThe cashier applies the code to the current bill. Posnic validates it again when saving, so the final payable total is the amount to trust.

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

  1. Open Manage -> Marketing -> Coupons.
  2. Click New coupon.
  3. Enter the Code and a staff-readable Description.
  4. Choose Percentage off or Fixed amount off, then enter Value.
  5. Enter Min spend when the bill must reach a threshold.
  6. For a percentage offer, enter Max discount to cap the currency amount; 0 means no cap.
  7. Set Valid from and Valid until for a timed offer, or leave them empty for no date boundary.
  8. Set Total uses and Per customer. In either field, 0 means unlimited; Total uses 1 creates a one-use code.
  9. Keep Active selected only when cashiers should accept the code.
  10. Select Save and wait for Coupon saved.
  11. Find the row in the Coupons table and verify Code, Value, Valid, Used and Status.
  12. Run the controlled test matrix below before distributing or printing the code.

Understand Every Field

ControlWhat Posnic actually usesOperator guidance
CodeTrimmed, uppercased and required; duplicates are rejected across the license.Avoid spaces and ambiguous characters on printed material.
DescriptionStaff-facing text stored with the coupon.State the offer purpose or approval reference.
TypePercentage off or Fixed amount off.Confirm the unit before entering Value.
ValuePercent 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 spendThe live bill basis must be at least this amount; 0 means no minimum.Test one bill below and exactly at the threshold.
Max discountCaps only a percentage coupon's currency discount; 0 means no cap.Use it to contain high-value baskets.
Valid fromThe code is refused before the saved start date.Leave empty for no starting boundary.
Valid untilThe entire end date is included through 23:59:59.999 server-local time.Use the advertised final day, not the following day.
Total usesCounts non-voided redemption rows for everyone; 0 means unlimited.Set 1 for a one-time code.
Per customerCounts non-voided uses for the selected customer; 0 means unlimited.A positive value refuses Walk-in because identity is required.
ActiveMust 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.

RULEBILLRESULT
10% off, no cap1,250125 discount.
20% off, maximum discount 1001,000100 discount; the till marks it capped.
Fixed 250 off900250 discount.
Fixed 250 off180180 discount; it cannot exceed the bill.
Any type with Value 0Any billRejected because it produces no discount.
Minimum spend 500499.99 / 500Rejected 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.

  1. Open New Sale, add every item and finish line edits or manual discounts first.
  2. Select the correct named customer before applying a code with a Per customer limit or customer binding.
  3. Place the cursor in Coupon, then type the code or scan a printed voucher barcode into that field.
  4. Apply the code and read the status returned by Posnic.
  5. Confirm the green summary shows the normalized code, discount and capped label when relevant.
  6. Read Discount and Pay Total after applying it; do not calculate change from the original total.
  7. If items, quantities, customer or other discounts change, clear the coupon and apply it again to refresh the preview.
  8. Open PAY only after the final displayed total is correct, then complete payment normally.
  9. 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 SYMPTOMMEANINGACTION
Coupon code not recognisedNo coupon with that normalized code exists in the license.Retype or scan it; do not guess a replacement.
This coupon is not activeActive is off.Ask an authorized manager to review the offer.
Not valid yet / expiredCheckout is outside the saved date window.Check the store date and advertised period; the end day itself is inclusive.
Bill is below minimum spendThe validation bill is below Min spend.Recheck the current bill, not the tendered amount.
Reached usage limitNon-voided total uses reached Total uses.Do not override with a manual discount without approval.
Customer already used this couponThat customer reached Per customer.Verify customer identity and prior sales.
Registered customer requiredA customer-limited code is being used with Walk-in.Attach the correct customer and apply again.
Belongs to a different customerThe voucher is bound to another customer.Do not transfer it; verify the intended recipient.
Applied preview disappears on saveA 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.

  1. Open Sales History and find the exact original Sale ID.
  2. Verify customer, items, total, coupon code and discount before cancelling.
  3. Use the authorized whole-sale void action and complete any manager approval.
  4. Confirm the sale is cancelled and its stock and payment consequences are handled.
  5. Return to Coupons and verify Used decreased when the coupon still exists.
  6. 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

ACTIONCURRENT ACCESS BOUNDARYRECOMMENDED ROLE
Open MarketingMarketing feature must be on; navigation is shown to a user with Branch Write.Owner or configuration manager.
Create, edit or delete couponCoupon write endpoints reject only when Branch Write is explicitly false.Promotion manager with approved rules.
List couponsProtected signed-in route; the branch list includes branch and license-wide records.Manager or authorized operator.
Validate at tillProtected route and normal sale access; customer is additionally required for customer-limited codes.Cashier with Sales Write.
Void coupon saleNormal protected sale cancellation and manager controls apply.Authorized supervisor.

Controlled Test Matrix

TESTEXPECTED RESULTEVIDENCE
Percent couponDiscount equals bill x rate, rounded to two decimals.Bill, code and receipt total.
Percent capDiscount stops at Max discount and preview says capped.Applied summary and receipt.
Fixed coupon above billDiscount stops at the bill; total never goes negative.Final Pay Total.
Minimum thresholdOne bill below fails; a bill exactly at the threshold succeeds.Both till messages.
Final validity dayCoupon remains valid through that day and fails afterward.Store date and result.
Per-customer limitWalk-in fails; first named use succeeds; next use fails at the limit.Customer, Sale ID and messages.
Total limitUses stop when active redemption rows reach the limit.Used column and final rejection.
Stale last useOnly the first completing till gets the final use; the other sale saves without coupon discount.Both Sale IDs and receipts.
VoidRedemption is voided and the available use returns when the coupon still exists.Original Sale ID and Used before/after.
Cross-branchRecord actual behavior for every outlet before launch.Branch names and test receipts.