AI agents, enabled on the ledger they reason about
Agent-based products decide at runtime what to ask, which is what makes them useful and what makes their inputs load-bearing. Maesn gives your agent one shape for customers, invoices, bills, accounts and postings, from whichever accounting system each of your customers happens to keep.
Which cost this is, which period it belongs to, what the number means, how to phrase the answer.
- Which accounts exist
- Which tax rates apply
- Which dimensions exist
Your agent asks at runtime, the endpoint was fixed long before
An agent's advantage is that nobody decided in advance which question it would ask. The systems it asks were built on the opposite assumption.
This is the count behind a sentence the platform has always been open about. Filtering, ordering and paging are supported where the system underneath supports them, and what each endpoint accepts is published rather than implied. Nobody had added it up, and added up it says something specific about agent-based products: for most objects, the only question you can put on the wire is what has changed since you last asked. Being told instead of asking is rarer still, because an event only exists where the system underneath sends one, which on this market is a minority of them.
For a classic integration that is a nuisance you code around once. For an agent it is architectural, because the flexibility your product sells is exactly the thing the wire cannot carry. The way out is not a richer query language, it is a different division: fetch broadly through one model, hold what you fetched, and let the agent be flexible over that. The unified model is what makes the broad fetch affordable, since the same call and the same field names work on every system your customers use rather than one dialect at a time.
The second half of the problem is quieter and more expensive. A model asked to book something will produce an account number, a tax rate and a cost centre whether or not it has been told which ones exist, because producing a plausible answer is what it does. In a chat window a plausible answer is a bad answer. In an accounting system it is a posting.
Every write recipe opens by reading the customer's own vocabulary
Not a rule we invented. Four of the sixteen documented recipes open with the same three reads before they describe a write at all, and two more open with two of them.
This customer's own chart of accounts, not a standard one
The tax rates configured in that particular installation
Cost centres, and whatever else their bookings point at
One write, carrying the account, the rate and the dimension the reads returned.
Opens with a fourth read the others do not: which journals a booking may go into.
Two writes rather than one: the bill itself, and the payment made against it.
The invoice or a proposal to be reviewed, then the payment that settles it.
Read as a requirement it is unremarkable, because it is what correct bookkeeping has always needed: you post to an account that exists, at a rate that installation uses, against a dimension that customer actually keeps. Read as an instruction to an agent it is the whole design. The grounding read is the step that turns a model's proposal into something checkable, and it is the step a product under time pressure leaves out, because a hard-coded account number works on the first customer.
What a unified layer changes here is not that the step exists but that it is the same step everywhere. One call returns the chart of accounts whether your customer books in DATEV Rechnungswesen or in something else entirely, and the field names come back from one data model rather than from each vendor's vocabulary. So your product implements “learn this customer's books” once, and onboarding a customer on a system you have never seen is a connection rather than a project.
Which of your customers a call belongs to is settled underneath all of it, by the connection each of them authorised, so an agent never handles anybody's credentials and never reaches further than the person who granted the access could reach themselves.
A demanding client, and a connection that survives it
Agent-based products read more than form-based ones, and they read in bursts, because one user question can become a dozen lookups before an answer exists.
A single question can fan out into many reads, and they leave your backend together rather than politely spaced.
Requests from one tenant reach the target system one after another, so a token refresh underneath them cannot be raced.
The behaviour on the right is documented for a specific reason rather than as a general promise. Several target systems break authentication when parallel requests arrive while a token is being refreshed, and re-authorisation is not a retry, it is your customer being asked to connect again. Sequencing per tenant is what keeps a burst from turning into that phone call. It does not do more than that: the target system's own rate limits still apply, and a refusal reaches you as its own category rather than as a generic failure.
The rest of the outcome is what you stop building. One shape for an invoice across every system in the directory, one authorisation flow, one place where a vendor's yearly breaking change is absorbed. For an agent-based product that is not a convenience, it is where the team goes: every week spent on somebody else's pagination is a week not spent on the model that is the reason customers bought the thing. Where a write cannot be processed immediately, it is handed to a task you poll for confirmation, so “did it land” stays an answerable question.
Products with a model at the core, already running on this
Finto shipped a production-ready DATEV integration in days.
“Maesn enabled us to launch a production-ready DATEV integration within days, giving our AI structured financial data and our customers a smooth onboarding experience.”


Rally is the second, and its own site describes the shape well enough that we do not have to: receipts arrive from the field, Rally AI extracts the fields, matches payments and corrects errors, and what reaches the customer's ledger is already structured. Their CTO's account of getting there is on the Rally case study, and the part worth borrowing is the sequence rather than the adjective: the model does the judgement, the connection does the delivery, and neither is asked to do the other's job.
Both are what the industry view calls a further development of SaaS rather than a category beside it, which is the argument made for the vertical software market as a whole on the page for SaaS platforms. Neither of them publishes a number about this connection, and none is invented here.
What an agent can reach, counted per object
The rows are the objects the documented recipes name, not a selection. Reach is per object rather than per system, so the thinnest row your workflow depends on is the one that decides your roadmap.
| What you need | Today | On demand | System cannot |
|---|---|---|---|
| Which accounts this customer has | 19 | 8 | 2 |
| Which tax rates that installation uses | 12 | 14 | 3 |
| Cost centres and other dimensions | 3 | 17 | 9 |
| Which journals a booking may go into | 5 | 15 | 9 |
| Invoices, to reason over | 13 | 14 | 2 |
| Bills, to reason over | 8 | 17 | 4 |
| Post a booking | 10 | 11 | 8 |
| Post an expense | 7 | 19 | 3 |
| Hand a proposal over for review | 10 | 17 | 2 |
The shape of that table is the argument. The reads an agent needs in order to be grounded are not the widest rows, they are among the narrowest, and that is the opposite of what a roadmap assumes when it treats the grounding as setup and the write as the hard part. Knowing which of your customers' systems answers which of those rows is a week-one question, and it is answerable before you build, which is the only useful time to ask it. Where a single customer's installation carries a field the model does not, reaching past the model for that one field is a documented route rather than a fork of your integration.
The same discipline applies to what your agent reports back to a user. A write can succeed and still not do everything you asked, when a target system quietly ignores a field it does not carry, and the response says so through a warning next to the result. Surfacing that where a person can see it is the difference between an agent that is trusted and one that is merely confident.
We make the data legible, the judgement stays your product
On this use case the boundary is unusually easy to state, because the thing on your side of it is the entire reason your customers chose you.
- Auth and tokens per customer
- One vocabulary for every object
- The write shape each system expects
- Their yearly breaking changes
- What the model concludes
- Which account a line belongs to
- When a human has to approve
- The record of what your agent did
The last row on the right is the one that surprises people, and it follows from the architecture rather than from a gap in it. Because nothing is stored on the way through, there is no copy of your customers' books here and equally no transcript of what your agent proposed. What Maesn holds is that a call happened, to which system, under which customer's connection, and when. The reasoning, the prompt, the version of the model and the person who approved it are yours to keep, and for an agent acting on financial data they are the half an auditor will actually ask about. The other half, how the transfer itself is protected and certified, is the same posture the rest of the platform runs on rather than something this connection weakens.
The row above it is the same principle one level down. The documentation puts categorisation logic in your application, and it has to sit there: nothing shared could know that one of your customers books a fuel receipt against a different account than the next one does. To settle it once, for everybody, would be to choose on their behalf how their books are kept, which is a decision belonging to them and their accountant. Failures divide along the same line, and which side a rejection came from is the first thing an agent's handler should branch on.
Where this shows up in the day-to-day is the engineering roadmap, which is why product and engineering teams are usually the ones who bring this connection in, and the reason they give is the same one every time: the integrations were never the product. If your agent is meant to work through an assistant a customer already uses rather than only through your own interface, the protocol side of that is the MCP server, which runs on this same API.
Common questions
How is this different from your MCP server?
What does an agent have to read before it can post anything?
Can we query the data the way our agent asks for it?
How does an agent get access to our customer's accounting system?
Do you store our customers' financial data, or train anything on it?
Can we prove afterwards what our agent did?
What happens when the model proposes something the system rejects?
Which agent workflows does this actually cover?
Is a write confirmed, or is it fire and forget?
How many systems does one build reach?
Build once on the Unified API.
See how AI agents enablement works for your integration, or dive into the technical reference.










