Onadapt ERP

An ERP with AI at the centre.

Nine modules on one ledger, one sign-in. Every screen carries Ask AI: ask it in writing or out loud, and it reads the books freely, proposes what to do next, and posts nothing until a person approves. It also works unasked — a briefing on each company before anyone signs in, and a flag on the row that does not look right.

six modules · one ledger · automation at the hub
9modules on one database
127screens, each with Help and Ask AI
66machine-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. Auditing is not a tenth module but a section over all of them — every module’s controls and findings in one place, which is why its own Audit screen no longer sits in each module’s menu. 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 127: 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 Dashboard›Cross-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 five 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. Every action it proposes is authorised against the permission that action’s own screen demands, so someone who may raise a production order still cannot make it ship an invoice. The AI works under the same controls as everyone else, not around them.

4

Answers out loud, if you want

Press the microphone and speak, or turn on the wake word and say “erp, what is our cash position” with both hands full. The answer appears as it is written and can be read back to you. Approving stays a click: a spoken “yes” is not a signature.

5

Asks before it guesses

A report that needs an as-of date, or an order that needs a quantity and a due date, raises a small form with whatever it understood already filled in. A required field it could not work out stays empty rather than being guessed at, so an aging never quietly runs to the wrong date.

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.

943pull requests
478test files
19CI gates on every one

Before you ask

It does not wait to be asked.

What the AI does without being asked, and what it leaves behind: a briefing written before anyone signs in, a flag on the row that does not look right, a brief on the document waiting for your decision, an investigation of a control that has started to fail, and a sealed record of every run it made. Not one of them decides anything.

1

A briefing, every morning

At six, before anyone signs in, it reads each company’s books and writes what matters: what needs a decision today, what to watch, what is fine, and what has changed since yesterday’s. One briefing per company per day, stored, so everybody reads the same one. A module that did not answer is named as a gap rather than guessed at.

2

Flags on the row

A vendor invoice that looks like one already received. A journal line four times anything that account has seen this quarter. A manual entry posted on a Sunday. These are plain rules over your own rows, not a model’s opinion: each names the rule and the figures, so you can check it by hand. A flag is a question to look at, never a verdict.

3

A brief before you decide

On the approvals queue, Explain says what the document is, what to check on the module’s own screen, what stands out against the approval policy, and what to ask the person who raised it. It never recommends approve or reject — that decision is yours, on the screen that makes it.

4

An auditor that investigates, and cannot judge

When a control fails, a red light tells you that something is wrong, not what. The auditor agent picks up the finding and reads: the control’s history to find the run it began in, then the documents behind it, through the same read tools Ask AI uses. It works under its own identity — a principal that cannot sign in, holds read permissions and exactly one write, and has no key that could post, approve or decide. The code decides pass or fail; the agent never does.

Its one write is a note on the finding: what is wrong, the likely cause, how sure it is, and a fix a person could apply. Every claim cites what it rests on — document numbers, control ids, run ids, the calls it made. If it cannot work out the cause it says so and writes nothing. A person still decides whether to accept or resolve.

5

And a record of what the AI did

Every run the agent makes is one row: what triggered it, which model, every tool call and what it returned, the tokens, the cost, and a hash of what it wrote. The row is inserted once and then sealed — the database refuses a second update, a change to who or what or when, a step count that disagrees with the steps, and every delete. A daily spend cap per company is checked before each turn. The first question an auditor will ask about an AI auditor is “show me what it did”, and that is the table that answers it.

Morning briefingManufacturing Plant29 Sep, 06:00
Cash remains negative at -3,319.70 for a seventh straight day, the GL cash-flow tie-out control still fails by 2,990.00, and the three stalled production orders have now sat idle 179.6 hours, up from 155.6 yesterday.
Treasury · attention7 daysGeneral Ledger · attention2,990.00Manufacturing · watch179.6 h
Nothing is waiting in payables, and receivables are clear.
A real briefing, written by the product against its own books — including the fact that the same three things have been true for a week. How the AI works ↑

Audit controls

Sixty-six 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-six 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.

A failing control is a finding waiting to be opened

The red light is not the finding. A person opens one on the control they mean to track — one live finding per control and company — and from then on nobody edits it: every change is another event on it — opened, assigned, noted, accepted, resolved. An acceptance is a decision with an expiry, ninety days at most, not a way to make a red light go away. When the control passes again the finding resolves itself and says so.

The history, not just today

Each control keeps its result run by run, so you can see the run in which it started failing and the last run in which it passed. That is the difference between “this is broken” and “this broke on the nineteenth, and here is what changed that day.”

Where you see them

In Auditing, their own section in the menu: an overview, every open finding, Approvals & Access, and a page per module — General Ledger through Manufacturing — each control with its expected and actual side and its evidence. On the dashboard, as one tile per company: how many controls pass. At close, on the Period Close screen. And for the auditor, as a 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. What you may see is what your permissions already allow: a control in an area you cannot read is counted, not shown.

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