Global Settings
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.
Stores → Configuration → Hyvä POS holds everything that applies chain-wide. It has five sections: General, Terminal Defaults, Payments, Lock Settings and Advanced. Locations inherit these values and can override most of them per store, field by field.
How Settings Reach Devices
Registers pick up changes through their heartbeat: the device checks in every 5, 15, 30 or 60 minutes (a device setting, default 15), compares a configuration hash, and pulls the new configuration only when something changed. Expect a change to reach devices within minutes, not instantly. If a change never arrives, Magento cron and the heartbeat interval are the first two things to check.
General
- Version: the installed module version and update check.
- Hyvä POS License Connection: the API Key and API Token generated on your hyva.io account (see buying and licensing). The token is stored encrypted. With these set, the module fetches your licenses (a cron job syncs automatically; the Fetch Licenses button on the Licenses grid syncs on demand, right after you bought a new terminal) and renews license tokens.
- Enable POS: master switch for the POS system.
- Require Staff Login: the app must require staff PIN login before the register can be used. This is enforced from Magento - the app cannot bypass login even if someone disables it locally.
- Require Terminal Registration: devices must be activated on a registered terminal to operate; unregistered devices are locked out. This is your remote kill switch: deactivate a terminal in the admin and the device locks within its next heartbeat - useful when a device is stolen or an employee leaves.
- Default POS Order Status: the order status POS orders are created with.
- Share Held Carts: held carts are shared between all terminals at the same location, so a sale parked on one register can be recalled on any other. See held carts.
Terminal Defaults
Chain-wide defaults every location inherits unless it overrides them on its own edit screen.
Receipt Defaults - the fields follow the printed receipt top to bottom:
| Field | What it does |
|---|---|
| Default Header Display | Which elements the receipt header renders: the logo, the store name, or both |
| Default Receipt Logo / Logo Size | Pre-filled logo for new locations, and its display size on the digital (web / PDF / email) receipt |
| Default Receipt Header / Footer | Free text printed at the top / bottom; locations can override unless locked |
| Default Store Info Template | The address block. Uses {{var fieldname}} syntax (name, street, city, region, postcode, country, phone, vat_nr); \| splits a line into 2 or 3 columns; lines that resolve to empty drop out |
| Default Store Info Placement | Where the store-info block sits: above the items, below the totals, or hidden |
| Default: Show Staff Name / Staff Name Format | Print the cashier name next to the terminal name; the format can print a 5-character staff ID instead of the name |
| Default: Show Magento Order Number | Print the order increment ID on the receipt header |
| Default Receipt QR Text / QR URL | Caption and URL of the receipt-bottom QR code; an empty URL disables the QR entirely |
Checkout Auto-Print - three independent switches for what prints automatically on checkout success: the customer's order receipt, a CUSTOMER COPY terminal slip, and a MERCHANT COPY terminal slip (with EMV audit fields). Each is its own print job: auto-cut printers cut between them, tear-off printers prompt for tear-and-continue.
Walk-in Customer Defaults - the name, email and address stamped onto sales booked without a registered customer. Name defaults to "POS Customer"; empty email, phone and address fields fall back to Stores → Configuration → General → Store Information.
Layaway Defaults - the layaway guardrails: Minimum Deposit (%) (default 25), Expiry (days) before a layaway is flagged stale (default 30), and Cancellation Fee (%) retained from the deposit on cancellation (default 0).
Pickup Defaults:
- Auto Ready: Backorder Pickup: backorder shipments flip to Ready automatically as soon as stock arrives at the source (checked every 5 minutes by cron).
- Auto Ready: Online In-Store Pickup: online pickup shipments flip to Ready on creation.
- Post-Pickup Order Status: the order status applied when a pickup is marked collected at the register; empty keeps whatever Magento set.
- Damaged-Stock MSI Source Code: where damaged-condition RMA returns are booked; empty falls back to the location's main source with a stock comment.
- Default Pickup Queue Filter: the filter the register's pickup queue opens with (all / ready / awaiting stock / stale). The queue is scoped to the location's MSI source. The ready-count badge on the register's Pickup tile uses opt-in polling configured on the device itself, not here.
Stock - Default Low Stock Threshold: at or below this quantity the register shows a low-stock warning before selling.
Payments
- POS Payment Methods: which tenders are enabled by default for new locations.
- Card Payments → Mode: Manual (no terminal integration; the cashier confirms the transaction) or Mollie (payments sent to a physical Mollie terminal). Additional PSPs will appear here as they are added.
- Card Payments → Mollie: the Organisation ID, live and test API keys, and Mollie Test Mode. Magento Payment Method (Mollie) picks which Magento payment method records Mollie-routed card sales: with the Mollie POS module installed, choosing Mollie POS lights up the native integration (refunds, dashboard links, webhook status updates); without it, pick any active method and POS records the payment generically.
- Pay by Invoice: Method chooses the backing Magento payment method - Check / Money Order (default), Bank Transfer or Purchase Order (all must be enabled under Stores → Configuration → Sales → Payment Methods), or POS Invoice, a Hyvä-shipped POS-only method that keeps these orders in their own reporting bucket. Invoice Behavior controls what happens at checkout: create an open invoice (default - the receivable is visible in admin, mark it paid later), create no invoice, or create a paid invoice. Use Customer Credit Limits gates the feature by the customer's
hyva_pos_credit_limitattribute. See pay by invoice. - Refunds → Enable Built-in Refund: show or hide the standalone Refund tile on the register's order-detail screen. Hide it when an external RMA module owns your refunds and cashiers should refund exclusively through the RMA wizard.
- Refunds → Online Refund Validity (days): how long after payment the original payment method is assumed refundable through its payment provider. Refund windows are set by the provider and differ per provider and per payment method - anywhere from 90 days to a year or more, and some methods have no limit at all - so check your provider's documentation. The default is a conservative 120 days. Once the window has passed, the register shows a hint on the "Original Payment" and "Terminal" refund options - it never blocks them, because the provider is the authority and a store running several providers may find another one still accepts the refund. Set 0 to turn the hint off. Locations inherit this default and can override it per store.
Lock Settings
Every pushed default can be a suggestion or a rule. Lock Settings → POS Field Enforcement holds a Yes/No lock per field: a locked field arrives on the register as managed - the control shows a badge and is disabled, so a well-meaning cashier cannot "fix" the receipt footer on one register and break the chain's consistency.
Lockable fields: receipt header, receipt footer, "show staff name on receipt", "show order number on receipt", the receipt QR code, payment methods, the Mollie Magento payment method (locking it also overrides any per-location routing), the Mollie configuration, pay-by-invoice method, pay-by-invoice invoice behavior, store details (address, phone, VAT), tax settings, low stock threshold, held-cart sharing, POS navigation categories, walk-in customer defaults, the pickup queue filter, customer price fetching, and the online-refund validity window.
Advanced
- Credit & Return Providers: when multiple credit / gift-card / reward / RMA modules are installed, pick which one the POS uses per feature: Store Credit Provider, Gift Card Provider, Reward Points Provider and Return (RMA) Provider. Only installed and enabled bridge modules appear in each dropdown. The RMA provider's "-- Auto-detect --" uses an installed vendor bridge when present and falls back to the built-in POS returns flow; vendor RMA applies to shipped items, in-store sales without a shipment always use the built-in flow.
- Self-Checkout: parameters for the customer email one-time-code sign-in on self-checkout kiosks: code length (default 6), validity (default 180 s), wrong-attempt limit (default 5), resend cooldown (default 30 s), and per-email / per-terminal hourly rate limits (5 / 20).
- Telemetry & Diagnostics: optionally collect anonymous diagnostics from your devices - which iPads run low on memory, which API requests are slow. Off by default. Force Enable on Terminals removes the device-side opt-out (a notice is shown in the app's settings). Upload hour, raw-data retention (90 days) and aggregation window (7 days) are configurable; the data is browsable under Hyvä POS → Operations → Telemetry.
- Fiscal Data Export: how often DSFinV-K + TAR exports are generated from fiskaly - daily, monthly, or both (recommended). See fiscal compliance.
Scheduled Jobs
The module registers six cron jobs on Magento's default cron group:
| Job | Schedule | Does |
|---|---|---|
hyva_pos_license_refresh |
every 6 hours | Renews license tokens and syncs license status from hyva.io |
hyva_pos_fiskaly_export |
daily 02:00 | Generates fiscal exports |
hyva_pos_telemetry_cleanup |
daily 04:00 | Purges and aggregates telemetry |
hyva_pos_self_checkout_otp_purge |
hourly | Deletes expired kiosk sign-in codes |
hyva_pos_auto_ready_backorder_pickups |
every 5 minutes | Flips backorder pickups to Ready when stock arrives |
hyva_pos_flag_stale_layaways |
hourly | Flags layaways past their expiry |
If cron is not running, licenses eventually fail to renew and exports stop appearing - cron health is POS health.
Troubleshooting
- Fetch Licenses fails or the grid stays empty: the API key or token is wrong, or belongs to a different store on hyva.io. Re-enter both and save before retrying.
- A setting change never shows up on the register: wait one heartbeat interval, then check the terminal's Last Seen At on its edit form. A stale timestamp means the device is not checking in (asleep, offline, or app closed) - the setting arrives at the next heartbeat.
- A cashier keeps changing a setting back: that field has no lock set. Enable the matching lock under Lock Settings; the register's control turns managed at the next heartbeat.