Produktdaten liefern
Wir empfehlen nur Produkte, deren Inhaltsstoffe und Dosierung wir kennen. Dazu holen wir deine Produktdaten regelmäßig selbst ab. Du musst uns keine Änderungen melden.
Was zu tun ist
- Schick uns eine URL: einen Produkt-Feed, eine Sitemap oder deine Shop-Domain. Welche Variante für dein Shopsystem passt, steht unter Vorhandenes Format nutzen. Fertig, wenn die URL öffentlich über HTTPS erreichbar ist, oder du uns Benutzer und Passwort für den Zugriff genannt hast.
- Stelle sicher, dass die Pflichtfelder vorhanden sind: Artikelnummer, Name, Preis als Zahl, Verfügbarkeit, Produktbeschreibung als HTML. Fertig, wenn der Selbsttest unten keine Zeile ausgibt.
- Prüfe, ob Zutaten und Nährwerte als echte Tabelle in der Beschreibung stehen, nicht als Bild. Fertig, wenn die Tabelle eine Kopfzeile mit einer Mengenspalte hat, siehe Beschreibung, Nährwerte, Dosierung.
JSON-Feed nach unserem Schema
Der genauste Weg, und der mit den wenigsten Rückfragen. Ein HTTPS-Endpunkt liefert alle Produkte in einem Dokument.
product_numbervariants[].sku, Muster ^[A-Za-z0-9-]+$Felder je Produkt
| Feld | Typ | Pflicht | Bedeutung |
|---|---|---|---|
product_number | String, nicht leer | ja | Artikelnummer, unser Schlüssel für das Produkt. Muss über Feed-Generierungen hinweg stabil bleiben. |
title | String, nicht leer | ja | Anzeigename. |
health_claims.status | Feste Werte, siehe unten | ja | Steuert, ob das Produkt in der Beratung erscheinen darf. |
variants | Array, min. 1 | ja | Auch ein Produkt ohne Varianten hat genau einen Eintrag. |
body_html | String mit HTML | ja | Beschreibung wie auf der Detailseite, mit Zutaten, Nährwerttabelle und Verzehrempfehlung. |
url | Absolute HTTPS-URL | ja | Produktdetailseite auf der Domain, die du uns genannt hast. |
image | HTTPS-URL | empfohlen | Ein Titelbild. Die Liste images allein genügt nicht. |
darreichungsform | String | empfohlen | Kapseln, Tabletten, Pulver, Tropfen, Spray, Sachets, Set, Testkit. |
images, tags, vendor | Array, Array, String | optional | Weitere Bilder, Kategorien und Markenname. |
Felder je Variante
| Feld | Typ | Pflicht | Bedeutung |
|---|---|---|---|
sku | String, nur A-Z a-z 0-9 und Bindestrich | ja | Eindeutig je Variante. Diesen Wert senden wir im Warenkorb-Link zurück. |
price | Zahl, Punkt als Dezimaltrenner, brutto | ja | 24.9, nicht "24,90" und nicht "24.90". |
available | Boolean | ja | true oder false, nicht "true" und nicht 1. |
title | String | empfohlen | Größenbezeichnung, etwa 120 Kapseln oder 500 g. |
servings_per_container | Zahl | empfohlen | Portionen je Packung. Ohne dieses Feld lesen wir die Zahl aus dem Produkttitel, was bei Pulvern scheitert. |
serving_size, net_quantity, gtin | String, Objekt, String | optional | Portionsgröße, Füllmenge und EAN. Machen den Preisvergleich je Portion genauer. |
id | String | optional | Interne ID deines Shops, falls vorhanden. |
Werte für health_claims.status
| Wert | Bedeutung | Folge |
|---|---|---|
done | Nahrungsergänzung, Health-Claims geprüft | wird empfohlen |
keine_claims | Nahrungsergänzung ohne Health-Claims | wird empfohlen |
bundle | Set aus mehreren Produkten | im Katalog, eigene Behandlung |
kein_nem | Kein Nahrungsergänzungsmittel: Testkits, Zubehör, Kosmetik | bleibt aus der Beratung |
Jeder andere Wert und ein fehlendes Feld werden wie kein_nem behandelt. Setz den
Status also auch dann, wenn er keine_claims lautet. Testkits und Zubehör dürfen im
Feed bleiben, sie sind dann für die Beratung ausgeschlossen.
Betrieb des Feeds
- HTTPS und öffentlich abrufbar. Basic Auth ist möglich, nenn uns dann Benutzer und Passwort.
- Ein Dokument mit allen Produkten, keine Seitennummerierung.
- Antwort in unter 20 Sekunden. Bei großen Katalogen vorgeneriert ausliefern.
generated_atals ISO-8601-Zeitstempel, damit wir die Frische sehen.product_numberundskudürfen sich nicht bei jeder Generierung ändern.
Vier Regeln, an denen Produkte verloren gehen
- Kein
product_numberoder keintitleDas Produkt wird verworfen. - Keine Variante mit positivem
priceDas Produkt wird verworfen. Der Preis ist als JSON-Zahl zu liefern; zur Sicherheit nehmen wir auch Zeichenketten der Formen"3.95"und"3,95"an. Alles andere (Währungszeichen, Tausendertrenner,0) zählt als kein Preis. Das ist der häufigste Grund, warum ein Feed formal in Ordnung aussieht und bei uns null Produkte ankommen. - Unbekannter
health_claims.statusDas Produkt liegt im Katalog, ist in der Beratung aber unsichtbar. - Punkt, Unterstrich, Leerzeichen oder Schrägstrich in der
skuDas Produkt ist empfehlbar, fällt aber aus dem Warenkorb-Link, ohne Fehlermeldung. Die Kundin sieht dann einen unvollständigen Warenkorb.
Liegt die url nicht auf der Domain, die du uns genannt hast, verwerfen
wir den Produktlink. Vor dem Start heißt das: keine Testshop-Domains im Feed.
Beschreibung, Nährwerte, Dosierung
Gilt für alle Wege. Aus der HTML-Beschreibung lesen wir Inhaltsstoffe und Dosierung, die Grundlage jeder Empfehlung.
- Echte
<table>-Auszeichnung mit Kopfzeile und mindestens zwei Spalten. Tabellen als Bild oder alsdiv-Raster können wir nicht lesen. - Erste Spalte: Name des Nährstoffs. Unterzeilen beginnen mit
davonoder einem Bindestrich. - Mengenspalte: die Kopfzelle muss eines der Wörter
Tagesdosis,Mengeoderjeenthalten. Erkannt werden etwapro Tagesdosis (3 Kapseln),je Portion (10 g)undMenge pro Kapsel. Eine Spalteje 100 güberspringen wir, weil wir den Bezug auf die Portion brauchen. - NRV-Spalte, optional: Kopfzelle enthält
NRVoder% RM. - Verzehrempfehlung unter einer Zwischenüberschrift
<h3>Verzehrempfehlung</h3>, hinter der Tabelle.
<table>
<tr><th>Nährstoff</th><th>pro Tagesdosis (3 Kapseln)</th><th>% NRV</th></tr>
<tr><td>Magnesium</td><td>300 mg</td><td>80</td></tr>
<tr><td>davon aus Magnesiumcitrat</td><td>1875 mg</td><td>-</td></tr>
</table>
<h3>Verzehrempfehlung</h3>
<p>3 Kapseln täglich mit reichlich Wasser zu einer Mahlzeit.</p>
Kannst du Zutaten und Nährwerte strukturiert ausgeben, also Name, Menge, Einheit und Prozent NRV je Zeile, nehmen wir das lieber als HTML. Dann entfällt das Auslesen der Tabelle.
Vorhandenes Format nutzen
Vier Wege, für die dein Shop nichts Neues bauen muss.
Shopify
Wir lesen die öffentliche products.json. Von dir brauchen wir nur die Shop-Domain.
Der Warenkorb läuft über Cart-Permalinks, der Gutschein über /discount/<code>.
WooCommerce, Feed im Google-Merchant-Format
Erzeugt dein Shop schon einen Feed für das Google Merchant Center, lesen wir denselben Feed. Diese Felder werten wir aus:
| Feld | Pflicht | Hinweis |
|---|---|---|
g:id | ja | Produkt-ID, nur Ziffern. Derselbe Wert muss im Warenkorb-Link funktionieren. |
g:title | ja | Anzeigename. |
g:price | ja | Genau Betrag Währung, etwa 24.90 EUR: Punkt als Dezimaltrenner, ein Leerzeichen, ISO-Währungscode. Anderes Format, und das Produkt fällt aus. |
g:description | ja | Beschreibung als HTML, mit Nährwerttabelle und Verzehrempfehlung. |
g:link | ja | Produktseite auf der Live-Domain. |
g:availability | ja | in_stock, out_of_stock, preorder oder backorder. |
g:image_link | empfohlen | Titelbild, weitere über g:additional_image_link. |
g:product_type | empfohlen | Kategoriepfad mit >. Die letzte Stufe wird unsere Kategorie und entscheidet, ob ein Artikel als Nahrungsergänzung gilt. |
g:sale_price, g:gtin, g:mpn, g:brand | optional | Aktionspreis wird verwendet, wenn gesetzt. Die übrigen verbessern die Produktzuordnung. |
JSON-LD auf den Produktseiten
Kein Feed nötig: wir folgen deiner Sitemap und lesen auf jeder Produktseite das
schema.org-JSON-LD (Product oder DietarySupplement) mit
sku, price und availability, dazu die Zutaten- und
Nährwerttabelle aus dem Seiten-HTML. Voraussetzung: das JSON-LD steht auf jeder Produktseite und
enthält die Artikelnummer.
PrestaShop-JSON
Wir lesen id_product, name, reference,
price_current (ersatzweise price oder price_default),
description_short, description_webshop_full, images und
link_rewrite für den Produktlink.
Etwas anderes
Schick uns ein Beispiel deines Exports: eine Datei, eine URL oder eine Liste der Felder. Wir melden dir, ob wir es direkt lesen können oder was wir brauchen.
Selbst prüfen
Für den JSON-Feed. Jede Ausgabe ist ein Produkt, das bei uns nicht oder nur halb ankommt.
npx --yes -p ajv-cli -p ajv-formats ajv validate --spec=draft2020 -c ajv-formats \
-s json-feed.schema.json -d feed.json --errors=text --all-errors
pipx run check-jsonschema --schemafile json-feed.schema.json feed.json
Ohne Installation, nur mit jq:
jq -r '.products[] | select((.product_number|type) != "string" or (.product_number|length) == 0
or (.title|type) != "string" or (.title|length) == 0)
| "VERWORFEN (product_number/title): \(.title // "?")"' feed.json
jq -r '.products[] | select([.variants[]?.price | select(type == "number")] | length == 0)
| "VERWORFEN (kein numerischer Preis): \(.product_number)"' feed.json
jq -r '.products[] | .health_claims.status as $s
| select((["done","keine_claims","bundle","kein_nem"] | index($s)) == null)
| "UNSICHTBAR (health_claims.status): \(.product_number) = \($s|tostring)"' feed.json
jq -r '.products[] | .product_number as $p | .variants[]?
| select((.sku // "") | test("^[A-Za-z0-9-]+$") | not)
| "WARENKORB-VERLUST (sku): \($p) = \(.sku|tostring)"' feed.json
Keine Ausgabe heißt: der Feed geht vollständig durch. Schick uns die URL, dann prüfen wir gegen und melden Produktzahl und Auffälligkeiten.
Weiter mit Schritt 2: Warenkorb übergeben.
