Shopify mit Fehler bei der Mehrwertsteuer

Technisches

The english version of this post is on page 2.

Responsible Disclosure: Auch wenn das hier besprochene Verhalten kein Sicherheitsrisiko darstellt, ist es nach meinem Dafürhalten aufgrund der angedeuteten rechtlichen und steuerlichen Risiken für Shops mit Shopify in vergleichbarer Wichtigkeit und Dringlichkeit zu handhaben. Auf der HackerOne-Seite zu Responsible Disclosure gibt Shopify sich vier Tage für eine Reaktion. Tatsächlich passiert: Ich habe den Fehler am 4. Februar um 19:38 (alle Zeiten MEZ) gemeldet, der Chat-Support endete um 20:12 Uhr. Mehrfach habe ich mit größtmöglicher Empathie auf die Risiko und die Notwendigkeit für schnelle Reaktion hingewiesen. Außer einer automatischen Bestätigung mit Chat-Transkript geschah nichts. Am 8. Februar um 23:54 hakte ich per E-Mail nach, keine Antwort. Am 10. Februar wandte ich mich an den Twitter-Support, der jedoch keine Einsicht in die Tickets habe und mir empfahl, ein weiteres Ticket anzulegen.

Ich bin weder Rechtsanwalt noch Steuerberater. Der nachfolgende Beitrag stellt keine Rechtsberatung oder Empfehlung zu Steuerfragen und -handlungen dar.

Das verbreitete System Shopify, mit dem weltweit mehr als eine Million Geschäfte betrieben werden, gibt nach meinen Recherchen für die Mehrwertsteuerberechnung zumindest in Deutschland teilweise fehlerhafte Beträge aus. Soweit von außen einsehbar, liegt die Vermutung nahe, dass der Fehler in allen Ländern und Gebieten mit Steuersätzen auftreten kann. Der eigentliche Fehler beträgt jeweils nur einen Cent, setzt allerdings die dahinter liegenden Shops möglicherweise Risiken aus und dürfte in zahlreichen Fällen zumindest Mehraufwand bei der Rechnungskorrektur erfordern. In zugespitzten Situationen ist denkbar, dass versehentlich ein aus Finanzamtssicht signifikanter Betrag fehlberechnet wird.

Herleitung

In Shopify gibt es die Option, festzulegen, dass alle Preise bereits die Steuern enthalten. So wird letztlich eben einfach der Endpreis (etwa 119€) eingegeben und Shopify berechnet den Steueranteil selbst (in diesem Beispiel angenehme 19€).

Bei bestimmten Preisen kommt es hierbei zu einer Art Rundungsfehler, auch wenn das dahinterliegende Problem nicht im Runden, sondern in Variablen-Typen liegt. Ein solches Beispiel:

Beispiel für Shopify-Shop mit möglicherweise fehlerhafter MwSt-Berechnung.

Bei einem Gesamtbetrag von 44,75€ gibt Shopify eine Steuerlast von 7,15€ an. Und das ist… fast richtig. Der tatsächliche Steueranteil würde wie folgt berechnet:

Steueranteil = Gesamtbetrag / (100 + Steuersatz) * Steuersatz, im Falle eines nicht ermäßigten Produktes in der Bundesrepublik Deutschland also Steueranteil = Gesamtbetrag / 119 * 19.

Wer jetzt Taschenrechner, digitalen Assistent oder Wetten-dass-Kopfrechnen-Gewinner zückt, kommt für obiges Beispiel auf 7,14495798319328 €. Fast auf 7,15€ aufrundbar – aber eben nur fast. Um an dieser Stelle zu vermeiden, Insekten in Dickhäuter zu verwandeln, habe ich zahlreiche, zahlreiche, zahlreiche Quellen konsultiert und nachgerechnet (und nachrechnen lassen). Keine Erklärung zu kaufmännischem Runden lässt den Betrag von 7,15€ zu. Jeder Mehrwertsteuerrechner – online oder auch lokal mit der Software, der ich seit Jahren Einkommens- und Umsatzsteuererklärung anvertraue, kommt auf den anderen Betrag.

Der Netto-Preis – also den niedrigen, ohne Mehrwertsteuer – wird in diesem Zusammenhang ermittelt als Netto = Gesambetrag / (100 + Steuersatz) – 100, also hierzulande *100/119. Und soweit ich das von außen einsehen kann, berechnet Shopify erst diesen und ermittelt dann die Steuer über Subtraktion.

Woran es liegen könnte

Tatsächlich fiel mir der Fehler auf, als ich selber etwas mit Rechnungsvorlagen in Shopify arbeitete und Steuern händisch eintragen musste. Je nach Schreibweise der Berechnung gibt Liquid, die von Shopify erfundene Vorlagen-Sprache, ein anderes Resultat für die Berechnungen (Code-Beispiele leicht vereinfacht):

{% price_without_taxes_correct = product_total_price | times: 100 | divided_by: 119.0 %} 
{% price_without_taxes_wrong = product_total_price | times: 100 | divided_by: 119 %}

Mutmaßlicherweise liegt eine Implementierungsentscheidung dahinter, wonach Liquid bei Division durch ganzzahlige Divisoren eine Ganzzahl verwendet. Ich vermute, dass die interne Kalkulation der Steuer doch etwas anders läuft, denn bei einer kompletten Rekonstruktion des geschilderten Verfahrens wäre fast jeder zweite Preis fehlerhaft (ich habe eine kleine Liquid-Routine dafür „trocken“ geschrieben), und das ist dankbarerweise nicht der Fall. Verlässliche Aussagen über die Übertragbarkeit auf andere Steuersätze sind daher ebenfalls schwierig.

Es ist übrigens nicht möglich, händisch die Rate von „19“ auf „19.0“ anzupassen – Shopify nimmt die Steuerersatzerhebung selbstständig vor.

Mögliche Folgen

Eine Fehlberechnung um 1 cent – im obigen Fall fürderhin zum Nachteil des Shops – wird das Finanzamt nicht ein SEK beauftragen lassen. Aber:

  • wenn ein Shop tausende Produkte mit einem solchen Fehler pro Jahr vertickt, werden die absoluten Zahlen ebenfalls interessant
  • träte der Fehler auch bei kleinpreisigen Produkten auf, wäre hier auch ein relativ betrachtet signfikanter Verlust möglich
  • formal ist damit die Rechnung falsch und bedarf einer Korrektur
  • möglicherweise drohen in wettbewersintensiven Szenarien rechtliche Auseinandersetzungen
  • ohne die genaue Fehlerursache zu kennen, lässt sich auch nicht komplett ausschließen – auch wenn ich es für unwahrscheinlich halte -, dass bei einzelnen Beträgen ggf. zu wenig Umsatzsteuer berechnet wird

Anforderungen an Shopify

Das Beheben des eigentlichen Fehlers für Shopify ist naheliegenderweise geboten – aber, wenn meine obige Einschätzung zur Ursache richtig liegt, trivial. Fürderhin ist die Firma – immerhin das nach Marktkapitalisierung größte börsennotierte Unternehmen Kanadas – gut beraten, automatisch Korrekturrechnungen und entsprechende Hinweise für in der Vergangenheit betroffene Transaktionen zu anzuzeigen.

Next

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert