maesn
Use case

Payment reconciliation that posts where their ledger lives

Your engine already knows which payment settles which invoice. What it does not know is whether this customer's system wants that as a two-sided journal entry or as a payment against a document it already holds. Maesn delivers both routes and the accounts each one needs.

One reconciled bookingjournalLineItems[]
  • DEBITThe bank account it landed in
  • CREDITThe receivable it settles
both sides must name
An account from their chart19 systems
Readable through one call, under one shape

There is no contra-account field. The second side is a second line, and the guide expects you to name both.

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

One reconciled result, two incompatible destinations

Building the reconciliation engine is hard and bounded. Getting its output into the ledger is neither, because the ledger is a different one for every customer and they do not agree on what a settlement looks like.

How the thirteen reachable systems split across the two documented routes
7Journal entry only
bexio, DATEV Rechnungswesen, Dinero, Fortnox, odoo, QuickBooks, Twinfield
3Either route
Exact Online, Business Central, Xero
3Payment only
Lexware Office, sevdesk, Visma e-conomic
Only three of the twenty-nine connected systems accept both, so this is not a preference with a fallback. Posting a journal entry means naming both sides of the booking yourself; posting a payment means handing the money to the system and letting it settle an invoice it already holds. Which of those your product has to produce is decided by the customer's system, not by your architecture.

The work your product does upstream is the part nobody else can do for you: settlement lag, bundled payouts, fees, currency, refunds. The output of all that is clean and simple, a set of bookings ready to post. Then a customer says they are on DATEV, or Twinfield, or that their Dutch entity runs Exact Online, and a bounded engineering problem turns into an open-ended one.

It is not the number of integrations that makes it open-ended, it is that they disagree about the object. A journal entry asks you to name both sides of the booking, which means knowing the customer's chart of accounts and deciding which account each side hits. A payment asks for less and for something different: one account, an amount, and the id of the invoice it settles, because the system already holds that invoice and applies the money to it. Those are different features in your product, not two adapters around one feature.

And the split is uneven in a way that matters when you plan. The route that reaches the most systems is also the one that asks the most of you, so a product that only implements the easier one reaches a handful of systems, and a product that only implements the harder one misses the ones that will not take it. The reads behind either route come from master data that has to line up first, which is its own documented use case.

How Maesn solves it

One booking shape, and the accounts it has to reference

What a reconciled entry may carry is documented per system, and the fields that every system takes are exactly the ones that make an entry an entry.

Documented on the nine systems with a field list for this endpoint
debitCreditIndicatorWhich side of the entry this line is, debit or credit.9 of 9
accountId / accountNumberThe account, under the name that system uses.9 of 9
taxRateThe rate, on the systems where an entry carries one.6 of 9
dimensionsCost centre or department, as a named category.4 of 9
journalCodeWhich journal the entry belongs in, where there are several.4 of 9
files / filesPosThe statement or voucher, attached to the entry.5 of 9
The top two are on every system, which is what makes a reconciled entry portable at all. Everything below them is where the systems stop agreeing, and a booking that depends on a journal code or a cost centre is a booking whose feasibility is a per-system question. The entry also carries an accounting period and a reversal flag, so a correction is a documented shape rather than a workaround.

The two fields on every system are the account and the side, which is the whole of double-entry bookkeeping and the reason a reconciled booking is portable at all. Everything past that is where systems differ, and the differences are knowable before you build: the same normalized objects deliver the chart of accounts, the tax rates and the journals your entry points at, and a tax rate frequently arrives without a rule for applying it, which is a decision you keep rather than one the connection makes.

Two things the entry carries deserve naming because they are easy to miss. It takes an accounting period, so a booking can land in the period it belongs to rather than the one it was sent in. And it takes a reversal flag, so a correction has a documented shape. Attachments work the same way: the request is multipart and a file can be tied to a specific line, which is how a bank statement ends up on the booking instead of in a folder. Where a system holds something the shared model has no field for, reaching past the model is documented, and the customer authorises all of it once.

What the connection does not do is decide the accounting. The guide asks you to specify the account and the contra account for each entry, and that is the right division: which account a fee hits, how a bundled payout splits, and what period it belongs to are questions about your customer's books that no integration layer is in a position to answer.

What you get

A batch of bookings posted the way each system takes them

A reconciliation run does not produce one booking, it produces a cycle of them. One system in particular is built for exactly that, and its route is different enough to plan for.

Most systems
POST /journalEntries

One entry per call, and the response tells you whether it posted. This is the route the field lists above describe, and the nine field lists on that endpoint all agree about it.

DATEV Rechnungswesen
POST /journalEntries/bulk

A list of entries in one call, and the answer is a task rather than a result. Its own guide sends you to GET /asyncTask to find out whether the batch was accepted.

documentIdasyncTask
Why this looked like a gap and is not one

DATEV Rechnungswesen has no entry on the single-booking endpoint's field list, which reads like missing support until you find its own guide. It posts through the batch route by design, which is also the shape a reconciliation run wants: a settlement cycle produces many entries at once, not one.

The batch route is the better fit for this use case and the reason is structural rather than a matter of convenience: a settlement cycle produces many entries at once, and posting them one call at a time turns a single business event into a queue you have to manage. Handing over a list and polling for the outcome is the shape the work already has. Building for that answer from the start is far cheaper than retrofitting it, because a write that returns a task and a write that returns a result need different error handling around them.

The practical consequence is a second code path, and it is worth pricing in early. Posting to DATEV Rechnungswesen means assembling a list, handing it over and matching a task id back against what you sent. Posting to Xero means a call per entry and an answer in the response. Same booking, two different pieces of software around it, and the difference is invisible until the first customer on the other system arrives.

Proof

The system this page is about, in a customer's own words

Rally replaced a direct DATEV integration with one API.

Maesn completely transformed how we integrate with DATEV. What would have been a complex direct integration became a smooth, intuitive process thanks to their REST API and DATEV sandbox.
Thiago Peres
CTO, Rally

Rally is this page's subject from the other side. The quote names DATEV and it names the sandbox, which is the part a team posting bookings cares about: a place to get the shape of an entry right before it lands in a customer's books. Their published account describes replacing a complex direct integration, and the section above is the concrete version of what that replaces. Systems like Business Central sit on the other side of the split, taking either route, and sevdesk takes only the payment, which is the distinction the first section is about.

Key facts

Both routes and what they reference, counted per system

The two ways a reconciled result can land, then what a booking points at, counted from the per-system documentation.

Across the 29 connected systems
What you needTodayOn demandSystem cannot
Journal entries, writing10118
Payments, writing6158
Chart of accounts, reading1982
Tax rates, reading12143
Journals, reading5159
Dimensions, reading3179
Bank lines, reading0218
The first two rows are the two ways a reconciled result can land, and they are nearly exclusive sets rather than one number split in two. Below them sit the things a booking points at, thinning out as they get more specific. The last row is the one to read hardest: bank lines are readable on none of the connected systems, so the reconciliation itself is never something this connection performs for you.

Read the top two rows together rather than separately. They are nearly separate sets of systems, so adding them up describes nothing, and treating either as the number would overstate one and hide the other. The rows beneath are what an entry has to reference, and they thin out in the usual direction: accounts almost everywhere, tax rates on most of it, journals and dimensions on a handful.

The last row is the one this page is built around. Bank lines are readable on none of the connected systems, so nothing here compares a statement against open invoices. That is also why the receivable side and the payable side both stop at the document rather than at the bank, and why reading only what changed is how you keep the open items you match against current.

Where the line runs

You reconcile, we post the result

This is the one page in the family where the boundary was already drawn correctly by the page it replaces, and the coverage is the reason it holds.

What Maesn delivers
  • Both documented posting routes
  • The accounts, rates and journals
  • Batch posting where it exists
  • The attachment, on the entry
What stays your product
  • What each payment settles
  • Which account each side hits
  • How a bundled payout splits
  • When the booking is posted

Everything on the left is the connection: two routes into a ledger instead of one integration per accounting platform, the master data an entry has to reference under one set of field names, the batch route where a system offers it, and a file that travels with the booking. That is the part which otherwise grows with every customer who runs something new.

Everything on the right is your engine, and on this use case that is the substance. Which payment settles which invoice is a question about data we cannot see, since bank lines are not readable through any connected system. How a bundled payout splits, which account a fee belongs on, and when a cycle posts are decisions about your customer's books and your product's workflow.

Two things belong here because the page this replaces put them under the wrong heading. Posting a booking twice is prevented by your write happening once, not by a guarantee from us, and since no object has delete enabled, the fix for a double posting is a reversal rather than a removal. And the tax treatment of an entry stays with you: we deliver the rates the system publishes, in the form it publishes them. The lastModified filter is what keeps the accounts and rates you cached from drifting away from the ones your customer sees.

Matching a payment to an open item is the month-end work of financial teams, and it is the reason the two write routes matter to them at all.

Payment Reconciliation FAQ

Common questions

Does Maesn reconcile payments for us?

No, and that boundary comes before anything else. Bank lines are readable on none of the connected systems, so nothing here can compare a bank statement against open invoices. Your product or your payment provider decides what settles what. What this connection does is take the result of that decision and post it into whichever accounting system the customer runs.

How does a reconciled result get into the ledger?

One of two documented ways, and which one applies depends on the system. Ten systems accept a journal entry, where you name both sides of the booking yourself. Six accept a payment against an invoice the system already holds, and let it do the settling. Only three accept both, so the shape your engine has to produce is partly decided for you.

Why is there no contra-account field?

Because the second side of a booking is a second line rather than a field. The entry carries a list of line items, each with an indicator saying whether it is the debit or the credit side, and each naming its own account. That is ordinary double-entry structure, and it means a bundled settlement with several allocations is the same shape as a simple one, only with more lines.

Can we post a whole settlement batch at once?

On DATEV Rechnungswesen that is the documented route: a list of entries in one call, answered with a task you then poll for the outcome. Elsewhere the endpoint takes one entry per call. For a reconciliation product that difference is architectural rather than cosmetic, because a settlement cycle produces many entries at once and the two routes want different code around them.

Can we attach the bank statement or the voucher?

On the systems whose field list documents it, yes. The booking is a multipart request and takes files alongside the entry, with a position field so an attachment can belong to a specific line rather than to the whole document. That is how a statement or a voucher ends up on the entry rather than in a folder somebody has to match up later.

What about cost centres on the booking?

Documented on four of the nine systems that publish a field list for this endpoint, as a named dimension category on the line. Reading the available dimensions back out is thinner still, at three systems, and the two sets are not the same. So cost-centre reporting is buildable for named systems rather than in general, which is a better sentence to put in front of a customer than an assurance.

Does Maesn map our categories to their accounts?

No. The documented flow has you specify the account and the contra account for each entry, and what Maesn supplies is the raw material for that decision: the customer's chart of accounts, their tax rates and their journals, in one shape on every system. That is what lets you build a mapping interface once instead of once per accounting platform, but the mapping itself is your product's.

How do we avoid posting the same booking twice?

By making sure the write happens once on your side, which is the ordinary answer and the honest one. Nothing in the documentation describes a de-duplication guarantee here, so a retry after an unclear response should check before it repeats. Worth planning for, because no object in the model has delete enabled, so an entry posted twice is corrected with a reversal rather than removed.

Can we reverse a booking that turned out wrong?

The entry carries a reversal flag, so a correction is a documented shape rather than an improvisation. That fits how accounting systems expect corrections to work anyway: as a new document that cancels the old one, leaving both visible in the audit trail, rather than as an edit that makes the original disappear.

Which systems can we post reconciled bookings to?

Thirteen of the connected systems accept one route or the other today, with more marked on demand in their own documentation. The more useful question is which, because the split is uneven: seven take a journal entry and no payment, three take a payment and no journal entry, and three take either.

Build once on the Unified API.

See how payment reconciliation works for your integration, or dive into the technical reference.