[{"data":1,"prerenderedAt":845},["ShallowReactive",2],{"blog-b2b-pricing-engine-de":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":24,"sources":33,"cover":70,"og":71,"expertise":72,"locales":73,"lang":75,"title":77,"description":78,"coverAlt":79,"metaTitle":80,"takeaways":81,"faq":87,"toc":103,"blocks":134,"others":572},"b2b-pricing-engine","2026-10-07",12,"web",[9,10,11,12,13],"Pricing","Spryker","SAP","Caching","VAT",[15,16,17,18,19,20,21,22,23],"b2b pricing engine","customer specific pricing b2b","spryker price dimensions customer specific","sap condition technique pricing","commercetools price selection","price cache invalidation customer group","b2b volume pricing tiers","price audit trail explainability","vat rounding invoice line items",[25,27,30],{"name":9,"url":26},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPricing",{"name":28,"url":29},"Value-added tax","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FValue-added_tax",{"name":31,"url":32},"Cache invalidation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCache_invalidation",[34,37,40,43,46,49,52,55,58,61,64,67],{"title":35,"url":36},"Spryker docs: prices feature overview (Sep 2026)","https:\u002F\u002Fraw.githubusercontent.com\u002Fspryker\u002Fspryker-docs\u002Fmaster\u002Fdocs\u002Fpbc\u002Fall\u002Fprice-management\u002Flatest\u002Fbase-shop\u002Fprices-feature-overview\u002Fprices-feature-overview.md",{"title":38,"url":39},"Spryker docs: price explosion and ERP-owned pricing in B2B (Sep 2026)","https:\u002F\u002Fraw.githubusercontent.com\u002Fspryker\u002Fspryker-docs\u002Fmaster\u002Fdocs\u002Fpbc\u002Fall\u002Fprice-management\u002Flatest\u002Fbase-shop\u002Ftutorials-and-howtos\u002Fhandle-price-explosion-and-erp-owned-pricing-in-b2b.md",{"title":41,"url":42},"Spryker docs: volume prices overview","https:\u002F\u002Fraw.githubusercontent.com\u002Fspryker\u002Fspryker-docs\u002Fmaster\u002Fdocs\u002Fpbc\u002Fall\u002Fprice-management\u002Flatest\u002Fbase-shop\u002Fprices-feature-overview\u002Fvolume-prices-overview.md",{"title":44,"url":45},"commercetools docs: pricing and discounts overview","https:\u002F\u002Fdocs.commercetools.com\u002Fapi\u002Fpricing-and-discounts-overview",{"title":47,"url":48},"SAP Learning: introducing the condition technique","https:\u002F\u002Flearning.sap.com\u002Fcourses\u002Fconfiguring-pricing-in-sap-s-4hana-sales\u002Fintroducing-the-condition-technique_dce0f313-dee6-470e-8851-3f1773cb5d45",{"title":50,"url":51},"Pimcore docs: price systems and getting prices (2026.3)","https:\u002F\u002Fdocs.pimcore.com\u002Fplatform\u002FEcommerce_Framework\u002FWorking_with_Prices\u002FPrice_Systems_and_getting_Prices\u002F",{"title":53,"url":54},"Adobe Experience League: shared catalog pricing structure (Oct 2026)","https:\u002F\u002Fexperienceleague.adobe.com\u002Fen\u002Fdocs\u002Fcommerce-admin\u002Fb2b\u002Fshared-catalogs\u002Fdefine\u002Fcatalog-shared-pricing-structure",{"title":56,"url":57},"Shopify Help Center: B2B quantity rules and volume pricing","https:\u002F\u002Fhelp.shopify.com\u002Fen\u002Fmanual\u002Fb2b\u002Fcatalogs\u002Fquantity-pricing",{"title":59,"url":60},"Varnish libvmod-xkey README","https:\u002F\u002Fraw.githubusercontent.com\u002Fvarnish\u002Flibvmod-xkey\u002Fmaster\u002FREADME.rst",{"title":62,"url":63},"Opinion of the Advocate General in Case C-484\u002F06 (Koninklijke Ahold)","https:\u002F\u002Feur-lex.europa.eu\u002Flegal-content\u002FEN\u002FTXT\u002FHTML\u002F?uri=CELEX:62006CC0484",{"title":65,"url":66},"HMRC internal manual VATREC12030: rounding of VAT","https:\u002F\u002Fwww.gov.uk\u002Fhmrc-internal-manuals\u002Fvat-trader-records\u002Fvatrec12030",{"title":68,"url":69},"Playwright docs: snapshot testing","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Ftest-snapshots","\u002Fimages\u002Fblog\u002Fb2b-pricing-engine\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fb2b-pricing-engine\u002Fog.jpg","b2b-ecommerce-developer",[74,75,76],"en","de","hu","B2B-Preisfindung: kundenspezifische Preise, Caching und Audits","Wie B2B-Plattformen kundenspezifische Preise auflösen, wie man sie ohne Lecks cacht, im Streitfall erklärt, testet und die Umsatzsteuer rundet.","Vier Preisschilder als absteigende Treppe, das erste hervorgehoben.","B2B-Preisfindung: Caching, Audits · Balázs Csorba",[82,83,84,85,86],"Ein B2B-Preis hängt von bis zu sieben Dimensionen ab: Kunde, Kundengruppe oder Firma, Vertrag, Region, Mengenstaffel, Währung und Gültigkeitsdatum; die Engine wählt die spezifischste passende Regel und fällt auf einen Basispreis zurück.","Plattformen dokumentieren ihre Auflösungsreihenfolge: SAP-Zugriffsfolgen durchsuchen Konditionstabellen vom Spezifischen zum Allgemeinen, commercetools nutzt einen achtstufigen Fallback, in dem innerhalb einer Stufe der günstigste Preis gewinnt, und Spryker fällt vom konkreten auf das abstrakte Produkt zurück.","Cachen Sie personalisierte Preise pro Preisliste oder Kundengruppe, leeren Sie den Cache bei Vertragsänderungen per Tag, prüfen Sie im Checkout erneut und lassen Sie den Cache nie die einzige Kopie eines Preises sein.","Speichern Sie zum Bestellzeitpunkt einen Preis-Snapshot mit siegreicher Regel, deren Version, Steuersatz und Rundungsmodus, damit ein Streitfall Monate später ein Nachschlagen ist und keine Rekonstruktion.","Testen Sie Preise mit einer Golden-Matrix und eigenschaftsbasierten Invarianten nach jedem Import, und halten Sie eine Rundungsregel fest, die Shop, ERP und Rechnung gemeinsam nutzen.",[88,91,94,97,100],{"q":89,"a":90},"Was ist eine B2B-Preis-Engine?","Die Komponente, die den Nettopreis auflöst, den ein bestimmter Geschäftskunde für eine SKU zahlt, unter Berücksichtigung von Kunde, Gruppe, Vertrag, Region, Menge, Währung und Datum. Sie sucht die spezifischste gültige Regel und fällt auf allgemeine Preise zurück. In vielen Architekturen hält das ERP die Regeln und der Shop eine schnelle Lesekopie.",{"q":92,"a":93},"Wie cacht man kundenspezifische Preise sicher?","Nehmen Sie jede preisverändernde Dimension, meist die Preisliste oder Kundengruppe, in den Cache-Schlüssel auf, nie nur die URL und nie die Benutzer-ID. Versehen Sie Antworten mit Tags pro SKU und Preisliste, leeren Sie bei Vertragsänderungen per Tag, prüfen Sie den Preis im Checkout erneut und halten Sie den maßgeblichen Preis außerhalb des Caches.",{"q":95,"a":96},"Wie ermittelt SAP einen Preis?","Über die Konditionstechnik. Ein Kalkulationsschema wird aus Verkaufsbereich, Verkaufsbelegart und Auftraggeber bestimmt. Jede Konditionsart hat eine Zugriffsfolge, die Konditionstabellen vom spezifischsten zum allgemeinsten Schlüssel durchsucht, bis sie einen gültigen Satz findet, und Mengenstaffeln bestimmen die Staffelstufe.",{"q":98,"a":99},"Was sollte ein Auftrag speichern, um seinen Preis später zu erklären?","Einen Snapshot pro Auftragsposition: aufgelösten Stückpreis und Währung, die siegreiche Regel mit ID und Version, die unterlegenen Kandidaten, die Mengenstaffel, den Steuersatz, den Rundungsmodus sowie Herkunft und Alter des Preises in diesem Moment.",{"q":101,"a":102},"Rundet man die Umsatzsteuer pro Position oder pro Rechnung?","Die EU-Mehrwertsteuerrichtlinien regeln die Rundung nicht ausdrücklich, daher gilt nationales Recht; HMRC etwa rundet unter 0,5 Pence ab und ab 0,5 Pence auf. Wählen Sie eine dokumentierte Regel, die Ihre Steuerberatung akzeptiert, und wenden Sie sie in Shop, ERP und Rechnung identisch an. Bei Nettorechnungen im B2B sind die Verzerrungen viel kleiner als bei Bruttopreisen im Einzelhandel.",[104,107,110,113,116,119,122,125,128,131],{"id":105,"title":106},"how-b2b-prices-get-decided","Wie werden B2B-Preise bestimmt?",{"id":108,"title":109},"where-prices-live-and-the-resolution-order","Wo Preise liegen und in welcher Reihenfolge sie aufgelöst werden",{"id":111,"title":112},"platform-support-compared","Plattformen im Vergleich",{"id":114,"title":115},"caching-personalized-prices","Personalisierte Preise cachen, ohne sie preiszugeben",{"id":117,"title":118},"auditing-and-explainability","Einen Preis prüfen und erklären",{"id":120,"title":121},"testing-price-logic-with-golden-snapshots","Preislogik mit Golden Snapshots testen",{"id":123,"title":124},"vat-rounding-and-price-mode-pitfalls","Umsatzsteuer, Rundung und Preismodus-Fallen",{"id":126,"title":127},"when-not-to-build-a-pricing-engine","Wann Sie keine eigene Preis-Engine bauen sollten",{"id":129,"title":130},"checklist","Eine Checkliste, bevor Sie Preise anfassen",{"id":132,"title":133},"sources","Quellen",[135,144,158,161,164,203,210,211,218,224,231,237,248,255,256,259,336,346,347,350,381,384,388,389,392,395,398,406,413,414,428,430,438,441,442,447,459,470,482,483,486,489,497,498,501,521,533,534],{"type":136,"content":137},"paragraph",[138,139,143],"Eine ",{"tag":140,"children":141},"strong",[142],"B2B-Preis-Engine"," entscheidet, welchen Nettopreis ein angemeldeter Käufer für eine SKU sieht, abhängig davon, wer er ist, welchen Vertrag seine Firma hat, wo er kauft, wie viele Einheiten er bestellt, in welcher Währung und an welchem Datum. Die Berechnung ist die leichte Hälfte. Die schwere Hälfte ist der Betrieb: Preise cachen, die je Kunde verschieden sind, ohne sie dem falschen Kunden zu zeigen, einen Preis drei Monate später im Streitfall erklären und die Umsatzsteuer genauso runden wie die Rechnung.",{"type":136,"content":145},[146,147,152,153,157],"Dieser Artikel zeigt, wie die großen Plattformen kundenspezifische Preise auflösen (Spryker, Pimcore, die SAP-Konditionstechnik, commercetools, Adobe Commerce und Shopify B2B), und behandelt dann Caching, Audit, Tests und Umsatzsteuer. Wie ein Konfigurator Optionen bepreist, steht in ",{"tag":148,"to":149,"children":150},"link","\u002Fblog\u002Fheadless-product-configurator-b2b",[151],"Headless-Produktkonfiguratoren im B2B","; wie Preise hinter einem Login als strukturierte Daten ausgeliefert werden, steht in ",{"tag":148,"to":154,"children":155},"\u002Fblog\u002Fschema-org-structured-data-b2b-shop",[156],"schema.org-Daten für B2B-Shops",".",{"type":159,"level":160,"id":105,"text":106},"heading",2,{"type":136,"content":162},[163],"Meist bestimmen sieben Dimensionen einen B2B-Preis: der Kunde, die Kundengruppe oder Firma, der Vertrag, die Region oder der Vertriebskanal, die Mengenstaffel, die Währung und das Gültigkeitsdatum. Eine Preis-Engine sucht die spezifischste Regel, die zu allen passt, und fällt Schritt für Schritt auf einen allgemeinen Basispreis zurück, wenn es nichts Spezifischeres gibt.",{"type":165,"ordered":166,"items":167},"list",false,[168,173,178,183,188,193,198],[169,172],{"tag":140,"children":170},[171],"Kunde",": ein individueller Preis für ein Käuferkonto, oft für eine Handvoll Kernartikel.",[174,177],{"tag":140,"children":175},[176],"Kundengruppe oder Firma",": eine Preisliste für ein Segment, etwa Händler, Installateure oder alle Töchter einer Firma.",[179,182],{"tag":140,"children":180},[181],"Vertrag",": eine verhandelte Vereinbarung mit Laufzeit, manchmal mit eigenen Mengenzusagen.",[184,187],{"tag":140,"children":185},[186],"Region oder Kanal",": Land, Store oder Vertriebskanal, der auch die steuerliche Behandlung bestimmt.",[189,192],{"tag":140,"children":190},[191],"Mengenstaffel",": die Staffelstufe, die die bestellte Menge erreicht.",[194,197],{"tag":140,"children":195},[196],"Währung",": Preise werden je Währung gepflegt, nicht spontan umgerechnet.",[199,202],{"tag":140,"children":200},[201],"Gültigkeitsdatum",": Start- und Enddatum, damit die Preise des nächsten Quartals vorab geladen werden können.",{"type":136,"content":204},[205,206,209],"Die Dimensionen multiplizieren sich. Sprykers Leitfaden zu ERP-geführten Preisen rechnet ein Beispiel vor: 1.000 Kunden mal 25.000 Produkte, gezählt für abstrakte und konkrete Produkte, ergeben 50 Millionen theoretische Preissätze. Bei 20 Prozent Vertragsabdeckung sind es noch etwa 20 Millionen, der Punkt, an dem laut Leitfaden die Standard-Sync-Pipeline „ernsthaft nachzulassen beginnt“ (",{"tag":207,"href":39,"children":208},"a",[10],"). Deshalb sind die Fragen, wo Preise liegen und wie sie gecacht werden, wichtiger als die Formel.",{"type":159,"level":160,"id":108,"text":109},{"type":136,"content":212},[213,214,157],"Preise haben meist drei mögliche Orte: das ERP, das verhandelte Konditionen hält und meist das führende System ist; das PIM, das Listenpreise als Produktattribute halten kann; und die Commerce-Plattform, die Preislisten oder Preisdimensionen für schnelle Lesezugriffe hält. Entscheidend ist, welches System maßgeblich ist und wie veraltet eine Kopie in einem anderen System sein darf. Bei Produktdaten stellt sich dieselbe Frage, siehe ",{"tag":148,"to":215,"children":216},"\u002Fblog\u002Fpimcore-erp-delta-sync",[217],"den Pimcore-ERP-Delta-Sync",{"type":219,"src":220,"alt":221,"wide":222,"caption":223},"image","\u002Fimages\u002Fblog\u002Fb2b-pricing-engine\u002Fdiagram-8.webp","Kette der B2B-Preisauflösung Fünf Schritte von links nach rechts: der Anfragekontext mit Kunde, Firma, Region, Menge, Währung und Datum; der Vertragspreis als spezifischste Regel; der Kundengruppenpreis als nächster Fallback; der Basispreis als letzte Stufe; und ein Preis-Snapshot, der an der Auftragsposition gespeichert wird.",true,"Die Auflösung geht von der spezifischsten zur allgemeinsten Regel, und der siegreiche Preis wird an der Auftragsposition eingefroren.",{"type":136,"content":225},[226,227,230],"In SAP S\u002F4HANA entscheidet die Konditionstechnik. Das System wählt ein Kalkulationsschema aus Verkaufsbereich, Verkaufsbelegart und Auftraggeber. Jede Konditionsart im Schema hat eine Zugriffsfolge, die Konditionstabellen der Reihe nach durchsucht, vom spezifischsten zum allgemeinsten Schlüssel, bis sie einen gültigen Konditionssatz findet. Mengenstaffeln wählen dann die Staffelstufe, und Kopfkonditionen werden nach Nettowert auf die Positionen verteilt, sofern nichts anderes eingestellt ist (",{"tag":207,"href":48,"children":228},[229],"SAP Learning",").",{"type":136,"content":232},[233,234,230],"commercetools dokumentiert seine Preisauswahl als achtstufigen Fallback, von Kundengruppe plus Kanal plus Land bis hinunter zum Basispreis. Innerhalb jeder Stufe gewinnen Preise mit Gültigkeitszeitraum gegen Preise ohne, und passen danach noch mehrere, gewinnt der günstigste. Staffelpreise werden ignoriert, wenn bereits ein Produktrabatt greift (",{"tag":207,"href":45,"children":235},[236],"commercetools",{"type":136,"content":238},[239,240,243,244,247],"Spryker speichert Preise als Ganzzahlen in der kleinsten Währungseinheit, jeweils mit Preistyp sowie Brutto- und Nettowert pro Preismodus. Beim Lesen wird zuerst das konkrete Produkt geprüft, dann auf das abstrakte zurückgefallen. Staffelpreise folgen derselben Vererbung: Die eigenen Staffelpreise eines konkreten Produkts überschreiben die abstrakten, und sie unterstützen nur den Standardpreistyp (",{"tag":207,"href":36,"children":241},[242],"Spryker-Preise",", ",{"tag":207,"href":42,"children":245},[246],"Spryker-Staffelpreise","). Kundenspezifische Preise entstehen über Preisdimensionen: Der dokumentierte Weg erweitert die Kunden- und Preistabellen um eine Gruppen-ID und exportiert Preise pro Gruppe in den Key-Value-Store.",{"type":136,"content":249},[250,251,254],"Pimcores E-Commerce-Framework gibt jedem Produkt ein Preissystem, das PriceInfo-Objekte liefert. Das eingebaute AttributePriceSystem liest den Preis aus einem Produktattribut, und alles, was aus dem ERP kommt, wird ein eigenes, in der Konfiguration registriertes Preissystem (",{"tag":207,"href":51,"children":252},[253],"Pimcore","). Preisregeln wenden dann Rabatte als Paare aus Bedingung und Aktion auf diesen Preis an.",{"type":159,"level":160,"id":111,"text":112},{"type":136,"content":257},[258],"Die Plattformen sind sich einig, dass die spezifischste Regel gewinnt, und unterscheiden sich darin, wo Gleichstände entschieden werden und was sie für Audits bieten. Die Tabelle fasst zusammen, was jede Stand Oktober 2026 dokumentiert.",{"type":260,"head":261,"rows":272},"table",[262,264,266,268,270],[263],"Plattform",[265],"Preisdimensionen",[267],"Staffelpreise",[269],"Vorrang",[271],"Audit- oder Erklärhilfe",[273,283,294,305,315,326],[274,275,277,279,281],[10],[276],"Store, Währung, Preismodus; Kundengruppen über Preisdimensionen",[278],"JSON pro Store und Währung, nur Standardpreistyp",[280],"konkretes vor abstraktem Produkt",[282],"Hybridmuster mit Prüfung im Checkout",[284,286,288,290,292],[285],"Pimcore E-Commerce-Framework",[287],"was das Preissystem implementiert",[289],"in einem eigenen Preissystem",[291],"Preissystem pro Produkt, dann Preisregeln",[293],"angewandte Regeln pro PriceInfo lesbar",[295,297,299,301,303],[296],"SAP S\u002F4HANA SD",[298],"Konditionstabellen mit Kunde, Material, Verkaufsbereich und mehr",[300],"Mengenstaffeln an Konditionsarten",[302],"Zugriffsfolge, spezifischste Tabelle zuerst",[304],"gefundene Konditionssätze je Belegposition",[306,307,309,311,313],[236],[308],"Kundengruppe, Kanal, Land, Gültigkeit",[310],"Staffeln an eingebetteten und eigenständigen Preisen",[312],"achtstufiger Fallback, günstigster gewinnt je Stufe",[314],"Pricing- und Discount-Messages, optional",[316,318,320,322,324],[317],"Adobe Commerce B2B",[319],"Shared Catalog pro Firma, Website-Ebene",[321],"Staffelpreise pro Shared Catalog",[323],"fester Sonderpreis: Minimum aus Basis- und Festwert",[325],"in den zitierten Docs keine genannt",[327,329,331,333,335],[328],"Shopify B2B",[330],"Kataloge mit Mengenregeln pro Variante",[332],"bis zu 10 Preisstufen pro Produkt",[334],"Staffelpreis fixiert den Preis; Katalogaufschlag greift nicht mehr",[325],{"type":136,"content":337},[338,339,342,343,230],"Zwei dokumentierte Regeln überraschen viele. In Adobe Commerce erhöht ein fester Sonderpreis in einem Shared Catalog den Preis nie: Verwendet wird das Minimum aus Basispreis und Festwert (",{"tag":207,"href":54,"children":340},[341],"Adobe","). In Shopify B2B wird der Preis fest, sobald ein Staffelpreis greift, sodass eine katalogweite prozentuale Anpassung ihn nicht mehr senkt, und Mengenregeln gelten pro Variante, sodass ein Käufer Varianten nicht kombinieren kann, um ein Minimum zu erreichen (",{"tag":207,"href":57,"children":344},[345],"Shopify",{"type":159,"level":160,"id":114,"text":115},{"type":136,"content":348},[349],"Ein personalisierter Preis lässt sich cachen, solange jede Dimension, die den Preis ändert, Teil des Cache-Schlüssels ist. Ist der Schlüssel nur die URL, bestimmt der erste Käufer, der eine Produktseite lädt, den Preis für alle späteren Käufer. Das ist zugleich ein falscher Preis und ein Datenleck: Der Vertragspreis eines Kunden wird einem anderen gezeigt.",{"type":165,"ordered":166,"items":351},[352,361,369,374],[353,356,357,230],{"tag":140,"children":354},[355],"Schlüssel nach Preisdimensionen, nicht nach Benutzer."," Cachen Sie pro Preisliste oder Kundengruppe, nicht pro Benutzer-ID, sonst bricht die Trefferquote ein. Cloudflare erlaubt Header, Cookies und Nutzermerkmale in eigenen Cache-Schlüsseln, aber diese Optionen gibt es nur im Enterprise-Tarif, und die Doku warnt, dass eigene Schlüssel den Cache zersplittern können (",{"tag":207,"href":358,"children":359},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcache\u002Fhow-to\u002Fcache-keys\u002F",[360],"Cloudflare",[362,365,366,230],{"tag":140,"children":363},[364],"Antworten für die Invalidierung taggen."," Mit dem xkey-Modul von Varnish versieht das Backend jede Antwort mit Surrogate Keys wie SKU und Preisliste. Ein Purge-Aufruf leert jedes Objekt mit diesem Schlüssel, softpurge behält sie für den Grace-Modus, und die README rät, den Purge-Endpunkt per ACL zu schützen (",{"tag":207,"href":60,"children":367},[368],"xkey",[370,373],{"tag":140,"children":371},[372],"Beim Geschäftsereignis leeren."," Eine Vertragsänderung, ein neuer Preisimport oder ein ERP-Delta sendet die betroffenen SKU- und Preislisten-Tags. Eine TTL allein lässt den alten Vertragspreis bis zum Ablauf live.",[375,378,379,230],{"tag":140,"children":376},[377],"Den Cache nie zum einzigen Speicher machen."," Sprykers Leitfaden warnt, dass Preise, die nur in einen Cache geschrieben werden, ein Datenverlustrisiko darstellen, wenn der Cache verloren geht (",{"tag":207,"href":39,"children":380},[10],{"type":136,"content":382},[383],"Für ERP-geführte Preise empfiehlt derselbe Leitfaden als Standard ein Hybridmodell: Ein lokales Lesemodell bedient Katalog und Warenkorb, und der Checkout prüft erneut gegen das ERP, sodass der endgültige Preis bei der Bestellung bestätigt wird. Altern gecachte ERP-Preise, zeigt die Seite einen Aktualitätshinweis wie „Preis von 14:23“, statt so zu tun, als sei die Zahl live. Das Ziel im Leitfaden ist ein Preisabruf unter 100 ms pro Storefront-Anfrage.",{"type":219,"src":385,"alt":386,"wide":222,"caption":387},"\u002Fimages\u002Fblog\u002Fb2b-pricing-engine\u002Fdiagram-21.webp","Caching-Topologie für personalisierte Preise Obere Reihe von links nach rechts: der Browser eines angemeldeten Käufers, ein Edge-Cache mit dem Schlüssel URL plus Kundengruppe, die Shop-API, die den Preis auflöst, und ein lokales Lesemodell, das das Alter des Preises zeigt. Unter dem Lesemodell liegt das ERP als führendes System, das das Lesemodell per Delta-Sync versorgt. Die Shop-API prüft den Preis im Checkout erneut gegen das ERP. Bei einer Vertragsänderung sendet das ERP ein Ereignis an einen Kasten Vertragsänderung, der den Edge-Cache über SKU- und Preislisten-Tags leert.","Personalisierte Preise werden pro Kundengruppe gecacht, bei Vertragsänderung per Tag geleert und im Checkout gegen das ERP bestätigt; das Lesemodell zeigt, wie alt ein Preis ist.",{"type":159,"level":160,"id":117,"text":118},{"type":136,"content":390},[391],"Früher oder später fragt jemand, warum Kunde X an einem bestimmten Tag Preis Y gesehen hat. Muss man dafür die heutigen Regeln auf die heutigen Daten anwenden, gibt es keine Antwort, denn Vertrag, Staffeltabelle und Basispreis haben sich seitdem geändert. Die Antwort muss in dem Moment gespeichert werden, in dem der Preis verwendet wird.",{"type":136,"content":393},[394],"Speichern Sie an jeder Auftragsposition einen Preis-Snapshot zum Bestellzeitpunkt: den aufgelösten Nettopreis, die siegreiche Regel und die unterlegenen Kandidaten, Preislisten- und Vertrags-IDs mit Versionen, die Mengenstaffel, die Währung, den Steuersatz und den Rundungsmodus. Der Snapshot kostet einige hundert Byte pro Position und macht aus einem Streitfall ein Nachschlagen. Das Beispiel unten ist illustrativ, Beträge in Cent.",{"type":396,"code":397},"code","{\n  \"orderLine\": \"SO-2026-104233\u002F3\",\n  \"sku\": \"VLV-200-DN50\",\n  \"quantity\": 24,\n  \"resolvedAt\": \"2026-10-07T09:14:03Z\",\n  \"currency\": \"EUR\",\n  \"unitNet\": 18350,\n  \"winningRule\": { \"type\": \"contract\", \"id\": \"CT-7781\", \"version\": 4, \"tier\": \"20+\" },\n  \"candidates\": [\n    { \"type\": \"customerGroup\", \"id\": \"PL-INSTALLERS\", \"unitNet\": 19100 },\n    { \"type\": \"base\", \"id\": \"PL-BASE-EUR\", \"unitNet\": 22400 }\n  ],\n  \"taxRate\": \"19.00\",\n  \"rounding\": \"HALF_UP per line\",\n  \"priceSource\": \"erp-read-model\",\n  \"priceAgeSeconds\": 412\n}",{"type":136,"content":399},[400,401,405],"Die Plattformen liefern einen Teil des Rohmaterials. commercetools erzeugt Messages für Änderungen an Ressourcen, darunter eigene Pricing- und Discount-Messages für eigenständige Preise, aber Messages werden standardmäßig nicht gespeichert und müssen aktiviert werden (",{"tag":207,"href":402,"children":403},"https:\u002F\u002Fdocs.commercetools.com\u002Fapi\u002Fprojects\u002Fmessages",[404],"commercetools Messages","). Pimcore kann die auf ein PriceInfo angewandten Preisregeln auflisten, und in SAP trägt jede Belegposition die Konditionssätze, die ihre Zugriffsfolgen gefunden haben. Nichts davon ersetzt einen Snapshot unter Ihrer Kontrolle, denn diese Quellen ändern sich oder verfallen nach eigenem Zeitplan.",{"type":136,"content":407},[408,409,412],"Preisanomalien sind ein guter Ort für Automatisierung, die ihre Grenzen kennt. Eine Prüfung, die Positionen markiert, deren berechneter Preis um mehr als eine Toleranz vom aufgelösten abweicht, sollte den Fall an einen Menschen geben, nicht automatisch korrigieren. Mein Skill ",{"tag":396,"children":410},[411],"jev-decide"," folgt demselben Muster: Eine Entscheidung mit niedriger Konfidenz geht an einen Menschen, statt angewendet zu werden.",{"type":159,"level":160,"id":120,"text":121},{"type":136,"content":415},[416,417,420,421,424,425,230],"Preislogik ist eine Matrix aus Kunde, Vertrag, Region, Menge, Währung und Datum. Wählen Sie je Dimension wenige repräsentative Werte, berechnen Sie den aufgelösten Preis für jede Kombination und legen Sie das Ergebnis als Golden File im Repository ab. Playwright schreibt beim ersten Lauf einen Golden Snapshot, vergleicht jeden späteren Lauf damit und aktualisiert ihn nur mit ",{"tag":396,"children":418},[419],"--update-snapshots","; ",{"tag":396,"children":422},[423],"toMatchSnapshot()"," funktioniert mit beliebigem Text, nicht nur mit Screenshots (",{"tag":207,"href":69,"children":426},[427],"Playwright",{"type":396,"code":429},"import { test, expect } from '@playwright\u002Ftest'\nimport { resolvePrice } from '..\u002Fsrc\u002Fpricing'\nimport { customers, skus, quantities, dates } from '.\u002Fprice-matrix'\n\n\u002F\u002F One row per combination; the golden file is reviewed like code\ntest('price matrix matches the golden file', () => {\n  const rows: string[] = []\n  for (const c of customers) for (const sku of skus) for (const qty of quantities) for (const date of dates) {\n    const p = resolvePrice({ customer: c, sku, quantity: qty, date, currency: 'EUR' })\n    rows.push([c.id, sku, qty, date, p.unitNet, p.winningRule.id].join(';'))\n  }\n  expect(rows.join('\\n')).toMatchSnapshot('price-matrix.txt')\n})",{"type":136,"content":431},[432,433,437],"Golden Files fangen Regressionen in konkreten Fällen; eigenschaftsbasierte Tests fangen Verstöße gegen die allgemeinen Regeln. Mit fast-check formulieren Sie Invarianten, und die Bibliothek erzeugt Hunderte Eingaben und schrumpft jeden Fehler auf einen minimalen Fall (",{"tag":207,"href":434,"children":435},"https:\u002F\u002Ffast-check.dev\u002Fdocs\u002Fintroduction\u002F",[436],"fast-check","). Nützliche Invarianten: Die Auftragssumme ist die Summe der gerundeten Positionssummen, eine höhere Staffel liefert nie einen höheren Stückpreis, brutto liegt bei positivem Steuersatz nie unter netto, und ein kundenspezifischer Preis liegt nie über dem Basispreis, wo die Geschäftsregel das verbietet.",{"type":136,"content":439},[440],"Lassen Sie die Matrix nach jedem Preisimport und jedem ERP-Delta laufen, nicht nur bei Codeänderungen, denn die meisten Preisfehler kommen aus Daten, nicht aus Code. Auf der Storefront-Seite steuere ich mit Playwright MCP den echten Shop mit verschiedenen angemeldeten Rollen und vergleiche nach einer Vertragsänderung den angezeigten mit dem aufgelösten Preis.",{"type":159,"level":160,"id":123,"text":124},{"type":136,"content":443},[444,445,230],"B2B-Preise werden meist netto gepflegt und angezeigt, Verbraucherpreise brutto, und eine Plattform muss wissen, welche Variante sie speichert. Spryker hält den Preismodus, brutto oder netto, am Quote fest, und ein Quote kann nicht beide zugleich nutzen. Die Dokumentation zeigt auch die Folge: Im Bruttomodus bleibt ein Produkt mit €100 netto und 20 % Steuer in der Region des Stores beim Verkauf in eine Region mit 10 % Steuer bei €120 brutto, der Nettobetrag wird also €109,09 (",{"tag":207,"href":36,"children":446},[10],{"type":448,"variant":449,"title":450,"body":451},"callout","warn","Die 19\u002F119-Falle",[452,457],[453,454,230],"Die Umsatzsteuer aus einem Bruttopreis herauszurechnen heißt bei 19 % mit 19\u002F119 zu multiplizieren, und das Runden dieses kleinen Betrags pro Stück verzerrt die Steuer. Die Schlussanträge des Generalanwalts in der Rechtssache C-484\u002F06 nennen das Beispiel: €0,28 inklusive 19 % Umsatzsteuer enthalten €0,0447 Steuer; auf €0,04 gerundet ergibt sich ein Netto von €0,24, dessen 19 % Steuer tatsächlich €0,0456 beträgt (",{"tag":207,"href":63,"children":455},[456],"C-484\u002F06",[458],"Entscheiden Sie, ob pro Stück, pro Position oder pro Rechnung gerundet wird, halten Sie die Regel schriftlich fest und verwenden Sie sie identisch in Shop, ERP und Rechnung.",{"type":136,"content":460},[461,462,465,466,230],"Dieselben Schlussanträge halten fest, dass keine Vorschrift der EU-Mehrwertsteuerrichtlinien die Rundung ausdrücklich regelt, die Einzelheiten also nationales Recht im Rahmen der EU-Grundsätze sind, und dass bei Nettorechnungen zwischen Unternehmen die Verzerrungen entweder nicht entstehen oder stark abgeschwächt sind. Die HMRC-Regel ist ein konkretes Beispiel: Steuer unter 0,5 Pence wird abgerundet, ab 0,5 Pence aufgerundet, und andere Verfahren sind zulässig, wenn sie ein faires und angemessenes Ergebnis liefern (",{"tag":207,"href":66,"children":463},[464],"HMRC","). Für Verbraucher verlangt die Preisangabenrichtlinie den Verkaufspreis einschließlich Umsatzsteuer, ein Grund, warum B2C-Shops brutto und B2B-Shops netto denken (",{"tag":207,"href":467,"children":468},"https:\u002F\u002Feur-lex.europa.eu\u002Flegal-content\u002FEN\u002FTXT\u002F?uri=CELEX%3A31998L0006",[469],"Richtlinie 98\u002F6\u002FEG",{"type":136,"content":471},[472,473,476,477,481],"Machen Sie Rundung im Code explizit. commercetools bietet Rundung als Konfiguration an, mit den Modi HalfUp, HalfDown und HalfEven sowie getrennten Warenkorb-Einstellungen für Preisrundung, Steuerrundung und Steuerberechnung, und weist darauf hin, dass B2B-Preise oft Genauigkeit unter einem Cent brauchen. In PHP speichert moneyphp Beträge als Strings, und ",{"tag":396,"children":474},[475],"allocate()"," teilt €10,00 deterministisch in 334, 333 und 333 Cent auf (",{"tag":207,"href":478,"children":479},"https:\u002F\u002Fgithub.com\u002Fmoneyphp\u002Fmoney",[480],"moneyphp","). Speichern Sie Preise als Ganzzahlen in der kleinsten Einheit oder über eine Money-Bibliothek, nie als Gleitkommazahlen.",{"type":159,"level":160,"id":126,"text":127},{"type":136,"content":484},[485],"Die meisten B2B-Shops sollten keine Preis-Engine bauen, sondern einen Preis-Adapter. Wenn das ERP Konditionen bereits korrekt auflöst, erzeugt eine Kopie dieser Logik im Shop zwei Engines, die auseinanderlaufen. Das Hybridmuster lässt das ERP maßgeblich: aufgelöste Preise in ein Lesemodell für den Katalog replizieren, im Checkout erneut prüfen und Veraltung zeigen statt verbergen.",{"type":136,"content":487},[488],"Bauen Sie die Auflösung im Shop, wenn das ERP bei Ihrer Kataloggröße nicht schnell genug für das Browsen antwortet, wenn der Shop Dinge verkauft, die das ERP nicht bepreist, etwa konfigurierte Optionen oder Marktplatzangebote, oder wenn die ERP-Regeln so einfach sind, dass ein Preislistenimport sie abdeckt. Auch dann gilt: ein Eigentümer pro Preisregel, und das andere System ist eine Kopie mit bekanntem Höchstalter.",{"type":136,"content":490},[491,492,496],"„Preis auf Anfrage“ verdient einen eigenen Geschäftszustand mit eigenem Ablauf, keinen Fehler. Passt keine Regel, ist eine Angebotsanfrage besser als ein Basispreis, auf den der Kunde keinen Anspruch hat, und besser als ein fehlender Preis, der wie ein Bug aussieht. Danach übernimmt die Angebotsbearbeitung, wie in ",{"tag":148,"to":493,"children":494},"\u002Fblog\u002Fllm-rfq-quote-automation",[495],"RFQ-Automatisierung mit LLMs"," beschrieben.",{"type":159,"level":160,"id":129,"text":130},{"type":136,"content":499},[500],"In meiner Arbeit mit Spryker und Pimcore ist die Frage, wo Preise liegen, die erste, die geklärt werden muss. Diese Liste sollte man durchgehen, bevor man Indizes, Caches oder Importer ändert, die Preise berühren.",{"type":165,"ordered":222,"items":502},[503,505,507,509,511,513,515,517,519],[504],"Dimensionen und Auflösungsreihenfolge festhalten, einschließlich der Entscheidung bei Gleichstand innerhalb einer Stufe.",[506],"Für jede Preisregel einen Eigentümer und für jede Kopie ein Höchstalter benennen.",[508],"Jede preisverändernde Dimension in den Cache-Schlüssel aufnehmen, nichts pro Benutzer.",[510],"Gecachte Preise nach SKU und Preisliste taggen und bei Vertragsänderung leeren, nicht nur per TTL.",[512],"Im Checkout erneut prüfen und das Alter des Preises zeigen, wenn er nicht live ist.",[514],"Einen Preis-Snapshot zum Bestellzeitpunkt mit Regel-IDs, Versionen, Steuersatz und Rundungsmodus speichern.",[516],"Eine Golden-Preismatrix und Eigenschaftstests pflegen und nach jedem Import ausführen.",[518],"Eine Rundungsregel für Shop, ERP und Rechnung dokumentieren und Ganzzahlen oder eine Money-Bibliothek verwenden.",[520],"„Preis auf Anfrage“ als Zustand mit eigenem Ablauf behandeln.",{"type":136,"content":522},[523,524,528,529,157],"Wenn Sie kundenspezifische Preise zwischen Shop und ERP entwirren, sehen Sie sich meine ",{"tag":148,"to":525,"children":526},"\u002Fexpertise\u002Fb2b-ecommerce-developer",[527],"B2B-E-Commerce-Arbeit"," an. Vertriebsmitarbeiter, die einem Kunden einen Preis erklären müssen, profitieren von denselben Snapshot-Daten, siehe ",{"tag":148,"to":530,"children":531},"\u002Fblog\u002Fsales-rep-ai-copilot-b2b",[532],"einen KI-Copiloten für den B2B-Vertrieb",{"type":159,"level":160,"id":132,"text":133},{"type":165,"ordered":222,"items":535},[536,539,542,545,548,551,554,557,560,563,566,569],[537],{"tag":207,"href":36,"children":538},[35],[540],{"tag":207,"href":39,"children":541},[38],[543],{"tag":207,"href":42,"children":544},[41],[546],{"tag":207,"href":45,"children":547},[44],[549],{"tag":207,"href":48,"children":550},[47],[552],{"tag":207,"href":51,"children":553},[50],[555],{"tag":207,"href":54,"children":556},[53],[558],{"tag":207,"href":57,"children":559},[56],[561],{"tag":207,"href":60,"children":562},[59],[564],{"tag":207,"href":63,"children":565},[62],[567],{"tag":207,"href":66,"children":568},[65],[570],{"tag":207,"href":69,"children":571},[68],[573,647,703,777],{"slug":574,"published":575,"minutes":576,"category":7,"tags":577,"keywords":583,"about":595,"sources":604,"cover":641,"og":642,"expertise":72,"locales":643,"lang":75,"title":644,"description":645,"coverAlt":646},"schema-org-structured-data-b2b-shop","2026-10-17",10,[578,579,580,581,582],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[584,585,586,587,588,589,590,591,592,593,594],"schema.org b2b shop","product structured data b2b","merchant listing structured data","product snippet vs merchant listing","unitpricespecification referencequantity","productgroup variants structured data","organization schema vatid","b2b prices behind login seo","json-ld nuxt schema org","merchant return policy structured data","mpn gtin structured data",[596,598,601],{"name":578,"url":597},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":599,"url":600},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":602,"url":603},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[605,608,611,614,617,620,623,626,629,632,635,638],{"title":606,"url":607},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":609,"url":610},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":612,"url":613},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":615,"url":616},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":618,"url":619},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":621,"url":622},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":624,"url":625},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":627,"url":628},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":630,"url":631},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":633,"url":634},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":636,"url":637},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":639,"url":640},"Nuxt SEO: Schema.org identity setup","https:\u002F\u002Fnuxtseo.com\u002Fdocs\u002Fschema-org\u002Fguides\u002Fsetup-identity","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fog.jpg",[74,75,76],"Schema.org-Strukturdaten für B2B-Shops: Preise hinter Logins, Einheiten und Varianten","Produkt-Markup für B2B-Shops: Snippet oder Händlereintrag, welcher Preis, Artikelnummern, Grundpreise, Varianten, Organization und SSR in Nuxt.","Ein Produktrechteck mit dünnem Rahmen und einem kleinen Feld, das eine niedrige Wand verdeckt.",{"slug":648,"published":575,"minutes":649,"category":7,"tags":650,"keywords":655,"about":667,"sources":675,"cover":697,"og":698,"expertise":72,"locales":699,"lang":75,"title":700,"description":701,"coverAlt":702},"ai-assistant-b2b-shop-customer-support",9,[580,651,652,653,654],"AI assistant","Customer support","LLM agents","EU AI Act",[656,657,658,659,660,661,662,663,664,665,666],"ai assistant b2b shop","ai customer support b2b ecommerce","llm chatbot order status","ai agent customer service tools","chatbot liability air canada","klarna ai assistant results","human handoff chatbot design","eu ai act chatbot disclosure","owasp excessive agency","ai support resolution rate","b2b customer portal chatbot",[668,671,674],{"name":669,"url":670},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":672,"url":673},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":602,"url":603},[676,679,682,685,688,691,694],{"title":677,"url":678},"Klarna: AI assistant handles two-thirds of customer service chats in its first month (press release, 2024)","https:\u002F\u002Fwww.klarna.com\u002Finternational\u002Fpress\u002Fklarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month\u002F",{"title":680,"url":681},"Entrepreneur: Klarna is hiring customer service agents again, according to its CEO (May 2025)","https:\u002F\u002Fwww.entrepreneur.com\u002Fbusiness-news\u002Fklarna-ceo-reverses-course-by-hiring-more-humans-not-ai\u002F491396",{"title":683,"url":684},"ABA Business Law Today: BC tribunal confirms companies remain liable for information provided by AI chatbot","https:\u002F\u002Fwww.americanbar.org\u002Fgroups\u002Fbusiness_law\u002Fresources\u002Fbusiness-law-today\u002F2024-february\u002Fbc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot\u002F",{"title":686,"url":687},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":689,"url":690},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":692,"url":693},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":695,"url":696},"Intercom: Fin pricing and billable outcomes","https:\u002F\u002Ffin.ai\u002Fpricing","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fog.jpg",[74,75,76],"Ein KI-Assistent für den Support im B2B-Shop: Tools, Berechtigungen und die Übergabe an Menschen","Wie man einen KI-Support-Assistenten für einen B2B-Shop baut: was automatisieren, Tools im Kundenkontext, Übergabe an Menschen, AI Act und Kennzahlen.","Eine hohe Mauer mit schmalem Durchgang: Ein Pfeil führt in ein Feld mit drei Quadraten, ein zweiter nach unten zu einer Ablage.",{"slug":704,"published":575,"minutes":705,"category":7,"tags":706,"keywords":711,"about":723,"sources":733,"cover":770,"og":771,"expertise":772,"locales":773,"lang":75,"title":774,"description":775,"coverAlt":776},"vue-ai-chat-ui-streaming-accessibility",11,[707,582,708,709,710],"Vue","Accessibility","Streaming","AI chat",[712,713,714,715,716,717,718,719,720,721,722],"vue ai chat ui","nuxt llm streaming","sse vs fetch streaming","aria-live streaming text","accessible chat interface","abort fetch stream vue","dompurify markdown llm","role log chat","reduced motion chat ui","wcag 2.2 chat","screen reader streaming",[724,727,730],{"name":725,"url":726},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":728,"url":729},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":731,"url":732},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[734,737,740,743,746,749,752,755,758,761,764,767],{"title":735,"url":736},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":738,"url":739},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":741,"url":742},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":744,"url":745},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":747,"url":748},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":750,"url":751},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":753,"url":754},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":756,"url":757},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":759,"url":760},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":762,"url":763},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":765,"url":766},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":768,"url":769},"Vue docs: nextTick","https:\u002F\u002Fvuejs.org\u002Fapi\u002Fgeneral.html#nexttick","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fog.jpg","vue-nuxt-developer",[74,75,76],"Streaming-Chat mit KI in Vue und Nuxt: von Anfang an barrierefrei","KI-Chat in Vue oder Nuxt: Fetch-Streams, Abbruch und Retry, sicheres Markdown-Rendering, aria-live-Meldungen, Tastaturnavigation und Reduced Motion.","Eine Nachrichtenkarte mit blinkendem Cursor, eine gepunktete Linie öffnet sich zu Wellen, daneben ein Haken.",{"slug":778,"published":575,"minutes":649,"category":7,"tags":779,"keywords":784,"about":796,"sources":806,"cover":839,"og":840,"expertise":772,"locales":841,"lang":75,"title":842,"description":843,"coverAlt":844},"llm-translation-pipeline-i18n",[780,781,782,707,783],"Translation","i18n","LLM","Localization",[785,786,787,788,789,790,791,792,793,794,795],"llm translation pipeline","icu messageformat placeholders","vue i18n llm translation","translation memory llm","glossary enforcement translation","german informal sie du","hungarian translation quality llm","structured output json translation","machine translation post-editing","locale file validation","cldr plural categories",[797,800,803],{"name":798,"url":799},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":801,"url":802},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":804,"url":805},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[807,809,812,815,818,821,824,827,830,833,836],{"title":808,"url":802},"Unicode ICU User Guide: Formatting Messages",{"title":810,"url":811},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":813,"url":814},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":816,"url":817},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":819,"url":820},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":822,"url":823},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":825,"url":826},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":828,"url":829},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":831,"url":832},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":834,"url":835},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":837,"url":838},"Microsoft Writing Style Guide","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fstyle-guide\u002Fwelcome\u002F","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fog.jpg",[74,75,76],"Eine LLM-Übersetzungspipeline für i18n: Glossar, Platzhalter und Review","Produkt- und Website-Texte mit LLMs übersetzen, ohne Platzhalter, Pluralformen oder Tonalität zu beschädigen: Glossar, ICU-Nachrichten, QA-Checks, Review.","Drei Quellkarten, eine übersetzte Karte mit Glossar-Lesezeichen, dann eine geprüfte Klemmschiene.",1792337023541]