maesn
For developers

Webhooks in ERP and accounting: which systems push events

Webhooks make integrations event-driven, and in ERP and accounting fewer than half of the systems send them natively. This guide walks the systems maesn connects: which publish webhooks, which model and payload each one uses and how to keep data current on the ones that send nothing.

Dr. Themo Voswinckel, CEO and Co-Founder at maesn
Dr. Themo Voswinckel
CEO and Co-Founder · · Updated
Illustration for Webhooks in ERP and Accounting: Which Systems Push Events
The concept

What webhooks, events and payloads are

A webhook lets one system notify another when something changes. You register a URL once, and the source system sends a request to it as soon as something relevant happens, such as an invoice being created, a payment being booked or a customer record being updated. Nothing has to query an API on a schedule to find out.

Three terms carry this article, and each one names a different thing. The event is the change in the source system, the invoice that was created, and it is what triggers a delivery. The webhook is the HTTP POST request that reports this event to the URL you registered. The payload is the body of that request, and how much it carries differs from system to system.

Because the source system reports changes as they happen, an integration can react within seconds and stops sending requests that return nothing new. For an integration that keeps data in sync for many customers, that decides between constant traffic and traffic only when there is something to fetch.

Terms used below
Tenant
The software vendor offering the integration
User
A customer of that software vendor
App
The integration the tenant provides
Why it matters

Why webhooks matter in ERP and accounting

ERP and accounting systems are often the system of record for critical business data. A change there usually has effects downstream, on reporting, payments, CRM systems or operational workflows. Without webhooks, an integration relies on scheduled polling jobs, which add delay, raise API load and make error handling harder.

Webhooks shorten that path. A change reaches the integration within seconds, each webhook names the object that changed, and the systems involved stay consistent with less traffic between them. That would make webhooks the default for ERP and accounting integrations, and in this domain their adoption has been slow.

The two models

The two webhook models ERP vendors use

Across ERP and accounting platforms two different webhook models have emerged, and which one a system uses decides how much routing and isolation you own.

App-based: one endpoint for every user

In an app-based model the software vendor configures a single webhook endpoint for the whole application. Webhooks for all connected users arrive at that one endpoint, and each payload carries a user identifier so your app can tell which user the event belongs to. This is common on accounting platforms with strong app marketplaces, such as QuickBooks Online and Xero. For the ERP vendor it is simple to manage and scales across thousands of small companies. For you it means routing every webhook to the right user, verifying it and keeping users isolated from each other.

User-based: a subscription per user

In a user-based model a subscription is created per user. Each one defines which events are delivered and to which URL. This is more common in ERP and mid-market systems, where data isolation, permissions and compliance requirements are stricter. Systems such as Microsoft Dynamics 365 Business Central and weclapp follow this approach. There are more subscriptions to manage, and in return each one has a clear boundary around the data of one user.

Payloads

How payloads differ between systems

Systems also differ in how much data a webhook carries. Some use ping and pull: the payload only signals that something changed and names the user and the object, and the receiving system fetches the full record through the API in a second call. This pattern is common in enterprise-oriented ERPs and keeps payloads small.

Other systems put business data directly into the payload. That can save the follow-up call and simplify processing, and it makes the payload larger and the sender responsible for more. In our experience even extensive payloads often miss a field a real use case needs, so the second API call usually happens anyway.

System by system

Which systems support native webhooks

The overview below shows which systems publish native, vendor-supported outbound webhooks and which model and payload each one uses. Systems without them are listed by name, because for an integration their absence is as much a finding as a webhook.

Of the 27 systems assessed
11
push events natively
4
answer in their own way
12
stay silent
A system counts as native when its vendor documents outbound webhooks. Which objects those webhooks cover is a second question, answered per system.
SystemModelPayload
Exact OnlineUser-basedPing and pull
Business CentralUser-basedPing and pull
XeroApp-basedPing and pull
QuickBooks OnlineApp-basedEvent payload
Lexware OfficeUser-basedEvent payload
FreshBooksUser-basedEvent payload
HoldedUser-basedEvent payload
MoneybirdUser-basedEvent payload
QontoUser-basedEvent payload
Visma e-conomicUser-basedEvent payload
WeclappUser-basedEvent payload
Fortnox
Websockets instead of webhooks

Events arrive over a persistent connection rather than as discrete HTTP requests, which has to be kept alive, reconnected and scaled per customer.

Xentral
Beta, with a model of its own

Support exists but follows Xentral's own conventions and is still in beta, so the shape can change without notice.

Pennylane
Beta, three events

Pennylane sends three events, on e-invoicing status and on incoming documents, and documents the feature as beta. Its own advice is to fall back on the changelog endpoints during this phase.

odoo
Webhooks through automation rules

An automation rule can send a POST with the values of selected fields to a URL when a record changes. Each customer sets it up in their own database.

No native outbound webhooks
AbacusbexioBuchhaltungsButlerDATEV RechnungswesenDATEV Unternehmen OnlineFreeAgentSage AccountingSage ActivesevdeskSnelStartTwinfieldVisma eAccounting

Also in the maesn catalogue, not covered by this overview: BMD, Dinero, Fatture in Cloud, Procountor, Sage 50 Spain, SAP Cloud ERP, Spiris. For these systems the overview makes no statement in either direction.

This is also why a build-versus-buy estimate for webhooks is usually wrong. Support has to be answered per object, per model and per payload style, and the answer changes when a vendor ships a release.

A neighbouring mechanism

Websockets as an alternative to webhooks

A few ERP and accounting systems, such as Fortnox, deliver change events over websockets. A websocket is a persistent, bidirectional connection that streams events as they happen, where a webhook is a single HTTP request per event.

Websockets can deliver with very low latency, and they cost more to operate: the connection has to be kept alive, reconnects have to be handled carefully and scaling gets harder with every customer. Webhooks are stateless, easier to secure and simpler to run at volume, which is why they suit cross-system integrations better. Websockets show up mostly in controlled or vendor-specific scenarios.

Object coverage

Which objects native webhooks cover

Even where a system supports native webhooks, they often cover only part of its objects. Events for sales-side entities such as invoices or sales orders are common, while purchasing objects such as purchase orders often have no event at all. An integration then combines webhooks and polling for the same customer, which means two code paths that fail in different ways.

The same object-level split applies to what maesn delivers. Each system page in the integration directory shows, object by object, which objects send webhooks through maesn and which ones you keep current with a scheduled read.

The reason

Why many systems still have no webhooks

Despite the advantages of event-driven integrations, many ERP and accounting systems still offer no native, vendor-supported webhooks. The reasons are usually legacy architectures, a strong reliance on batch processing and strict audit or compliance requirements that make real-time delivery harder to build and maintain. Many products in this space were also designed around manual workflows, with system-to-system automation added later.

Where native webhooks are missing, polling is the remaining option. It is technically straightforward, and it adds delay, raises API traffic and makes an integration slower to react. Third-party add-ons that simulate webhooks by polling internally exist for some systems, and their recurring cost per user adds up at scale. Most teams poll directly.

An integration across many systems therefore has to cover both cases: webhooks where a system sends them, and a scheduled read with a modification filter where it does not, behind one way of consuming changes.

One model

How maesn delivers webhooks

Through maesn you create a subscription per customer with one endpoint, and webhooks arrive at your callback URL in the same payload shape, whichever system they came from. An app-based vendor’s single endpoint stops being routing work in your code, because the subscription already belongs to one customer.

The payload follows ping and pull on every system: it names the object that changed, and you read the object through the Unified API. What your handler needs to know stops at the unified event model, and the vendor differences catalogued above stay on our side of the connection.

Where a system or an object sends no webhook through maesn, the same API serves the scheduled read. A lastModified filter returns only the records that changed since your last call, so each run stays small.

Why maesn standardises on ping and pull
Following it everywhere keeps the payload free of business data: what travels is an identifier, and the data itself moves over an authenticated call you make. That is a consistency decision and a security property at the same time.
Trust

How to verify a webhook from maesn

A callback URL is publicly reachable, so anyone who learns it could POST a forged webhook to it. Every webhook maesn delivers is therefore signed with an HMAC-SHA256 signature in the X-MAESN-SIGNATURE header, and your endpoint verifies it before acting on the payload.

FAQ

Frequently asked questions

What is a webhook and why does it matter for ERP integrations?

A webhook is an HTTP POST request that a system sends automatically when an event occurs, such as an invoice being created or a payment being booked. Your system learns about the change within seconds without polling an API repeatedly, which reduces API traffic and synchronisation delay.

What are the two main webhook models used by ERP vendors?

App-based webhooks send all user events to one central endpoint, which is common on platforms like QuickBooks Online and Xero. User-based webhooks create an individual subscription per user, which is common in systems like Microsoft Dynamics 365 Business Central. The two differ in what they ask of you for routing, security and scale.

What is the ping-and-pull pattern?

The webhook carries only a notification that something changed, without the data itself. The receiving system then fetches the record through a separate API call. That keeps payloads small, and it is the pattern maesn follows for every webhook it delivers.

Why do many ERP systems still not support native webhooks?

Legacy architectures, batch processing models and strict compliance requirements make real-time event delivery harder to implement. Many ERP products were designed around manual workflows, with system-to-system automation added later.

What happens when native webhooks are missing?

Teams typically fall back to polling, which adds delay and API load. Third-party add-ons that simulate webhooks exist for some systems, and their cost per user adds up at scale. A scheduled read with a modification filter keeps the load down, because each run fetches only what changed.

How does maesn handle webhook fragmentation across systems?

Through maesn you subscribe once per customer and receive one payload shape with one signature, whichever system sends the webhook underneath. Where a system or an object sends no webhook through maesn, the same API reads only what changed since your last call through a lastModified filter. Each system page shows which objects fall on which side.

Build once on the Unified API.

See how unified webhooks behave on the systems your customers run, or read the technical reference.