Blog

Warum ein Produkt nie „Zimmer“ sieht

20. September 2026 · 7 Min. Lesezeit · Stefan Hartmann

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.

Eine quadratische Instagram-Grafik eines cremefarbenen Sneakers mit dem Badge ZU VERKAUFEN, dem Ort Freiburg im Breisgau, dem Titel Halden Low — Off-White, dem Preis 179,00 € und den Fakten 5 Zimmer und 168 m²; in der Fußzeile Hartmann Immobilien und hartmann-immobilien.de.
Ein Sneaker mit Titel, Preis und Foto durch die festen Felder: jede leere Stelle füllt die Vorlage mit ihrer Vorgabe, und die Vorgabe ist ein Haus in Freiburg.

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.

Derselbe Sneaker mit dem Badge NEUE KOLLEKTION, der Marke Nordwerk über dem Titel Halden Low — Off-White, dem Preis 179,00 €, den Fakten Gr. 38–47 und Sneaker; in der Fußzeile Nordwerk Store und nordwerk.example.
Derselbe Schuh durch das Produktformular: dieselbe Anordnung, dieselbe Stufe der Textleiter — und nichts aus einer Immobilie.

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:

SpalteRolleErste Zeile
artikelnummerkein Feld — bleibt der SchlüsselNW-0451
nameTitelHalden Low — Off-White
preisPreis179,00 €
markeMarkeNordwerk
groesseFakt38–47
bildFotohttps://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