Skip to content

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 where a sale is built: 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 Magento order through the order API in one call, carrying the register's amounts line by line and tax by tax. How that works, 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.

One consequence of the local index: 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.

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 your Magento reporting stays correct. Leave the SKU empty to disable custom items entirely. On PRO the SKU comes from Custom Sale Product SKU under Stores → Configuration → Hyvä POS → General, and Lock Custom Sale Product SKU keeps the device from changing it.

Discounts and Coupons

Line and cart discounts, coupon codes (read from Magento's cart rules and evaluated on the device, never validated through a Magento cart), promotion rules, tier prices and customer pricing all apply at the register. Details, including how each lands on the Magento order, are on 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 amount on the Magento order is the amount collected at the register.

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 manual on this tier; the placing-orders page explains why.
  • PRO: the same screen takes its values from Magento as they arrive with the heartbeat, within minutes; a Sync from Magento button pulls on demand. Your administrator can additionally lock tax settings from the Magento side: locked fields show a lock and a Magento badge on the register and cannot be edited there.

When the rate cannot be determined. The register matches Magento's rates the way the storefront does: by country, then by region and postcode where the store's rates use them. A location that lacks a region or postcode its rates need cannot resolve the rate for the affected product classes. Those lines show "Tax rate cannot be determined", every payment method is off, and placing the order refuses with the fix: set the region or postcode on the location in Magento (PRO), or in the register's store location and Settings → Store → Pricing & Tax (free). A product class with no rate at a complete location sells at 0%, as it does in the webshop, and the register lists it under sync issues so you can check the tax rules.

When more than one rate applies. Some countries charge two taxes on the same line: GST plus PST in most of Canada, CGST plus SGST in India, state plus municipal IVU in Puerto Rico. Magento combines them into one figure per line, and receipts in those countries have to show each part separately. The register prices a product class with a single rate and does not model the separate parts yet, so it does not sell those lines: they show "Stacked tax rates not supported", every payment method is off, and the sync issues list names the affected product classes with the rates involved. Nothing in your store is misconfigured and nothing there needs changing. The rest of your tax table keeps working.

Fixed product taxes. A product with a recycling, disposal or WEEE fee charges that fee at the register, per unit, for the country and region the register sells in. PRO reads the store's settings from Magento: whether the fee is taxed, whether it sits in the subtotal, and how it is shown beside the price. On the free tier the register charges the fee on top of the line, outside the subtotal, without tax on it, and names it under the line; if your Magento is configured differently, those settings need the module to reach the register.

Magento's product list does not carry fee amounts, only a single product read does. A PRO register with module 1.2.0 or later syncs the store's whole fee table with its catalog, so every product knows its fee before it is added, offline as well. On an older module and on the free tier the register reads the fee from Magento the first time a product is added in a session. Placing the order waits for that answer where it is still missing: when the fee cannot be confirmed while the register is online, the order refuses with the product named, and the cashier tries again once the connection is back. Offline, a register without the synced table sells the product without its fee.

Zero tax rows. A sale whose tax comes to zero, a free product for example, prints no VAT rows unless Magento's Display Zero Tax Subtotal is on. With the setting on for sales documents, the receipt prints one VAT row per rate the lines carry, at 0.00; with it on for the shopping cart, the register's totals and the customer display show the same. Both settings come from Magento with the other tax display settings (PRO, module 1.2.0 or later) and are off by default, as in Magento; the free tier keeps them off.

The fee is shown the way your Magento says to show it: inside the price with a line naming it, beside the price, or silently, following Display Prices in Sales Documents. The customer display shows what the counter screen shows, and the printed receipt names the fee under the line it belongs to. Where the fee is not part of the subtotal it prints as a row of its own, without VAT; the VAT on a taxed fee is in the VAT rows, the way Magento totals it.

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. On the free tier that is a per-device setting, Settings → Walk-in Customer; on PRO it comes from Magento (Stores → Configuration → Hyvä POS → Terminal Defaults → Walk-in Customer Defaults, overridable per location). See guest and walk-in sales.

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 this on the order screen in the Magento admin.
  • After the sale: cashiers can add notes to any Magento order from the Orders tab, on both tiers.

Parking a Sale

A customer forgets 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. A cashier recalls their own held carts; recalling a cart another staff member parked needs a role with the Recall Any Cart permission. 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 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 device switches to a full-screen customer-facing mode where the buyer handles their own receipt, with a large email field that sends the receipt, and a QR code that opens the receipt on their phone. Cashier controls are hidden, and returning to the register takes a long-press rather than a tap.

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 message before payment is taken; nothing is 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 connection failure 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 → Payments → POS Payment Methods, 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 Custom Sale Product SKU under Stores → Configuration → Hyvä POS → General, optional lock
Walk-in customer Settings → Store → Walk-in Customer Stores → Configuration → Hyvä POS → Terminal Defaults → Walk-in Customer Defaults, per-location override
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's values apply on every register as they arrive, and the register lists each change under Applied by Magento (Settings → Data & Sync). A field your administrator locks shows a lock and a Magento badge and cannot be edited on the device; an unlocked field can be edited there, and the edit holds until Magento's value next changes. See global settings.