Products and Stock
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 catalog on the register is your Magento catalog, live: no imports, no separate product database to babysit. The app reads products, categories, prices and stock straight from Magento's REST API, and it only writes back when the cashier deliberately changes something - a stock adjustment, never a product edit.
Browsing and Search
Search by name or SKU, browse the category tree, and filter by status, type, visibility or category. Search feels instant because matching products appear from the local catalog cache first, while the authoritative Magento results load in the background and replace them moments later.
Opening a product shows images, description, custom attributes, tier prices and stock per source - useful mid-sale when a customer asks "does this come in blue?". Offline, browsing and search keep working against the cached catalog (see Offline Product Cache).
Barcode Scanning
- Bluetooth scanners in HID mode work out of the box.
- MFi scanners (Socket Mobile and similar) connect natively.
- The iPad camera scans barcodes too, so a register works before any hardware arrives.
A scan resolves against the local SKU cache - SKU first, then the barcode attribute - so the line lands in the cart without waiting for the network. Live price and stock refresh right after. Hardware options are on the barcode scanners page.
Product Types at the Register
- Simple products add straight to the cart.
- Configurable products open an option picker (size, color, and so on); the resolved variant is what is sold and what deducts stock.
- Grouped products open a list of their children, each with its own quantity stepper; every selected child becomes its own cart line, exactly like on the storefront.
- Bundle products open the bundle picker with required and optional selections and quantities.
How Bundles Reach Magento
Magento's order API cannot reproduce the bundle-parent-with-child-lines structure a storefront order has - a long-standing platform limitation, not a POS one. So when a POS sale contains a bundle, the app writes the Magento order with one line per component simple. The charged bundle price, tax and discount are distributed across the components penny-exactly, so the lines always sum to precisely what the customer paid, and every component deducts its own stock and ships correctly.
The customer never sees this: the receipt shows the bundle as one line at its bundle price. Only the Magento order record carries the flattened components.
Price Display and Tax Mode
Prices on the register can show Excluding Tax, Including Tax, or Both. This only changes what the cashier sees - tax itself is always calculated from Magento's tax rules and rates, which sync to the device, so the register's totals match the webshop's to the cent.
Set the display mode under Settings → Pricing & Tax: Display Product Prices in Catalog for the product grid, and separate Display Prices and Display Subtotal pickers for the cart. Mirror your store's Stores → Configuration → Sales → Tax display settings so both channels present prices the same way. On PRO, a Sync from Magento button pulls these values, and the admin can lock them from global settings - a locked setting shows as managed on the register, and the Magento value wins.
Stock at the Register
Every product's stock is one tap away. With Multi-Source Inventory, quantities show per source; without MSI, the register shows the single Magento stock figure. The numbers are Magento's on-hand source quantities, read live from the inventory API.
Which shelf the register sells from is Settings → Store Configuration → POS Inventory → Shipment Source. Every stock check then runs against that source specifically - not an aggregate across warehouses that would mask a local shortage. Reduce Stock on POS Sale, in the same section, controls whether POS orders create a shipment and deduct stock at all. On PRO, terminals bound to a location inherit the source from the location, so every register in a shop is configured identically.
Cashiers can also change stock, and each save writes straight to Magento's inventory:
- Take in a delivery by scanning it in - see below.
- Set quantities directly, per source, including for the children of configurable products.
- Review recent changes in the on-device adjustment history - who, when and why, exportable as CSV - and roll back a mistake.
If your store keeps stock in more than one place, read inventory sources and stocks first. Which source the register sells from, and which one a delivery lands in, are separate settings.
Receiving a Delivery
A box of t-shirts arrives at the shop. Twelve of them, four sizes, and nobody wants to type twelve quantities into the admin.
- Open Stock and turn on Auto-increase stock above the search field.
- Pick the Source the delivery is landing in. On a single-source store there is nothing to choose. On a split setup this is the difference between the shop shelf and the warehouse, so check it before the first scan - the picker defaults to the first source, not necessarily yours.
- Scan the first shirt. The register resolves the barcode, adds one unit to that source, saves it to Magento immediately, and confirms on screen.
- Keep scanning. Two of the same size means scanning it twice. There is no quantity to type and no Save to remember.
Because each scan saves on its own, a delivery half-counted is still a delivery half-counted correctly: stop whenever you like and the units already scanned are in Magento. Nothing is held in a draft that could be lost.
Configurable products resolve to the child that owns the barcode, so scanning a medium adds to the medium and not to the parent. Parents hold no stock of their own in Magento's inventory.
Every scan lands in the adjustment history with the cashier's name, so a miscount is traceable and reversible rather than a mystery a week later.
Low Stock
Stock checks run in the background after a line is added, never blocking the scan. Cart lines wear a Low Stock badge when the selling source is at or below the threshold, which defaults to 10 units; on PRO the threshold is set per location in the Magento admin and syncs to every register. Product screens flag stock slightly above the product's own minimum quantity, so the warning arrives before the last unit sells, not after.
Selling Through a Shortage
Before payment, the register compares every line against the on-hand quantity at its source and lists any shortfalls. What happens next is a policy you choose under Settings → Store Configuration → POS Inventory → Insufficient stock (shown when stock reduction is on):
- Warn but allow (default) - badges inform, checkout proceeds.
- Confirm at checkout - one dialog lists the short lines; the cashier confirms deliberately.
- Hard-block - checkout stops until the cashier resolves the line.
When the customer is holding the item, the cashier resolves with Sell anyway on the line (available when Magento allows backorders). The sale completes at negative stock, and on PRO the override is logged server-side so stock drift gets reconciled instead of silently accumulating.
Offline Product Cache
The register keeps a slim copy of the catalog on the device: SKU, name, price, tax class, barcode, categories and thumbnail per product, encrypted at rest. It powers instant scanning, instant search suggestions, and full browsing when the connection drops.
Configure it under Settings → Data & Sync: the Offline Catalog Cache toggle, a Sync Interval picker, and a Last synced timestamp so the cashier can see how fresh the copy is. Fast Product Lookup keeps the index in memory for the quickest scans. One consequence to know: a product added to the catalog after the last sync is not scannable until the next sync completes.
Barcode Labels
With a label-capable printer connected, print barcode labels for products straight from the product screen - new delivery in, labels out. Which product attribute holds the barcode is set per label printer under Settings → Barcode Labels (the default attribute code is barcode).
PRO
PRO adds per-line source selection at checkout (sell this one from the warehouse in the back), stock transfers between sources with an audit trail, stock-discrepancy reporting in the Reports tab, and customer-specific pricing from contracts or an ERP.