Cubes ERP
Operations · confirms today

Operations never wait for accounting.

In most ERPs, confirming a delivery writes a journal entry on the spot. A missing account, a locked period or an absent accountant stops the warehouse. Cubes keeps the two apart: operations record facts and keep moving, the accountant turns facts into journals when ready, and a reconciliation proves they agree — to 0.000.

Accounting · posts when ready
Ledger = Operations − Unposted
Δ 0.000

Confirm a delivery, a receipt, a payment. The accountant reviews and posts in their own time. The difference stays at zero, by construction.

Cubes ERP · Meridian Trading · live simulation, synthetic data
Accountant in
Operations · warehouse and cash Storekeepers and cashiers confirm documents. Each one is done the moment it is confirmed.
    Confirmed today 0 Blocked by accounting 0
    Accounting · the accountant's desk Reviews each projection and posts the journal, in their own time.
    Waiting for review 0
      Posted 0
        Reconciliation · inventory Ledger 1,284,930.50 = Operations 1,284,930.50 − Unposted 0.00 Δ 0.00balanced
        Send the accountant home with the switch: the left side keeps confirming, the pile in the middle grows, and the bottom line stays at zero.

        With the accountant at the desk or away, none of these numbers move.

        0journal entries written by operations staff
        1reviewed queue for every accounting effect
        0.000reconciliation delta, by construction
        5domains reconciled: inventory, receivables, payables, cash, cheques
        In practice

        What changes on an ordinary Tuesday.

        Seven situations every company knows, in an ERP that writes journals from operational screens, and in one that keeps operations and accounting apart.

        A product category has no cost-of-goods account

        Typical ERP

        The delivery fails with an accounting error. The truck waits until someone with accounting rights fixes the configuration.

        Cubes

        The delivery confirms. Its accounting event is queued with a named exception. The accountant fixes the mapping and regenerates, whenever that is.

        The accountant is on leave for two weeks

        Typical ERP

        Either operations stop at the first accounting error, or two weeks of unreviewed journals pile up for someone to untangle.

        Cubes

        Operations continue. Events wait in the queue. Nothing posts without review, and the month cannot close until it has been reviewed.

        A storekeeper confirms a goods receipt

        Typical ERP

        A journal entry appears in the ledger, written by someone who has never seen a chart of accounts.

        Cubes

        Stock, cost and the vendor balance update. No journal exists yet. The accountant produces it from the projection, and can read it before it exists.

        A posted entry turns out to be wrong

        Typical ERP

        The accountant reverses it by hand. The operational document and the ledger now disagree.

        Cubes

        The input is fixed and the event regenerated. Reversal and repost are chained automatically, and the document still matches the ledger.

        A cashier needs a customer's balance right now

        Typical ERP

        The balance is a ledger figure. It is right only once everything has been posted.

        Cubes

        The balance is operational, updated at confirm, used by statements and credit limits immediately. Posting cannot change it.

        Month end

        Typical ERP

        Stock is reconciled to the ledger by hand, and the differences are hunted for days.

        Cubes

        A reconciliation report per domain: ledger = operational truth − unposted. Zero, or a named difference with a drill-down.

        Who has to understand what

        Typical ERP

        Operations staff see journal entries. Accountants see operational noise.

        Cubes

        Documents carry no journal and no accounting status. Accounting state is a queue badge, on the accountant's screen.

        How it works

        Two authorities. One reconciled ledger.

        A document is an operational fact. A journal is the accountant's reading of that fact. Cubes keeps them apart in time and in authority, and proves they agree.

        1

        Operations confirm

        Order, delivery, receipt, payment, transfer. Done the moment it is confirmed, whatever accounting is doing.

        • Official number allocated
        • Stock and cash move at captured cost
        • Balances, audit and print evidence, in one transaction
        2

        The accountant reviews

        Each financial effect becomes one event with its projection: the journal it would produce, readable before it exists.

        • Post it, or fix the input and regenerate
        • Auto mode per company; a failure blocks the event, never the document
        • Nothing posts behind the accountant's back
        3

        The ledger reconciles

        Append-only journals, reconciled per domain against operational truth.

        • Ledger = operations − unposted effect
        • Δ 0.000, or a named exception
        • Period close only on an empty queue
        1. Drafttemporary id · watermark · no effect
        2. Confirmofficial number · stock, cash, balances, audit
        3. Queueevent with its projection · nothing waits
        4. Postappend-only journal · reconciled
        5. Closeonly on an empty queue

        Commits at confirm · operations

        • The official number
        • Stock movements at captured cost
        • Cash movements and box balances
        • Partner balances, per currency
        • The audit row, in the same transaction
        • Frozen print evidence
        • The accounting event, queued

        Belongs to the accountant

        • Reviewing each projection
        • Generating and posting journals
        • Auto-posting on or off, per company
        • Reversals and amendments after posting
        • Period close
        • Chart of accounts and posting profiles

        Two authorities. A pending journal never blocks a sale. An open queue always blocks a close.

        Proofs

        Marketing pages make claims. This one lets you test them.

        Five small demonstrations that run in your browser, modeled on the rules the real system enforces in its database. Every one of them is a rule in the codebase before it is a sentence on this page.

        Proof 01

        The account mapping is missing. Ship anyway.

        In the usual ERP this delivery fails with an accounting error and the truck waits. Here the delivery is an operational fact: it confirms, moves stock and gets its number. The accounting event lands in the queue flagged with the exception, for the accountant to fix and post — today or next week.

        Rule · Documents never post the ledger. Confirm records operational truth and enqueues the projection; a projection failure blocks the event, never the document.

        Goods deliveryTMP-2b7e91c0Draft
        Rice 25 kg24 × 12.50300.00
        Green tea 24 × 100 g · Beverages2 × 45.7591.50
        Cost of goods, at captured WAC391.50
        Stock · Port warehouse
        no change
        Audit row
        Journal
        none · accounting is a queue
        Accounting queueposting profile v4 · no COGS account for “Beverages”
        1. no events

        Proof 02

        A posted entry cannot be edited. Try.

        Posted journals and stock movements are append-only. The database rejects updates and deletes with a trigger, so no role, script or migration can change history. Corrections are new entries that reference what they correct.

        Rule · Posted journals and stock moves are append-only. Corrections are reversal entries, enforced by PostgreSQL triggers, not by policy.

        JE-2026-01187 Posted 2026-07-10 · Port branch · profile v4
        AccountDebitCredit
        5100 · Cost of goods sold300.00
        1400 · Inventory300.00

        Proof 03

        Freight lands on the item, not in overheads.

        Shipping, customs and clearing are allocated across the receipt lines by value, to the cent, with the largest-remainder method. The result is the real unit cost that feeds weighted-average valuation and margins. Move the inputs: the allocation is a live projection, never a stored guess.

        Rule · Pre-capture figures are projections: live, one shared function for preview and capture, no “Calculate” button anywhere.

        GR-2026-00187 · Elite ImportsUSD
        ItemQtyUnitValueLandedLanded unit
        Totals

        Proof 04

        A euro balance stays in euros.

        Each partner holds one signed balance per currency. Nothing is converted at write time. Reporting figures are valuations computed when you look, at a rate the system records and labels. Change a rate: the valuation moves, the balance does not.

        Rule · Monetary truth keeps its original currency. A company-currency figure is a labeled valuation, never a stored balance.

        Elite Imports · balances by currency
        CurrencyBalance (stored)Reads asRate → USDValuation

        Proof 05

        No number is invented by hand.

        Drafts carry a temporary id and print only with a DRAFT watermark. At confirmation the server allocates the official number from a durable sequence. The first official print freezes its template, assets and data; every reprint is identical, marked COPY.

        Rules · Numbers are allocated at confirm, never by the client. Official print evidence is frozen on first issue.

        Sales invoice
        TMP-8f3a21c4
        Draft
        Rice 25 kg24 × 12.50300.00
        Sunflower oil 1.8 L12 × 8.2599.00
        Green tea 24 × 100 g2 × 45.7591.50
        Total due490.50
        Unofficial · prints only with the DRAFT watermark

        Modules

        Six domains. One ledger. Nothing re-keyed between them.

        Every document hands over to the next. And every domain with a financial effect ships three things: an operational truth, an accounting projection, and a reconciliation that proves the two agree.

        Sales

        SO → GD → INV → RV → SR

        Orders, deliveries against orders, invoices as a print projection of what was actually delivered, receipts, and returns at the original captured cost.

        Purchasing

        PO → GR → LC → PV → PR

        Orders in any currency, receipts that create the payable, landed costs on the item, payments with a settlement rate that finalizes purchase cost, returns.

        Inventory

        TRF → CNT → ADJ · WAC

        Warehouses per branch, independent transfer dispatch and receipt with visible discrepancies, counts and adjustments, weighted average captured on every move.

        Treasury

        RV · PV · CHQ · XFR · CNT

        Cash boxes and bank accounts, receipts and payments, cheques with endorsement, transfers, cash counts and custody. A box can never go negative.

        Accounting

        DOC → EVENT → JE → CLOSE

        Documents enqueue accounting events; the accountant reviews each projection and posts. Period close is gated on an empty queue, and posted entries never change.

        Reporting

        STATEMENTS · AGING · TB · RECON

        Partner statements per currency, aging, trial balance, financial statements, and the reconciliation reports that keep every domain honest.

        Every domain ships three legs, or it does not ship.

        That is a rule of the codebase, not a line on a slide.

        Operational truth

        A materialized store updated inside the operational transaction: stock, balances, cash. Accounting-blind.

        Accounting projection

        Event types on the queue, each with a generator that produces the journal for review.

        Reconciliation

        A report proving ledger control = operational truth − unposted effect, with a drill-down and real drift shown, never hidden.

        • Inventory

          Truth
          Stock levels and weighted-average cost
          Projection
          Receipt, delivery, transfer, adjustment, landed-cost events
          Reconciliation
          GL inventory = stock value − unposted, per branch
        • Receivables

          Truth
          Signed customer balance per currency
          Projection
          Invoice, receipt, return, write-off events
          Reconciliation
          GL control = Σ balances − unposted, per customer
        • Payables

          Truth
          Signed vendor balance per currency; an advance is the negative sign
          Projection
          Receipt, payment, note, settlement-cost events
          Reconciliation
          GL control = Σ balances − unposted, per vendor and currency
        • Cash & banks

          Truth
          Per-account balance that cannot go negative
          Projection
          Receipt, payment, transfer, count events
          Reconciliation
          GL account = box balance − unposted, per box
        • Cheques

          Truth
          Instrument lifecycle: received, endorsed, deposited, cleared, bounced
          Projection
          Deposit, clearing, bounce events
          Reconciliation
          Cheques in hand = open instruments − unposted
        Make it yours

        Your fields, your screens, your paperwork.

        Add a field to a document and it travels: onto the form, into the list columns, into the search box, the filters and the group-by menu, and onto the printed page. It is configuration, not code, and it can apply to one company or to all of them. Try it — this editor behaves like the real one.

          Drag a row to reorder it, or use the arrows. The blue switches place the field on screen — as a list column, in the search box, among the filters, in the group-by menu. The amber one is separate: it puts the field on the printed document.

          See the configuration this screen writes
          
                  

          Rule · No logic in configuration. Fields, layouts, search and print templates are declarative JSON checked against published schemas, never scripts. The core stays reviewable, and an upgrade never overwrites your setup.

          Under the hood

          Built like a ledger, not like a form builder.

          The constraints the system is built on, for the people who will have to live with it.

          Separation

          Documents carry no journal reference and no accounting status. The accounting projection is a queued event the accountant posts.

          Append-only ledger

          Journals and stock moves never change. UPDATE, DELETE and TRUNCATE are rejected by PostgreSQL triggers, not only by the API.

          Corrections

          Reversal entries and versioned amendments: reverse, repost, chain. Never an in-place edit of history.

          Operational balances

          Partner, cash and stock balances are updated row-locked at confirm, never recomputed from journals, never touched by posting.

          Money and currency

          numeric(18,3), decimal arithmetic, never floats. One signed balance per company, partner and currency; valuations at a recorded rate.

          Numbering

          Allocated at confirm from a durable server-side sequence. Drafts are TMP- ids. Clients never generate numbers.

          Access

          Role privileges intersected with explicit company and branch scope, clamped by warehouse and cash-account grants. Zero scope means zero access.

          Audit

          Every mutation writes an audit row. Ledger-affecting transitions write it inside the same transaction as the ledger.

          Printing

          First official print freezes projection, template and assets. Reprints are identical, marked COPY. Drafts are watermarked.

          Full specification
          Cost
          Weighted average captured on the movement itself. Landed costs allocated to items by value. Provisional purchase rates finalized at settlement.
          Time
          UTC stored, local time displayed. Fiscal logic runs on dates, not timestamps.
          Configuration
          Custom fields, form and list layouts, validation and default rules, workflows and print templates are declarative JSON validated against published schemas. No scripting.
          Languages
          Arabic and English on every label and error, right-to-left first. Problem responses follow RFC 7807 with bilingual detail.
          Search
          Arabic search on normalized shadow columns, with every list virtualized.
          Stack
          TypeScript end to end: NestJS, PostgreSQL 18, Prisma, React, a PWA client. Reviewed SQL migrations only.
          Deployment
          Cloud servers in the region you choose, or your own hardware. Encrypted backups with rehearsed restores.
          Integration
          REST API with the same privilege checks as the UI. Signed, retried webhooks from a transactional outbox on every lifecycle transition.
          Who it is for

          For businesses where the stock, the cash and the branches are real.

          Cubes is not a CRM with an invoice module. It is for operators who count goods, handle cash, buy in one currency and sell in another, and run more than one location.

          Distributors and wholesalers

          Orders, deliveries, returns and collections across warehouses, with customer statements and aging that agree with the ledger.

          Importers

          Foreign-currency purchase orders, landed costs on the item, settlement rates that finalize purchase cost, vendor balances per currency.

          Multi-branch retail

          Each branch with its own warehouses, cash boxes, numbering and printing — and one consolidated view at head office.

          Groups of companies

          Several legal entities with separate books and catalogs, shared users with scoped access, and reports that never mix companies.

          Rollout

          Three weeks, three steps, one reconciled opening balance.

          We do not go live on numbers that do not agree. The opening balance is migrated, reconciled and signed off before the first document is confirmed.

          1. 1Week 1

            Set up and migrate

            Companies, branches, warehouses, chart of accounts, items, partners and opening balances, imported from your spreadsheets or exports, then reconciled.

          2. 2Week 2

            Train by role

            Storekeeper, cashier, buyer, accountant, supervisor: each role trained on its own screens and its own approvals. Operations staff never see a journal.

          3. 3Week 3 →

            Go live, with us in the room

            First real documents with our team beside you, then support that answers within the working day.

          Questions

          Asked before signing.

          Straight answers, including the ones with a “no” in them.

          If operations and accounting are separated, don't the two drift apart?

          No. Every operational effect enqueues exactly one accounting event, and each domain ships a reconciliation report: ledger = operational truth − unposted effect. The unposted part is explicit, so the difference is zero by construction, or a named exception the accountant can see.

          What happens when the accountant is away?

          Operations continue. Numbers, stock, cash, balances and audit are recorded at confirm. Accounting events wait in the queue. Nothing is posted without review, and the period cannot close until the queue is empty.

          Where does my data live?

          Wherever you decide: on cloud servers in the region you choose, or on your own hardware. Backups are encrypted, restores are rehearsed, and every action is in the audit trail.

          What happens if the internet connection drops?

          Today Cubes runs online. A branch works against the central system, so while the link is down users cannot confirm new documents; work resumes when it returns, and nothing confirmed before the outage is lost or duplicated. Branch continuity — a branch that keeps confirming through an outage on its own node and reconciles when the link returns — is designed into the architecture and is in development. It is not part of the current release, and we do not promise what we have not released.

          Which languages does it support?

          Arabic and English, on every label, message and print, right-to-left first. Users switch per session.

          Can we customize it without a developer?

          Yes: custom fields, form and list layouts, validation and default rules, approval workflows and print templates are configuration, scoped per company if you like. What you cannot do is inject scripts — the core stays reviewable.

          How is it priced?

          By company and branch, not by counting every click. Book a call and you will have a written quote after one conversation.

          Can we migrate from spreadsheets or another system?

          Opening balances, items, partners, price lists and open documents are imported from spreadsheets or exports, then reconciled before go-live. We do not switch on a system whose opening balance does not agree.

          Book a demo

          See it on data that looks like yours.

          Forty-five minutes, live, on a company set up to resemble your business. Bring your accountant and your storekeeper. No slides.

          No newsletter. No tracking. One reply, from a person.