Configure, Issue, Print and Redeem Cashback Vouchers
Cashback is not an instant reduction on the earning sale. A qualifying completed sale creates a single-use voucher for a future visit, redeemed through the same validated coupon control.
Menu path
Manage -> Marketing -> Cashback; Sales -> New Sale -> Coupon
Verified from
Posnic demo and current POS source reviewed on 2026-09-13
Technical source evidence
Live Posnic demo Cashback tab reviewed 2026-09-13, frontend/modules/settings_write.html Cashback tab, frontend/static/script/js/modules/js/cashback.js settings, ledger and Code128 printing, api/src/services/cashback.service.js compute, issue, delivery and reversal, api/src/controllers/cashback.controller.js access boundary, api/src/controllers/sales.controller.js post-sale issue and void hooks, api/src/services/coupon.service.js voucher validation, booking and redemption reversal
Configure the branch ruleLive demo verified on 2026-09-13. The Cashback tab separates earning rules, future-redemption rules, customer binding and delivery.Earn and redeem through salesThe earning sale mints the voucher after saving; a later sale redeems its code through the normal Coupon control.
Understand the Cashback Lifecycle
Cashback is a reward for a later purchase, not a discount on the sale that earns it. After a qualifying sale commits, Posnic creates a new fixed-amount coupon with a unique CB code, one permitted use and an expiry date. That separate coupon is what the customer later types or scans at the till.
Stage
What Posnic does
Operator evidence
Configure
Stores one cashback rule for the active branch.
Saved values reload on the Cashback tab.
Earn
Calculates against the completed sale total, rounds to two decimals and applies the cap.
The earning Sale ID and expected value.
Issue
Creates one active fixed coupon and one cashback-issue record after the sale commits.
A CB code appears under Recently issued.
Deliver
Optionally attempts SMS or WhatsApp; the voucher still exists if sending fails.
Issued or Sent status, plus the customer's message when applicable.
Redeem
Validates the generated coupon on a later sale and books its single use.
Later Sale ID, receipt code and discount.
Reverse
Voiding the earning sale deactivates its voucher and marks the issue Voided.
Original Sale ID and Voided status.
Prepare the Reward Policy
Enable Marketing under Manage -> Features before looking for Cashback.
Decide the earning percentage, minimum earning bill, maximum reward, validity period and minimum redemption bill before switching it on.
Choose whether a named customer is mandatory. Binding cannot protect a Walk-in sale that has no customer ID.
For SMS or WhatsApp, configure and test the branch's Messaging provider first and collect a valid customer phone number.
Run a controlled earn-and-redeem test before advertising the program; the public demo resets and must not be treated as a permanent ledger.
Configure Cashback Step by Step
Open Manage -> Marketing -> Cashback.
Leave Enable cashback off while entering and checking a new rule.
Enter Cashback %, Min bill to earn and Max cashback.
Enter Valid for (days) and Min bill to redeem.
Turn on Bind to the customer when only the earning customer may use the voucher.
Choose Don't send (print only), SMS or WhatsApp under Send via.
Write the customer message using only the displayed placeholders: {name}, {amount}, {code}, {currency}, {shop} and {expiry}.
Review every value, then turn on Enable cashback.
Select Save cashback settings and wait for Cashback settings saved.
Reload the tab and confirm the saved values remain before running a test sale.
Understand Every Setting
Control
Actual rule
Operator guidance
Enable cashback
No voucher is issued while off, even when the other values are present.
Use this as the program pause control.
Cashback %
Clamped from 0 to 100; zero or less earns nothing.
Use the approved percentage and test the maths.
Min bill to earn
The saved sale total must equal or exceed this value; zero removes the threshold.
Test immediately below and exactly at the boundary.
Max cashback
Caps the generated fixed voucher amount; zero means no cap.
Use a cap to contain unusually large baskets.
Valid for days
Stored as an integer of at least one day; blank or invalid input falls back to 30.
State the expiry clearly in customer terms.
Min bill to redeem
Becomes the generated coupon's minimum spend for the later bill.
This is not the earning threshold.
Bind to customer
Adds the earning sale's customer ID to the coupon when a customer exists.
Select the same named customer before redemption.
Send via
Only none, SMS or WhatsApp is stored; unrecognized values become none.
Provider setup and a phone are separate requirements.
Message
Known placeholders are replaced; unknown {words} remain unchanged.
Preview wording manually and avoid unsupported fields.
Currency
Taken from branch context and printed as a label; it does not convert value between currencies.
Use common currency policy across outlets.
Calculate the Voucher Value
Posnic uses the earning sale's saved sales total, multiplies it by the configured percentage, applies Max cashback when greater than zero, and rounds to two decimals. A zero result creates no voucher.
Rule
Completed sale
Issued value
10%, no minimum, no cap
1,000
100.00
7.5%, no cap
999
74.93 after two-decimal rounding
20%, maximum 100
1,000
100.00 because the raw 200 is capped
10%, minimum bill 500
499.99
No voucher
10%, minimum bill 500
500
50.00
0% or disabled
Any sale
No voucher
Issue a Voucher from a Qualifying Sale
Start New Sale and build the basket normally.
Select a named customer before payment when binding or message delivery is required.
Verify the customer phone when Send via is SMS or WhatsApp.
Complete payment and save the sale; held or unsaved work is not a completed earning sale.
Keep the Sale ID and calculate the expected reward from the final saved sale total.
Open Manage -> Marketing -> Cashback and inspect Recently issued for the new CB code, amount, customer, expiry and status.
Do not repeat the sale if the row or message is delayed. Issuing is a protected post-sale action and the original sale remains committed.
How Issuing Behaves After Save
The sale commits first. Cashback errors are caught so they cannot fail or roll back the sale.
Issuing is idempotent by earning sale: retrying the hook for the same Sale ID does not create a second voucher.
Generated codes begin with CB and use six non-ambiguous letters or numbers; a timestamp fallback is used after repeated clashes.
The generated coupon is fixed amount, active, single use, optionally customer-bound and expires after the configured number of days.
A qualifying Walk-in sale can earn an unbound voucher, but it has no phone or customer identity for protected delivery.
The generated coupon uses the ordinary coupon engine, including final-save revalidation and the license-wide code lookup behavior documented in Create and Manage Coupons.
Deliver or Print the Voucher
Print opens a separate browser window and automatically starts printing; allow popups for the POS site.
The voucher renders a Code128 barcode plus the human-readable code, fixed amount, branch name and expiry.
Test the paper barcode with the same scanner and till used by cashiers. The code can always be typed when scanning fails.
Printing is available only for a non-voided row in Recently issued.
Method
What happens
What to verify
Don't send (print only)
No automatic message is attempted; staff print from Recently issued.
Popup allowed, shop, amount, code, barcode and expiry are readable.
SMS
Posnic calls the configured SMS service only when the sale has a phone.
Message reaches the correct phone and the row shows Sent.
WhatsApp
Posnic calls the configured WhatsApp service only when the sale has a phone.
Approved provider path works and the row shows Sent.
Missing phone
Voucher is issued but no send is attempted.
Use the ledger and print rather than promising a message.
Provider failure
Voucher remains issued; delivery failure does not remove it or fail the sale.
Preserve Sale ID and code, fix messaging, and give the customer a printed copy.
Read Recently Issued
Column or status
Meaning
Operator use
Code
The generated coupon code used at the later till.
Match it to the message, printout and redemption receipt.
Amount
The fixed discount value minted from the earning sale.
Recalculate percentage and cap when disputed.
Customer
Named earning customer or Walk-in.
Binding applies only when an actual customer ID was saved.
Expires
The generated coupon end date.
Explain the last usable date before handing it over.
Issued
Voucher exists but no successful automatic delivery is recorded.
Print it or investigate phone/provider configuration.
Sent
The configured send call returned success.
Still verify receipt when delivery is operationally important.
Voided
The earning sale was voided and the voucher was deactivated.
Do not print or accept it.
Print
Creates the barcode voucher for a non-voided issue.
Use for print-only and delivery fallback.
Redeem the Voucher on the Next Sale
Start a new later sale; never try to apply the voucher back to the earning sale.
Add all items and finish line edits before applying the voucher.
Select the same named customer first when the voucher is bound.
Place the cursor in Coupon, then type the CB code or scan its printed Code128 barcode.
Apply the code and read the server response.
Confirm the later bill reaches Min bill to redeem and the displayed discount matches the voucher amount, capped to the bill when necessary.
Open PAY only after checking the final payable total, then save the sale.
Verify the later receipt contains the code and discount. A second use must be rejected because the generated coupon has a total-use limit of one.
Void the Earning or Redemption Sale
Voiding the earning sale finds its cashback issue, deactivates the generated coupon and marks the issue Voided. It can no longer be printed from the Cashback tab.
If the customer already redeemed the voucher before the earning sale is voided, deactivation prevents future use but does not automatically undo the discount on that separate redemption sale.
Voiding the later redemption sale follows normal coupon reversal: its redemption row is marked voided and the coupon usage counter is reduced when the coupon still exists.
A cashback voucher deactivated because its earning sale was voided should remain invalid even if a redemption reversal later frees its usage count.
Always retain both Sale IDs when an earning sale and a redemption sale are involved.
Branch Scope and Permissions
Area
Current behavior
Operating rule
Settings
One rule is loaded and saved for the active branch.
Verify the branch before changing values.
Recent ledger
Shows issues for the active branch, newest first, normally 20 and capped by the API at 100.
Switch branches deliberately when investigating.
Save access
The endpoint rejects only when Branch Write is explicitly false.
Restrict configuration to an approved manager role.
Read access
Authenticated users can read settings and recent issues.
Treat customer, phone and reward records as operationally sensitive.
Redemption
The generated coupon is found license-wide by code in the current coupon engine.
Test outlet and currency policy before a multi-branch launch.
Currency
Saved and printed as a display label without conversion.
Do not redeem fixed vouchers across different-currency branches without an approved policy.
Controlled Test Matrix
Test
Expected result
Evidence
Below earning minimum
No issue row and no generated voucher.
Sale ID, total and active rule.
Exactly at earning minimum
One voucher is issued.
Sale ID and new CB row.
Percentage rounding
Value matches percentage rounded to two decimals.
Calculation and Amount column.
Maximum cap
Issued amount does not exceed Max cashback.
High-value test sale and row.
Idempotent retry
The same earning sale never receives a second voucher.
Single row for one Sale ID.
Bound customer
Correct customer succeeds; Walk-in and another customer fail.
Till responses and later Sale ID.
Minimum redeem bill
Below threshold fails; exact threshold succeeds.
Both till messages.
Single use
First completed redemption succeeds and the next fails.
Receipt and reuse response.
Print and scan
Barcode enters the exact CB code in Coupon.
Printed voucher and scanner test.
Delivery failure
Voucher remains Issued and earning sale remains saved.
Sale ID, ledger status and provider error.
Void earning sale
Issue becomes Voided and generated coupon is inactive.
Original Sale ID and ledger status.
Cross-branch
Actual acceptance and currency behavior are recorded per outlet.
Branch names and test receipts.
Troubleshoot Cashback
Problem
Likely cause
Action
Cashback tab is missing
Marketing is off or navigation permission is insufficient.
Enable Marketing with an authorized role and reopen Manage.
No voucher issued
Disabled rule, zero percentage, below earning minimum or post-sale issue failure.
Keep the Sale ID; compare saved total and rule, then escalate instead of duplicating the sale.
Value looks wrong
Wrong branch rule, percentage, cap or rounding expectation.
Recalculate from the saved sale total and verify active branch.
Customer shows Walk-in
No customer ID/name was saved on the earning sale.
Do not assume binding or message delivery occurred.
Status stays Issued
Print-only, no phone, provider failure or send returned unsuccessful.
Print the voucher and inspect Messaging configuration.
Code rejected
Inactive/voided, expired, below redemption minimum, already used or wrong bound customer.
Read the till message and match both Sale IDs before correcting anything.
Applied preview disappears on save
Coupon was revalidated and a rule or use state changed.
Check the final payable total and receipt before taking money.
Print does not open
The browser blocked the popup.
Allow popups for the POS site, then select Print again.
Barcode does not scan
Poor print quality, scanner mode or focus problem.
Focus Coupon, test Code128 configuration, or type the printed code.
Earning sale was voided
The generated voucher is deliberately deactivated.
Use the Voided ledger record as evidence; do not recreate it manually.