maesn
Use Case

Ausgabenmanagement in der Form, die jedes System verlangt

Ihr Produkt weiß, was ausgegeben wurde, von wem und wofür. Was es nicht weiß, ist, welchen von drei Feldnamen das System dieses Kunden für das Sachkonto verwendet, und ob die Zeile den Netto- oder den Bruttobetrag tragen muss. Maesn liefert das und bucht dann die Ausgabe.

Eine AusgabenzeileexpenseLines[]
Ein Platz, überall verlangt
Das Sachkonto, auf das diese Ausgabe gebucht wird
und es heißt
  • accountId
  • accountNumber
  • accountCode

Die Systeme, die eine von Ihnen geschriebene Ausgabe annehmen, sind sich einig, was die Zeile braucht, und nicht darüber, wie es heißt.

Diese Software-Teams vertrauen uns
HubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicapHubSpotTipaltiPaywiseRallyQredNordhealthFindityFintoClockinHEROHolviLanes & PlanesAgicap
Das Problem

Ein Ausgabenobjekt, sieben verschiedene Verträge

Eine Ausgabe zu schreiben ist auf jedem System, das es unterstützt, ein einziger Aufruf. Was dieser Aufruf enthalten muss, ist auf allen sieben verschieden, und die Unterschiede sind nicht kosmetisch.

Die Systeme, die heute eine geschriebene Ausgabe annehmen
Business Central
Konto auf der ZeileaccountId
Verlangter BetragtotalNetAmount
Gebucht gegensupplierId, verlangt
DATEV Unternehmen Online
Konto auf der Zeileaccount.number
Verlangter BetragtotalGrossAmount
Gebucht gegennicht in der Anfrage
Exact Online
Konto auf der ZeileaccountId
Verlangter BetragtotalGrossAmount
Gebucht gegensupplierId, verlangt
Lexware Office
Konto auf der ZeileaccountId
Verlangter BetragtotalGrossAmount
Gebucht gegensupplierId, verlangt
QuickBooks
Konto auf der ZeileaccountId
Verlangter BetragtotalNetAmount
Gebucht gegensupplierId, optional
Twinfield
Konto auf der ZeileaccountNumber
Verlangter BetragtotalNetAmount
Gebucht gegennicht in der Anfrage
Xero
Konto auf der ZeileaccountCode
Verlangter BetragtotalGrossAmount
Gebucht gegensupplierId oder customerId
Die mittlere Spalte ist die, die Geld kostet: Manche Systeme verlangen auf der Zeile den Nettobetrag und andere den Bruttobetrag, und der Abstand zwischen beiden ist genau die Steuer. Schicken Sie die Zahl, die Sie gerade haben, und die Buchung ist nicht fast richtig, sie ist auf jeder Zeile um die Steuer falsch.

Das Objekt selbst ist einfach, und es ist überall dasselbe. Ein Kopf sagt, wann das Geld geflossen ist und in welcher Währung; eine Zeile sagt, auf welches Sachkonto die Ausgabe gehört, wie hoch sie war und zu welchem Steuersatz. Jedes System, das eine Ausgabe annimmt, will genau so viel. Keine zwei von ihnen verlangen es unter denselben Namen.

Das Konto ist der sichtbare Fall. Alle sieben verlangen, dass die Zeile eines benennt, und untereinander nennen sie es accountId, accountNumber und accountCode. Das kostet Sie eine Zuordnungstabelle und sonst nichts. Der Betrag ist der, bei dem es still schiefgeht, denn beide Zahlen sind völlig gültige Werte und nur eine davon ist die, nach der dieses System gefragt hat. Eine Zeile, die brutto geschickt wird, wo netto verlangt war, wird nicht abgelehnt, sie wird gebucht, und sie wird genau um die Steuer falsch gebucht. Dass der Steuersatz selbst oft ohne eine Regel zu seiner Anwendung veröffentlicht wird, ist die zweite Hälfte desselben Problems.

Über die gemeinsame Form hinaus verlangt jedes der sieben etwas, wonach keines der anderen fragt. QuickBooks will eine Zahlungsart, und das Konto im Kopf muss von der passenden Art sein. Xero will wissen, ob der Beleg eine Ausgabe oder eine Erstattung ist, und es will entweder einen Lieferanten oder einen Kunden statt keines von beidem. Exact Online und Twinfield wollen einen Journalcode. Lexware Office will eine Belegnummer und auf jeder einzelnen Zeile einen Steuersatz in Prozent, und dazu gehört eine zweite Tatsache über dieses System: es ist das einzige der sieben, dessen Steuersatz-Lesezugriff als auf Anfrage verfügbar markiert ist statt als heute unterstützt. Nichts davon ist unvernünftig. Zusammen sind sie der Grund, warum eine Ausgaben-Integration nach dem ersten System selten fertig ist.

Wie Maesn das löst

Eine Anbindung für die Konten, die Sätze und die Dimensionen

Alles, worauf eine Ausgabe verweisen muss, kommt aus jedem angebundenen System in einer Form zurück, und genau das lässt Ihre Nutzer ihre Ausgaben einmal auf ihre eigene Buchhaltung abbilden statt einmal je Hersteller.

Zwei dokumentierte Wege ins Hauptbuch

Von den 30+ angebundenen Systemen nehmen sieben eine Ausgabe an und zehn einen Buchungssatz an, und das ist der Weg, den der Leitfaden in seinem Schlusssatz nennt. Nur fünf nehmen beides an, und damit ist das keine Rückfallebene für die schwächeren Systeme: DATEV Unternehmen Online und Lexware Office nehmen eine Ausgabe und keinen Buchungssatz, während fünf weitere einen Buchungssatz und keine Ausgabe nehmen. Zählt man beide Wege, können die meisten Systeme heute Ausgaben aus Ihrem Produkt entgegennehmen.

Der Kontenrahmen ist der tragende Lesezugriff dieses Use Cases, und er ist zugleich der stärkste: dasselbe normalisierte Objekt ist fast überall lesbar, und auf jedem einzelnen System, das eine Ausgabe annimmt. Was sich unterscheidet, ist, wie viel jedes hineinlegt. Das Feld, nach dem der Leitfaden zu gruppieren vorschlägt, damit ein Nutzer Aufwandskonten sieht statt einer flachen Liste von Hunderten, taucht in sieben dieser neunzehn dokumentierten Feldlisten auf, und der Verweis auf das übergeordnete Konto, mit dem sich die Hierarchie zeichnen ließe, in zweien. Keine der beiden Lücken stoppt den Use Case. Beide entscheiden, wie gut die Kontoauswahl in Ihrem Produkt für einen bestimmten Kunden sein kann, und das ist genau die Art Sache, die man vor einem Design-Review wissen will und nicht danach.

Der Rest der Kette ist gewöhnlich, sobald die Verbindung steht. Ihr Kunde gibt sie einmal über einen Ablauf frei, welches System er auch betreibt, Steuersätze und Lieferanten kommen überall als dieselben Objekte an, und nur zu lesen, was sich seit dem letzten Lauf geändert hat, hält einen zwischengespeicherten Kontenrahmen ehrlich, während Ihre Nutzer ihren bearbeiten. Wo ein System etwas führt, wofür das gemeinsame Modell kein Feld hat, ist am Modell vorbeizugreifen dokumentiert statt improvisiert.

Was eine Anbindung nicht kann, ist die Daten zu erfinden. Dimensionen sind das ehrliche Beispiel. Drei Systeme geben heute eine lesbare Liste davon heraus, und die meisten übrigen tragen in ihrer eigenen Dokumentation eine Markierung auf Anfrage, und das ist eine Markierung und kein Versprechen. Unabhängig davon dokumentiert kaum ein System ein Dimensionsfeld auf der Ausgabenzeile selbst, und es sind nicht dieselben zwei. Eine Kostenstellen-Funktion ist also baubar, und sie ist für benannte Systeme baubar und nicht allgemein, und das ist ein deutlich besserer Satz vor einem Kunden als die Zusicherung, dass alles unterstützt wird.

Was Sie bekommen

Die Ausgabe landet dort, wo der Buchhalter ohnehin hinsieht

Das Ergebnis von all dem ist unspektakulär, und genau das ist der Punkt: Ausgaben, die in Ihrem Produkt entstanden sind, erscheinen im Hauptbuch Ihres Kunden, auf seinem Konto, zu seinem Satz, ohne dass jemand eine Datei exportiert. Am klarsten zeigt sich, was dafür nötig ist, an einem einzigen System, auf das die gewohnten Wörter nicht passen.

GET /accountsWas zurückkommt
nametypeund sonst nichts

Zwei Felder, und type nimmt einen von drei Werten an: CASH, ACCOUNTS_RECEIVABLE, ACCOUNTS_PAYABLE. Keine Nummer, keine Klasse, kein Saldo. Das ist eine Liste von Buchungsordnern und kein Kontenrahmen, und genau das meint der Leitfaden, wenn er beiläufig anmerkt, dass der Endpunkt für DATEV nur Namen von Buchungsordnern liefert.

derselbe Wert, unverändert
POST /expenses/asyncWas es verlangt
account.namegeneratorNamecurrencytotalGrossAmounttransactionDate

Der Ordnername geht unverändert wieder hinein, und er muss einer vom Typ CASH. Die Antwort ist eine Aufgaben-Kennung und keine Buchung, und über GET /asyncTask erfahren Sie, ob sie gelandet ist. Der synchrone Endpunkt führt dieses System weiterhin und markiert es als veraltet, mit einem Verweis hierher.

DATEV Unternehmen Online gibt überhaupt keinen Kontenrahmen heraus. Zurück kommt eine kurze Liste von Buchungsordnern mit einem Typ, und der Schreibvorgang will einen dieser Namen zurück, und zwar einen vom Kassen-Typ. Ein Produkt, das auf der Annahme gebaut ist, dass jedes System nummerierte Konten zurückgibt, hat seinem Nutzer hier nichts zu zeigen. Ein Produkt, das auf dem gebaut ist, was jedes System wirklich zurückgibt, hat eine Liste, die sein Nutzer wiedererkennt, und eine Buchung, die ankommt, und denselben Unterschied macht die DATEV-Anbindung auch in jedem anderen Use Case.

Die zweite Hälfte dieses Kastens ist der Teil, den die meisten Anbindungen spät entdecken. Dieser Schreibvorgang ist asynchron: die Antwort ist eine Auftragskennung, und ein eigener Aufruf sagt Ihnen, ob die Buchung angekommen ist. Das richtig zu behandeln heißt, dass Ihr Nutzer von einem Fehlschlag Minuten später erfährt statt nie, und es ist weit billiger, von Anfang an dafür zu bauen, als es Code nachzurüsten, der annahm, eine Antwort käme mit der Anfrage.

Zwei kleinere Dinge gehören ebenfalls zum Ergebnis. Der Beleg reist auf fast allen mit der Ausgabe mit, weil der Schreibvorgang eine mehrteilige Anfrage ist und die Datei neben den Daten nimmt, der Beleg, den Ihr Nutzer fotografiert hat, liegt also dort, wo sein Buchhalter ihn erwartet, und nicht in einem Ordner, den später jemand abgleichen muss. Und der Auslöser bleibt Ihrer: ob eine Ausgabe in dem Moment abgeglichen wird, in dem sie freigegeben ist, in einem nächtlichen Lauf, oder erst wenn jemand einen Knopf drückt, ist eine Entscheidung über den Ablauf, den Ihre Nutzer schon haben, und nicht über die Anbindung.

Beleg

Ausgabenmanagement, eingebettet in die Buchhaltung ihrer Kunden

Findity bringt den Ausgabenabgleich in die Produkte seiner Partner.

“Maesn hat uns geholfen, Integrationen zu Buchhaltungssystemen zu bauen, und wir konnten uns dadurch auf andere Prioritäten unserer Roadmap konzentrieren. Besonders zufrieden sind wir mit der Unterstützung, die wir jedes Mal bekommen haben, wenn wir in einer Integration erweiterte Funktionalität brauchten, die Maesn für uns eingerichtet hat.”
Per Q.
CTO, Findity

Findity baut Ausgabenmanagement als White-Label- und API-Produkt, und das heißt, ihre Integrationen gehören nicht ihnen allein: jeder Partner, der sie einbettet, erbt, welche Buchhaltungssysteme Findity erreicht. Das ist dieser Use Case in seiner anspruchsvollsten Form, und der Teil des Zitats, der zweimal gelesen werden sollte, ist der zweite Satz, über die erweiterte Funktionalität, die vereinbart wurde, als eine Integration mehr brauchte, als sie hatte. Systeme wie Lexware Office, Xero und QuickBooks nehmen alle eine Ausgabe an und sind sich über fast jedes ihrer Felder uneinig, und das ist die Arbeit, die hier aufgenommen wird. Die Kunden mit einer veröffentlichten Case Study sind eine andere Menge, und dies hier ist ein Zitat und keine Studie.

Die Eckdaten

Jeder Schritt des Abgleichs, je System gezählt

Zuerst beide Schreibwege, dann alles, worauf die Ausgabe verweisen muss, gezählt aus der Dokumentation des jeweiligen Systems.

Über die 30+ angebundenen Systeme
Was Sie brauchenHeuteAuf AnfrageSystem kann es nicht
Ausgaben, schreiben7193
Buchungssätze, schreiben10118
Kontenrahmen, lesen1982
Lieferanten, lesen1928
Lieferanten, schreiben14411
Steuersätze, lesen12143
Dimensionen, lesen3179
Die oberen zwei Zeilen sind die zwei dokumentierten Wege, Ausgaben ins Hauptbuch zu bringen, und es sind nicht dieselben Systeme. Darunter verengt sich die Kette, die eine Ausgabe richtig macht, je genauer sie wird: der Kontenrahmen ist fast überall lesbar, wo sich eine Ausgabe schreiben lässt, Steuersätze auf den meisten davon und Dimensionen auf dreien. Wegen dieser letzten Zeile markiert der Leitfaden seinen Dimensionsschritt als optional.

Die Tabelle beantwortet die Frage, die tatsächlich über die Machbarkeit entscheidet, und das ist nicht, ob der Ausgabenabgleich funktioniert, sondern wie viel davon für die Systeme funktioniert, die Ihre eigenen Kunden fahren. Von oben nach unten gelesen erklärt sie auch die Form des Leitfadens: der Schreibvorgang ist schmal, der Kontenrahmen dahinter ist breit, und alles, was eine Buchung genauer macht, wird dünner, je genauer es wird.

Eine Zeile lohnt einen zweiten Blick aus einem Grund, der nicht ihre Größe ist. Buchungssätze erreichen mehr Systeme als Ausgaben, und die Dokumentation erwähnt diesen Weg fast beiläufig, als den einfacheren Weg, Ausgaben zu buchen. Für ein Produkt, dessen Nutzer nur den Betrag auf dem richtigen Konto brauchen und kein Ausgabendokument mit Lieferant und angehängtem Beleg, gibt es diesen Weg auf Systemen, die dieser hier nicht erreicht. Lieferanten sind hier die bequemen Zeilen, und wo sie angelegt und nicht nur gelesen werden müssen, ist das ein eigener dokumentierter Use Case.

Wo die Grenze verläuft

Wir liefern die Struktur, die Kategorisierung gehört Ihnen

In diesem Use Case zieht die Dokumentation die Grenze selbst, denn ihr längster Schritt beschreibt Entscheidungen, die sie ausdrücklich Ihrem Produkt überlässt.

Was Maesn liefert
  • Konten, Sätze und Dimensionen
  • Eine Form auf jedem System
  • Die Ausgabe, zurückgeschrieben
  • Der Beleg, mit der Buchung
Was Ihr Produkt bleibt
  • Das Konto jeder Ausgabe
  • Die Regeln Ihrer Nutzer
  • Wann der Abgleich läuft
  • Was als Ausgabe zählt

Alles links ist die Anbindung: die echte Buchhaltungsstruktur des Kunden, geliefert unter denselben Namen, auf welchem System er auch läuft, und ein Schreibvorgang, der als Buchung landet und nicht als Datei, die jemand importiert. Das ist der Teil, der sonst eine Anbindung je Buchhaltungsplattform wäre, jede mit einer eigenen Vorstellung davon, was eine Kontokennung ist.

Alles rechts ist Ihr Produkt, und hier ist das mehr als sonst. Die Dokumentation widmet ihren längsten Schritt der Kategorisierung und gibt die ganze Sache dann ab: ein einzelnes Standardkonto für den einfachen Fall, Regeln mit Bedingung für den schwereren, Kategorisierung im Moment der Synchronisation und Nutzer, die überschreiben, was auch konfiguriert war. Sie sagt, die Geschäftslogik hänge an Ihrer Anwendung, und damit hat sie recht. Was eine Ausgabe bedeutet, auf welches Konto sie gehört und wer das ändern darf, sind Produktentscheidungen, die nah an dem liegen, wofür Ihre Nutzer Sie tatsächlich bezahlen.

Eines gehört hierher, weil die Seite, die diese ersetzt, es in die Überschrift gestellt hat. Maesn macht Ausgaben nicht steuerkonform. Wir liefern die Sätze, die ein System veröffentlicht, und schreiben zurück, was Ihr Produkt zusammengestellt hat, und das Buchhaltungssystem, in dem es landet, ist die Stelle, an der die lokalen Regeln gelten, genau wie vorher. Wo die Ausgabe Ihre Nutzer als Eingangsrechnung erreicht und nicht als Kartenumsatz, ist der benachbarte Use Case mit eigenen Endpunkten das Buchen von Eingangsrechnungen und ihren Zahlungen, und der lastModified-Filter sorgt dafür, dass die Konten und Sätze, die Sie zwischengespeichert haben, nicht von denen abweichen, die Ihre Nutzer sehen.

Eine Ausgabe, die bereits kontiert ankommt, ist die, die Finanzteams nicht mehr abtippen.

Ausgabenmanagement FAQ

Häufige Fragen

Was gehört dazu, eine Ausgabe in das Buchhaltungssystem eines Kunden abzugleichen?

Ein Schreibvorgang und eine Handvoll Lesezugriffe, die ihn richtig machen. Sie geben die Anbindung einmal frei, lesen die Sachkonten des Kunden, seine Steuersätze und, wo er sie nutzt, seine Dimensionen, lassen Ihre Nutzer entscheiden, wie Ausgaben darauf abgebildet werden, und buchen die Ausgabe dann, wann immer sie in Ihrem Produkt anfällt. Die Reihenfolge zählt, denn alles vor dem Schreibvorgang ist dafür da, dass er auf dem richtigen Konto zum richtigen Satz landet.

Welche Systeme nehmen heute eine Ausgabe an?

Sieben der angebundenen Systeme nehmen eine geschriebene Ausgabe an, und weitere fünf nehmen stattdessen einen Buchungssatz, den die Dokumentation als den einfacheren Weg zum selben Ergebnis anbietet. Insgesamt können also zwölf Systeme Ausgaben aus Ihrem Produkt entgegennehmen. Die nützlichere Frage ist meist welche statt wie viele, denn nur fünf nehmen beide Wege an und die übrigen genau einen.

Warum unterscheidet sich der verlangte Betrag je System?

Weil die Systeme selbst sich unterscheiden, und das gemeinsame Modell trägt beide Zahlen, statt eine für Sie auszuwählen. Drei der sieben verlangen den Nettobetrag auf der Ausgabenzeile und vier den Bruttobetrag. Der Abstand zwischen beiden ist die Steuer, das ist also kein Formatierungsdetail: die Zahl zu schicken, die Sie gerade haben, erzeugt eine Buchung, die auf jeder Zeile um die Steuer falsch ist, und keine, die laut fehlschlägt.

Kategorisiert Maesn die Ausgaben?

Nein, und die Dokumentation sagt ungewöhnlich deutlich, dass das die Aufgabe Ihres Produkts ist. Sie beschreibt ein einzelnes Standardkonto für den einfachen Fall, Regeln mit Bedingung wie ein Konto je Abteilung für den schwereren, Kategorisierung im Moment des Abgleichs und Nutzer, die überschreiben, was auch konfiguriert war. Maesn liefert das Rohmaterial für diese Oberfläche: die echten Konten des Kunden, seine echten Steuersätze und seine echten Dimensionen, in einer Form auf jedem System.

Können wir den Beleg anhängen?

Auf fast jedem System, das eine Ausgabe annimmt, ja. Der Schreibvorgang ist eine mehrteilige Anfrage und nimmt Dateien neben der Ausgabe selbst an, das Bild oder PDF reist also mit der Buchung mit, statt danach getrennt hochgeladen zu werden. Twinfield ist in der Dokumentation die Ausnahme, und das ist die Art Detail je System, die sich zu prüfen lohnt, bevor Sie einem Kunden auf einer bestimmten Plattform eine Funktion zusagen.

Was ist mit Kostenstellen und Abteilungen?

Das sind Dimensionen, und das ist der dünnste Teil der Kette. Drei Systeme geben heute eine lesbare Liste von Dimensionen heraus, und der Rest markiert es überwiegend in der eigenen Dokumentation als auf Anfrage verfügbar. Davon getrennt dokumentiert kaum ein System ein Dimensionsfeld auf der Ausgabenzeile selbst, und diese gehören nicht zu jenen dreien. Ein Produkt, das auf eine Auswertung nach Kostenstellen angewiesen ist, sollte das deshalb als Frage je System behandeln und nicht als Eigenschaft des Modells.

Müssen wir den Lieferanten zuerst anlegen?

Das hängt vom System ab, und deshalb markiert der Leitfaden diesen Schritt als optional. Drei der sieben verlangen einen Lieferanten auf der Ausgabe, eines nimmt ihn wahlweise, eines will entweder einen Lieferanten oder einen Kunden, und zwei tragen in der Anfrage überhaupt keine Gegenpartei. Wo ein Lieferant verlangt wird, gehören Lieferantendatensätze beim Lesen wie beim Schreiben zu den besser abgedeckten Objekten des Modells, und die zwei Seiten in Übereinstimmung zu halten ist deshalb der am wenigsten brüchige Teil dieses Use Cases.

Ist eine abgeglichene Ausgabe steuerkonform?

Das ist keine Zusage, die diese Seite macht. Maesn liefert die Steuersätze, die das System des Kunden veröffentlicht, und schreibt die Ausgabe zurück, die Ihr Produkt zusammengestellt hat, und das System, in dem sie landet, ist der Ort, an dem die lokalen Regeln ohnehin gelten. Welcher Satz auf eine Zeile gehört und was eine Meldung zeigen muss, bleibt bei Ihrem Produkt und beim Steuerberater Ihres Kunden. Wenn Sie für einen bestimmten Markt etwas Festeres brauchen, fragen Sie uns direkt, statt es in einen Marketingsatz hineinzulesen.

Was passiert, wenn eine Buchung länger dauert als eine Anfrage?

Ein System bucht Ausgaben von Haus aus asynchron: die Antwort ist eine Aufgaben-Kennung und keine Bestätigung, und ein eigener Statusaufruf sagt Ihnen, wann die Buchung tatsächlich gelandet ist. Dafür lohnt es sich von Anfang an zu bauen, denn ein Schreibvorgang, der eine Quittung zurückgibt, und einer, der ein Versprechen zurückgibt, brauchen verschiedene Behandlung in Ihrem Produkt, und das zweite in Code nachzurüsten, der vom ersten ausging, ist die teurere Reihenfolge.

Was, wenn ein System ein Feld braucht, das das gemeinsame Modell nicht trägt?

Dafür gibt es einen dokumentierten Weg. Ein Rohdaten-Schalter gibt die eigene Nutzlast des Zielsystems neben dem normalisierten Objekt zurück, damit Sie alles sehen, was es führt, und wo das Modell überhaupt kein Feld hat, erreicht ein nativer Aufruf über den Durchleitungs-Endpunkt das System direkt, auf der Anbindung, die Sie ohnehin haben. Keiner von beiden verlangt eine zweite Integration oder einen zweiten Satz Zugangsdaten.

Einmal bauen, auf der Unified API.

Sehen Sie, wie Ausgabenmanagement für Ihre Integration funktioniert, oder steigen Sie in die technische Referenz ein.