Promotional Offers & Points
Two ways to reward a customer. A promotional offer is an ordinary product - searchable, scannable, listed online like any other - that is really a Bundle/Combo or a Buy-X-Get-Y-Free deal underneath; scanning it expands the bill into the real component lines, or bills as one line if it was set to keep its own stock. A flat "15% off this brand this week" is not an offer at all - that is a Price Rule, and a code the customer quotes for money off the bill is a Coupon. Points accrue to a customer (and optionally to the staff who sold) per bill and redeem against later bills.
Where it is in the app
Main menu (Premium): Promotional Offers - a paged, searchable list of every offer product, each showing its type, item count, dates and (for an own-stock offer) its stock. Its toolbar also opens Price Rules directly, for the "% off a brand" case that has no home here. Points live on the customer record (point feature) and item (point, point qty); Reports > Customer Points, Promotional Sales. Marketing posts for an offer come from Tools > Design > Business Marketing.
Setting one up
flowchart TD
A[Add Offer] --> B[Create the offer product
name · code/barcode · group-category-brand
Keeps its own stock? on/off]
B --> C[Configure the offer]
C --> D{Offer type}
D -->|Bundle/Combo| E[Add components: item · qty · price each
offer price = sum of price x qty]
D -->|Buy X get Y free| F[Add items to buy + at least one free item
trigger bills at its own price · reward at zero]
E & F --> G[Optional: name · valid dates · hours of the day
one customer or group
usage caps total/per-customer
hide the free line on print - BuyXGetYFree only]
G --> H[(Offer saved against the product)]
H --> I{Keeps its own stock?}
I -->|on| J[Add Stock builds it from the components' own stock]
I -->|off, default| K[Nothing to build - it expands at sale time]
What happens at the counter
flowchart TD
A[Offer product scanned or picked, sale-side invoice] --> B{Keeps its own stock?}
B -->|yes| C[Bills as one line, at its own price and tax
its own stock moves]
B -->|no, default| D{Expired, no items, or blocked by scope/coupon/usage cap?}
D -->|yes| E[Toast explains why · nothing added]
D -->|no| F{Bundle or BuyXGetYFree?}
F -->|Bundle| G[Each component added at its own priced qty
real tax/HSN from its own product]
F -->|BuyXGetYFree| H[Same-SKU trigger + reward combined into one line
at a blended discount · a different-SKU reward its own free line]
G & H --> I[(Component lines, tagged with the offer and a shared group id)]
I --> J[Free line hidden on print, if the offer asks for it]
I --> K[Promotional Sales report]
Offer types
There are exactly two, and the difference is where the price comes from: a bundle carries its own component prices, while a buy-X-get-Y reads each component's current price and zeroes the reward.
flowchart TD
O[An offer product] --> T{Type}
T -->|Bundle / Combo| B[Components each carry a price inside the offer]
B --> B1[Offer price = sum of price x qty]
B1 --> B2[At the counter: each component added
at its own priced qty]
B2 --> B3[(Tax and HSN from each real product)]
T -->|Buy X, get Y free| Y[Components split into trigger and reward]
Y --> Y1[Trigger bills at the component's own CURRENT price]
Y1 --> Y2[Reward bills at 100% off]
Y2 --> Y3{Reward the same SKU as its trigger?}
Y3 -->|yes| Y4[Combined into ONE line
at a blended discount]
Y3 -->|no| Y5[Its own free line
hideable on the printed bill]
B3 & Y4 & Y5 --> S{Offer keeps its own stock?}
S -->|no, default| S1[Expands into component lines
components' stock moves]
S -->|yes| S2[Bills as ONE line at its own price and tax
the offer's own stock moves]
| Type | How it prices | Example |
|---|---|---|
| Bundle / Combo | Each component is given its own per-unit price inside the offer; the offer's own price is the sum of price × qty - nothing is split or allocated at sale time. | Shampoo + conditioner sold together as one product, priced at 250. |
| Buy X, get Y free | Trigger rows bill at the component's own current price; reward rows are 100% off. A reward of the same SKU as its trigger combines into one line at a blended discount. | Buy 2 soaps, get 1 of the same soap free - one line, 3 qty, netting the price of 2. The free line can be hidden on the printed bill. |
Every offer can also carry: a name (blank falls back to the product's own name), valid from/to dates, hours of the day, a scope of one customer or one customer group (blank means everyone), a coupon code claimed by typing it instead of scanning, and total/per-customer usage caps (a returned bill gives its count back).
Hours of the day
An offer can run only between a start and an end time - the breakfast combo, the late-night deal. The rules are the same ones price rules follow, because both read the same helper: both blank (or only one filled) is all day, the bounds are inclusive, and an end time before the start crosses midnight, so 22:00-02:00 runs until 2am the next morning. An offer written for the same hours as a price rule starts and stops with it.
Which discount wins?
flowchart TD
A[Item added to the bill] --> B{Is it a promotional-offer product?}
B -->|yes| C[Offer expands or bills as one line
free/component pricing above]
B -->|no| D{A price rule covers this customer or quantity?}
D -->|yes| E[Rule rate, discount or pack price applies]
D -->|no| F[The item's own rate for this customer's tier]
C & E & F --> G{Biller types a manual discount?}
G -->|yes| H{Within their permitted maximum?}
H -->|yes| I[Applied on top]
H -->|no| J[Refused — needs the owner]
G -->|no| K[Line priced]
I --> K
K --> L{Customer redeeming points?}
L -->|yes| M[Points reduce the bill total]
Settings & permissions
Settings > Master - Promotional Offers module (Premium); Settings > Contact - points feature and value per point. Permission: new/edit product (creating or editing an offer's product and its components), edit sales rate (the Price Rules shortcut in its toolbar), less point (redeeming).
Reports
Promotional Sales, Customer Points, Sales by Product, Commission (staff points).