maesn
Use case

Financial analysis and forecasting on data pulled from the ledger

Accounting systems keep the finished figures to themselves. What they will hand over is the evidence underneath: the postings, the receivables and the chart of accounts. Maesn delivers those in one shape across every system your customers run.

What a forecast asks for
The finished figuretrialBalance
2of 29 systems return one
so it asks for the evidence
  • 10The postingsjournalEntries
  • 13The receivablesinvoices
  • 19The chart of accountsaccounts

Counted from the per-system documentation across the 29 connected systems.

Trusted by winning software teams
HubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinProvetHeroHolviLanes & PlanesHubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinProvetHeroHolviLanes & Planes
The problem

One report endpoint across every connected system

A forecasting product would happily take the answer if the accounting system offered one. It does not, and the gap between what is computed and what is readable is the whole shape of this integration.

Readable today, out of the 29 connected systems
The answers

Aggregates the accounting system has already computed.

Journals
5
Dimensions
3
Trial balance
2
Open items
2
Fiscal years
2
Transactions
0
The evidence

Documents and master data the aggregates are built from.

Customers
20
Accounts
19
Invoices
13
Tax rates
12
Journal entries
10
Bills
8
Counted from the per-system documentation. Searching the whole API reference for analysis, report, forecast, statement, profit, loss and balance returns one endpoint, and it is the trial balance.

Every one of those figures exists inside the accounting system. It knows the balance of each account, it knows which receivables have gone past their date, and it knows when the financial year turns, because it renders all three on a screen the customer looks at every week. What it mostly will not do is answer a question about them through an API, and that is the difference a finance product discovers only after it has promised a roadmap.

It is tempting to read those gaps as a backlog, and for the largest of them it is not one. On the trial balance, twenty of the twenty-nine systems are marked as having no such endpoint of their own, so no amount of integration work opens them. The remaining thin rows are mostly marked on demand instead, and what that marking promises is an open question rather than a date, so the only safe reading is that they are not available today.

The layer underneath tells a different story, and it is the reason this page exists. Documents survive where aggregates do not: the postings, the receivables, the payables, the chart of accounts and the rates behind it all come back in quantity. So the work is not fetching an answer, it is building one, from evidence that arrives in the same shape however many systems your customers run. That is also, usually, what a forecasting product wants. A model somebody else already ran is not a differentiator.

How Maesn solves it

The postings and invoices your model actually runs on

One connection, one object shape, and a per-system truth worth knowing before you build against it: not every ledger returns a posting with a number on it.

One posting, as it comes backjournalEntries
  • transactionDateWhen it was booked
  • descriptionWhat it was for
  • journalTypeWhich journal it sits in
journalLineItems[]6 of 9 field lists

The account, the debit or credit side and the amount all live here. Everything a model sums is inside this one block.

Field names from the documented response. The nine field lists published for this endpoint and the ten systems listed as readable are not the same set, and neither one contains the other.

Without that block

On three of the nine field lists the reference documents no line items, so a posting arrives with a date, a description and a journal code and no figure attached to it.

Exact OnlinefortnoxOdoo
And the amount is not one field

Of the six that do carry lines, four document the gross amount only, Dinero documents the net only, and Xero documents net, tax and gross together. Summing the wrong one is wrong by the tax on every line.

A posting is the smallest honest unit a financial model can work from. It carries the date, the account, the debit or credit side and the amount, and everything a report summarises is a sum over those lines. Maesn normalises that object across systems, so the code that groups postings into a period, an account or a cost centre is written once rather than once per accounting platform.

Where the normalisation stops is at the fields a given system does not publish, and this endpoint has the sharpest example in the model. Reading the field lists rather than the headline count is what surfaces it: on three of the nine documented systems the response has no line items, so a posting comes back described but not quantified. Counting readable systems and building on the total would put those three in a forecast as postings worth nothing.

The receivable side is the happier one, and it is where most cash-flow work actually happens. Invoices are readable on thirteen systems and carry a status everywhere they are documented, which is enough to age a ledger without an ageing endpoint existing. Bills give the same picture on the payable side. Between them they answer what is outstanding and when it falls due, which is the input a liquidity model spends most of its time on.

Volume is the other half of the problem, since a model that wants history wants years of postings rather than yesterday's. Reads are paginated and filterable in one way across systems, an incremental pull keeps a refresh proportional to what changed, and where a system answers a large read as a background task rather than a response, that arrives as an asynchronous task you poll. The object shapes themselves come from the common data model, and the connection each customer authorises once is described in unified authentication.

What you get

A trial balance where it exists, an ageing schedule you build yourself

Where a finished report does exist, here is exactly what it contains. And where it does not, here are the fields that let you build the one a forecast actually needs.

The one report endpointtrialBalance
DATEV Rechnungswesen
accountNameaccountNumberbalancemonthlyValues[]openingBalancetotalDebitAmounttotalCreditAmount

Returns a balance per month per account, plus the opening balance and both totals. That is a time series, which is what a model wants.

Sage Active
accountCodeaccountNamebalance

Returns the balance as it stands. How the account got there is not in the response, so the series has to come from the postings anyway.

Both require fiscalYearStartDate before they will answer. Fiscal years are readable on two of the twenty-nine systems, and Sage Active is not one of them, so on one of the two systems that return a trial balance the endpoint asks for something that system will not tell you.

The consequence is an importer that cannot be written once. A product that reads “trial balance supported” off a capability list will build for the richer response, ship it, and find that on the other system the same code has one number to work with and no way to see how the account reached it. There the series has to be rebuilt from the postings, which is a second code path rather than a configuration flag.

The parameter dependency is worth planning around for the same reason. Where the fiscal year is not readable, its start date has to reach your request from somewhere else, which in practice means asking the customer during onboarding and storing the answer. That is a field on a setup form if you know in week one, and a migration if you find out in week nine.

Across the thirteen systems whose invoice fields are documented
  • status13 of 13Where the invoice standsOn every documented system.
  • dueDate12 of 13When it was dueMissing only on Xentral.
  • totalAmount12 of 13How much is outstandingMissing only on Xentral.
  • paidDate6 of 13When it was actually paidThe one that models behaviour.

No object in this model is called an ageing schedule, and the first three rows are all it takes to build one: a status, a due date and an amount, bucketed by how far past due each invoice sits. The payable side works identically from bills, which is how the same code produces both halves of a working-capital view.

The fourth row is marked apart because it separates a report from a forecast. Knowing an invoice is overdue tells you where it stands today. Knowing the date it was actually settled tells you how that customer pays, which is the only thing a projection can be built on. Where that date is absent, payment behaviour has to be inferred from status changes over time rather than read, and designing for that from the start is cheaper than retrofitting it once a customer arrives on one of the systems that needs it. Postings are the fallback for both, since that is where a settled payment ends up recorded in the first place.

Proof

A finance product already runs on this connection

Published customer
Finto
Finto builds AI finance software on this API.

Maesn names them an AI finance software customer on its own home page. What they built with it is theirs to describe, so that is all this says.

Customers who have published a full account of what they built are collected on the case studies page.

Key facts

What a forecast reads, counted per system

The rows a financial model touches, taken from the per-system documentation rather than from a summary.

Across the 29 connected systems
What you needTodayOn demandSystem cannot
The postings themselves10127
Receivables and their due dates13142
Payables and their due dates8174
The chart of accounts1982
The rates behind the figures12143
The balance per account2720
What is still unsettled2225
Bank activity0218
Read from the per-system documentation. The last three rows are the ones a forecasting roadmap is most likely to assume: the computed balance, the unsettled position and bank activity. Bank activity is the zero, and it stays a zero, which is why the modelling belongs on your side of the line.

The last row is the one to plan around, because it is not thin but empty. Bank activity comes back from no connected system at all, while writing a transaction is documented for four. A capability that exists in one direction only is easy to misread from a feature list, and this one is worth reading twice: the object called a transaction here is a residual bucket for records that fit none of the others, not the line on a bank statement.

Events are worth measuring the same way. Postings publish change events on three systems and the trial balance on none, so a product that wants to react to a booking rather than find it on the next sweep can do that for those three and polls for the rest. How that mechanism works, and where its edges are, is the subject of unified webhooks. The per-system differences that survive normalisation, of which the amount basis above is one, are covered in customization handling, and what a partial response looks like when a system omits a field is unified error handling.

The systems in this bracket that a financial product meets most often are the German and Dutch ledgers, and their behaviour on this endpoint differs enough to be worth reading before you scope: DATEV Rechnungswesen, which is the one system here that answers a ledger read as a task rather than a response, Exact Online, Xero and Microsoft Dynamics 365 Business Central.

Where the line runs

You model, we deliver the numbers behind it

The forecast is your product. What this connection owes you is the material it runs on, in one shape, from every system your customers use.

Maesn delivers
  • Postings with side and amount
  • Invoices and bills with dates
  • The chart of accounts and rates
  • Paginated, incremental reads
Your product owns
  • The model and its assumptions
  • Which accounts roll up where
  • How payment behaviour is read
  • Scenarios, budgets and variance

The line sits where it does because of what the data allows rather than where a diagram would put it. Maesn passes requests through to the target system and normalises the response on the way back, so there is no second copy of anybody's ledger to drift out of date. That is a security property before it is an architectural one, and it is the subject of how the connection is built and hosted.

It also means the interesting part stays yours. Two products reading the same postings through the same connection will produce different forecasts, because the difference is the model rather than the pipe. The pipe is what this page is about, and the reason it matters is that building it once per accounting platform is how a finance product spends a year not shipping the model. Neighbouring cases work the same way: what a settlement looks like once it is posted is accounts receivable, the payable mirror is accounts payable, the rates behind the figures are tax automation, and the master data that makes a customer in one system the same customer in another is customer and supplier data sync.

One boundary decides more than the rest, because it is the one the category name invites: this connection does not read bank lines. Bank activity is readable on none of the connected systems, so a cash position assembled here comes from the ledger's own view of what was booked, not from the account itself. If your product needs the bank, it needs a bank connection, and that is a different piece of plumbing with a different set of rules. What arrives through this one starts at journalEntries, once a transaction has become a booking.

A cash position assembled from bookings rather than from the bank is what gets asked of financial teams.

Financial analysis FAQ

Common questions

Can we pull a profit and loss statement or a balance sheet?

No, and the reason is specific. There is no profit-and-loss endpoint and no balance-sheet endpoint in the API, and searching the whole reference for the reporting vocabulary returns a single endpoint, the trial balance. What you pull instead are the postings, the invoices, the bills and the chart of accounts, which is the material those statements are made from.

Which systems return a trial balance?

DATEV Rechnungswesen and Sage Active, and they do not return the same thing. One documents a balance per month per account plus the opening balance and both totals; the other documents the account code, the account name and the current balance. Both require a fiscal-year start date before they will answer, and fiscal years are themselves readable on only two systems.

Is the data real time?

It is as fresh as you ask for it to be, which is a different promise. Maesn's own guidance names two ways to stay current, events and polling, and it recommends polling at the lowest frequency your product can live with, weighed against rate limits. Events are the faster route where they exist: for postings that is three of the connected systems, and for the trial balance none. So freshness is a decision you make per object rather than a property that arrives with the connection.

Can we read bank transactions for a cash position?

No. Bank activity is readable on none of the connected systems, and there is no endpoint for reading transactions at all — the only transactions endpoint in the reference writes them. It is also worth knowing that the transaction object in this model is a residual bucket for records that fit no other object, rather than bank activity, so it would not be the right object even where it existed.

How do we build an ageing schedule without an ageing endpoint?

From the invoice fields, and they are there. Every one of the thirteen documented systems returns a status, twelve return the due date and the amount, so bucketing what is outstanding and by how long is ordinary arithmetic on data you already have. The field that is thinner is the date an invoice was actually paid, documented on six.

What is the difference between reporting and forecasting here?

One field, more or less. A report needs to know where each invoice stands today, and the status field is on every documented system. A forecast needs to know how a given customer actually pays, which means comparing the date an invoice was due with the date it was settled, and the settlement date is documented on six of thirteen. Where it is missing, payment behaviour has to be inferred from status changes over time instead of read.

Does a posting always come back with amounts on it?

No, and this is the finding most likely to surprise a team mid-build. Of the nine field lists documented for reading journal entries, three carry no line items at all: Exact Online, fortnox and Odoo. A posting arrives from those with a date, a description and a journal code, and no figure attached. The other six carry the lines, and even among those the amount is documented as gross on most, as net on one and as all three on one.

Can we segment a forecast by cost centre or department?

For named systems rather than in general. Reading the available dimensions as their own object is documented on three systems. The more useful route is that the dimension rides along on the posting line itself, as a named category, on the systems whose field list documents it. Either way it is a per-system answer, which is a better sentence to put in front of a customer than an assurance.

How much data are we pulling, and how often?

A model that wants history wants a lot of postings, so this is a volume question before it is a freshness one. Reads are paginated and filterable, an incremental pull by last-modified timestamp keeps a refresh proportional to what changed, and one system answers a ledger read as an asynchronous task you poll rather than as a response you wait for. Those three things are what make a nightly rebuild practical rather than heroic.

Does Maesn store or model our customers' financial data?

No. Requests are passed through to the target system and the response is normalised on the way back, so there is no copy of the ledger sitting here to go stale or to be breached. That also means the modelling, the aggregation and the forecast itself all stay in your product, which is where the differentiation belongs.

Build once on the Unified API.

See how financial analysis and forecasting works for your integration, or dive into the technical reference.