Shopify sagt, die Bestellung beträgt 128,45. Der Verkaufsauftrag in Odoo sagt 106,16. Niemand hat etwas angefasst, der Konnektor meldet keine Fehler, und trotzdem widersprechen sich die beiden Zahlen. In der Praxis lässt sich fast jede Betragsabweichung zwischen Odoo und Shopify auf eine von acht Ursachen zurückführen – und jede hinterlässt einen anderen Fingerabdruck. Dieser Leitfaden geht alle acht durch, nennt das Symptom, das jede von ihnen verrät, und zeigt auf beiden Seiten genau das Feld, das zu prüfen ist.
Das gilt für jede Shopify-Bestellung, die in Odoo lebt, unabhängig davon, welcher Konnektor sie importiert hat: der Shopify Odoo Connector von Emipro, Webkul, ein OCA-Modul oder eine eigene Brücke. Die Feldnamen unten stammen aus den Standardmodellen von Odoo, ergänzt – wo relevant – um die Einstellungen, die ein Konnektor üblicherweise auf seinem Instanzdatensatz bereitstellt.
Zuerst: Vergleichen Sie wirklich vergleichbare Zahlen
Bevor Sie nach einem Fehler suchen, prüfen Sie, was Sie eigentlich vergleichen. Beide Systeme zeigen mehrere „Summen“, und die bedeuten nicht dasselbe.
- Aktuelle Shopify-Summe: was der Kunde heute schuldet, nach Erstattungen und Bestelländerungen. In der Admin API: currentTotalPriceSet.
- Ursprüngliche Shopify-Summe: was beim Checkout vereinbart wurde, vor jeder späteren Änderung: originalTotalPriceSet.
- Summe des Odoo-Verkaufsauftrags: amount_total auf sale.order – was der Konnektor importiert und danach eventuell nachsynchronisiert hat.
- Netto abgerechnet in Odoo: gebuchte Kundenrechnungen minus gebuchte Gutschriften (account.move, move_type out_invoice und out_refund).
Dass diese vier Zahlen auseinandergehen, ist für sich genommen kein Problem. Die einzige echte Frage lautet, welches Paar übereinstimmen sollte – und das hängt davon ab, wie weit die Bestellung gereist ist: Eine noch nicht abgerechnete Bestellung verlangt einen anderen Vergleich als eine, die abgerechnet, erstattet und geändert wurde.
1 Ursache 1: Bruttopreise (Steuer im Preis enthalten)
Das ist der häufigste Fehlalarm und der am leichtesten auszuschließende. Wenn Ihre Shopify-Preise die Steuer enthalten und Ihre Odoo-Steuern als „Im Preis enthalten“ konfiguriert sind, messen der Shopify-Zwischensumme und der Nettobetrag in Odoo zwei verschiedene Dinge: die eine ist brutto, der andere netto.
Das Symptom ist unverkennbar: Die Lücke entspricht exakt dem Steuersatz. 128,45 gegen 106,16 ist kein Rundungsproblem, das sind 21 % Mehrwertsteuer.
Die Lösung besteht darin, einen Vergleich zu wählen, der diese Einstellung übersteht. Vergleichen Sie Bruttosummen – die aktuelle Shopify-Summe gegen amount_total in Odoo – oder Nettobeträge auf beiden Seiten, indem Sie in Odoo amount_tax von amount_total abziehen. Was Sie nie tun sollten: die Shopify-Zwischensumme mit amount_untaxed in Odoo vergleichen, außer Sie wissen sicher, dass beide Seiten gleich konfiguriert sind.
2 Ursache 2: Der Auftrag ist eingefroren, die Rechnung lebt weiter
Konnektoren importieren eine Shopify-Bestellung in einen sale.order. Sobald dieser Auftrag abgerechnet ist, hören die meisten auf, spätere Änderungen hineinzuschreiben – zu Recht: Ein abgerechneter Auftrag ist ein Buchhaltungsdokument, kein Spiegel. Ab da hält der Auftrag fest, was bestellt wurde, und die Rechnungen halten fest, was tatsächlich berechnet wurde.
Kommt also nach der Rechnungsstellung eine Erstattung, sinkt die aktuelle Shopify-Summe, während der Odoo-Auftrag stehen bleibt. Das Geld hat sich in Odoo sehr wohl bewegt, nur woanders: in einer Gutschrift, einem account.move mit move_type = out_refund.
Wo Sie nachsehen: sale.order.invoice_ids liefert alle Rechnungen und Gutschriften zum Auftrag. Addieren Sie die gebuchten out_invoice, ziehen Sie die gebuchten out_refund ab – dieser Nettobetrag ist das, was zur aktuellen Shopify-Summe passen muss. Pro Zeile ist die maßgebliche Menge qty_invoiced, nicht product_uom_qty.
Deshalb liefert ein Vergleich des Verkaufsauftrags mit Shopify mit zunehmendem Alter der Bestellung immer mehr Fehlalarme: Sie vergleichen eine Momentaufnahme vom Importzeitpunkt mit einem lebenden Dokument.
3 Ursache 3: Erstattungen – das Geld stimmt immer, die Mengen nicht unbedingt
Shopify-Erstattungen gibt es in zwei Varianten, und nur eine rührt den Bestand an. Eine Erstattung kann das Geld zurückgeben und die Einheiten einlagern, oder das Geld zurückgeben und die Einheiten lassen, wo sie sind: beschädigte Ware, Kulanz, teilweise Preisanpassung.
In der Admin API steckt der Unterschied in jeder Erstattungszeile im Feld restockType: NO_RESTOCK, CANCEL, RETURN oder LEGACY_RESTOCK. Für den Abgleich heißt das: Eine NO_RESTOCK-Erstattung senkt den Betrag, ohne die lebende Menge der Zeile zu ändern – eine Mengenprüfung pro Zeile kann also falsch aussehen, obwohl das Geld perfekt stimmt.
Das ist die am häufigsten missverstandene Abweichung, weil der Instinkt sagt, man solle Mengen mehr trauen als Beträgen. Hier haben die Beträge recht, und die Mengen erzählen etwas anderes: was abgerechnet wurde gegenüber dem, was physisch zurückkam.
4 Ursache 4: Die Bestellung wurde nachträglich in Shopify bearbeitet
Shopifys Bestellbearbeitung ändert eine Bestellung an Ort und Stelle: Zeilen kommen hinzu, fallen weg oder ändern ihre Menge, nachdem der Kunde bezahlt hat. Shopify behält beide Zahlen – originalTotalPriceSet für den Checkout, currentTotalPriceSet für die bearbeitete Bestellung – und die meisten Konnektoren synchronisieren den Verkaufsauftrag nach, sodass amount_total in Odoo der Änderung folgt und nicht mehr dem entspricht, was bestellt wurde.
Das allein ist harmlos. Gefährlich wird die Variante, die nach der Rechnungsstellung eintrifft: Eine in Odoo bereits abgerechnete Zeile wird in Shopify entfernt. Jetzt hat Odoo mehr abgerechnet, als Shopify je einziehen wird. Das ist kein Anzeigeartefakt, sondern eine echte Überfakturierung – und braucht eine Gutschrift.
Symptom: Der Nettobetrag der Odoo-Rechnungen liegt über der aktuellen Shopify-Summe, die Bestellung hat keine Erstattung, und die ursprüngliche Shopify-Summe ist höher als die aktuelle. Wenn alle drei Punkte gleichzeitig zutreffen, wurde die Bestellung nach der Rechnungsstellung bearbeitet.
5 Ursache 5: Geschenkkarten – verkauft und eingelöst
Geschenkkarten erzeugen zwei völlig verschiedene Abweichungen, je nachdem, auf welcher Seite der Transaktion sie stehen – es lohnt sich, das sauber zu trennen.
Eine Geschenkkarte verkaufen. In Shopify trägt die Zeile das Kennzeichen isGiftCard und meistens gar keine SKU. Konnektoren ordnen sie nicht über die SKU zu – sie erkennen das Kennzeichen beim Import und leiten die Zeile auf ein eigenes Produkt um, das auf der Konnektor-Instanz konfiguriert ist (bei Emipro gift_card_product_id). Wenn Ihr Abgleich Zeilen über die SKU zuordnet, erscheint dieselbe Karte als zwei halbleere Zeilen: eine auf der Shopify-Seite mit Bezeichnung und ohne SKU, eine auf der Odoo-Seite mit der internen Referenz des synthetischen Produkts. Mit der Karte ist alles in Ordnung; der Zuordnungsschlüssel ist falsch.
Mit einer Geschenkkarte bezahlen. Hier hat Shopify überhaupt keine Zeile: Eine als Zahlung eingesetzte Geschenkkarte ist ein Zahlungsmittel und taucht nur unter den Zahlungsanbietern der Bestellung auf. Konnektoren, die die Zahlung in Odoo ausgleichen müssen, fügen eine negative Zeile hinzu – „Gift card for …“ –, die auf dasselbe synthetische Produkt zeigt. Odoo hat dann eine Zeile mehr als Shopify, und jede naive Zeile-für-Zeile-Ansicht zeigt eine Zeile ohne Gegenstück.
6 Ursache 6: Rabatte, Gratisartikel und Artefaktprodukte
Shopify und Odoo modellieren dieselbe kaufmännische Geste unterschiedlich. Ein Gratisartikel ist in Shopify eine zweite Zeile zu 0,00. Ein Rabatt ist ein Betrag auf der Zeile selbst. Odoo-Konnektoren drücken beides häufig als zusätzliche Auftragszeile aus, die auf ein synthetisches Produkt auf der Instanz zeigt – typischerweise ein Rabattprodukt, ein Erstattungsausgleichsprodukt, ein Zollprodukt, ein Trinkgeldprodukt und ein Versandprodukt.
Diese Artefaktzeilen haben kein Gegenstück in den lineItems von Shopify. Zeile für Zeile sehen sie wie Geisterzeilen aus; in der Summe sind sie genau das, was beide Summen zur Deckung bringt. Sie zu löschen würde die Bestellung kaputt machen, nicht reparieren.
Richtig vergleichen: Aggregieren Sie Zeilen vor dem Zuordnen nach SKU und schließen Sie die Produkte aus, die auf der Konnektor-Instanz als Artefakte konfiguriert sind. Sind diese beiden Regeln gesetzt, sind die verbleibenden Unterschiede echt.
7 Ursache 7: Versand, Zölle und Gebühren
Versand ist in Shopify ein eigenes Konzept – eine Versandzeile mit eigenem Preis und eigener Steuer –, während er in Odoo meist als normale Auftragszeile mit dem Kennzeichen is_delivery ankommt, bepreist über das Versandprodukt des Konnektors. Zölle, Trinkgelder und Zahlungszuschläge folgen demselben Muster.
Praktische Folge: Die Zeilenzahl stimmt fast nie überein, selbst bei perfekt synchronisierten Bestellungen, und jeder Zwischensummen-Vergleich erbt diesen Unterschied. Vergleichen Sie zuerst Summen; Zeilen erst, nachdem Sie Versand- und Gebührenzeilen auf der Odoo-Seite ausgeschlossen haben.
Dasselbe gilt für die Lieferachse: Hinter einer Dienstleistungszeile steht keine Lagerbewegung, ihre gelieferte Menge bleibt also für immer null. Das ist korrektes Verhalten, keine offene Lieferung.
8 Ursache 8: Währung, Presentment Money und Rundung
Shopify liefert jedes Geldfeld doppelt: shopMoney in der Währung Ihres Shops und presentmentMoney in der Währung, die der Kunde tatsächlich gesehen hat. Wer über mehrere Währungen verkauft, dessen Konnektor hat eine davon importiert – und Sie lesen womöglich die andere.
Odoo fügt eine eigene zweite Umrechnung hinzu: Der Auftrag wird in seiner Währung gespeichert und zum Tageskurs in die Unternehmenswährung umgerechnet. Ein veralteter Wechselkurs erzeugt eine kleine Abweichung, die immer in dieselbe Richtung geht – ein verlässliches Indiz, denn echte Fehler sind selten so konsistent.
Und dann ist da noch schlichte Rundung. Unterschiede von ein bis drei Cent bei mehrzeiligen Bestellungen mit prozentualen Zeilenrabatten sind Rundung, und ihnen nachzujagen kostet einen Nachmittag. Alles Größere hat eine der obigen Ursachen.
Schnellreferenz: vom Symptom zur Ursache
| Was Sie sehen | Wahrscheinlichste Ursache | Wo prüfen |
|---|---|---|
| Die Lücke entspricht exakt dem Steuersatz | Bruttopreise | Odoo-Steuer „Im Preis enthalten“; Bruttosummen vergleichen |
| Odoo höher als Shopify, Bestellung hat eine Erstattung | Erstattung nach der Rechnungsstellung gebucht | account.move out_refund; qty_invoiced pro Zeile |
| Odoo höher, keine Erstattung, Shopify original > aktuell | Nach Rechnungsstellung bearbeitet (Überfakturierung) | originalTotalPriceSet gegen currentTotalPriceSet |
| Beträge stimmen, die Menge einer Zeile nicht | Erstattung ohne Wiedereinlagerung | refundLineItems.restockType; currentQuantity |
| Eine Zeile mehr in Odoo, runde Differenz | Geschenkkarte als Zahlung eingesetzt | Zahlungsanbieter der Bestellung; negative Zeile in Odoo |
| Eine Geschenkkarte erscheint als zwei halbleere Zeilen | Über SKU statt über das Geschenkkarten-Kennzeichen zugeordnet | isGiftCard; Geschenkkartenprodukt der Instanz |
| Zusätzliche Odoo-Zeilen für Rabatt oder Zoll | Artefaktprodukte des Konnektors | Rabatt-/Zoll-/Trinkgeld-/Versandprodukt der Instanz |
| Eine Differenz von wenigen Cent | Rundung oder Wechselkurs | shopMoney gegen presentmentMoney; Tageskurs in Odoo |
Eine Fünf-Minuten-Prüfung zum Wiederholen
Wenn eine Abweichung auf Ihrem Tisch landet, löst diese Reihenfolge sie schneller, als beide Bildschirme anzustarren:
- Öffnen Sie die Shopify-Bestellung. Notieren Sie die aktuelle Summe und prüfen Sie, ob sie Erstattungen trägt oder bearbeitet wurde.
- Öffnen Sie den Odoo-Verkaufsauftrag. Notieren Sie amount_total und sehen Sie sich invoice_status an.
- Wenn abgerechnet: Addieren Sie die gebuchten Rechnungen, ziehen Sie die gebuchten Gutschriften ab und vergleichen Sie diese Zahl – nicht die Auftragssumme – mit der aktuellen Shopify-Summe.
- Wenn noch nicht abgerechnet: Vergleichen Sie mit amount_total und behandeln Sie das Ergebnis als vorläufig. Es ändert sich, sobald die Rechnung gebucht ist.
- Stimmen beide weiterhin nicht überein, gehen Sie die acht Ursachen der Reihe nach durch: erst Steuern, dann Rechnungsstellung, Erstattungen, Bearbeitungen, Geschenkkarten, Artefakte, Versand, Währung. Die erste, die passt, ist fast immer die Antwort.
Fünf Minuten pro Bestellung sind in Ordnung, wenn es zweimal im Monat passiert. Sie sind es nicht mehr, wenn ein Support-Mitarbeiter das vor jeder „Sie haben mir den falschen Betrag berechnet“-E-Mail tun muss oder jemand vor dem Monatsabschluss einen Tag voller Bestellungen stichprobenartig prüfen soll.
Weiterlesen
Oder prüfen Sie es mit einem Klick
Odoo–Shopify Order Check führt diesen ganzen Vergleich für Sie aus – direkt in der Bestellseite, die Sie ohnehin offen haben: Summen, Steuern, Mengen, Zeilen, Adressen und Lieferung, wobei Erstattungen und Geschenkkarten als Kontext statt als Fehler behandelt werden. Die Erweiterung liest nur – sie schreibt nie nach Odoo oder Shopify – und braucht keine API-Schlüssel.
14 Tage kostenlos testen