Onadapt ERP

An ERP with AI at the centre.

Nine modules on one ledger, one sign-in. Every screen carries Ask AI: it reads the books freely, proposes what to do next, and posts nothing until a person approves.

six modules · one ledger · automation at the hub
9modules on one database
120screens, each with Help and Ask AI
62machine-checkable controls
1book of record: the general ledger

One ledger, nine modules

Every module posts to the same book.

One PostgreSQL database, one schema per module, real foreign keys between them. Vendors belong to Payables, customers to Receivables, items and bins to Inventory, and the general ledger is the only book of record. Nothing keeps a private ledger. Below is every group in the menu, and every screen in it.

The six shapes are the six modules on the mark. Administration adds Users & Roles and, on demo systems, the scenario Simulation.

The screens

Every screen names itself once, then shows its state.

The same layout on all 120: the facts that matter at the top, each a click to what it counts, one primary action, and Ask AI and Help in the same place. This is a capture of the product, not a mockup.

Executive DashboardCross-Module Summary· Ask AI open
The executive dashboard for two companies, with the Ask AI panel open. It was asked what is waiting on someone right now and answers that nothing is, that all eight controls pass in the plant company, and that it cannot read the second company's receivables.
Asked “What is waiting on someone right now?” — it answers for both companies from what the person asking is allowed to see: nothing waiting, eight of eight controls passing, and “you cannot read its receivables” where their permissions stop.

Ask AI

It reads freely. It proposes. A person posts.

The same panel on every screen, with the same three rules, so that what the AI can and cannot do is never a surprise.

1

Reads freely

Ask why receivables moved, which invoices aged past sixty days, what a project has spent against its budget. It reads the trial balance, the registers and the aging the way the screens do, for the company you are looking at.

2

Proposes, and stops

Anything that would write, a journal, a reversal, a purchase order, renders as an action card with the exact lines. Nothing happens until you press Approve, and the approval is recorded with your name on the entry it made.

3

Refuses what you could not do either

A manual journal to an account a module posts automatically is refused, line by line. The person who raised a document cannot approve it. The AI works under the same controls as everyone else, not around them.

Ask AIGeneral Ledgerexample
Why doesn't receivables tie this month?
Accounts Receivable (1200) holds 8,970.00; open invoices less cash received come to 7,475.00. The difference is one invoice, posted twice:
INV1012-REV · revenue · posted1,495.00INV1012-REV-2 · revenue · posted1,495.00
The second carries the same customer reference. I can reverse it.
Proposed action · reverse journal Reverse INV1012-REV-2 (1,495.00), dated today, memo “duplicate of INV1012-REV”.
DR4000 Sales Revenue1,495.00 CR1200 Accounts Receivable1,495.00
Approved actions post with the approver's identity. Refusals name the rule: “1200 is a controlling account, posted automatically by Receivables.” See it answering on the dashboard ↑

The product is built the way it runs: AI agents do the work, and a person approves every pull request before it ships. Every change carries a test that failed first.

771pull requests
323test files
13CI gates on every one

Audit controls

Sixty-two controls, run every time somebody looks.

An audit control here is not a checklist item. It is a named assertion with an expected value, an actual value read live from the database, and a verdict. They run whenever a screen loads, so a break shows on the day it happens, not at year end when the auditor finds it.

Expected against actual, live

Each control computes both sides itself, from the rows, and states its tolerance. Nothing is copied from a report somebody exported last month.

A-CT-08 · GR-IR 0.00 + AP 0.00 + paid 8,550.93 vs received PO total 8,550.93 · pass

Accounts that refuse a hand

An account a module posts to automatically is a controlling account. A hand-typed journal on it is refused line by line, and the ledger itself is append-only: a mistake is corrected by a reversing entry, never by editing.

Account 1200 is a controlling account (posted automatically by Receivables) — manual entries cannot post here.

Separation you cannot skip

The person who raises a document cannot approve it, and that is a control with an id, not a policy in a binder. It checks the register, not the org chart.

A-TR-06 · No payment batch was approved by the person who created it · pass

What the sixty-two cover

Grouped by the module that owns them. Every control below is quoted by its own name from the code that runs it.

A-GL
The ledger itselfDebits equal credits, every entry balances, append-only triggers are active and armed, no orphan lines, and no reference posts twice.
A-CL
Period closeThe five readiness checks below. A period closes when they are green; reopening one is the gated direction.
A-PO
PurchasingThree-way match integrity, no over-receipts, billing never exceeds receipts, PO-line totals tie to receipt and invoice detail, every receipt carries a journal, GR-IR clears.
A-AP
PayablesEvery payment carries a GL reference, paid invoices tie to recorded payments, every AP journal in the GL belongs to a document, every queued journal reaches the ledger within twenty minutes.
A-AR
ReceivablesNo customer on credit hold has an open committed order, no customer exceeds its limit, every invoice's approval state agrees with its posting status.
A-TR
TreasuryBank closing balances tie, every reconciled line has a reconciliation and the amounts tie, cash suspense ties to parked deposits, every printed check is reported to the bank by positive pay, no batch approved by its creator.
A-CT
The plant, at standard costWIP ties to shop-floor absorption; sub-assemblies, finished goods and raw materials each tie to their stock; receivables tie to open invoices; received purchase orders tie to GR-IR, AP and payments.
A-FA
Fixed assetsEach class's cost and accumulated depreciation tie to their accounts, every posted run has a journal that agrees with the asset events, nothing depreciates below salvage, a disposed asset carries nothing.
A-PJ
ProjectsProject WIP ties to the GL and never touches plant WIP, no cost is stranded on a project that stopped taking charges, every billing instruction reached an AR invoice for the same amount.
A-VR
VariancesThe variance identity holds for every completed order, and finished-unit price variance stays constant across order sizes.
A-AN
AnalyticsRevenue sliced by tag ties back to GL sales, so a management view can never disagree with the books.
A-MG
The posting queueEvery queued journal from the floor reaches the ledger within twenty minutes; the oldest one waiting is the number that alarms.

What a control looks like

Period close readiness, the five that gate a month.

ClosePeriod close readiness, Augustexample
A-CL-01Trial balance in balance as of period endDR 1,552,637.82 / CR 1,552,637.82pass
A-CL-02Every entry dated in the period balances0 unbalancedpass
A-CL-03Nothing still queued in the GL outbox for this period0 pending or blockedpass
A-CL-04Every earlier period is already closed0 still openpass
A-CL-05Every balance-sheet account is reconciled and reviewed2 of 15 outstandingnot yet

One approval policy, eighteen document types

Requisitions, purchase orders, vendor and customer invoices, credit memos, prepayments, production orders, inventory adjustments, journals, period reopening, asset disposals, project time. Each with its own threshold, its own approvers, two approvers above a limit, and never the person who raised it.

Closing is quick. Reopening is gated.

A close that waits for a signature makes controllers close late, so a period closes when its five checks are green. Reopening one needs a proposal and a separate approver, and once a year is closed to retained earnings, it stays closed.

Where you see them

On the dashboard, as one tile per company: how many controls pass. In every module, on its own Audit screen (GL Audit, PO Audit, AP Audit, Treasury Audit, the plant's Internal Audit), each control with its expected and actual side. At close, on the Period Close screen. And for the auditor, as an audit package per module that can be handed over whole. Ask AI reads the same controls, so “do the books tie?” is a question it can answer with the ids.

Data tags

One chart of accounts. Any question you like of it.

A tag is a label the ledger carries on a posting line, beside the account. Sales Revenue stays one account; the tags say which product line, which cost centre, which customer, which vendor. The chart never grows a sub-account to answer a management question, and every answer still ties to the books.

The tags a line carries, put there by the module that posted it

Nobody codes them by hand. The floor tags a costing entry with the product line and the cost centre of the order that made it; Purchasing tags a receipt with its vendor; Receivables tags an invoice with its customer. A new finished good gets its product-line tag the moment it is created.

Product line
DroneHeavy-Lift HexacopterCaseHousehold Quadruped Robot
Cost centre
Assembly LineCase Production LineHeavy-Lift LineK9 Robot Assembly LineMarketing+2
Vendor
18 vendors, one tag each, written by the receipt
Customer
every customer, written by the invoice
One line, split by percent · example
DR 5010Cost of Goods Sold · INV1001-COGS1,516.00
Drone 62% · 939.92Case 38% · 576.08
A drone that ships with its case carries both product lines on the same line, in proportion. The account is still one account.
AnalyticsP&L by Product Line · Aug 2026example
TagRevenueExpenseMargin
Drone48,750.0031,208.4017,541.60
Heavy-Lift Hexacopter22,400.0015,987.506,412.50
Case6,300.004,118.202,181.80
Household Quadruped Robot0.001,940.00−1,940.00
Total77,450.0053,254.1024,195.90
Pick any group — Product Line, Cost Center, Vendor, Customer — and any dates. A-AN-01 checks that the revenue here equals GL Sales Revenue, so the slice can never disagree with the trial balance.

Margin by what you sell

Revenue, cost and margin per product line, from the same postings the financial statements are built on, without a product sub-account for every account in the chart.

Spend by who you buy from, cost by where it happens

Vendor spend straight from the ledger, not from a purchasing report that has to be reconciled to it. Cost centre P&L the same way, with a line split across two centres when the work was.

A new dimension without a new chart

Add a group — a project, a region, a campaign — and start tagging. The chart stays as it is, and the close does not change. For statutory splits the ledger has divisions and departments on the account itself; tags are the lighter layer on top, for the questions that change every quarter.

Proof

It proves itself, through its own front door.

A separate simulation service drives whole business threads through the real APIs, as a person's clicks would, and records every document it creates so anything it produced stays attributable. All four run green in both plants from a clean reset.

SMOKE-012 / 2

Read-only reachability and provenance check. Creates nothing.

O2C-0115 / 15

Order to cash: customer order → buy material → receive, three-way match and pay → build → ship and invoice → collect. Real documents, backdated so aging and DSO are genuine.

PJ-0117 / 17

A capital project: open, charge, issue stock, book and approve time, settle onto an asset, audit. Asserts two refusals that were once live defects.

SHORT-019 / 9

Leaves sales orders unshippable on purpose and checks what the Order Fulfillment screen says at each stage: nothing building, blocked on material, then building.

See it

Open the books.

The demo plants hold real posted activity from the runs above. Sign in, pick a screen, and ask it something.

See it running