maesn
Produkt-Feature

Ein Unified-Webhook-Modell für jedes System, das Sie anbinden

Manche Systeme senden Events. Viele senden gar nichts. Maesn gibt Ihnen einen Webhook zum Abonnieren, eine Nutzlastform zum Verarbeiten und eine Signatur zum Prüfen, und pollt selbst, wo ein System schweigt.

Zwei Arten von Systemenein Event
System pusht Eventsnativer Webhook
System bleibt stummkein nativer Webhook
maesn sendet das Event
Derselbe Event-Rumpf
{
  "eventType": "CREATED",
  "resource": "INVOICE",
  "resourceId": "bca91f06…"
}
Diese Software-Teams vertrauen uns
HubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicapHubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicap
Das Konzept

Was sind Unified Webhooks

Ein Webhook ist der Unterschied zwischen Fragen und Erfahren. Statt eine API nach Zeitplan aufzurufen, um zu sehen, ob sich etwas geändert hat, melden Sie einmal eine URL an, und das System ruft Sie auf, wenn es so weit ist. Für Anbindungen, die Daten im Gleichstand halten, ist das der Unterschied zwischen Minuten Rückstand und wenigen Sekunden, und zwischen dauerndem Verkehr und Verkehr nur bei Neuigkeiten.

Der Haken ist, dass Webhooks der am wenigsten standardisierte Teil jeder API sind. Die Unterstützung ist ungleich, die Nutzlasten widersprechen sich, und das Vokabular für ein angelegtes Objekt wechselt von System zu System. Unified Webhooks fassen das in ein Abo-Modell und einen Event-Rumpf, ausgeliefert über dasselbe normalisierten Datenmodell wie der Rest der Unified API. Sie schreiben einen Handler, und er funktioniert weiter, während Ihre Kunden neue Systeme mitbringen.

Das Problem

Events sind der am wenigsten standardisierte Teil

Jedes System beantwortet dieselben vier Fragen anders, angefangen damit, ob es Ihnen überhaupt etwas sagt. Wer direkt dagegen baut, braucht je Anbindung einen eigenen Listener.

Pusht es überhaupt
native Eventsnichtsteilweise
Was ankommt
volle Nutzlastnur ein Pingein Array
Event-Vokabular
creatednewobject.add
Wie Sie es prüfen
SignaturShared Secretnichts
Die zwei Modelle

App-basiert oder nutzerbasiert, und das ändert Ihren Code

Wo es Webhooks gibt, haben ERP- und Buchhaltungshersteller sich auf zwei unvereinbare Modelle festgelegt. Welches ein System nutzt, entscheidet, wie viel Verteilung und Trennung Ihnen gehört.

Ein Endpunkt für alle

App-basiert

  • Alle Events aller verbundenen Nutzer kommen an einem Endpunkt an
  • Jede Nutzlast trägt eine Nutzerkennung, nach der Sie verteilen müssen
  • Üblich, wo ein Hersteller einen großen App-Marktplatz betreibt
  • Legt Verteilung, Prüfung und Nutzertrennung auf Ihre Seite
QuickBooks OnlineXero
Ein Abo pro Kunde

Nutzerbasiert

  • Pro Nutzer und pro Event-Typ wird ein Abo angelegt
  • Das Zustellziel ist explizit statt geteilt
  • Üblich in ERP- und Mid-Market-Systemen mit strengerer Trennung
  • Mehr zu verwalten, klarere Grenzen zwischen Kunden
Exact OnlineBusiness Centralweclappund weitere

Bei den Nutzlasten geht es genauso auseinander. Manche Systeme senden ein Ping-and-Pull-Signal: Das Event sagt, welches Objekt sich geändert hat, und Sie holen das Objekt selbst in einem zweiten Aufruf. Andere legen Geschäftsdaten direkt in die Nutzlast, was einen Aufruf spart und das vergrößert, was Sie prüfen müssen. In der Praxis fehlt selbst großzügigen Nutzlasten meist ein Feld, das ein echter Anwendungsfall braucht, der zweite Aufruf passiert also ohnehin.

Maesn standardisiert für jedes Event auf Ping and Pull, nativ oder nicht. Das Event benennt das Objekt, Sie lesen es über die Unified API, und die Nutzlast wird nie zu einem Ort, an dem Kundendaten unterwegs liegen. Das ist ebenso eine bewusste Sicherheitseigenschaft wie eine der Einheitlichkeit, und sie macht einen Handler über beide Herstellermodelle hinweg tragfähig.

Systemunterstützung

Welche Systeme Events pushen, und welche stumm bleiben

Zu ERP- und Buchhaltungssystemen mit eigenen Webhooks und Triggern: Eine Minderheit hat sie, und die Mehrheit wird sie nie haben.

Native Webhooks: 10 von 27 Systemen
Exact OnlineNutzerbasiertPing und Abruf
Business CentralNutzerbasiertPing und Abruf
XeroApp-basiertPing und Abruf
QuickBooks OnlineApp-basiertEvent-Nutzlast
Lexware OfficeNutzerbasiertEvent-Nutzlast
FreshBooksNutzerbasiertEvent-Nutzlast
MoneybirdNutzerbasiertEvent-Nutzlast
QontoNutzerbasiertEvent-Nutzlast
Visma e-conomicNutzerbasiertEvent-Nutzlast
weclappNutzerbasiertEvent-Nutzlast
Ausgewählte Sonderfälle
FortnoxWebsockets statt Webhooks

Events kommen über eine dauerhafte Verbindung statt als einzelne HTTP-Anfragen, und die muss je Kunde offen gehalten, neu aufgebaut und skaliert werden. Maesn hält sie und sendet daraus gewöhnliche vereinheitlichte Events.

XentralBeta, mit eigenem Modell

Unterstützung gibt es, sie folgt aber Xentrals eigenen Konventionen und ist noch in der Beta, die Form kann sich also ohne Ankündigung ändern. Eine Änderung auf ihrer Seite fängt Maesn ab, statt dass Sie sie nachhalten müssen.

Keine nativen Webhooks: 15 von 27
AbacusbexioBuchhaltungsButlerDATEV RechnungswesenDATEV Unternehmen OnlineFreeAgentHoldedodooPennylaneSage AccountingSage ActivesevdeskSnelstartTwinfieldVisma eAccounting

Das ist die Mehrheit, und darunter sind die im deutschen Markt gefragtesten Systeme. Deshalb ist „unterstützt System X Webhooks“ die falsche Grundlage für eine Architektur: Die Antwort ist meist nein, und sie ändert sich unangekündigt.

Alle 27 liefern über Maesn vereinheitlichte Events, in einem Modell mit einer Nutzlastform, ob das System nativ pusht oder Maesn es abfragt und das Event selbst sendet.

Die zwei Sonderfälle, Fortnox und Xentral, erreichen Sie wie alles andere als gewöhnliche vereinheitlichte Events. Was jedes System darunter veröffentlicht, und warum eine Einschätzung je Hersteller den Kontakt mit dieser Tabelle nicht übersteht, steht System für System in unserem Artikel zur Webhook-Landschaft.

Wie Maesn damit umgeht

Einmal abonnieren, ein Event verarbeiten

Ein Endpunkt legt ein Abo für einen Kunden an. Von da an kommen die Events in derselben Form an Ihrer Callback-URL an, aus welchem System sie auch stammen.

callbackUrl

Wohin Events gehen

Der Endpunkt auf Ihrer Seite, der jedes Event dieses Abos entgegennimmt, als POST-Request.

eventType

Wovon Sie hören

Abonnieren Sie angelegte, geänderte oder gelöschte Objekte, mit einem Vokabular auf jedem System.

resource

Welche Objekte

Die Ressource, die Sie beobachten wollen, etwa eine Rechnung oder einen Kunden, überall gleich benannt.

Ein Webhook-Typ

Ein einziger Unified Webhook deckt jedes System ab, sodass Sie einen Handler schreiben statt einen je Anbindung.

Synthetische Webhooks

Für Systeme, die nativ nichts pushen, fragt Maesn für Sie ab und sendet dasselbe Event, sodass die Lücke Ihren Code nie erreicht.

Abos je Kunde

Jedes Abo gehört zu einem Kunden, sodass seine Events über sein eigenes Abo ankommen und trennbar bleiben.

Signierte Events

Jedes Event trägt eine HMAC-SHA256-Signatur über dem Rohrumpf, sodass Sie seine Herkunft von Maesn belegen können, bevor Sie ihm trauen.

subscribe.http
POST /webhooks
 
x-api-key: YOUR_API_KEY
x-account-key: CUSTOMER_ACCOUNT_KEY
 
{
"callbackUrl": "https://your-app.com/events",
"eventType": "CREATED",
"resource": "INVOICE"
}
Synthetische Webhooks

Events aus Systemen, die nichts pushen

Das ist der Teil, den es ohne vereinheitlichende Ebene nicht gibt. Hat ein System keine nativen Webhooks oder deckt nur einen Bruchteil seiner Objekte ab, lautet die übliche Antwort, dass Sie einen Poller bauen: einen Zeitplan, einen Cursor je Kunde und je Ressource, Änderungserkennung und eine Warteschlange, um die Last zu glätten. Es funktioniert, und es wird zu dauerhafter Infrastruktur, die Ihnen für immer gehört.

Maesn betreibt diesen Poller stattdessen und macht aus dem Ergebnis ein normales Event. Sie abonnieren genauso, wie Sie es bei einem nativen Webhook täten, und Sie bekommen denselben Rumpf mit demselben eventType, derselben resource und derselben resourceId. In Ihrem Handler unterscheidet die beiden nichts, und das ist der Punkt: Ob ein System Events pusht, ist keine Eingangsgröße Ihrer Architektur mehr. Das Abfragen dahinter wird von Asynchronous Processing getaktet, es bleibt also innerhalb der Limits jedes Systems, ohne dass Sie darum herum planen. Sie werden sie auch als virtuelle Webhooks bezeichnet sehen; es ist dieselbe Idee unter anderem Namen.

Die Lücke, die sie schließen, sind nicht nur ganze Systeme, es sind Objekte. Native Webhook-Unterstützung ist meist auf der Verkaufsseite am breitesten, bei Rechnungen und Kundenaufträgen, und im Einkauf am dünnsten, wo eine Bestellung oft gar kein Event hat. Damit fahren Sie Webhooks und Abfragen nebeneinander in derselben Anbindung, für denselben Kunden, mit zwei Codepfaden, die unterschiedlich scheitern. Synthetische Events nehmen diese Teilung weg: Ein Objekt ohne natives Event kommt genauso an wie eines mit.

Ein System ohne Events
1Kein nativer Webhook zum Abonnieren
2Also fragen Sie selbst nach Zeitplan ab
3Jeder Mandant, jede Ressource, dauerhaft
4Und Sie erfahren es trotzdem spät
maesn fragt es für Sie ab
Ein synthetischer Webhook

Sie abonnieren einmal und empfangen Events. Das Abfragen, die Taktung und die Änderungserkennung bleiben auf Maesns Seite, und der Event-Rumpf ist der, den Sie schon verarbeiten.

identisch: eventType · resource · resourceId
Event-Sicherheit

Eine Callback-URL ist öffentlich, deshalb wird jedes Event signiert

Events überall auszuliefern löst die Abdeckung. Es löst nicht das Vertrauen, und den Endpunkt, den Sie eben veröffentlicht haben, erreicht jeder, der die URL erfährt.

Ein unauthentifizierter Webhook-Endpunkt ist eine offene Tür: Wer die URL erfährt, kann ein gefälschtes Event darauf senden, und ein Handler, der auf Empfangenes reagiert, bucht es bereitwillig. Jedes Event, das Maesn ausliefert, nativ oder synthetisch, trägt einen über dem Rohrumpf berechneten X-MAESN-SIGNATURE-Header, Ihr Endpunkt kann also feststellen, dass das Event von Maesn kam, bevor er irgendetwas damit tut.

In Ihrem Handler, in dieser Reihenfolge
1

Über dem Rohrumpf neu berechnen

Nehmen Sie das Secret aus dem Anlegen des Webhooks, und tun Sie es, bevor Sie das JSON parsen. Wer vorher neu serialisiert, ändert die Bytes, und die Signatur passt nie.

expected = hmacSha256(webhookSecret, rawBody)
2

In konstanter Zeit vergleichen

Ein einfacher Gleichheitsvergleich verrät über die Laufzeit Information. Beide Hex-Strings in konstanter Zeit zu vergleichen ist eine kleine, kostenlose Härtung.

isValid = timingSafeEqual(expected, header)
// not: expected === header
3

Die Verarbeitung idempotent schlüsseln

Netze wiederholen, dasselbe Event kann also zweimal ankommen. Schlüsseln Sie Ihre Verarbeitung so, dass eine erneute Bearbeitung harmlos ist, dann wird aus doppelter Zustellung keine doppelte Buchung.

key = `${eventType}:${resource}:${resourceId}`

Zusammengenommen ist das eine Haltung und nicht drei Funktionen. Ping and Pull heißt, dass ein ausgeliefertes Event Kennungen trägt und keine Geschäftsdaten, selbst ein abgefangenes Event gibt also sehr wenig preis. Die Signatur heißt, dass Sie einem Event trauen können, bevor Sie handeln. Und weil Maesn keine Kopie der durchgereichten Daten behält, ist die Plattform in der Mitte kein zweiter Ort, an dem die Datensätze Ihrer Kunden liegen. Wer beantworten muss, wie das abgesichert ist, gibt auf jeder Ebene dieselbe Antwort, und darum geht es auch bei die umfassendere Sicherheitsarchitektur.

Asynchrone Antworten

Bescheid, wenn der API-Aufruf wirklich fertig ist

Nicht jedes System beantwortet einen Schreibvorgang sofort. Manche nehmen das Objekt an, reihen es ein und erzeugen den Ausgang später, und dann fragen Sie normalerweise Ihr eigenes Ergebnis ab.

Ihre App
Das Objekt senden
Wo Sie sonst abfragen würden
Das System
Reiht es ein, noch kein Ergebnis
maesn
Verfolgt den Ausgang
Ihre App
Event: Erfolg oder Fehlschlag

Maesn kann diese Schleife mit einem Webhook schließen: Sobald das System den Ausgang erzeugt, bekommen Sie ein Event, das sagt, ob der Schreibvorgang gelang oder scheiterte. Es gibt das, weil Kunden danach gefragt haben, und das ist der ehrliche Grund, aus dem das meiste dieser Ebene existiert. Jede Anfrage, jede Antwort und jedes Event auf dem Weg wird aufgezeichnet, wenn also doch etwas schiefgeht, sehen Sie über Protokollierung und Monitoring, was gesendet wurde und was zurückkam.

Warum es zählt

Ein Listener, jedes System

Selbst gebaut
  • Jedes Event-Modell einzeln lernen
  • Die stummen Systeme selbst abfragen
  • Pings in echte Nutzlasten verwandeln
  • Jedes Schema anders prüfen
Mit Maesn
  • Ein Event-Modell zu verarbeiten
  • Stumme Systeme für Sie abgefragt
  • So oder so normalisierte Nutzlasten
  • Überall eine Signaturprüfung

Webhook-Unterstützung fehlt am ehesten in dem System, das ein Kunde als nächstes will, und erzwingt am ehesten eine Neuschreibung, wenn sie fehlt. Weil das Event-Modell Maesns ist und nicht das jedes Herstellers, spielt diese Frage im Verkaufsgespräch keine Rolle mehr: Sie unterstützen das System, und wie seine Daten zu Ihnen kommen, ist ein Umsetzungsdetail auf unserer Seite. Der Handler, den Sie für die erste Anbindung geschrieben haben, ist der Handler für die letzte. Welches System ein Interessent fährt, ist dann eine Frage, die Go-to-Market-Teams beantworten, ohne vorher in der Entwicklung nachzufragen.

FAQ Unified Webhooks

Häufige Fragen

Wie richte ich einen Webhook mit Maesn ein?

Legen Sie ein Abo mit einem POST auf den Endpunkt /webhooks an und übergeben Sie eine callbackUrl, den eventType, der Sie interessiert, und die resource, die Sie beobachten wollen. Die Anfrage trägt Ihren API-Key und den Account-Key des Kunden, zu dem das Abo gehört. Gelöscht wird ein Abo mit einem DELETE auf /webhooks/{webhookId}.

Wie sieht ein Event aus?

Ein kleiner, gleichbleibender Rumpf: der eventType, die resource, die resourceId des geänderten Objekts und ein filterDate. Weil die Form überall dieselbe ist, deckt ein Handler jedes System ab. Bei einigen wenigen Systemen kommt die Benachrichtigung als Array von Objekten statt als einzelnes, was die Doku je System ausweist.

Was sind synthetische Webhooks?

Events für Systeme, die keine nativen Webhooks haben oder nur teilweise. Maesn fragt das System für Sie ab, erkennt die Änderung und sendet dasselbe normalisierte Event, das Sie ohnehin verarbeiten. Sie abonnieren einmal und empfangen Events, ohne wissen zu müssen, ob das System darunter etwas pusht.

Welche ERP- und Buchhaltungssysteme unterstützen eigene Webhooks und Trigger?

Eine Minderheit. Von den 27 geprüften Systemen bieten 10 native Webhooks: Exact Online, Microsoft Dynamics 365 Business Central, Xero, QuickBooks Online, Lexware Office, FreshBooks, Moneybird, Qonto, Visma e-conomic und weclapp. Fortnox streamt Events stattdessen über Websockets, Xentral hat ein eigenes Modell in der Beta, und 15 Systeme, darunter DATEV, sevdesk, Pennylane und Sage, bieten nichts. Über Maesn liefern alle 27 dasselbe vereinheitlichte Event, weil die stummen für Sie abgefragt und ihre Events für Sie gesendet werden.

Was unterscheidet app-basierte von nutzerbasierten Webhooks?

Ein app-basiertes Modell sendet jedes Event jedes verbundenen Kunden an einen Endpunkt, den Sie für die ganze Anwendung einrichten, mit einer Nutzerkennung in der Nutzlast, nach der Sie verteilen müssen. QuickBooks Online und Xero arbeiten so. Ein nutzerbasiertes Modell legt ein Abo je Kunde und je Event-Typ an, was mehr zu verwalten ist, Kunden aber sauber trennt. Exact Online, Business Central, weclapp und Qonto arbeiten so. Maesn bietet ein nutzerbasiertes Modell, gleich welches das System darunter verwendet.

Was sind virtuelle Webhooks?

Ein anderer Name für synthetische Webhooks. Wo ein System für ein Objekt keinen nativen Webhook hat, fragt Maesn es ab, erkennt die Änderung und sendet ein vereinheitlichtes Event mit demselben Rumpf, den ein natives Event hätte. In Ihrem Handler unterscheidet die beiden nichts, und deshalb ist es für Sie keine Architekturentscheidung mehr, ob ein System Events pusht.

Websockets oder Webhooks für ERP-Anbindungen?

Webhooks, für alles, was über Systeme hinweg geht. Websockets bringen sehr geringe Latenz über eine dauerhafte bidirektionale Verbindung, aber diese Verbindung muss am Leben gehalten, neu aufgebaut und je Kunde skaliert werden. Ein Webhook ist eine zustandslose HTTP-Anfrage, die leichter abzusichern und in der Masse zu betreiben ist. Fortnox ist das eine verbundene System, das über Websockets streamt, und Maesn macht aus diesem Strom gewöhnliche vereinheitlichte Events.

Wie härte ich meinen Webhook-Handler ab?

Zuerst die Signatur prüfen, dann zwei Dinge auf Ihrer Seite. Vergleichen Sie die Signatur in konstanter Zeit, etwa mit crypto.timingSafeEqual, damit der Vergleich über die Laufzeit nichts preisgibt. Und machen Sie die Verarbeitung idempotent, indem Sie auf Ressourcen-ID und Event-Typ schlüsseln, denn Netze wiederholen, und dasselbe Event kann zweimal ankommen. Sonst wird aus einer doppelten Zustellung eine doppelte Buchung.

Wie prüfe ich, dass ein Event wirklich von Maesn kam?

Jedes Event enthält einen Header X-MAESN-SIGNATURE mit einer HMAC-SHA256-Signatur. Berechnen Sie sie über dem rohen Anfragerumpf mit dem Webhook-Secret neu, das Sie beim Anlegen des Webhooks erhalten haben, und vergleichen Sie die beiden Werte. Prüfen Sie immer gegen den Rohrumpf, bevor Sie das JSON parsen.

Was passiert, wenn ein System eine Anfrage asynchron verarbeitet?

Manche Systeme nehmen einen Schreibvorgang an und liefern das Ergebnis erst später, was sonst bedeutet, den Ausgang abzufragen. Maesn kann Sie stattdessen per Webhook benachrichtigen, sobald das Ergebnis feststeht, einschließlich ob es gelang oder scheiterte. Gebaut wurde das, weil Kunden danach gefragt haben.

Sollte ich Webhooks nutzen oder abfragen?

Webhooks passen, um auf einzelne Änderungen zu reagieren, sobald sie geschehen. Ein geplanter Delta-Abruf über den lastModified-Filter passt für den Abgleich und zum Aufholen nach einer Ausfallzeit. Viele Anbindungen fahren beides, Webhooks für die Unmittelbarkeit und einen regelmäßigen Delta-Abruf als Netz.

Welche Events kann ich abonnieren?

Das Anlegen, Ändern und Löschen von Objekten, auf den Ressourcen, die das Zielsystem anbietet. Das Vokabular ist über alle Systeme dasselbe, das Abonnieren einer angelegten Rechnung sieht also gleich aus, welches System Ihr Kunde auch fährt. Die nötigen Parameter je System stehen auf der jeweiligen Zielsystem-Seite.

Einmal bauen, auf der Unified API.

Sehen Sie, wie das Unified-Webhook-Modell für Ihre Integration funktioniert, oder steigen Sie in die technische Referenz ein.