Warum ein Produkt nie „Zimmer“ sieht
Das Wichtigste in Kürze
- Die Vorlagen kennen Rollen, keine Branchen — aber die eingebauten Felder hießen Zimmer, Wohnfläche und Maklerfoto, und ein Produkt musste sich darin einrichten.
- Was dabei auf dem Bild landete: ein Sneaker mit dem Badge „Zu verkaufen“, dem Ort Freiburg im Breisgau, fünf Zimmern, 168 Quadratmetern und einem Maklerbüro als Absender. Jede leere Stelle füllte die Vorlage mit ihrer Vorgabe, und die Vorgabe war ein Haus.
- Jetzt sind zwei Formulare eingebaut: „product“ mit Marke, Variante, Kategorie, Shop und Shop-Adresse, „property“ mit Ort, Zimmern, Fläche und Absender. Beide gelten überall, wo ein gespeichertes Formular gilt.
- Für Shops ändert sich vier Mal etwas: Das Modell liest eine Marke statt eines Orts heraus, eine handgeschriebene CSV wird an ihren Spalten erkannt, ein Bestand und ein Formular-Link tragen das Produktformular, und die App öffnet auf „Produkt“.
- Was gleich bleibt: die Grafik, die Rollen, der Preis. Ein Datensatz aus strukturierten Daten kostet 4 ct, jede Grafik daraus ist kostenlos — und der Shop-Export war das Produktformular schon immer, nur ohne Namen.
Wer bei uns einen Schuh setzte, tat das monatelang in einer Wohnung. Nicht sichtbar — die Grafik sah richtig aus — aber in den Daten: Die Größe stand im Feld „Zimmer“, das Material im Feld „Wohnfläche“, die Marke dort, wo sonst der Ort steht. Die App beschriftete die Felder um, und das Bild wusste nichts davon. Dieser Beitrag erzählt, was dieser Umweg einmal auf dem Bild angerichtet hat, warum wir ihn trotzdem lange gegangen sind, und was sich mit den zwei eingebauten Formularen ändert, die seit dieser Woche jedes Konto hat.
Der Schuh in der Wohnung
ListingShot kennt keine Branche, es kennt Rollen: Foto, Badge, eine Zeile über dem Titel, den Titel, die Hervorhebung, Fakten, einen Handlungsaufruf, eine Fußzeile. Ob in der Hervorhebung ein Kaufpreis steht oder ein Sneakerpreis, ändert an der Anordnung nichts. Das war von Anfang an der Punkt, und es stimmt bis heute.
Die Felder hinter den Rollen aber hatten Namen, und die Namen waren die
einer Immobilie: location, rooms, area, agent_name. Die App hat ein
Produkt darum umbeschriftet — „Marke“ auf das Ortsfeld, „Größen“ auf die
Zimmer, „Material“ auf die Fläche — und das funktionierte, solange jedes Feld
gefüllt war.
Sobald eines leer blieb, sah man, wo der Schuh wohnte.
Das ist keine Fotomontage, sondern ein Aufruf an /v1/images mit drei
Angaben, gezeichnet für diesen Beitrag. So sah die App eine Zeit lang jeden
Schuh, dessen Beschreibung keine Größe nannte — bis sie lernte, die Vorgaben
zu leeren, bevor sie rendert. Das Leeren war die Reparatur eines Symptoms. Die
Ursache blieb: Es gab nur ein Formular, und das war eine Immobilie.
Warum wir den Umweg trotzdem gingen
Weil die Alternative damals falsch gewesen wäre. Die Anordnung nach Branche zu trennen hätte drei Sätze Vorlagen ergeben, die in Schritt zu halten sind, für Bilder, die identisch aussehen. Ein Feldname ist billig; eine zweite Vorlagenfamilie ist eine zweite Wartung. Also blieb die Vorlage eine, und die Felder hießen, wie sie hießen.
Was sich seither geändert hat, ist nicht die Vorlage, sondern die Zahl der
Wege, auf denen Daten hereinkommen. Ein Feld, das rooms heißt und Größen
hält, ist in einem Formular auf einem Bildschirm eine Beschriftung. In einem
CSV-Import ist es eine Spalte, die jemand zimmer nennen muss, damit sie
ankommt. In einem angeschlossenen Bestand ist es eine Zuordnung, die jede
Prüfung anwendet. In einem Formular-Link ist es das Wort, das eine Assistenz
über dem Eingabefeld liest. Und über die API ist es ein Schlüssel, den ein
Entwickler in seinen Code schreibt — rooms: "Gr. 38–47" — und den ein
Kollege ein Jahr später für einen Fehler hält und korrigiert.
Der Umweg war für einen Bildschirm gebaut. Für fünf Wege ist er ein Fehler, der nur noch nicht passiert ist.
Zwei Formulare, eingebaut
Seit dieser Woche hat jedes Konto zwei Formulare, ohne eines anzulegen.
property sind die festen Felder von immer: Ort, Titel, Preis, Zimmer,
Fläche, Lage, Handlungsaufruf, Absender, Kontakt, Maklerfoto. product ist
ein Shop: Foto, Badge, Marke, Produktname, Preis, Variante, Kategorie,
Handlungsaufruf, Shop, Shop-Adresse.
Beide gelten überall, wo ein gespeichertes Formular gilt: form: "product"
oder form_id: "product" beim Rendern, beim Auslesen, beim Import, beim
Anschließen eines Bestands und beim Anlegen eines Formular-Links. Ein Aufruf
für ein Produkt sieht so aus:
{
"template": "ig-post",
"form": "product",
"values": {
"title": "Halden Low — Off-White",
"price": "179,00 €",
"brand": "Nordwerk",
"variant": "Gr. 38–47",
"category": "Sneaker",
"badge": "NEUE KOLLEKTION",
"photo": "https://…/halden-low.jpg"
}
}
Das Produktformular ist übrigens nicht neu. Es ist das Formular, in das ein Export aus Shopify, Shopware oder WooCommerce seit September gelesen wird — nur hatte es keinen Namen, unter dem ein Kunde es hätte ansprechen können. Jetzt hat es einen.
Was sich für einen Shop ändert
Beim Auslesen. Wer eine Produktbeschreibung einfügt, bekommt sie durch das Produktformular gelesen: Das Modell sucht eine Marke, eine Variante, eine Kategorie — nicht einen Ort und eine Zimmerzahl, die es dann in einen Schuh hineinliest. Vorher half ein Satz im Hinweis an das Modell; jetzt sind es die Felder selbst.
Beim Import. Eine CSV, die ein Shop selbst geschrieben hat, ohne die
Spaltennamen eines Shopsystems, wird an ihren Spalten erkannt. So antwortet
der Plan vor dem Import auf eine Datei mit den Spalten artikelnummer, name, preis, marke, groesse, bild:
| Spalte | Rolle | Erste Zeile |
|---|---|---|
| artikelnummer | kein Feld — bleibt der Schlüssel | NW-0451 |
| name | Titel | Halden Low — Off-White |
| preis | Preis | 179,00 € |
| marke | Marke | Nordwerk |
| groesse | Fakt | 38–47 |
| bild | Foto | https://nordwerk.example/halden-low.jpg |
1 Datensatz · 4 ct · Formate ig-post, ig-story, og-wide — so, wie POST /v1/imports/plan antwortet, bevor etwas kostet.
Eine Randnotiz, weil sie zu diesem Blog gehört: Beim Schreiben dieses Beitrags sagte der Plan zu jeder dieser Spalten „kein Feld des Formulars heißt so“ — während die Vorschau der ersten Zeile längst Marke, Titel und Preis zeigte. Die Zuordnung stimmte, die Erklärung widersprach ihr. Der Beleg oben ist der Stand nach der Korrektur, und ein Test hält ihn fest.
Im Bestand und im Formular-Link. Ein angeschlossener Bestand trägt das Produktformular, damit jede Prüfung eine Produktdatei als Produktdatei liest. Ein Formular-Link, den eine Kollegin ohne Konto öffnet, zeigt „Produktname“, „Marke“ und „Variante“ über den Feldern, nicht „Zimmer“.
In der App. Sie öffnet auf „Produkt“. Das ist eine Reihenfolge, keine Funktion — aber sie sagt, für wen die App zuerst gebaut ist, und sie schickt das Produktformular bei jedem Aufruf mit.
Was bewusst gleich bleibt
Die Grafik. Die zwei Bilder oben sind dieselbe Anordnung auf derselben Stufe der Textleiter; das Produktformular hat keine eigene Vorlage bekommen und wird keine bekommen. Die Rollen: Was auf dem Bild wohin gehört, entscheidet die Rolle, nicht der Feldname. Der Preis: Ein Datensatz aus strukturierten Daten kostet 4 ct, ob Schuh oder Haus, und jede Grafik daraus ist kostenlos.
Und die Grenze bleibt ehrlich benannt: Ein Fahrzeug wird in der App weiter über umbeschriftete Immobilienfelder gesetzt, weil das Fahrzeugformular noch nicht gebaut ist. Wer heute Erstzulassung und Kilometerstand als eigene Felder braucht, legt unter „Felder“ ein Formular an — das ging vorher, das geht weiter. Was nicht mehr geht, ist, dass ein Schuh in eine Wohnung zieht, ohne dass es jemand merkt.
Häufige Fragen
Muss ich für Produkte ein Formular anlegen?
Nein. Das Produktformular ist eingebaut und gilt für jedes Konto: form: "product" bei einem Aufruf, „Produkt (eingebaut)“ in der App. Ein eigenes Formular lohnt sich erst, wenn eine Angabe keinen Platz hat — eine dritte Fakten-Spalte, eine Monatsrate, eine Lieferzeit als eigenes Feld.
Welche Felder hat das Produktformular?
Foto, Badge, Marke, Produktname, Preis, Variante, Kategorie, Handlungsaufruf, Shop und Shop-Adresse. Marke steht über dem Titel, Variante und Kategorie sind die Fakten-Chips, Shop und Shop-Adresse bilden die Fußzeile. Dieselben Felder, in die ein Shopify-, Shopware- oder WooCommerce-Export schon immer gelesen wurde.
Was passiert mit einer CSV, die ich selbst geschrieben habe?
Die Spalten werden an ihren Namen erkannt, deutsch wie englisch: name oder produktname wird der Titel, preis der Preis, marke oder hersteller die Marke, groesse, farbe oder variante die Variante, kategorie die Kategorie, bild das Foto. Der Plan vor dem Import zeigt jede Spalte mit ihrer Rolle und die erste Zeile, bevor etwas kostet.
Ändert sich die Grafik?
Nein. Die Anordnung, die Schrift, die Textleiter und der Preis als gesetzter Text sind dieselben. Was sich ändert, ist, was in den Rollen steht: eine Marke statt eines Orts, eine Größe statt einer Zimmerzahl — und nichts aus einer Immobilie füllt mehr eine leere Stelle.
Und Fahrzeuge?
Noch nicht. Ein Fahrzeug wird in der App weiter über die umbeschrifteten Immobilienfelder gesetzt; das Fahrzeugformular mit Erstzulassung, Kilometerstand und Leistung steht auf der Roadmap und entsteht mit dem ersten Händler, der es braucht. Bis dahin ist ein eigenes Formular unter Felder der Weg.
Weiterlesen
Sale-Banner aus dem Shop-Export, und wieder weg, wenn die Aktion endet Eine Aktion hat zwei Momente, in denen Grafiken lügen: wenn sie beginnt und wenn sie endet. Wie aus der Produktdatei, die Shopify, Shopware oder WooCommerce ohnehin schreiben, Anzeigen mit Sale-Badge entstehen — genau für die Produkte, deren Preis unter dem Vergleichspreis liegt, und für kein anderes.
Warum wir keinen Editor bauen Fast jedes Werkzeug für Bildautomatisierung hat einen Vorlagen-Editor, und fast jede Beschwerde darüber ist eine Editor-Beschwerde. Wir haben keinen. Was wir stattdessen gebaut haben: eine geprüfte Beschreibung der Anordnung, die man in einem Satz sagt, aus einem Screenshot liest und für jedes Format zugleich bekommt — für einen Schuh wie für ein Exposé.