maesn
Product insight

Every system, one common data model

Maesn normalises responses, formats and structures across every ERP and accounting system, so you build against a single schema instead of dozens. Where a native endpoint falls short, Maesn makes the extra calls and fills the gap before the response reaches you.

Three systems, one fieldcurrency
XerocurrencyCode: "EUR"
sevdeskcurrency: "EUR"
Lexware Officeeuro-only, no field
maesn normalises
Common data model
{ "currency": "EUR" }
Trusted by winning software teams
HubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicapHubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicap
The concept

What is a common data model

A Unified API exposes one standardised set of endpoints across many systems in the same category and normalises each system's data into shared schemas. Instead of learning every ERP's data shapes, you implement a single code base and always receive consistent, normalised data, whichever system your customer runs.

Normalisation happens at the level of the schema, not just the field name. Maesn aligns field names, data types, date and currency formats and the relationships between objects, so an invoice, its line items and its contact fit together the same way in every system. That is what separates a common data model from a plain field-by-field mapping: you build against one predictable structure once, instead of reconciling each system's quirks yourself every time you add another integration.

The problem

Every system models data differently

The same invoice looks different in every system: different field names, date formats, currency handling and object structures. Building and maintaining a separate mapping for each one is where integration projects stall.

Field names
currencyCodecurrency— missing
Date formats
2026-01-0101/01/2026…T00:00+02:00
Country codes
"Germany""DE""DEU"
One object
invoice+ lines+ contact = 3 calls

And the difference is not only in the data. Not every system speaks REST: some are SOAP, some expose GraphQL, some are XML-RPC or JSON-RPC. Parts of some are not requested at all but exchanged as files, as XML or CSV. A single integration across a handful of systems can therefore mean four transport technologies before a single field has been mapped. Odoo is the clearest example in the catalogue: it has no REST API at all, and reaching it means RPC. Behind Maesn all of it arrives as one REST interface, so parsing XML, reading CSV exports or learning a GraphQL schema never becomes your problem.

How Maesn handles it

Normalised, ISO-standardised and complete

Just a few examples. Maesn normalises far more than this, across every field, object and system.

The same value, named three ways

Xero returns it as currencyCode, sevdesk as currency, and Lexware Office has no currency field at all because it only supports euro. Maesn returns one currency field, always with the right value.

Xero → currencyCodesevdesk → currencyLexware → euro-only
"currency": "EUR"

One normalised schema

Responses, formats and structures are normalised across every system, so every integration you build behaves identically.

Background multi-calling

Where a native endpoint does not return everything, Maesn makes the extra calls itself and assembles one complete object.

ISO standards enforced

Country codes follow ISO 3166-1, currencies ISO 4217 and dates ISO 8601, validated on the way in and on the way out.

Told what a system ignores

When a target system does not use a field you sent, the response says so in meta.warnings instead of silently dropping it.

Automatic date conversion

Send a date or a full timestamp. Maesn converts it to what each system expects, adding midnight UTC or dropping the time as needed.

invoice.json
{
"data": [{
"id": "9714f3a2-5b8e-4d1b-8a0c-9f6e7d2f3e4b",
"invoiceNumber": "1020",
"currency": "EUR",
"invoiceDate": "2026-01-01T00:00:00Z",
"contactId": "eaa28f49-6028-4b6e-bb12-…",
"lineItems": [ … ]
}],
"meta": { "pagination": { "total": 125 } }
}
ISO 3166-1
Country codes
ISO 8601
Dates and timestamps
ISO 4217
Currency codes
Background multi-calling

Complete objects, assembled for you

Some systems never return a complete object from a single endpoint, and a contact is the clearest case. One system keeps the company, its contact people, their addresses, their email addresses and their phone numbers behind five separate endpoints. Another returns all of it from one. Same object, same customer question, two entirely different amounts of work.

Maesn does that work in the background. You call one /contacts endpoint. Behind it, Maesn either passes the request to the single native endpoint or makes the five calls in the right order and the right formats, then assembles the result before it reaches your code. What arrives is one contact carrying its addresses, contactPersons, emailAddresses and phoneNumbers, whichever system it came from. The multi-calling, the ordering and the reassembly stay on Maesn's side.

Native system, five calls
GET/companies/9021
GET/contactPersons?company=9021
GET/addresses?company=9021
GET/emails?company=9021
GET/phoneNumbers?company=9021
maesn assembles
One complete object
"data": [{
  "id": "92c4f3a2-5b8e-4d1b-…",
  "companyName": "maesn",
  "addresses": [ … ],
  "contactPersons": [ … ],
  "emailAddresses": [ … ],
  "phoneNumbers": [ … ]
}]
Why it matters

One model, less to maintain

Building it yourself
  • Map every system's data shapes by hand
  • Branch your logic for each system's quirks
  • Re-map whenever a system changes its API
  • Rebuild for every new system you add
With Maesn
  • Build against one schema
  • No per-system branching
  • Upstream changes absorbed for you
  • New systems included automatically

The part that gets underestimated is not the build, it is the years after it. A target system changes a field, renames an endpoint or alters a format, and an integration built directly against it breaks. Either you track every upstream release to stay ahead of it, or you find out when a customer tells you their data stopped syncing. Building is a question of time to market; maintenance is where the cost accumulates, and over the life of an integration it is usually the larger half.

That is the half Maesn absorbs. The systems Maesn partners with notify it of changes before they land, and the work of following them happens on Maesn's side of the interface rather than yours. How well that has held is a checkable fact rather than a promise: Maesn is still on the first version of its API, so nothing you built against it has been taken away. Should a breaking change ever be unavoidable, the intent is to announce it ahead of time and publish the new shape alongside the old one instead of in place of it, so the migration lands in your planning rather than in an incident.

The common data model deliberately covers the fields and objects that every system shares. When a customer needs something outside it, you are not stuck. Customisation handling reaches anything beyond the model: Authenticated Passthrough calls any endpoint in the system directly, and Raw Data gives full, unfiltered access to whatever the system returns. Nothing is locked away, so the model stays clean without limiting what you can build. One model that holds across systems is what product and engineering teams are actually buying when they pick a unified API.

Common Data Model FAQ

Common questions

What does Maesn normalise?

Field names, data types, date and currency formats and the relationships between objects, across every supported system, into one shared schema.

What if a system has a field the common data model does not cover?

Use Authenticated Passthrough to call that endpoint directly, or Raw Data for full, unfiltered access to whatever the system returns. Nothing is locked away.

How do I know whether a system actually used a field I sent?

The response tells you. Alongside the data, Maesn returns a meta.warnings array, and a field a target system does not use is named there rather than quietly discarded. That matters when you write to many systems from one code base: without it you would only find out that a value never arrived by going to look in the customer's system.

Are new systems automatically covered?

Yes. Once you integrate Maesn's endpoints, every existing and new integration Maesn adds is available on the same schema, with no extra work on your side.

How are dates and currencies handled?

Dates use ISO 8601 and are converted automatically to what each system expects, adding midnight UTC or dropping the time as needed. Currencies use ISO 4217 and countries ISO 3166-1.

Do I still need per-system logic?

No. You implement a single code base and always receive normalised, consistent data, whichever system your customer runs.

How is the common data model different from field mapping?

The common data model normalises the fields and objects that every system shares into one schema. Field mapping sits on top of it for the parts specific to your customer, their custom fields and objects, mapped into that same schema. You get a consistent base model and a way to extend it wherever a customer's setup needs it.

Does normalising the data mean I lose access to anything?

No. The model exposes the shared, normalised shape, and anything outside it stays reachable through Authenticated Passthrough or Raw Data. You work against clean, consistent data by default and drop down to the raw system response whenever you need to.

What happens when a system changes its API?

Maesn absorbs the change. Because you build against the common data model and not the underlying system, upstream changes to field names or structures are handled on Maesn's side, and your integration keeps receiving the same normalised data.

Build once on the Unified API.

See how the Common Data Model works for your integration, or dive into the technical reference.