Promotion Rules: What the Register Supports
Hyvä POS is in closed beta
Hyvä POS is currently in a closed beta (pilot phase) with a small group of merchants. It is not yet generally available: the App Store release follows the pilot, and features and configuration may still change, possibly in backwards-incompatible ways, before the general release. Want to take part? Sign up at hyva.io/pos.
The register evaluates Magento promotion rules on the device, without creating a cart in Magento. This keeps the register responsive and allows PRO registers to work offline, and it means the register implements every rule setting itself. This page lists the settings and states for each whether the register applies it the way the webshop does. Prices and Discounts explains how the pieces fit together.
Three answers appear in the tables:
- Yes: applies at the register as in the webshop.
- Applied, not checked: the rule applies, and the register tells the cashier that one of its settings is not verified at the counter.
- Online only: the register cannot evaluate this, so the rule does not apply at the counter. A coupon of this kind is refused with the reason and "It can be used online"; the coupon browser lists it under Online only; an automatic rule of this kind is shown in the Discounts panel as Not available at the register.
Rule Settings
| Setting in Magento | At the register | Note |
|---|---|---|
| Active | Yes | |
| From / To dates | Yes | Read on the store's calendar, both days inclusive, as Magento filters them. |
| Websites | Yes | A rule for another website is not offered and its coupon is refused. |
| Customer Groups | Yes | A walk-in sale is the "NOT LOGGED IN" group, or on PRO the group set under Walk-in Customer Defaults; attach a customer and the rules for their group apply. |
| Coupon: No Coupon (automatic) | Yes | Suggested in the Discounts panel and confirmed by the cashier. |
| Coupon: Specific Coupon | Yes | The code is typed or picked from Browse. |
| Coupon: auto-generated codes | Yes | Any generated code is accepted; a code expires with the rule's To date, as in Magento. |
| Uses per Coupon | Yes | A spent code is refused: "This coupon has already been used the maximum number of times". Two registers can both spend the last use within seconds of each other; Magento counts both. |
| Uses per Customer | Yes on PRO; applied, not checked on the free tier | PRO reads the customer's usage from the module before accepting the code and refuses it at the limit. The free tier has no module, so it applies the coupon and notes it under the code. Walk-in sales have no customer to count. |
| Priority | Yes | Rules apply in priority order, each on what earlier rules left. |
| Discard subsequent rules | Yes | Ends the pass for the lines the rule applied to. |
| Maximum Qty Discount is Applied To | Yes | Limits the units this rule discounts. It does not limit what the rules ahead of it already took off the line. |
| Discount Qty Step (Buy X) | Yes | The X of buy X get Y. A percentage or fixed rule needs at least this many units on a line and discounts whole steps only: five units with a step of three are discounted on three. A line with fewer units than the step takes nothing, and the rule goes on to the other lines. |
| Apply to Shipping Amount | Yes, for sales that ship | The rule's discount also comes off the shipping charge, each rule on what earlier rules left of it, and the order carries it as Magento does. A take-home sale has no charge to discount. |
| Free Shipping | Yes, for sales that ship | Follows Magento's carriers: "For matching items only" frees the matched units' share of the charge; "For shipment with matching items" frees the shipment on every carrier except Magento's flat rate, which Magento's flat rate carrier ignores in the webshop as well (Magento 2.4.8). A coupon that only grants free shipping is named as one for sales that ship on a take-home sale. |
| Store view labels | Yes | The label is what the order's discount description carries, as in Magento; a rule without a label books its name. |
| Several coupons on one cart | One code | The register holds one coupon per cart, like Magento Open Source. Adobe Commerce's multiple-coupons setting is not yet supported. |
Cart Conditions
The conditions under "Apply the rule only if the following conditions are met".
| Condition | At the register | Note |
|---|---|---|
| Subtotal (excl. tax) | Yes | |
| Subtotal (incl. tax) | Yes | |
| Subtotal after discounts | Yes | The subtotal less what the rules ahead of this one took, in priority order. |
| Total Items Quantity | Yes | |
| Total Weight | Yes on PRO | The units' weights from the product cache. The free tier has no cache, so the rule is online only there. |
| Payment Method | Online only | The tender is chosen after the cart is built. |
| Shipping Method | Yes, for sales that ship | Read from the shipment set up on the sale. A take-home sale does not meet it, and the rule is named to the cashier as one for sales that ship. |
| Shipping Postcode, Region, State/Province, Country | Yes, for sales that ship | Read from the ship-to address, a saved customer address or one typed at the register. A take-home sale does not meet them. |
| If an item is FOUND in the cart with all/any of these conditions | Yes | With every product condition below. |
| If total quantity / total amount of items matching these conditions | Yes | Quantity and row total (excl. tax). |
| Conditions added by an extension | Online only | Named to the cashier with the extension's condition type. |
| Adobe Commerce customer segments | Online only | Segment membership is not available to the register. |
Product Conditions
The conditions on the items themselves, in the cart conditions and in "Apply the rule only to cart items matching the following conditions".
| Condition | At the register | Note |
|---|---|---|
| SKU | Yes | The child SKU for a configurable product. |
| Category | Yes | |
| Product ID, product type | Yes | |
| Quantity in cart, Price in cart, Row total in cart | Yes | The row total is the net row, as Magento compares it. |
| Any product attribute set to "Use for Promo Rule Conditions" (brand, colour, size, …) | Yes on PRO; on the free tier with a setting | PRO caches the attributes with the catalog, so these rules match offline too. The free tier has no attribute cache; with Fetch Missing Promotion Attributes on (Settings, Store Configuration, Promotion Rules) the register requests a product's attributes from Magento once per shift when a rule needs one that is not cached. With the setting off, such a rule does not match and the cashier is informed. On PRO the same setting is Magento configuration and can be locked. A multiselect attribute is compared as the set of selected options, as Magento compares it, so "contains" asks whether an option is selected and not whether the stored ids contain those characters. The register reads each attribute's type from Magento when it syncs the rules; a register that has never synced online compares such a value as text. |
| Attributes of a configurable's variants | Yes on PRO | A condition is met when the chosen variant or the parent product meets it, and the "Parent Only" and "Children Only" conditions read one or the other, as in Magento. Settings, Data & Sync, "Promotion Attributes of Variants" leaves the variants out of the cache on a very large catalog. |
| Attribute Set, weight | Yes on PRO | Cached with the promotion attributes, under the same switch. |
| Comparison operators: is, is not, is one of, is not one of, contains, does not contain, greater or equal, greater, less or equal, less | Yes | Matched as Magento matches them: ignoring case, "is one of" against the whole value, "contains" as a substring. A comparison needs a number on both sides; a rule that compares a number with text does not match. |
Discount Actions
| Action | At the register | Note |
|---|---|---|
| Percent of product price discount | Yes | |
| Fixed amount discount | Yes | Per unit, never more than the line. |
| Fixed amount discount for whole cart | Yes | Spread over the matching lines in proportion, as Magento spreads it; a single line's share can differ from Magento's by a cent. |
| Buy X get Y free | Yes | Per line, as Magento counts it: every full group of X+Y units on a line frees Y; a partial group frees the units beyond X; a rule that gives more than it asks does nothing. |
| Discount taken on prices including or excluding tax | Yes | Follows your Apply Discount On Prices setting, booked with the discount tax compensation Magento books. |
| Actions added by an extension | Online only | Named to the cashier with the extension's discount type. |
Catalog Price Rules
| Situation | At the register | Note |
|---|---|---|
| A catalog rule for all customer groups | Yes | The rule price lands on the cart line the moment the product is added. |
| A catalog rule for specific customer groups, walk-in sale | Yes | The register prices as the webshop prices a visitor who is not logged in. |
| A catalog rule for specific customer groups, customer attached | Yes on PRO, with Customer Prices fetching on | The module's customer-group price resolver answers with the group's catalog rule price for the day, beside the group's tier prices, and the register charges the lower of the two for the line's quantity. Turn on Fetch Customer Prices (Terminal Defaults, Customer Prices) for it. The free tier still prices as for a visitor. |
| Product tiles | Catalog price | The rule price shows on the cart line, not on the tile. |
| Offline (PRO) | Yes | The offline catalog cache keeps the day's catalog rule prices for every customer group, refreshed with the catalog on the sync interval, so a running promotion prices the same offline. Settings, Data & Sync, "Catalog Rule Prices" leaves them out. |
Extensions
Promotion extensions (Amasty Special Promotions, Mageworx, Mirasvit and the like) add their own conditions, actions and pricing to Magento. The register reads Magento's own rule model only, so anything an extension adds is Online only and is named as such to the cashier. Loyalty programmes, store credit and gift cards from third parties already work at the register through bridges: small Magento modules that translate between the extension and the register. A promotion extension can be connected the same way; contact us if you use one.
What You See at the Counter
- A refused coupon names the reason: "This coupon uses a condition on the payment method. It can be used online." A rule on the shipping method or address reads "a condition on the shipping address, which applies to sales that ship", and applies once the shipment is set up.
- Browse in the Discounts panel lists applicable coupons first, then an Online only section with the reason per code.
- An automatic rule the register cannot evaluate appears under Auto Discounts as Not available at the register, with the reason.
- An applied coupon with an unchecked setting shows "Not checked at the register: …" under the code.