Lieferantenbestände anbinden: Feeds, API und Aktualität
Kurz gesagt
Bestand und Preis kommen über zwei getrennte Wege: eine Katalog- oder Preisanbindung als Datei oder API und ein kurzer Abruf für den aktuellen Bestand. CSV nach RFC 4180 beschreibt Zeilenaufbau und Anführungszeichen, nicht die Bedeutung der Felder. BMEcat 2005.2 überträgt Preise, Einheiten und Lieferzeiten, aber keine Lagermenge. Den Abruftakt rechnen Sie aus Absatzrate, Puffer und Nachlieferzeit aus.
Das Wichtigste
- BMEcat 2005.2 (Version vom 1. Oktober 2022) überträgt Katalogdaten; ein Element für eine Bestandsmenge enthält das Schema nicht.
- BMEcat kennt drei Transaktionen: T_NEW_CATALOG, T_UPDATE_PRODUCTS und T_UPDATE_PRICES, sodass Änderungen ohne Gesamtkatalog übertragbar sind.
- Innerhalb derselben BMEcat-Katalogversion zählt prev_version die vorausgegangenen Aktualisierungen, beginnt nach jedem T_NEW_CATALOG bei 0 und steigt je Aktualisierung um 1; die CATALOG_VERSION bleibt über Aktualisierungen gleich.
- RFC 4180 beschreibt für CSV Zeilenaufbau, Komma als Trennzeichen und Anführungszeichen, aber keine Feldbedeutung; Zeichensatz und Dezimaltrennzeichen vereinbaren Sie.
- Für den Bestand gilt: Abruftakt in Stunden höchstens Puffer geteilt durch Absatz je Stunde minus Nachlieferzeit in Stunden.
- Die GTIN kennzeichnet die Handelseinheit; GS1-Regeln binden über Vertrag oder Kanalvorgabe, nicht als staatliche Vorschrift.
Katalogdaten ändern sich aus Anlass: ein neuer Preis, ein geändertes Sortiment, eine andere Lieferzeit. Bestände ändern sich mit jedem Verkauf und jeder Lieferung. Wer beides in einen Weg und einen Takt zwingt, überträgt zu viel oder erfährt eine Änderung zu spät. Der Ablauf trennt beide Wege und leitet den Abruftakt aus Ihren Zahlen ab.
Was Sie vorab brauchen
- je Lieferant Format (CSV, XML, API), Übertragungsweg, zugesagte Grenzen (Datensätze je Abruf, Abrufe je Zeiteinheit, Antwortzeit) und eine Person für Störungen
- die Feldliste des Lieferanten mit Bezeichnung und Bedeutung jedes Feldes
- eine eigene Artikelnummer je Lieferantenartikel und, soweit vorhanden, die GTIN des Herstellers
- ein Testkonto oder eine Testdatei vor der ersten echten Lieferung
- Absatz je Artikel und Stunde, Nachlieferzeit und der Bestand, den Sie anzeigen wollen
Welches Format welchen Teil trägt
Die Tabelle stellt die Wege gegenüber, über die Lieferanten Bestand, Preis und Lieferzeit bereitstellen. Die letzte Spalte nennt den Punkt, an dem die Anbindung scheitert.
| Format | Was es trägt | Was es nicht festlegt | Woran es scheitert |
|---|---|---|---|
| CSV-Datei | Listen mit allen Artikeln eines Lieferanten, auch Bestand und Preis, im Feldaufbau, den beide Seiten vereinbaren | Feldbedeutung und -reihenfolge, Trennzeichen, Dezimaltrennzeichen, Zeichensatz, Datumsformat; RFC 4180 hält in Abschnitt 2 selbst fest, dass keine formale Spezifikation existiert | eine Spalte, die der Lieferant umbenennt oder umstellt |
| XML-Katalog nach BMEcat 2005.2 | Preise mit Preistyp und Gültigkeitszeitraum, Steuerfaktor, Mengeneinheiten, Klassifikation, Lieferzeiten und die GTIN als internationale Artikelnummer (INTERNATIONAL_PID mit dem Typ ean) | keine Bestandsmenge: Im Schemabestand von BMEcat 2005.2 gibt es kein Element für eine Lagermenge; der Wert stock in PRODUCT_CATEGORY besagt, dass ein Produkt lagermäßig geführt wird, ohne Menge | eine Aktualisierung, deren prev_version die erwartete Kette bricht (Wiederholung oder Lücke) |
| Verfügbarkeits- oder Preisanfrage im IPP-Modul zu BMEcat 2005 | den aktuellen Bestand und Preis zu einer Liste von Produkten; die Antwort kommt synchron innerhalb der vereinbarten Antwortzeit | keine Übertragung des Gesamtkatalogs; Einschränkungen wie Lieferzeit und Verbindlichkeitsgrad muss die Antwort mitführen | Kennungen, die nicht zum Artikelstamm passen |
| Abruf über eine HTTP-API mit JSON | einzelne Artikel und Änderungslisten; JSON ist nach RFC 8259 Abschnitt 8.1 UTF-8, eine Implementierung darf Umfang und Genauigkeit von Zahlen begrenzen (Abschnitt 9) | Feldbedeutung, Authentifizierung, Seitenaufteilung und Mengengrenzen; das liefert die Beschreibung des Lieferanten | Abrufe in kurzem Takt ohne bedingte Anfrage; Preise als gerundete Gleitkommazahl |
Schritt für Schritt: Lieferantendaten anbinden
Schritt 1: Datenarten trennen
Legen Sie vier Datenarten fest und je Datenart eine Quelle: Stammdaten (Bezeichnung, Einheit, Verpackung), Preis, Bestand und Lieferzeit. BMEcat trennt sie inhaltlich: Ein Preis trägt einen Preistyp und einen Gültigkeitszeitraum, die Lieferzeit steht mit der Vorlaufzeit in Werktagen, und der Bestand kommt nicht als Menge vor. Ergebnis: eine Zeile je Datenart mit Quelle, Format und Verantwortlichem.
Schritt 2: Die Feldbelegung schriftlich festhalten
Weil CSV die Feldbedeutung nicht regelt, hält Ihre Vereinbarung fest, welche Spalte welche Größe trägt, mit welchem Trennzeichen, in welchem Zeichensatz, in welcher Einheit und mit welchem Zeitstempel samt Zeitzonenversatz (RFC 3339 Abschnitt 5.6). Klären Sie außerdem, was ein leeres Feld bedeutet: null Stück, unbekannt oder nicht lieferbar. Drei Sachverhalte, drei Folgen für die Anzeige. Ergebnis: ein Felddokument, das beide Seiten als aktuell bestätigen.
Schritt 3: Artikel ohne Namen zuordnen
Ordnen Sie über Kennungen zu, nie über den Produktnamen. Nehmen Sie die GTIN, wenn der Hersteller eine vergeben hat: Nach den GS1 General Specifications kennzeichnet sie die Handelseinheit und kommt in vier Längen vor (Abschnitt 1.3.1). GS1 ist ein Standardverband; seine Regeln binden über Vertrag oder Kanalvorgabe und nicht als staatliche Vorschrift. In BMEcat steht sie in INTERNATIONAL_PID mit dem Typ ean. Fehlt sie, bleibt die Lieferantenkennung der Schlüssel. Ergebnis: je eigener Artikelnummer ein Eintrag mit Lieferantenkennung.
Schritt 4: Die Erstlieferung gegen die Lieferantenliste prüfen
Vergleichen Sie vor dem ersten Import Datensatzzahl, Summen und Kennungen. Ein fehlender und ein doppelter Datensatz mit gleichem Betrag heben sich in Anzahl und Summe auf und bleiben unentdeckt, wenn Sie nur addieren. Ein Katalogdokument trägt eine Katalogkennung und eine Katalogversion; ein Update trägt zusätzlich prev_version, die Zahl der vorausgegangenen Aktualisierungen innerhalb derselben Katalogversion. Dieselbe Kombination aus Katalogversion und prev_version wie beim letzten Import bedeutet eine Wiederholung. Wie Sie Übergaben laufend abgleichen, steht unter Datensynchronisation zwischen Systemen.
Schritt 5: Bestand nicht eins zu eins übernehmen
Zeigen Sie nicht die Zahl aus dem Feed, sondern diese Zahl minus Puffer; der Puffer deckt den Absatz zwischen zwei Abrufen und während der Nachlieferung. Unterstellung dabei: Der Feed nennt den Bestand im Zeitpunkt des Abrufs, der Lieferant reserviert nichts für Ihren Shop, und die Nachlieferzeit ist die zugesagte. Der Puffer deckt nur Ihren eigenen Absatz und ist keine Reservierung beim Lieferanten; verkauft der Lieferant aus demselben, nicht reservierten Bestand auch an andere Abnehmer, kann die Anzeige trotz Puffer zu hoch sein. Trifft eine Annahme nicht zu, ist der Puffer zu klein.
Schritt 6: Abrufe sparsam machen
Nutzen Sie Änderungslisten statt Vollabrufe, wo der Lieferant sie anbietet; BMEcat sieht dafür T_UPDATE_PRODUCTS und T_UPDATE_PRICES neben der Vollübertragung T_NEW_CATALOG vor. Bei einer HTTP-API können Sie häufiger fragen, ohne mehr Daten zu übertragen: Mit dem ETag-Wert der letzten Antwort im Feld If-None-Match antwortet der Server mit 304, wenn sich nichts geändert hat (RFC 9110 Abschnitt 13.1.2, RFC 9111 Abschnitt 4.3).
Schritt 7: Einen fehlenden Lauf erkennen
Ein Lauf, der nicht startet, hinterlässt keine Fehlermeldung. Notieren Sie je Abruf den Zeitpunkt, die Katalogversion mit prev_version oder den jüngsten Änderungszeitstempel aus der Antwort und die Zahl der Datensätze. Bleibt die erwartete prev_version aus oder wiederholt sich, prüfen Sie, ob die Übergabe steht. Alarmwerte und Protokollfelder beschreibt Datensynchronisation zwischen Systemen.
Wie oft Sie aktualisieren
Zwei Größen bestimmen den Takt: die Absatzrate je Stunde und die Menge, die veralten darf. Zuerst der Puffer, dann der Takt.
- Puffer in Stück ≥ Absatz je Stunde × (Abruftakt in Stunden + Nachlieferzeit in Stunden)
- Abruftakt in Stunden ≤ Puffer ÷ Absatz je Stunde − Nachlieferzeit in Stunden
Die zweite Formel ist nur anwendbar, solange sie einen positiven Takt ergibt; wird sie null oder negativ, ist der Puffer für die Nachlieferzeit zu klein.
Beispielrechnung mit erfundenen Zahlen: Ein Artikel verkauft sich zweimal je Stunde; im Feed stehen 60 Stück; Sie rufen alle sechs Stunden ab; der Lieferant braucht vier Stunden bis zum Versand. Der Puffer ist dann 2 × (6 + 4) = 20 Stück, und Ihr Shop zeigt 60 − 20 = 40 Stück an. Nach der zweiten Formel ist der Takt mit 20 ÷ 2 − 4 = 6 Stunden gerade ausgeschöpft; ein längerer Takt ließe die Anzeige vor dem nächsten Abruf zu hoch werden. Die 20 Stück Puffer sind Ihr eigener Absatz in den zehn Stunden bis zur Lieferung und keine Reservierung beim Lieferanten: Verkauft der Lieferant aus demselben, nicht reservierten Bestand auch an andere, kann selbst die gekürzte Anzeige zu hoch sein.
Die Beispielwerte sind redaktionell; die geöffneten Quellen nennen keinen Takt für Shops.
| Datenart | Wovon der Takt abhängt | Beispielwert |
|---|---|---|
| Bestand | Absatzrate im gleichen Zeitraum und Puffer (siehe Rechnung) | 4 bis 12 Stunden |
| Preis | wie lange ein alter Preis stehen bleiben darf, gemessen an den Preisänderungen des Lieferanten | anlassbezogen, mindestens täglich |
| Lieferzeit und Verfügbarkeit | Nachlieferzeit: bei Lieferzeit in Werktagen zählt der Takt weniger | einmal täglich |
| Stammdaten, Einheiten, Klassifikation, GTIN | Sortimentswechsel oder Änderung der Handelseinheit | anlassbezogen |
Die BMEcat-Spezifikation nennt in Abschnitt 3.1 als Beispiel einen Lieferanten mit Gesamtkatalog einmal pro Jahr, Sortimentsaktualisierung alle drei Monate und Preisänderungen bei Eintritt. Für den Bestand ist der Takt dagegen an der Absatzrate zu messen.
So prüfen Sie das Ergebnis
- Je Datenart steht eine Quelle mit Format, Feldbelegung und Verantwortlichem fest.
- Jeder Artikel lässt sich ohne Produktnamen zuordnen, über GTIN oder Lieferantenkennung.
- Der Shop zeigt nicht die Rohmenge aus dem Feed, sondern die um den Puffer gekürzte Zahl, und die Frage der Reservierung beim Lieferanten ist geklärt.
- Die Erstlieferung wurde über Datensatzzahl, Summe und Kennungen geprüft.
- Ein ausgebliebener Abruf fällt über die erwartete prev_version oder den jüngsten Zeitstempel auf.
- Erfundener Testfall: Sie stellen eine Datei mit doppelt enthaltenem Artikel ein und sehen, ob der Import ihn erkennt.
Wenn etwas nicht klappt
| Symptom | Mögliche Ursache | Behebung |
|---|---|---|
| Artikel erscheinen doppelt | Zuordnung über den Produktnamen oder geänderte Schreibweise | auf GTIN und Lieferantenkennung umstellen, Dubletten zusammenführen |
| Umlaute kommen als Zeichenfolge an | Zeichensatz in Datei und Import unterschiedlich | Zeichensatz (etwa UTF-8) vereinbaren und überall einstellen |
| Preise zeigen erfundene Nachkommastellen | in Gleitkomma gerundet statt in kleinster Währungseinheit gerechnet | Beträge in Cent oder Rappen führen, erst zur Anzeige formatieren |
| Bestand fällt sprunghaft auf null | leeres Feld bedeutet beim Lieferanten unbekannt, im Import null | Leerwert, null und Sperre unterscheiden |
| Gestern Bestand, heute keiner | der Abruf ist ausgefallen | Alarm auf ausbleibende Läufe, nicht nur auf Fehlermeldungen |
Wann Sie Hilfe holen sollten
Holen Sie Unterstützung, wenn ein Lieferant kein maschinenlesbares Format anbietet oder wenn niemand die Zuordnung pflegt. Welche technische Form zwischen zwei Systemen passt, steht unter Schnittstellen im Shop-Umfeld, welche Anforderungen Ihr Shopsystem mitbringen muss, unter Schnittstellen eines Shopsystems prüfen. Welche Preisangaben gegenüber Verbrauchern nötig sind, ist nicht Gegenstand dieses Artikels.