Approvals & Promotions
The single queue where requests wait for a manager's decision, and how to run discounts and coupon codes.
6 min read · Updated 10 Sep 2026
On this page
Two things owners ask for constantly: a way to stop staff doing expensive things unsupervised, and a way to run a promo. This page covers both — the approvals queue, then promotions.
The approvals queue
Everything that needs a manager's decision lands in one place: Approvals in the sidebar. There is no separate inbox per feature.
The queue is not a paid add-on. It appears for anyone whose role can see it.
Who can see and act
| Owner | Manager | Cashier / Staff | |
|---|---|---|---|
| See the queue | Yes | Yes | No |
| Approve or reject | Yes | Yes | No |
Access is by capability — View Approvals Queue and Act on Approvals — which owners and managers hold by default. If you use custom roles, you can grant either to another role. See Custom roles.
What lands in the queue
| Request type | Filed when |
|---|---|
| Void | A cashier asks to void a sale and cannot authorise it themselves |
| Refund | Any return or refund is processed |
| Purchase Order | A purchase order is submitted for sign-off |
| Expense | An expense is recorded by someone whose expenses need approval |
| Leave Request | A staff member files leave |
| Stock Transfer | A branch requests stock from another branch or a warehouse |
| Receiving Variance | Goods received differ from the purchase order by more than the allowed variance |
| Stock Count Variance | A stock count's difference exceeds the allowed variance |
| Production Run | A commissary production run is filed |
| Loan | A staff loan is created |
| Payroll Run | A payroll run is submitted for approval |
Variance approvals use these limits, which is what "more than the allowed variance" means:
| Limit | Default |
|---|---|
| Stock-count variance, units | 5 |
| Stock-count variance, percent | 10% |
| Receiving variance, units | 5 |
| Receiving variance, percent | 10% |
A count or a receipt inside those limits applies straight away, with no approval. Outside them, it waits. These limits are not editable from the web back office today — ask support if you need different figures.
Acting on a request
Open Approvals, filter by Status and Type, and open a row to see the detail: what is being asked, the amount, who asked, and when.
- Approve applies the decision to the underlying record. A voided sale becomes voided, an approved purchase order moves forward, an approved leave request is granted.
- Reject needs a written reason — up to 500 characters — and the queue will not let you submit without one. Say something useful; the requester sees it.
Either way the requester gets a notification. See Notifications.
Rejecting a Refund does not claw the money back. Refunds are applied at the counter first and recorded in the queue afterwards, as a sign-off and an audit record. Rejecting one is a statement that it should not have happened, not an undo. Correcting the money is a separate action.
Approved and rejected requests are final. Changes requested — a middle state that sends a request back to be amended — exists in Kassly, but the web queue only offers Approve and Reject.
The two-person rule
Kassly can require a second person's PIN before a destructive action goes through — voids, refunds, and discount overrides. It is off by default.
With it on, even a manager who could normally void a sale on their own must enter their PIN against the queue entry. With it off, an authorised manager voids inline at the counter and the queue entry is written purely for the record.
The two-person rule is not exposed on the web back office. Ask support to switch it on.
Promotions
Needs the Customer Memory & Promos add-on (₱300 per branch each month), or any bundle that includes it.
Promotions live at Promotions in the sidebar. Owners and managers can create and edit them; cashiers can apply a coupon code at the counter but cannot change the promotion itself.
The three kinds
| Type | What you set | What happens |
|---|---|---|
| Percentage Off | A percentage, up to 100 | That percentage comes off |
| Fixed Amount Off | A peso amount | That amount comes off, never more than the sale itself |
| Buy X Get Y | A buy quantity and a get quantity | Applied at the item level by the app at the counter |
Test a Buy X Get Y promotion with a real sale before you advertise it. It is applied per item by the selling app rather than as one discount on the sale, so it behaves differently from the other two. Ring one up and check the total.
Every field on a promotion
| Field | Required | What it does |
|---|---|---|
| Name | Yes | What you and your staff call it |
| Type | Yes | Percentage Off, Fixed Amount Off, or Buy X Get Y |
| Value | Yes | The percentage or the peso amount |
| Minimum purchase | No | The promotion is ignored below this subtotal |
| Buy quantity / Get quantity | For Buy X Get Y | The X and the Y |
| Product | No | Restricts the promotion to one product |
| Category | No | Restricts the promotion to one category |
| Coupon code | No | Leave blank for a promotion that applies by itself |
| Usage limit | No | The promotion stops working after this many uses, in total across your whole store |
| Start date / End date | No | Leave both blank for always-on |
| Priority | No | Higher numbers are considered first when several promotions could apply |
| Active | — | The manual on/off switch |
Product and category are single-pick, not a list. A promotion covering five specific products means five promotions, or one promotion on a category that contains them.
Automatic promotions versus coupons
This is the distinction that catches people out:
- Leave the coupon code blank and the promotion applies automatically to any sale that matches its conditions.
- Set a coupon code and the promotion only applies when someone enters that code. It is deliberately excluded from automatic application — otherwise every customer would get your coupon discount without the coupon.
The Promotions form upper-cases the coupon code as you type it, so summer2026
is stored as SUMMER2026.
When a promotion stops working
A promotion is inactive the moment any one of these is true:
- Active is switched off.
- Today is before the start date, or after the end date.
- The usage limit has been reached.
Kassly also runs a daily sweep just after midnight that switches off promotions whose end date has passed, so your list stays honest instead of filling with dead entries.
Usage is counted when a sale using the promotion is completed, and counted back down if that sale is later voided — so a void does not burn a use.
What promotions do not do
- No per-customer limits. The usage limit is a single total for the whole store. There is no "one per customer".
- No stacking rules. Priority decides the order promotions are considered in; there is no engine for combining or excluding them.
- No branch targeting. A promotion applies across your store, not to one branch.
- They are not the same as statutory discounts. Senior citizen, PWD, national athlete and solo-parent discounts are separate, legally defined, and handled by Kassly on their own. See Discounts.
Every change to a promotion is recorded — who changed what, and when. See Audit logs.