The platform
Six modules, one Postgres ledger. Every sale, count, and payment posts double-entry journals the moment it happens, so the books are never a separate job.
Capabilities
Each group below is a set of behaviors of the same database, not a separate product. Nothing here is an integration.
A register built for the counter: fast line entry, strict identity, and a sale that lands in the ledger the moment the drawer closes.
PIN cashiers
Cashiers sign in with a PIN, not a shared login. Every sale carries the person who rang it.
Per-terminal assignment
Staff are assigned to specific locations and terminals, so a PIN only works where it should.
Registered devices
Each terminal is activated once with a one-time code and bound to a single register.
Supervisor approvals
Overrides take a supervisor PIN and are stamped on the transaction. The cashier session never switches.
Barcode line entry
Scan to add lines. Batch and serial items route through the right prompts automatically.
Posting at the counter
Every sale writes stock movement and journal lines in one transaction. There is no end-of-day sync.
Stock is a stack of dated cost layers, not a single number. Cost flows out the way it came in, and every movement is traceable.
FIFO cost layers
Every receipt opens a cost layer. Sales consume layers oldest-first, so margin is real, not averaged.
Batch and expiry lots
Lots carry batch numbers and expiry dates on the layer itself. Sell and count by lot.
Serial tracking
Serial-numbered units are tracked one by one from receipt to sale, return, or adjustment.
Stock counts with zero-fill
Count what is on the shelf. Uncounted products can be zero-filled in one step, so the count is complete.
Adjustments that post
Gains and losses from counts and corrections post their own journal entries, at layer cost.
Stock by location
Quantities, layers, and counts are kept per location, so each store sees its own shelf.
Double-entry is not a report bolted on afterwards. It is the substrate: every document writes balanced journal lines the moment it posts.
Journals behind everything
Invoices, purchases, returns, payments, and adjustments all write balanced debit and credit lines.
Multi-currency with FX
Documents keep their transaction currency and rate. Realized FX gain and loss post automatically.
Payment allocation
Payments apply against open documents, and credits from returns, advances, and journals can settle them too.
Aging that ties out
A/R and A/P aging reconciles to the ledger balance, including unapplied credits, to the cent.
Statements per currency
Customer and vendor statements read straight from journal lines, in base or any transaction currency.
Printable templates
Every document type prints from an editable template: invoices, credit notes, payments, and more.
One company, one chart of accounts, many counters. Each location keeps its own numbering, stock, and staff without splitting the books.
Per-location numbering
Document numbers are allocated per location from configurable prefix sequences. No gaps, no clashes.
Stock transfers
Move stock between stores with documents that carry cost layers along, not just quantities.
Rosters per store
Terminals and cashier assignments are managed per location, so staff exist where they work.
One chart of accounts
All locations post into the same ledger. Consolidated statements need no consolidation step.
Role permissions
Access is granted per resource and action: who can post, who can void, who can backdate.
Location-aware reports
Sales, purchases, and stock reports filter by location while the ledger stays whole.
The counter cannot wait for the network, and the ledger cannot tolerate races. Both constraints are designed in, not patched around.
Ordered offline replay
When the connection drops, sales queue locally and replay in order once it returns. Nothing is lost or reordered.
Offline PIN sign-in
Cashier PINs verify locally against derived, expiring verifiers. The store opens even when the internet does not.
Serialized posting
Advisory locks per company and product keep FIFO layers correct under concurrent registers.
Built for long documents
Cursor-paginated lists and line-at-a-time saves handle documents with a thousand-plus lines.
Streaming exports
Every filtered list streams to CSV with the same filters applied, however large the result.
Realtime dashboards
Sales, margin, and cash positions update live as terminals post through the day.
The trace
Follow a single line item through the system. Every step is the same transaction, in the same database.
Register
A cashier scans one item at the counter.
T-02 / qty 1 x 24.00
Stock layer consumed
The oldest cost layer gives up one unit.
layer #4812 / 36 -> 35 @ 9.40
Invoice posted
The sale becomes a numbered document.
INV-000241 / total 24.00
Journal lines
Balanced debits and credits, including cost.
DR cash 24.00 / CR sales 24.00 / DR cogs 9.40 / CR inventory 9.40
Reports
Margin and balances update in place.
margin 60.8% / live
Baseline
The ledger is not an upsell. These are floor features, present from the smallest plan up.
Three plans, priced like a utility. No per-module fees.