Checkout and Cart
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 cart is the center of the register: scan or search products into it, adjust, discount, attach a customer, and take payment. The register prices the cart on the device and places the finished sale as a real Magento order through the order API - one call, exact register amounts, line by line, tax by tax. Why it works that way, and what it means for your Magento data, is explained in how orders are placed.
Building a Sale
- Scan to cart: a barcode scan adds the line instantly. The app keeps an in-memory index of your catalog (SKU, barcode, price, tax class, tier prices), so a scan resolves without touching the network - lookup is SKU first, then barcode. The line appears at the cached price; live stock and any customer-specific price are fetched in the background, and the line updates if the fetched price is lower.
- Search and browse: full product search and category browsing, straight from Magento. Configurable products open their option picker; bundle and grouped products are supported.
- Line detail: tap a line's thumbnail to open the product in full - description, attributes, images, stock per source, categories - useful when a customer asks "does this come in blue?" mid-sale.
One consequence of the local index to know: products added to the catalog after the last cache sync are not scannable until the next sync completes. The sync interval is configurable in Settings → Data & Sync.
Custom Line Items
Not everything a store sells has a SKU - a repair charge, a service fee, an odd item from the shelf. A custom item gets a free-form description, a price (entered including or excluding tax, your choice per entry), a tax class picked from your synced tax rates, and a quantity. The sheet remembers your last ten custom items, and any of them can be pinned as a Quick Action tile for one-tap reuse.
Behind the scenes the line books onto a placeholder simple product. Create one in Magento, then set its SKU once in Settings → Store → Advanced under Custom Item SKU - the order line carries the custom description and price, so Magento reporting stays truthful while the catalog stays clean. Leave the SKU empty to disable custom items entirely.
Discounts and Coupons
Line and cart discounts, coupon codes validated live against Magento's cart-rule engine, promotion rules, tier prices and customer pricing all apply at the register. The full story, including how each lands on the Magento order, has its own page.
Tax Handling
The register calculates tax on the device using Magento's own model: the same calculation settings (prices including or excluding tax, tax before or after discount, subtotal vs row total), the same rates, the same rules. The result on the Magento order is the exact amount from the cash drawer.
Where that configuration lives depends on your tier:
- Free: set the calculation and display settings in Settings → Store → Pricing & Tax to match your Magento configuration at Stores → Configuration → Sales → Tax. Keeping them in agreement is on you - the placing-orders page explains why.
- PRO: the same screen syncs from Magento (a Sync from Magento button pulls on demand; the heartbeat picks up changes within minutes). Your administrator can additionally lock tax settings from the Magento side - locked fields show a "Managed by Magento" badge on the register and cannot be edited there. Magento wins.
Two register-specific tax features live at the bottom of the same screen: Reverse Charge (EU) applies 0% VAT for intra-community B2B sales (the receipt says so, and a note lands on the Magento order), and Tax Exempt Sales lets the cashier mark an individual sale tax-free for eligible customers. Both are off until you enable them.
Customers on the Sale
Attach a customer by searching name, email or phone, or create one at the register. The sale then books to their Magento account: their order history grows and their group pricing applies. Without a customer, the sale books to your walk-in default - hard-coded on Free, configurable per location on PRO (Settings → Store → Walk-in Customer, or centrally from the Magento location form).
Notes
- Park note: when you park a cart you can attach a comment ("blue jacket, back at 3"), shown when the cart is recalled.
- Order comments: every placed sale writes order comments into Magento's status history - "Order placed via Hyvä POS" (with the cashier's name on PRO), the payment detail (cash tendered and change, card reference, split breakdown), and exchange context linking back to the original order and credit memo. Your back office sees what happened at the register without leaving the order screen.
- After the sale: cashiers can add notes to any Magento order from the Orders tab, on both tiers.
Parking a Sale
Someone forgot their wallet in the car? Park the cart with a note and help the next customer; recall it when they are back. Parked carts survive app restarts.
PRO
With PRO, parked carts are shared between registers at the same location, so the customer can complete the sale at whichever counter is free. PRO also adds layaway (deposit now, pay later), pay by invoice for B2B, and special orders with mixed fulfillment.
Taking Payment
Checkout offers the tenders you enabled in Settings → Payments: cash with change math and cash rounding, card through an integrated terminal or by manual reference, pay by invoice on PRO, and split payments combining cash and card. Details, including exactly what each tender records on the Magento order, are on the payments page.
After the Sale: Handover
The success screen shows the change due, prints the receipt automatically if auto-print is on (and kicks the cash drawer on cash sales), and offers reprint and email actions. It also has a Hand over to customer button: the iPad flips into a full-screen customer-facing mode where the buyer self-serves their receipt - a large email field that sends the receipt, and a QR code that opens the receipt on their phone. Cashier chrome is hidden, and returning to the register takes a deliberate long-press so a curious customer cannot tap their way into the register.
The email option works on both tiers (Free sends Magento's order or invoice email; PRO sends a rendered receipt image). The QR code requires PRO, because it points at the receipt page that receipt sync publishes on your Magento store.
When the Network Drops
- Free: placing a sale needs a connection. With no network, checkout stops with a clear message before any money changes hands - nothing is half-recorded.
- PRO: the sale completes normally at the register. The finished order waits in the offline queue, the receipt prints from the local record, and the queue drains automatically on reconnect. Every sale carries a unique id, so a retry after a network hiccup returns the existing Magento order instead of creating a duplicate.
Either way the local receipt is saved on the device first, before any network call - see local receipts.
Where Checkout Is Configured
| What | App | Magento (PRO) |
|---|---|---|
| Payment methods, split payments, cash rounding | Settings → Payments | Stores → Configuration → Hyvä → POS, per-location overrides, optional lock |
| Tax calculation + display | Settings → Store → Pricing & Tax | Synced from Stores → Configuration → Sales → Tax, optional lock |
| Custom Item SKU | Settings → Store → Advanced | - |
| Walk-in customer | Settings → Store → Walk-in Customer | Location form |
| Pickup buttons + pickup queue | Settings → Store → Checkout | Location form |
| Catalog cache sync interval | Settings → Data & Sync | - |
On Free, the app is the only place to configure anything. On PRO, Magento pushes defaults to every register; a changed default arrives as an "Apply / Keep Local" prompt on the device, and fields your administrator locks arrive managed - badge shown, editing disabled, Magento wins. See global settings.