Settings

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.

StageWhat Posnic doesOperator evidence
ConfigureStores one cashback rule for the active branch.Saved values reload on the Cashback tab.
EarnCalculates against the completed sale total, rounds to two decimals and applies the cap.The earning Sale ID and expected value.
IssueCreates one active fixed coupon and one cashback-issue record after the sale commits.A CB code appears under Recently issued.
DeliverOptionally attempts SMS or WhatsApp; the voucher still exists if sending fails.Issued or Sent status, plus the customer's message when applicable.
RedeemValidates the generated coupon on a later sale and books its single use.Later Sale ID, receipt code and discount.
ReverseVoiding 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

  1. Open Manage -> Marketing -> Cashback.
  2. Leave Enable cashback off while entering and checking a new rule.
  3. Enter Cashback %, Min bill to earn and Max cashback.
  4. Enter Valid for (days) and Min bill to redeem.
  5. Turn on Bind to the customer when only the earning customer may use the voucher.
  6. Choose Don't send (print only), SMS or WhatsApp under Send via.
  7. Write the customer message using only the displayed placeholders: {name}, {amount}, {code}, {currency}, {shop} and {expiry}.
  8. Review every value, then turn on Enable cashback.
  9. Select Save cashback settings and wait for Cashback settings saved.
  10. Reload the tab and confirm the saved values remain before running a test sale.

Understand Every Setting

ControlActual ruleOperator guidance
Enable cashbackNo 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 earnThe saved sale total must equal or exceed this value; zero removes the threshold.Test immediately below and exactly at the boundary.
Max cashbackCaps the generated fixed voucher amount; zero means no cap.Use a cap to contain unusually large baskets.
Valid for daysStored 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 redeemBecomes the generated coupon's minimum spend for the later bill.This is not the earning threshold.
Bind to customerAdds the earning sale's customer ID to the coupon when a customer exists.Select the same named customer before redemption.
Send viaOnly none, SMS or WhatsApp is stored; unrecognized values become none.Provider setup and a phone are separate requirements.
MessageKnown placeholders are replaced; unknown {words} remain unchanged.Preview wording manually and avoid unsupported fields.
CurrencyTaken 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.

RuleCompleted saleIssued value
10%, no minimum, no cap1,000100.00
7.5%, no cap99974.93 after two-decimal rounding
20%, maximum 1001,000100.00 because the raw 200 is capped
10%, minimum bill 500499.99No voucher
10%, minimum bill 50050050.00
0% or disabledAny saleNo voucher

Issue a Voucher from a Qualifying Sale

  1. Start New Sale and build the basket normally.
  2. Select a named customer before payment when binding or message delivery is required.
  3. Verify the customer phone when Send via is SMS or WhatsApp.
  4. Complete payment and save the sale; held or unsaved work is not a completed earning sale.
  5. Keep the Sale ID and calculate the expected reward from the final saved sale total.
  6. Open Manage -> Marketing -> Cashback and inspect Recently issued for the new CB code, amount, customer, expiry and status.
  7. 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.
MethodWhat happensWhat 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.
SMSPosnic calls the configured SMS service only when the sale has a phone.Message reaches the correct phone and the row shows Sent.
WhatsAppPosnic calls the configured WhatsApp service only when the sale has a phone.Approved provider path works and the row shows Sent.
Missing phoneVoucher is issued but no send is attempted.Use the ledger and print rather than promising a message.
Provider failureVoucher 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 statusMeaningOperator use
CodeThe generated coupon code used at the later till.Match it to the message, printout and redemption receipt.
AmountThe fixed discount value minted from the earning sale.Recalculate percentage and cap when disputed.
CustomerNamed earning customer or Walk-in.Binding applies only when an actual customer ID was saved.
ExpiresThe generated coupon end date.Explain the last usable date before handing it over.
IssuedVoucher exists but no successful automatic delivery is recorded.Print it or investigate phone/provider configuration.
SentThe configured send call returned success.Still verify receipt when delivery is operationally important.
VoidedThe earning sale was voided and the voucher was deactivated.Do not print or accept it.
PrintCreates the barcode voucher for a non-voided issue.Use for print-only and delivery fallback.

Redeem the Voucher on the Next Sale

  1. Start a new later sale; never try to apply the voucher back to the earning sale.
  2. Add all items and finish line edits before applying the voucher.
  3. Select the same named customer first when the voucher is bound.
  4. Place the cursor in Coupon, then type the CB code or scan its printed Code128 barcode.
  5. Apply the code and read the server response.
  6. Confirm the later bill reaches Min bill to redeem and the displayed discount matches the voucher amount, capped to the bill when necessary.
  7. Open PAY only after checking the final payable total, then save the sale.
  8. 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

AreaCurrent behaviorOperating rule
SettingsOne rule is loaded and saved for the active branch.Verify the branch before changing values.
Recent ledgerShows issues for the active branch, newest first, normally 20 and capped by the API at 100.Switch branches deliberately when investigating.
Save accessThe endpoint rejects only when Branch Write is explicitly false.Restrict configuration to an approved manager role.
Read accessAuthenticated users can read settings and recent issues.Treat customer, phone and reward records as operationally sensitive.
RedemptionThe generated coupon is found license-wide by code in the current coupon engine.Test outlet and currency policy before a multi-branch launch.
CurrencySaved and printed as a display label without conversion.Do not redeem fixed vouchers across different-currency branches without an approved policy.

Controlled Test Matrix

TestExpected resultEvidence
Below earning minimumNo issue row and no generated voucher.Sale ID, total and active rule.
Exactly at earning minimumOne voucher is issued.Sale ID and new CB row.
Percentage roundingValue matches percentage rounded to two decimals.Calculation and Amount column.
Maximum capIssued amount does not exceed Max cashback.High-value test sale and row.
Idempotent retryThe same earning sale never receives a second voucher.Single row for one Sale ID.
Bound customerCorrect customer succeeds; Walk-in and another customer fail.Till responses and later Sale ID.
Minimum redeem billBelow threshold fails; exact threshold succeeds.Both till messages.
Single useFirst completed redemption succeeds and the next fails.Receipt and reuse response.
Print and scanBarcode enters the exact CB code in Coupon.Printed voucher and scanner test.
Delivery failureVoucher remains Issued and earning sale remains saved.Sale ID, ledger status and provider error.
Void earning saleIssue becomes Voided and generated coupon is inactive.Original Sale ID and ledger status.
Cross-branchActual acceptance and currency behavior are recorded per outlet.Branch names and test receipts.

Troubleshoot Cashback

ProblemLikely causeAction
Cashback tab is missingMarketing is off or navigation permission is insufficient.Enable Marketing with an authorized role and reopen Manage.
No voucher issuedDisabled 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 wrongWrong branch rule, percentage, cap or rounding expectation.Recalculate from the saved sale total and verify active branch.
Customer shows Walk-inNo customer ID/name was saved on the earning sale.Do not assume binding or message delivery occurred.
Status stays IssuedPrint-only, no phone, provider failure or send returned unsuccessful.Print the voucher and inspect Messaging configuration.
Code rejectedInactive/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 saveCoupon was revalidated and a rule or use state changed.Check the final payable total and receipt before taking money.
Print does not openThe browser blocked the popup.Allow popups for the POS site, then select Print again.
Barcode does not scanPoor print quality, scanner mode or focus problem.Focus Coupon, test Code128 configuration, or type the printed code.
Earning sale was voidedThe generated voucher is deliberately deactivated.Use the Voided ledger record as evidence; do not recreate it manually.