maesn
Use case

Accounts receivable automation starts before the invoice

Your product knows the receivable. Only your customer's ledger knows the customer record, the account and the tax rate it has to be posted against. Maesn moves both directions through one connection, then writes the invoice and the payment back.

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
HubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinProvetHeroHolviLanes & PlanesHubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinProvetHeroHolviLanes & Planes
The problem

The receivable is yours, the accounting structure is not

Read the documented flow in order and something stands out: almost none of it is about the invoice. It is about agreeing with somebody else's ledger before you write to it.

The documented order, start to finishdashed = a use case of its own · pale = optional in the guide
  1. sync contactsAgree on who the customer is
  2. GET /accountsThe general ledger account
  3. GET /taxRatesThe rates in use
  4. GET /dimensionsClasses, locations, departments
  5. categorizationHow your users map it all
  6. POST /invoicesOr a booking proposal
  7. POST /paymentsThe money against it

Only one of the seven is about the invoice itself. The first is a separate use case, two are optional, and the rest is the customer's own accounting structure, which is the part your product does not hold.

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 two 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 normalized 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 reads on twenty of the connected systems and writes on sixteen, 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

Create the invoice, or upload the one you issued

The guide offers two ways for a receivable to reach the ledger, and they answer different questions about where the invoice came from. They are supported on the same number of systems, which is where a first reading stops being enough: the counts match and the system lists do not.

POST /invoices10 systems

Create it in their ledger

Your product is where the invoice comes into existence, so Maesn writes it into the customer's accounting system with the account, rate and dimensions their setup expects.

POST /bookingProposals10 systems

Upload the one you issued

The guide names this route for the case where the invoice was already created on another platform. It arrives as a proposal to be booked rather than as a fresh document.

The same count is not the same systems

Only five of the connected systems support both routes, five more take a created invoice but no booking proposal, and another five take a booking proposal but no created invoice. Which route you need is therefore partly decided by the systems your customers run, not only by where the invoice was born.

POST /paymentsThen the money against it, whichever route the invoice took. Supported on six systems today.

Which route fits depends first on where the document is born. If your product is the system of record for the invoice, you create it in the customer's ledger and it arrives as a real document with your account, rate and dimension choices attached. If the invoice already exists somewhere else, the booking proposal route is the honest one: it presents the transaction for booking instead of pretending your product issued it. Uploading a document that already exists as though it were new is how duplicates enter a ledger.

The second thing it depends on is the system in front of you, and the split is sharper than the two counts suggest. Lexware Office and Xero take either route, so there the choice really is yours. DATEV Unternehmen Online takes booking proposals and not created invoices, which is not a gap but the shape of the German workflow: documents are submitted to the tax advisor's environment to be booked, they are not issued there. A product that only implemented the invoice route would simply not work for those customers.

After either route the payment is its own step, and its coverage is narrower than the invoice routes. That is worth designing around rather than discovering: a product whose value depends on the payment appearing in the ledger should check that against the systems its own customers actually use. Settling that 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 29 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, writing6158
Payment terms, reading21413
Open items, as an object2225
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, and the two write routes for the receivable are supported on the same number of systems. The last two rows are here because the page they replace promised them. Payment terms and open items each stand at two systems 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, and the two write routes are level with each other. That combination 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 two systems 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 two 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. Both routes are supported on the same number of connected systems today.

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 categorized?

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 two connected systems 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, reading on twenty of the connected systems and writing on sixteen, 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.