Skip to content

Register Reports

Hyvä POS is on the App Store

The free app is out for iPhone, iPad and Mac: install it from the App Store, connect your Magento store and sell. PRO, the Magento module with a license per terminal, follows shortly. News and pricing are at hyva.io/pos.

When a cashier closes the register, the register writes the closing of the session: the Z report. On the free tier the closing stays on the device, where it prints and exports as PDF or CSV. With PRO and module 1.4.0, every closing is also sent to Magento, where the back office reads the closings of every register per terminal and location, adds notes to them, and totals them over a period.

With module 1.5.0 Magento also checks each closing against the orders and credit memos the register sent, shows the registers that are open right now, and totals closings by day. Register reports need module 1.4.0 or later; the open registers, the checks and the totals by day need module 1.5.0.

What a Closing Is

A closing is the record of one register session, from the moment the register opened to the moment it closed. Several cashiers can sell into one session; a cashier change does not close it, and several sessions can close on one day.

The closing holds what the session's Z report shows:

  • the location and terminal, by id and by the names they had at the close,
  • the business date, the opening and closing times with their timezone, and who opened and who closed the register,
  • the order count, sales and refunds excluding tax, the tax and the totals including tax,
  • the tenders: cash, card, the cash and card parts of split payments, pay by invoice, credits redeemed and issued, layaway receivables and payments, Credit Due collections and cash rounding,
  • card activity per payment provider, collected and refunded,
  • the tax per rate for sales and refunds, with reverse-charge and tax-exempt sales in buckets of their own,
  • the cash drawer: opening float, cash in and cash out with their notes, expected cash, counted cash, the difference and the cash left in the drawer,
  • the documents booked into the session (sales, refunds, exchanges and layaway payments), each with its sale id, type, amount and receipt number,
  • the closing note.

A session without a cash drawer has no float, count or difference; those amounts are absent, not zero. All amounts are in the currency the session opened with. A register session keeps that currency until it closes: while a session is open, the store picker does not switch to a store view that sells in another currency.

The business date is the date the session opened, in the location's timezone as it was when the session opened. A session that runs past midnight keeps the date it opened on.

Who opened and closed the register is the signed-in cashier, by name; a cashier with a staff account is also recorded by staff id.

A closing is the register's own record of a session. It is not a fiscal closing and makes no claim of fiscal status.

Closing Numbers

Every closing carries a number, printed with the four-character code of its numbering series: Z-Report A3F9-7 is closing 7 of series A3F9. The Register Reports listing shows the same code and number.

A numbering series belongs to one install of the app on one device, under one store connection. Numbers in a series run from 1 without gaps. A reinstall, a restored backup, a new device, or a store connection removed and added again starts a new series at 1, with a new code, so no number is ever issued twice. Magento gives each series of a terminal an ordinal in the order the series arrive; the closing's page shows it as "series 2 of this terminal".

When a Closing Is Written and Sent

Tapping Close Register writes the closing to the device first, in one write, before the register leaves the open state. If that write fails, the register stays open and shows a notice. Reprints and exports read the same closing, so a closing is never numbered twice. The device keeps every closing until Magento holds it, beside the newest 100 sessions in the register history.

The register then sends the closing to Magento, right after the close. A closing Magento has not taken yet is sent again on the register's later sync passes, when the app starts and when the connection returns, so a register can close offline. The closed screen shows where the closing is: "Closing A3F9-7 sent to Magento", or "Closing A3F9-7 is kept on this device until Magento takes it".

Sending a closing takes PRO, a device activated on a terminal, and module 1.4.0. On an older module the closings stay on the device, and Reports → Sync Issues has one entry, "Closings are kept on this device", that shows the module version that takes them. When Magento refuses a closing, Sync Issues lists "Closing A3F9-7 is not in Magento" with the reason, and the closing waits there until it is retried.

Magento stores each closing once. Sending the same closing again returns the one Magento holds; a second closing for a session Magento already has a closing for, or a number already taken in the series, is refused and listed under Sync Issues.

A device that was replaced still sends the closings it holds: Magento takes them from a device the terminal was bound to before. The replacement numbers its own closings in a new series.

What Holds the Close

A cash difference never blocks the close; it is recorded on the closing. Two things do hold it:

  • Unreconciled Card Payments: a card payment the terminal took whose order has not been created yet. Retry Sync sends the order again.
  • Card payments to check: a terminal payment started in this session whose outcome the provider did not confirm. Check payments opens the Terminal Payments check, where each payment is checked with the provider or marked settled.

The register closes once each one is resolved. Payments from a terminal test, from self-checkout and from another session do not hold the close. A sale that is only waiting for its Magento upload does not hold it either.

Open Registers

Hyvä POS → Reports → Register Reports opens with Open Registers: every register whose heartbeat reports an open session, with its location, terminal, open since, cashier, documents and sales. A register that stopped reporting is marked Not reporting. An open session is a live view and becomes a closing when it is closed on the register. The terminal grid's Register column shows the same per terminal.

In Magento: Register Reports

Hyvä POS → Reports → Register Reports lists the closings, one row each, with filters, sorting and CSV export. The columns are the location, terminal, closing (series code and number, for example C4A1-41), business date, opened, closed, opened by, closed by, currency, sales including and excluding tax, tax, refunds, cash difference, order count, the four states (see the checks below), the session and report ids, and when the closing reached Magento; the column picker chooses which show. The location filter lists the store's locations; the business date filters by range.

For each card payment provider your closings name (Mollie, PAY., Manual card), the listing has a Collected and a Refunded column, which filter, sort and export like the others.

A link can open the listing filtered, for example pos/registerreport/index?location_id=3&business_date_from=2026-10-12&business_date_to=2026-10-18. The address takes location_id, currency, business_date_from and business_date_to (both days included). The filters show as chips and clear as usual.

Each row shows its amounts in its own currency. Nothing is added up across rows.

Opening a row shows the closing's page, with Back, Print and Download PDF in the action bar; the PDF is the page as an A4 document. It shows the closing as the register sent it: the closing and its series, the register session with who opened and closed it, the figures for sales and refunds per tax rate with the reverse-charge and tax-exempt buckets, the tenders, the card activity per provider, the cash drawer and its movements, and the documents of the session. Each listed document links to its receipt in Magento, or shows as not received. Below the document, the check findings (module 1.5.0): the documents not processed and why, and each figure with both sides and the difference.

A closing cannot be edited or deleted, in the admin or through the API.

The Checks

Each closing carries four states:

State Meaning
Closing Received Magento holds the closing
Documents Received Complete when Magento holds a receipt for every document the closing lists
Orders Processed Complete when every listed sale has its order, not canceled and invoiced, every refund its credit memo, and every layaway payment its booking
Figures Reconciled Matched when the closing's sales, refunds, layaway payments and tenders agree with Magento's orders, credit memos and payments to within half a cent; Mismatched otherwise; No comparison when the check ran and the closing holds no figure it compares

A state the check has not reached yet reads Waiting for check, and so do figures that wait for Magento to process the closing's orders. A closing of a session without sales reads No sales: its figures are checked to be zero on every tender, and a tender with an amount makes them Mismatched. A closing with only drawer movements (pay-ins, pay-outs, a cash refund from the RMA screen) also closes as No sales, because drawer movements are not documents. A closing of exchanges only reads No comparison once Magento has processed its orders: exchanges are not compared, and the tenders are compared only when every document is a sale. No comparison is final; a later check keeps it. A scheduled job checks closings every hour, on every pass until they are complete and matched, and for 35 days after they closed, so a refund settled later or an order canceled later changes the result. The closing itself never changes; a receipt that reaches Magento late changes a state, never the closing. The closing's page shows what the check found: the documents not processed and why, and each figure with both sides and the difference. Exchanges are not compared. The cash count and the cash difference are not compared for any closing, since Magento keeps no record of the cash drawer.

The check runs in the module's own cron group, hyva_pos_remote. A cron setup that runs only the default group leaves every closing at Waiting for check; see global settings.

Notes on a Closing

Under the closing, Annotations lists the notes added in Magento, each with its author and time. An admin user whose role has Annotate Register Reports adds one with Add Annotation. A note changes no figure, and a note cannot be edited or deleted. Adding one gives the closing a new revision, so a connector reading the API sees it again.

In Magento: Register Totals

Hyvä POS → Reports → Register Totals adds up the closings whose business date (the day a session opened, in its location's timezone) falls in a period, the month to date by default, for one location or all, per Location, Terminal, Day, Day and location or Day and terminal, in one table per currency with a total row. Next to sales and the cash, card, split and invoice tenders it shows Collected and Refunded per card provider, the cash difference split into Cash Over and Cash Short, and how many closings have all their documents and reconciled figures. A closing with No sales counts as complete and reconciled, and a closing with No comparison counts as reconciled: the check ran over it and nothing on it is waiting or mismatched. Export CSV exports the table.

At the Location and on the Dashboard

A location's edit page lists that location's closings in its Register Reports section; see locations. The POS Register Closings dashboard widget shows the closings of a period and the registers open now on the Hyvä Admin Dashboard.

Receipts and Their Closing

Every sale, refund, exchange and layaway payment records the register session it was booked into, and its receipt carries it to Magento. The receipt's page in Hyvä POS → Store Setup → Receipts shows the register closing the receipt was booked into.

Permissions

Permission (Magento role resource) What it allows
Register Reports The Register Reports listing, the closing's page, Register Totals, and reading closings through the API
Annotate Register Reports Adding an annotation to a closing
Upload Register Reports Sending closings to Magento. The register's own role or integration needs it; installing module 1.4.0 grants it to every role and integration that may upload receipts

Who may close the register at the counter is the Close Register permission of the cashier's role.

For Developers

Closings are readable through GET /V1/pos/register-reports and GET /V1/pos/register-reports/:reportId, with a revision cursor for connectors, and Magento dispatches hyva_pos_register_report_saved after every stored or changed closing. See the API reference.

Requirements

  • Hyvä POS PRO on a device activated on a terminal, with the register at 0.3.0 or later; the open registers need the register at 0.4.0 or later.
  • Module 1.4.0 or later; the checks, the open registers, the provider columns, the PDF, the totals by day, the location section and the dashboard widget need module 1.5.0.

Not in This Release

  • No closing from the admin, no shared cash drawer across devices, no reason codes on cash movements, and no email on close.
  • No X reports in Magento: an X report stays on the device.
  • The cash count and the cash difference are not compared: Magento keeps no record of the cash drawer.
  • No accounting or ERP connectors; the API and the event are where one connects.
  • No grand total carried across closings, no booking of a card payment settled after its session closed, and no correcting documents: a closing is corrected with an annotation.