maesn
Use case

Accounts receivable automation starts before the invoice

Accounts receivable platforms require deep, bidirectional integration to correctly reflect customers, accounts, journals, accruals and deferrals, tax rates and open items. Maesn enables these complex AR workflows across dozens of ERP and accounting systems, without building each integration from scratch.

One receivable, two halvesboth directions
Your product
  • The invoice you issued
  • The payment you recorded
one shape, both ways
Their ledger
  • The customer, as their books name them
  • The account it posts to
  • The tax rate that applies

Six of the eight documented steps are about the right-hand side, not about the invoice.

Trusted by winning software teams
HubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicapHubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicap
The Prerequisite

Posting receivables is a lot about having the right data for precise mapping

Pull customer data, chart of accounts, dimensions and tax rates from your customer's accounting system as the base for precise mapping logic in your system: the prerequisite for correct postings into the accounting system.

What you pull first
/contactsCustomers matched
/accountsThe ledger
/taxRatesTax codes in use
/dimensionsClasses, departments
What your product decides
  • Which account a receivable lands in
  • Whether tax is set or chosen
  • Conditional rules per department
  • Override at the moment of transfer
Then you write, one of three ways
Option 1POST /invoices
Option 2POST /bookingProposals
Option 3POST /payments
And then it stays currentThe lastModified parameter works on every GET endpoint, so detecting what changed is a filter rather than a diff you build.

The first step is not a call at all, it is another use case. The guide opens by asking you to implement contact synchronisation, so that the customer in your database and the customer in your user's accounting platform are demonstrably the same party. That is not bureaucracy. A receivable booked against a near-duplicate customer record is the kind of error nobody notices until a statement goes out, and then it is somebody's afternoon. That work has its own page under customer and supplier data sync.

After that come the structures: the general ledger account the invoice posts to, the tax rates in use, and the dimensions their setup expects if they use any. None of these live in your product, all of them differ per customer, and each one is a place where an otherwise correct invoice becomes a correction. The tax rates in particular are less uniform than they look, which is a subject of its own under tax automation.

Only then does the invoice appear, and by that point the interesting question is no longer how to send it. It is which of the documented routes it should take.

How Maesn solves it

One connection that reads the structure and writes the receivable back

The same objects under the same names on every connected system, in both directions, so the mapping your users configure once keeps working when the next customer arrives on a different platform.

The reads arrive as one normalised shape, which is what makes the categorisation step buildable at all. You fetch the accounts, the rates and the dimensions, you present them in your own interface, and your users decide how their receivables map onto them. The documentation is unusually concrete about how far that can go: a single ledger account chosen from a dropdown, conditional rules of the kind if Department = IT, use Account A, or a choice made at the moment of transfer that overrides the stored configuration. Your product owns that logic. What it needs from the connection is that the options are real and current.

Writing back is where the direction matters. A receivable is money owed to your customer, so it posts as an invoice and a payment against a customer record, not as the mirror image on the payable side. That distinction is easy to lose in an integration layer that treats both as documents with amounts on them, and it is the reason the payable side has its own page rather than a paragraph on this one.

The customer record itself is the strongest part of the chain, which is convenient given the flow starts there. It is readable on most connected systems and writable on nearly as many, so keeping both sides in agreement is not a special capability you have to check per system. Authentication for all of it is one flow your customer approves once, whatever their system is.

What you get

Four ways a receivable reaches the ledger

Create the invoice

Your product is where the invoice comes into existence, so it arrives in the ledger as a real document with your choices attached.

You sendPOST /invoices
You supplyaccount, rate, dimensions

Upload the one you issued

The invoice already exists somewhere else, so it is presented for booking instead of being issued a second time.

You sendPOST /bookingProposals
You geta transaction to book

The payment against it

A step of its own after either route, and the one to check against the systems your own customers use.

You sendPOST /payments
You supplythe settlement

The journal entry

The deepest route, and it asks your product for the finished posting. It is also where accruals and deferrals are expressed.

You sendPOST /journalEntries
You supplythe complete posting

Which of the four an accounts receivable product uses depends on the concrete use case: where the invoice comes into existence, whether your product owns the categorisation, and whether the money has to appear in the ledger as well as the document. Most products need more than one of them over time, and the connection does not change when they do.

We help with that rather than leaving it to a trial build. It also depends on the system in front of you: Lexware Office and Xero take either of the first two, so there the choice really is yours, while DATEV Unternehmen Online takes booking proposals, which is the shape of the German workflow: documents are submitted to the tax advisor's environment to be booked, they are not issued there. Tell us which systems your customers are on and we say which routes are available on each.

Settling the payment against the outstanding item is the neighbouring job described under payment reconciliation, and where a system emits events, webhooks shorten the loop between the money arriving and your product knowing.

Proof

Receivables platforms already run on this connection

Two published customer categories, and the second one is what happens when a receivable stops being a receivable.

A customer in this category
Debtist
Debtist, a receivables management SaaS, runs on this API.

Receivables management is this use case by another name, which makes it the closest published category Maesn has to it.

What happens further down
Paywise
Paywise, a debt collection SaaS, builds on the same connection.

A receivable that stays unpaid becomes a collections case, and that is a platform reading the same objects from the same ledger.

Paywise has told the whole story, including what changed after the integration.

The two sit at different points on the same line. Receivables management is this use case under another name, and collections is what the unpaid remainder becomes. Both need the same things from the creditor's ledger, which is the argument for one connection rather than one per workflow, and the collections end of it is described under debt collection.

Key facts

Receivable coverage, object by object

The documented flow first, then the two objects a reader might expect here and should not count on. Counted from the per-system documentation, with what is supported today kept apart from what is only marked on demand.

Across the 30+ connected systems
What you needTodayOn demandSystem cannot
Customer records, reading2027
Customer records, writing1649
Chart of accounts, reading1982
Tax rates, reading12143
Invoices, writing10172
Booking proposals, writing10172
Payments, writing6167
Payment terms, reading21413
Open items, as an object2234
The top of the table is the documented flow, and it is where this use case is strong: the customer record is the best covered object in the whole model, on reading and on writing. The last two rows are here because the page they replace promised them. Payment terms and open items each stand at barely any system today, so nothing here is built on either. For unpaid invoices the documented route is the invoice list with a payment-status or due-date filter, which is supported far more widely.

The shape of this table is the shape of the use case: it is strongest exactly where the flow begins, at the customer record. That is what lets a product promise its users a working receivable sync rather than a working receivable sync on four named systems.

The last two rows earn their place by being weak. The page this replaces named payment terms and open items among the objects it reflects correctly, and at barely any system each that was more than the data supported. Where one system holds a receivables structure the shared model has no field for, reaching past the model is documented, and the incremental refresh that keeps all of it current works the same way as it does on every other list endpoint.

Where the line runs

We deliver the structure, your users decide the mapping

On this use case the boundary is unusually clear, because the documentation itself puts the categorisation logic in your product and says so.

What Maesn delivers
  • The customer, both directions
  • Accounts, rates and dimensions
  • Two routes for the invoice
  • The payment, written back
What stays your product
  • Which account a receivable hits
  • The rules your users configure
  • When a transfer happens
  • What your dunning looks like

Everything on the left is the connection doing what a connection should: the same objects, under the same names, on whichever system your customer runs, in both directions. That is the part that would otherwise be one integration per accounting platform, each with its own authentication, its own field names and its own opinion about what a customer record contains.

Everything on the right is your product, and the guide is explicit that this is deliberate. It hands you the accounts, the rates and the dimensions and then says the business logic will depend on your application. Whether a receivable maps to one ledger account or to a conditional rule, whether your users can override it at the moment of transfer, and when a transfer happens at all are product decisions with your customers' accounting conventions behind them. A layer that answered them for you would be guessing at an accountant's intent.

One property belongs here rather than on the security page. Requests are processed as they arrive, and what Maesn keeps is the record that a transfer happened rather than the transferred data. For a product handling other companies' customer and revenue data, holding less of it is easier to defend. The lastModified filter on the read endpoints is what makes staying current cheap without keeping a copy of anybody's ledger.

The people who notice first when a receivable ages are financial teams, before it reaches anyone else.

Accounts Receivable FAQ

Common questions

Where does an accounts receivable integration actually start?

Not with the invoice. The documented flow opens by asking you to implement the contact sync use case first, so the customer in your database and the customer in your user's accounting platform are the same customer. A receivable posted against the wrong record is not a receivable, it is a reconciliation problem with a date on it.

How does the invoice get into the accounting system?

Through one of several documented routes, and they are equals rather than a first choice and a fallback. If the invoice comes into existence in your product, you create it in the customer's system. If it was already created on another platform, the guide points you at booking proposals instead, so it arrives as something to be booked rather than as a fresh document. The payment and the journal entry are routes of their own after either.

What do we need before we can post anything?

The customer's own accounting structure, which is the part your product does not hold. The general ledger account the invoice posts to, the tax rates in use, and where relevant the dimensions their setup expects. Those are reads, they are among the better covered objects in the model, and getting them wrong is what turns an automated posting into manual correction later.

Do our users get to decide how transactions are categorised?

That is the intended design, and the documentation is unusually explicit about it. You present the accounts, rates and dimensions you fetched, and your users define the mapping: a single account for everything, conditional rules of the kind if department equals IT then use account A, or a choice at the moment of transfer with the configuration overridden. The business logic is yours; the data it operates on is what one connection delivers.

Can we post the payment as well, or only the invoice?

Both, and the payment is a separate documented step after either write route. It is worth knowing that payments are supported on fewer systems than invoices, so a product that depends on writing the payment rather than only the invoice should check that against the systems its own customers use.

You do not mention journal entries. Why not?

Because the accounts receivable guide does not. It documents invoices, booking proposals and payments as the way a receivable reaches the ledger. Journal entries are the write path of a different documented flow, the one for bookings, and they are also what payment reconciliation posts. Naming them here would sound more enterprise and describe a route this use case does not take.

What about payment terms and open items?

Those are real objects in the model and both are exposed by barely any connected system today, so this page builds nothing on either. For unpaid invoices the documented route is the invoice list filtered by payment status or due date, which is supported far more widely. If one specific system's own payment terms structure is what you need, that is a conversation about that system rather than a property of the model.

How do we keep the data current without re-reading everything?

The guide's last step is exactly that. Every GET endpoint takes a last-modified filter, so a scheduled job asks only for what changed since the previous run instead of comparing full lists, and where a system emits events, webhooks shorten the loop further. That is the same mechanism the rest of the API uses, not a special case for receivables.

Which systems does this work with?

Customer master data is the strongest row in the whole model, readable on most connected systems and writable on nearly as manyn, which matters because the flow starts there. Invoices write on ten and booking proposals on ten, so the two routes into the ledger are equally wide. The table on this page shows each object separately rather than averaging them, because an average would hide the row your product depends on.

Does Maesn decide which account or tax rate is used?

No. Maesn delivers the accounts, rates and dimensions the customer's system publishes, in one shape, and writes back what your product decided. Which account a given receivable belongs to, which rate applies to it and when it is transferred are your product's rules, and often your customer's accountant's rules before that.

Build once on the Unified API.

See how accounts receivable works for your integration, or dive into the technical reference.