Amazon-Business-Rechnungen automatisch herunterladen

Ein kleines Playwright-Skript holt die monatlichen Amazon-Business-Rechnungen selbständig ab — als Lösung für eine Aufgabe, die sonst niemand gerne macht. Mit Claude Code in einem Nachmittag entstanden.

pad systems 22. April 2026 5 min Lesezeit
Ein Stapel Rechnungen wartet auf Bearbeitung

Die stille monatliche Aufgabe

Jede Firma mit einem Amazon-Business-Konto kennt das Ritual. Am Monatsanfang loggt sich jemand ein, klickt sich entweder einzeln durch die Bestellungen und lädt die Rechnungspdfs herunter oder geht über die Bestellliste und „Bestelldokumente herunterladen”, wartet, bis Amazon das ZIP fertiggestellt hat, lädt es herunter, entpackt die PDFs und legt sie im Buchhaltungsordner für den Steuerberater ab. Zehn Minuten, wenn es gut läuft. Wenn man es vergisst, zwanzig gesammelte Bestellungen später eine halbe Stunde.

Niemand im Team macht diese Aufgabe gerne. Sie ist nicht schwer, sie ist nicht interessant, und sie ist nicht delegierbar — die Zugangsdaten liegen bei der Geschäftsführung. Genau die Sorte Aufgabe, die Automatisierung verdient.

Warum nicht einfach eine API?

Der erste Reflex bei „Rechnungen automatisiert abholen” ist die Suche nach einer REST-API. Amazon bietet solche APIs auch an — allerdings nicht für den Rechnungs-Download im Business-Bereich. Wer Rechnungen haben will, landet auf dem Web-Interface unter amazon.de/b2b/aba/reports. Ein klassisches JavaScript-getriebenes Frontend mit dynamisch gerenderten Dropdowns, CSRF-Schutz und asynchroner ZIP-Erzeugung im Hintergrund.

Ein einfaches curl-Skript reicht hier nicht. Wer die Seite ohne Browser ansteuert, bekommt leeres HTML. Man braucht einen echten Browser, der JavaScript ausführt und Klicks wie ein Mensch interpretiert.

Die Lösung: Playwright mit persistentem Login

Unser Skript heißt intern amazonbillfetcher und nutzt Playwright, die Browser-Automatisierungs-Bibliothek von Microsoft. Playwright startet einen echten Chromium, klickt die Elemente auf der Reports-Seite an und nimmt die Downloads entgegen.

Der erste Login ist manuell — einmalig Benutzername, Passwort und 2FA im automatisch geöffneten Browserfenster. Danach speichert Playwright den Session-State in einem lokalen Verzeichnis (.auth/). Jeder weitere Lauf nutzt diese Session, ohne dass sich jemand erneut einloggen muss. Für die 2FA-Wiederholung alle paar Wochen reicht ein kurzes manuelles Zwischenspiel. Wer das nicht will, muss sich bei jedem Start des Skripts anmelden - das spricht dann für ein lokales Ausführen der Aufgabe.

Warum zwei Schritte: request und fetch

Ein Detail, das man erst beim Programmieren merkt: Amazon generiert das ZIP nicht sofort. Der Klick auf „Alle herunterladen” stößt eine asynchrone Aufgabe im Backend an — je nach Größe kann das fertige ZIP Sekunden bis Minuten später bereitliegen. Ein einziges Skript, das beides in einem Rutsch macht, müsste entweder lange pollen oder zufällig mal scheitern, wenn Amazon länger braucht.

Deshalb läuft der Workflow zweistufig:

python fetch_invoices.py request   # Download-Auftrag anstoßen
# ... später, wenn Amazon fertig ist ...
python fetch_invoices.py fetch     # Fertige ZIPs abholen und PDFs extrahieren

Der erste Befehl klickt das Dropdown an, wählt „Alle herunterladen”, hakt im Dialog die Option für Rechnungen an und bestätigt. Amazon stellt den Auftrag in die Warteschlange. Der zweite Befehl navigiert in den Download-Verlauf, klickt jeden fertigen „Dokumente herunterladen”-Button, speichert die ZIPs in invoices/YYYY-MM/ und extrahiert die enthaltenen Rechnungs-PDFs in denselben Ordner.

Beide Schritte lassen sich per Cron oder systemd-Timer einplanen — request am Monatsersten um 08:00, fetch eine Stunde später. Bereits heruntergeladene ZIPs werden anhand des Dateinamens erkannt und übersprungen, idempotente Läufe sind also unkritisch.

Wie Claude Code dabei geholfen hat

Die eigentliche Programmierarbeit bestand aus zwei Dingen: die richtigen Selektoren für Amazons UI-Elemente finden und das Playwright-Flow-Handling robust machen. Für ersteres hilft nur der Browser-Inspektor — data-testid="download-order-documents-dropdown_label" muss man einmal aus den DevTools extrahieren.

Die Selektoren haben wir an Claude Code weitergegeben. Claude Code hat daraus die Playwright-Aufrufe, die Fehlerbehandlung (Debug-Screenshots bei Timeouts), die ZIP-Extraktion und die idempotente Dateibenennung zusammengesetzt. Inklusive Unit-Tests für die reinen Helper-Funktionen (month_dir, extract_pdfs). Der Browser-Flow wird manuell verifiziert — Selbsttests gegen ein Live-Amazon sind weder stabil noch sinnvoll.

Etwa 200 Zeilen Python, einsatzbereit an einem Nachmittag. Ohne Claude Code wäre es vielleicht ein Tag geworden — das Handwerk ist dasselbe, nur das Tempo unterscheidet sich.

Wann lohnt sich so eine Automatisierung?

Ehrliche Einordnung: nicht immer.

Lohnt sich, wenn:

  • die Aufgabe wirklich regelmäßig anfällt (monatlich oder öfter),
  • sie eine unbeliebte Pflicht ist, die sonst aufgeschoben wird,
  • der Web-Flow stabil genug ist, dass das Skript nicht alle zwei Wochen kaputtgeht,
  • das Thema Datenschutz überschaubar ist — hier bleiben Login-Daten auf unserem Rechner.

Lohnt sich nicht, wenn:

  • es einen offiziellen API-Weg gibt (dann den nehmen),
  • der Web-Flow sich laufend ändert (Wartung frisst den Zeitgewinn),
  • die Aufgabe einmal im Jahr anfällt (dann manuell erledigen und fertig).

Web-Automatisierung ist fragil. Amazon kann sein Frontend jederzeit umbauen, und dann müssen Selektoren nachjustiert werden. Bei uns rechnen wir mit ein bis zwei Stunden Pflegeaufwand pro Jahr — die sparen sich deutlich durch die monatlichen zehn Minuten, die niemand mehr klicken muss.

Zusammenfassung

Ein kleines Playwright-Skript, eine zweistufige Logik wegen Amazons asynchroner ZIP-Erzeugung, ein persistenter Login — und eine monatliche Aufgabe erledigt sich selbst. Die eingesparte Zeit ist gering, die mentale Last aber deutlich kleiner, weil niemand mehr an den Termin denken muss. Amazon ermöglicht seit einiger Zeit auch die Erstellung von E-Rechnungen. Der Empfang dieser Daten scheint aber bisher auf wenige Integrationen beschränkt zu sein - Wir erstellen einen neuen Artikel, wenn wir mehr wissen.

Wenn Sie solche Routineaufgaben in Ihrem Betrieb haben — Rechnungsabrufe, Report-Downloads, regelmäßige Exporte aus Portalen ohne API — sprechen Sie uns an. Nicht jede davon ist eine Automatisierung wert. Aber die, die es sind, erledigen wir gerne.

LinkedIn
Dieser Hinweis existiert nur, weil alle anderen einen haben. Keine Cookies an Bord.