[{"data":1,"prerenderedAt":736},["ShallowReactive",2],{"blog-pim-data-quality-llm-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":35,"cover":72,"og":73,"expertise":74,"locales":75,"lang":76,"title":79,"description":80,"coverAlt":81,"metaTitle":82,"takeaways":83,"faq":89,"toc":105,"blocks":136,"others":463},"pim-data-quality-llm","2026-10-12",8,"web",[9,10,11,12,13],"PIM","Data quality","ETIM","ECLASS","Deduplication",[15,16,17,18,19,20,21,22,23,24],"PIM data quality","ETIM classification LLM","eCl@ss classification automation","product data normalization","duplicate detection product data","product data deduplication embeddings","product data stewardship queue","ETIM vs eCl@ss","attribute normalization units","golden set product data evaluation",[26,29,32],{"name":27,"url":28},"Product information management","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct_information_management",{"name":30,"url":31},"Record linkage","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRecord_linkage",{"name":33,"url":34},"ETIM classification","https:\u002F\u002Fwww.etim-international.com\u002F",[36,39,42,45,48,51,54,57,60,63,66,69],{"title":37,"url":38},"ETIM International: new release ETIM 10.0 (10 Dec 2024)","https:\u002F\u002Fwww.etim-international.com\u002Fnew-release-etim-10-0-available\u002F",{"title":40,"url":41},"ETIM International: model information","https:\u002F\u002Fwww.etim-international.com\u002Fclassification\u002Fmodel-information\u002F",{"title":43,"url":44},"ETIM International: licence information","https:\u002F\u002Fwww.etim-international.com\u002Fclassification\u002Flicense-info\u002F",{"title":46,"url":47},"Ketenstandaard: ETIM 11.0 is coming (3 Feb 2026)","https:\u002F\u002Fketenstandaard.nl\u002Fnieuws\u002Fetim-11-0-komt-eraan-tijd-om-voor-te-sorteren\u002F",{"title":49,"url":50},"ECLASS: releases (Release 16.0, 28 Nov 2025)","https:\u002F\u002Feclass.eu\u002Fen\u002Feclass-standard\u002Freleases",{"title":52,"url":53},"ECLASS: language versions","https:\u002F\u002Feclass.eu\u002Fen\u002Feclass-standard\u002Flicenses\u002Flanguage-versions",{"title":55,"url":56},"Peeters and Bizer: Using ChatGPT for entity matching (ADBIS 2023)","https:\u002F\u002Farxiv.org\u002Fabs\u002F2305.03423",{"title":58,"url":59},"Peeters et al.: WDC Products, a multi-dimensional entity matching benchmark (EDBT 2024)","https:\u002F\u002Farxiv.org\u002Fhtml\u002F2301.09521v2",{"title":61,"url":62},"Splink: probabilistic record linkage","https:\u002F\u002Fmoj-analytical-services.github.io\u002Fsplink\u002F",{"title":64,"url":65},"Pimcore: Data Quality Management","https:\u002F\u002Fdocs.pimcore.com\u002Fplatform\u002FData_Quality_Management\u002F",{"title":67,"url":68},"Akeneo: understand data quality","https:\u002F\u002Fhelp.akeneo.com\u002Fserenity-understand-data-quality",{"title":70,"url":71},"SQLI: commerce search-first strategy (vendor case study)","https:\u002F\u002Fwww.sqli.com\u002Fint-en\u002Finsights\u002Fcommerce-search-first-strategy-impact","\u002Fimages\u002Fblog\u002Fpim-data-quality-llm\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fpim-data-quality-llm\u002Fog.jpg","b2b-ecommerce-developer",[76,77,78],"en","de","hu","PIM data quality with LLMs: ETIM classification, normalization and dedup","How to raise PIM data quality with LLMs: ETIM and ECLASS classification, unit and language normalization, duplicate detection and a stewardship queue.","A table of rows with a magnifying glass over the one incomplete row.","PIM data quality with LLMs · Balázs Csorba",[84,85,86,87,88],"PIM data quality comes down to four machine-checkable jobs: classify into a standard, normalize attribute values, detect duplicates, and steward every change with an audit trail.","LLMs work best as rankers over a retrieved shortlist of ETIM or ECLASS classes, with a confidence that routes uncertain records to a human queue.","Normalize values into a canonical unit and value tuple at import, and keep the original string and the mapping version for audit.","Deduplicate with a cascade of blocking keys, embedding candidates and LLM adjudication; on the WDC Products benchmark even strong matchers score F1 between 0.64 and 0.89.","Gate every prompt, model and standard-release change on a golden set reviewed by two annotators; ETIM 11.0 is planned for 1 December 2026.",[90,93,96,99,102],{"q":91,"a":92},"What does PIM data quality mean in practice?","It means records that are classified into the right standard class, carry attribute values in canonical units and formats, exist only once, and change only through a traceable process. Copywriting and images are enrichment, a separate job. Each of the four quality jobs can be measured with precision and recall on a golden set.",{"q":94,"a":95},"Can an LLM classify products into ETIM or ECLASS?","Yes, as a ranker. Retrieve a shortlist of candidate classes with search over class names and synonyms, give the model the class definitions and features, ask it to pick one or none, and send anything below a confidence threshold to a person. Do not expect a fixed accuracy figure; measure it on your own golden set.",{"q":97,"a":98},"How do you find duplicate products in a PIM?","Use a cascade. Blocking keys such as normalized manufacturer part number, GTIN prefix or brand plus first tokens cut the number of pairs; embeddings shortlist similar records; an LLM or a probabilistic model such as Splink decides the remaining pairs; and people review merges that are not backed by an exact identifier.",{"q":100,"a":101},"ETIM or ECLASS: which classification should a B2B shop use?","It depends on the sector and the trading partners. ETIM is common in electrical, HVAC and building technology wholesale; ECLASS is broader and ships in 31 languages, including German and Hungarian. Many PIMs carry both, mapped to an internal taxonomy.",{"q":103,"a":104},"How do you evaluate product data quality changes?","Build a golden set of a few hundred to a thousand records per catalog slice, labeled by two annotators who agree on most cases, and require every change to the prompt, model or standard release to pass precision and recall thresholds on it, including a negative check that an obviously wrong record stays rejected.",[106,109,112,115,118,121,124,127,130,133],{"id":107,"title":108},"what-good-product-data-looks-like","What does good product data look like?",{"id":110,"title":111},"classifying-into-etim-eclass-unspsc","How do you classify products into ETIM or ECLASS with an LLM?",{"id":113,"title":114},"normalizing-attributes-units-and-languages","How do you normalize units and languages?",{"id":116,"title":117},"deduplicating-with-blocking-embeddings-llm","How do you detect duplicate products?",{"id":119,"title":120},"stewardship-queue-and-audit-trail","What belongs in the stewardship queue?",{"id":122,"title":123},"golden-set-evaluation","How do you evaluate it with a golden set?",{"id":125,"title":126},"what-it-is-worth","What is better product data worth?",{"id":128,"title":129},"when-not-to-use-llms","When should you not use an LLM for product data?",{"id":131,"title":132},"checklist","A checklist for LLM-assisted PIM data quality",{"id":134,"title":135},"sources","Sources",[137,144,147,150,153,159,162,163,166,169,180,183,239,256,257,260,276,279,280,283,287,298,305,306,309,319,321,324,325,332,344,345,348,386,389,390,398,399,417,424,425],{"type":138,"content":139},"paragraph",[140,143],{"tag":141,"children":142},"strong",[15]," is the state in which every product record is classified into the right standard class, carries attribute values in canonical units, exists only once, and changes only through a traceable process. Large language models help with exactly the parts that used to stall in a backlog, ranking classes, interpreting messy values and judging near-duplicates, as long as deterministic rules run first and a person approves what the model proposes.",{"type":138,"content":145},[146],"This article covers the four quality jobs, classification into ETIM, ECLASS and UNSPSC, unit and language normalization, duplicate detection, the stewardship queue, evaluation with a golden set, and the business case. Generating product copy is a different job and not covered here.",{"type":148,"level":149,"id":107,"text":108},"heading",2,{"type":138,"content":151},[152],"Good product data passes four machine-checkable jobs: it is classified into a standard, its attribute values are normalized, it is unique, and every change is stewarded with an audit trail. Each job gets its own precision and recall target before any model is involved, because “better data” without a number cannot be accepted or rejected.",{"type":154,"src":155,"alt":156,"wide":157,"caption":158},"image","\u002Fimages\u002Fblog\u002Fpim-data-quality-llm\u002Fdiagram-4.webp","PIM data quality pipeline Five stages from left to right, applied to records arriving from the ERP and suppliers: deterministic checks for format, GTIN check digits and reference lists; LLM classification into a standard with confidence; normalization of units and values; duplicate detection; and a stewardship queue where people approve changes before the catalog is published. A golden set gates every change to prompts, models or standard releases.",true,"The data quality pipeline: deterministic rules first, LLM steps in the middle, and a human stewardship gate before anything reaches the published catalog.",{"type":138,"content":160},[161],"Classification decides which facets and filters a product appears in. Normalization decides whether “230 V”, “230V AC” and “0,23 kV” compare as equal. Deduplication decides whether demand for one item is split across three SKUs. Stewardship decides whether anyone can explain, a year later, why a record changed. In more than ten years of Spryker and Pimcore work I have seen these four jobs become the backlog nobody owns; LLMs change the cost of the review queue, not the need for one.",{"type":148,"level":149,"id":110,"text":111},{"type":138,"content":164},[165],"Treat the model as a ranker over a shortlist, not as a classifier over the whole standard. Retrieve ten or so candidate classes with search over class names and synonyms, give the model each candidate’s definition and feature list, let it pick one or none with a confidence, and route anything uncertain to a person.",{"type":167,"code":168},"code","\u002F\u002F Classification (sketch): retrieve a shortlist, let the model rank, route by confidence\nconst shortlist = await classIndex.search(`${product.title} ${product.attributeText}`, { k: 10 })  \u002F\u002F BM25 + vectors\nconst ranked = await llm.rank({\n  product,\n  candidates: shortlist.map((c) => ({ code: c.code, name: c.name, definition: c.definition, features: c.features })),\n  schema: { classCode: 'one candidate code or NONE', confidence: 'low | medium | high', reason: 'string' },\n})\n\nif (ranked.classCode !== 'NONE' && !shortlist.some((c) => c.code === ranked.classCode))\n  return queue(product, 'model answered outside the shortlist')\nif (ranked.confidence !== 'high') return queue(product, 'needs review', ranked)\nreturn propose(product, ranked)          \u002F\u002F still a proposal; publishing follows stewardship rules",{"type":138,"content":170},[171,172,176,177,179],"The standards themselves are designed for this. In ETIM every class, feature, value and unit has a language-independent identifier, features are typed as alphanumeric, logical, numeric or range, and numeric and range features always require a unit (",{"tag":173,"href":41,"children":174},"a",[175],"ETIM model","). ECLASS went further with generated text: for Release 16.0 it created around 23,300 class definitions with GPT-4o mini and marks each one as machine-generated in the standard itself (",{"tag":173,"href":50,"children":178},[12],"). That is a useful signal for your own pipeline: label model output as such, permanently.",{"type":138,"content":181},[182],"Set the confidence threshold per class family, not globally. In a family where classes differ by one feature, such as cable types by cross-section and insulation, the model will be confidently wrong more often than in a family with clearly separated classes. Measure accuracy per family on the golden set, auto-propose only where it holds, and let the threshold rise or fall with the evidence. The shortlist step also tells you something: if the right class is often missing from the top ten, fix retrieval and synonyms before touching the prompt.",{"type":184,"head":185,"rows":196},"table",[186,188,190,192,194],[187],"Standard",[189],"Current release",[191],"Typical scope",[193],"German and Hungarian",[195],"Exchange",[197,207,217,228],[198,199,201,203,205],[11],[200],"10.0 (Dec 2024); 11.0 planned for 1 Dec 2026",[202],"electrical, HVAC, building technology",[204],"national membership required",[206],"ETIM xChange 1.1, BMEcat mapping",[208,209,211,213,215],[12],[210],"16.0 (28 Nov 2025)",[212],"cross-industry, 31 languages",[214],"both 100% translated",[216],"CSV, XML, JSON, REST",[218,220,222,224,226],[219],"UNSPSC",[221],"owned by UNDP since January 2025",[223],"procurement and spend analysis",[225],"code-based",[227],"code lists",[229,231,233,235,237],[230],"BMEcat",[232],"2005.2",[234],"catalog exchange in DACH B2B",[236],"carries any classification",[238],"XML",{"type":138,"content":240},[241,242,245,246,245,249,245,252,255],"Sources for the table: ",{"tag":173,"href":38,"children":243},[244],"ETIM 10.0",", ",{"tag":173,"href":47,"children":247},[248],"ETIM 11.0 timing",{"tag":173,"href":44,"children":250},[251],"ETIM licences",{"tag":173,"href":53,"children":253},[254],"ECLASS language versions",", as of October 2026. A new standard release is a mapping project with its own golden set, not a prompt change.",{"type":148,"level":149,"id":113,"text":114},{"type":138,"content":258},[259],"Normalize into a canonical tuple of unit and value at import, and keep the original string and the mapping version next to it. Units come first: ETIM requires a unit on every numeric and range feature, so “2,5 mm²”, “2.5mm2” and “2,5 qmm” must all become the same value in the same unit before anything else can compare them.",{"type":138,"content":261},[262,263,265,266,269,270,275],"Language comes second, and licensing matters here. ETIM’s English master is open to all, but the German, German-Austrian and Hungarian language versions require national membership (",{"tag":173,"href":44,"children":264},[251],"); ECLASS ships German and Hungarian fully translated. Tooling coverage is uneven too: Akeneo’s spell check covers German but not Hungarian (",{"tag":173,"href":68,"children":267},[268],"Akeneo","). The pattern is the one I used for translating my own site with an LLM pipeline, described in ",{"tag":271,"to":272,"children":273},"link","\u002Fblog\u002Fllm-translation-pipeline-i18n",[274],"an LLM translation pipeline for i18n",": the model proposes, a glossary and a review step decide.",{"type":138,"content":277},[278],"Values that cannot be mapped need a defined home. Instead of letting the model invent the nearest allowed value, store the raw string, flag the attribute as unmapped, and send it to the queue with the candidate values the model considered. Over time the unmapped strings show which supplier formats or synonyms the rules are missing, and fixing a rule removes a whole category of queue items at once.",{"type":148,"level":149,"id":116,"text":117},{"type":138,"content":281},[282],"Use a cascade that removes most pairs cheaply before any model sees them. Comparing every record with every other does not scale: 100,000 records already form about 5 billion pairs. Blocking on normalized keys, embedding shortlists and LLM adjudication for the hard remainder bring that down to something people can review.",{"type":154,"src":284,"alt":285,"wide":157,"caption":286},"\u002Fimages\u002Fblog\u002Fpim-data-quality-llm\u002Fdiagram-19.webp","Duplicate detection cascade Four narrowing stages from top to bottom: all pairs, where 100,000 records already form about 5 billion pairs; blocking on normalized manufacturer part number, GTIN prefix or brand plus first tokens; an embedding shortlist of the most similar records; and LLM adjudication with a strict schema of same, different or unsure. The output splits into automatic merges only where an exact identifier and the model agree, which favors precision, and a stewardship queue for everything else, which favors recall.","The duplicate cascade: each stage removes most pairs cheaply, the LLM only sees the hard remainder, and only identifier-backed matches merge without a person.",{"type":138,"content":288},[289,290,293,294,297],"Set expectations from published results. On the realistic WDC Products benchmark, 11,715 offers for 2,162 products from 3,259 shops, state-of-the-art matchers score F1 between 0.64 and 0.89, and precision collapses on corner cases and unseen products (",{"tag":173,"href":59,"children":291},[292],"Peeters et al., EDBT 2024","). An earlier study found ChatGPT reached 82.35% F1 zero-shot on a product matching task where a fine-tuned RoBERTa needed 2,000 training examples for similar quality (",{"tag":173,"href":56,"children":295},[296],"Peeters and Bizer, 2023","). Good, not good enough to merge unattended.",{"type":138,"content":299},[300,301,304],"A probabilistic model is a serious alternative to an LLM for the adjudication step. Splink implements the Fellegi-Sunter model with unsupervised training and term-frequency adjustments, links about a million records per minute on a laptop and 100 million or more on Spark or DuckDB, and is used by the UK Office for National Statistics and the European Medicines Agency; its documentation is explicit that records must be standardized first (",{"tag":173,"href":62,"children":302},[303],"Splink","). That is the normalization step again.",{"type":148,"level":149,"id":119,"text":120},{"type":138,"content":307},[308],"Everything the pipeline is not sure about: low-confidence classifications, merge and split decisions without an exact identifier, and unit conflicts. The queue is where the LLM’s speed turns into published data, so it needs the same care as any user-facing screen.",{"type":138,"content":310},[311,312,315,316,318],"PIMs provide parts of this. Pimcore’s Data Quality Management computes a quality score per data object from configurable rules and shows it in the editor, grid and tree (",{"tag":173,"href":65,"children":313},[314],"Pimcore","), and Pimcore Copilot runs multi-step background jobs with a job overview. Akeneo’s Data Quality Insights grades products from A to E on enrichment and consistency (",{"tag":173,"href":68,"children":317},[268],"). Neither replaces an audit record per decision:",{"type":167,"code":320},"{\n  \"record\": \"SKU-118274\",\n  \"job\": \"classify\",\n  \"proposal\": { \"standard\": \"ETIM\", \"release\": \"10.0\", \"classCode\": \"…\", \"confidence\": \"high\" },\n  \"model\": \"provider\u002Fmodel-id@2026-10-01\",\n  \"promptVersion\": \"classify-v14\",\n  \"inputHash\": \"sha256:9f2c…\",\n  \"decision\": \"approved\",\n  \"decidedBy\": \"steward:k.mayer\",\n  \"decidedAt\": \"2026-10-12T09:41:07Z\"\n}",{"type":138,"content":322},[323],"Design the queue for throughput. Group items by type and class family so a steward reviews twenty similar cable records in a row instead of jumping between topics, show the evidence next to each proposal, and make accept, correct and reject single keystrokes. Every correction is training data for the next round: it becomes a synonym, a mapping rule or a golden-set example. A queue that only grows is a sign that the thresholds or the rules are wrong, not that people are slow.",{"type":148,"level":149,"id":122,"text":123},{"type":138,"content":326},[327,328,331],"Build a golden set of 300 to 1,000 records per catalog slice, labeled independently by two people, and gate every change to the prompt, the model or the standard release on precision and recall thresholds against it. Two careful annotators can get close to the quality of published benchmarks: the WDC Products team estimated 4.00% and 4.17% label noise with a Cohen’s kappa of 0.91 in its manual check (",{"tag":173,"href":59,"children":329},[330],"WDC Products",").",{"type":333,"variant":334,"title":335,"body":336},"callout","tip","Include a negative check",[337],[338,339,343],"Add records that must stay rejected: an obviously wrong class, a pair that looks alike but differs in one critical attribute, a value in the wrong unit. A change that improves average accuracy but lets one of these through should fail the gate. The same idea is behind the evaluation approach in ",{"tag":271,"to":340,"children":341},"\u002Fblog\u002Fllm-evals-for-product-features",[342],"LLM evals for product features",".",{"type":148,"level":149,"id":125,"text":126},{"type":138,"content":346},[347],"Search and filters are the revenue lever and duplicates are the cost lever. Published numbers exist for both sides, mostly from vendors and adjacent markets, so present them as direction rather than promise.",{"type":349,"ordered":350,"items":351},"list",false,[352,371,381],[353,356,357,360,361,365,366,370],{"tag":141,"children":354},[355],"Findability:"," in a vendor-published SQLI case, an industrial-goods retailer with 45,000 SKUs and an 18% zero-result rate moved search-user conversion from 23% to 47% and average cart size up 23% after a data-quality audit plus AI search (",{"tag":173,"href":71,"children":358},[359],"SQLI","). Clean attributes are what ",{"tag":271,"to":362,"children":363},"\u002Fblog\u002Fsemantic-product-search-b2b",[364],"semantic product search for B2B"," and agents reading your catalog, see ",{"tag":271,"to":367,"children":368},"\u002Fblog\u002Fprocurement-agent-buyer-side",[369],"agentic commerce readiness",", depend on.",[372,375,376,380],{"tag":141,"children":373},[374],"Returns:"," a GS1 India and Kanvic study released in March 2026 estimates that poor product data costs Indian e-commerce about ₹5,000 crore a year, around ₹1,900 crore of it in return-related costs (",{"tag":173,"href":377,"children":378},"https:\u002F\u002Fbwretailworld.com\u002Fsector\u002Fe-commerce-marketplaces\u002Fpoor-product-data-costs-indian-ecommerce-rs-5000-cr-every-year-study",[379],"BW Retail World","). Wrong-part orders in B2B are the same failure: a spec that did not match.",[382,385],{"tag":141,"children":383},[384],"Duplicates:"," no credible public figure exists for the cost of duplicate SKUs. The mechanics are clear: duplicates inflate the catalog, split demand signals and reorder points, and break assortment reporting. Count them before and after.",{"type":138,"content":387},[388],"For a head of e-commerce or a PIM manager, the measurable baseline is zero-result rate, attribute completeness per class and duplicate count. A fixed-scope data-quality sprint, audit, golden set, classification and dedup jobs with confidence gates, a stewardship view and a CI gate, can show the before and after on exactly those numbers.",{"type":148,"level":149,"id":128,"text":129},{"type":138,"content":391},[392,393,397],"Never for anything a rule can decide. Formats, GTIN check digits and membership in a reference list are deterministic checks and must run before any model. LLMs are for ambiguous ranking and interpretation, not for validating digits. And migrating to a new standard release, such as ETIM 11.0 in December 2026, is a mapping project with its own tests, not a prompt you adjust. If master data arrives inconsistently from the ERP, fix the import first; ",{"tag":271,"to":394,"children":395},"\u002Fblog\u002Fpimcore-erp-delta-sync",[396],"the Pimcore ERP delta sync"," is where that happens.",{"type":148,"level":149,"id":131,"text":132},{"type":349,"ordered":157,"items":400},[401,403,405,407,409,411,413,415],[402],"Define precision and recall targets for classification, normalization and dedup separately.",[404],"Run deterministic checks first: formats, GTIN check digits, reference lists.",[406],"Classify with a retrieved shortlist and reject answers outside it.",[408],"Store canonical unit and value plus the original string and mapping version.",[410],"Auto-merge only where an exact identifier and the matcher agree; queue the rest.",[412],"Write an audit record for every decision with model, prompt version and input hash.",[414],"Gate changes on a two-annotator golden set, including negative checks, in CI.",[416],"Plan standard-release migrations as projects with their own mapping tests.",{"type":138,"content":418},[419,420,343],"If you want a baseline for your catalog or help setting up the pipeline in Pimcore or Akeneo, see my ",{"tag":271,"to":421,"children":422},"\u002Fexpertise\u002Fb2b-ecommerce-developer",[423],"B2B e-commerce work",{"type":148,"level":149,"id":134,"text":135},{"type":349,"ordered":157,"items":426},[427,430,433,436,439,442,445,448,451,454,457,460],[428],{"tag":173,"href":38,"children":429},[37],[431],{"tag":173,"href":41,"children":432},[40],[434],{"tag":173,"href":44,"children":435},[43],[437],{"tag":173,"href":47,"children":438},[46],[440],{"tag":173,"href":50,"children":441},[49],[443],{"tag":173,"href":53,"children":444},[52],[446],{"tag":173,"href":56,"children":447},[55],[449],{"tag":173,"href":59,"children":450},[58],[452],{"tag":173,"href":62,"children":453},[61],[455],{"tag":173,"href":65,"children":456},[64],[458],{"tag":173,"href":68,"children":459},[67],[461],{"tag":173,"href":71,"children":462},[70],[464,538,594,668],{"slug":465,"published":466,"minutes":467,"category":7,"tags":468,"keywords":474,"about":486,"sources":495,"cover":532,"og":533,"expertise":74,"locales":534,"lang":76,"title":535,"description":536,"coverAlt":537},"schema-org-structured-data-b2b-shop","2026-10-17",10,[469,470,471,472,473],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[475,476,477,478,479,480,481,482,483,484,485],"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",[487,489,492],{"name":469,"url":488},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":490,"url":491},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":493,"url":494},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[496,499,502,505,508,511,514,517,520,523,526,529],{"title":497,"url":498},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":500,"url":501},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":503,"url":504},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":506,"url":507},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":509,"url":510},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":512,"url":513},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":515,"url":516},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":518,"url":519},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":521,"url":522},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":524,"url":525},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":527,"url":528},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":530,"url":531},"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",[76,77,78],"Schema.org structured data for B2B shops: prices behind logins, units and variants","Product markup for B2B shops: snippet or merchant listing, which price to publish, part numbers, unit pricing, variants, Organization and SSR in Nuxt.","A product rectangle with a framed outline and a small price slot hidden behind a low wall.",{"slug":539,"published":466,"minutes":540,"category":7,"tags":541,"keywords":546,"about":558,"sources":566,"cover":588,"og":589,"expertise":74,"locales":590,"lang":76,"title":591,"description":592,"coverAlt":593},"ai-assistant-b2b-shop-customer-support",9,[471,542,543,544,545],"AI assistant","Customer support","LLM agents","EU AI Act",[547,548,549,550,551,552,553,554,555,556,557],"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",[559,562,565],{"name":560,"url":561},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":563,"url":564},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":493,"url":494},[567,570,573,576,579,582,585],{"title":568,"url":569},"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":571,"url":572},"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":574,"url":575},"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":577,"url":578},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":580,"url":581},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":583,"url":584},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":586,"url":587},"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",[76,77,78],"An AI assistant for B2B shop support: tools, permissions and the human handoff","How to build an AI support assistant for a B2B shop: which requests to automate, tools that run in the customer context, handoff, AI Act and metrics.","A tall wall with one narrow gap; an arrow passes through it into a boxed enclosure of three squares, and another leads down to a tray.",{"slug":595,"published":466,"minutes":596,"category":7,"tags":597,"keywords":602,"about":614,"sources":624,"cover":661,"og":662,"expertise":663,"locales":664,"lang":76,"title":665,"description":666,"coverAlt":667},"vue-ai-chat-ui-streaming-accessibility",11,[598,473,599,600,601],"Vue","Accessibility","Streaming","AI chat",[603,604,605,606,607,608,609,610,611,612,613],"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",[615,618,621],{"name":616,"url":617},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":619,"url":620},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":622,"url":623},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[625,628,631,634,637,640,643,646,649,652,655,658],{"title":626,"url":627},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":629,"url":630},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":632,"url":633},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":635,"url":636},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":638,"url":639},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":641,"url":642},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":644,"url":645},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":647,"url":648},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":650,"url":651},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":653,"url":654},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":656,"url":657},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":659,"url":660},"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",[76,77,78],"Streaming AI chat in Vue and Nuxt: accessible by design","How to build a Vue or Nuxt AI chat UI: fetch streams, abort and retry, safe markdown rendering, aria-live announcements, keyboard support and reduced motion.","A message card with a careful caret, a dotted line opening into ripples and a check.",{"slug":669,"published":466,"minutes":540,"category":7,"tags":670,"keywords":675,"about":687,"sources":697,"cover":730,"og":731,"expertise":663,"locales":732,"lang":76,"title":733,"description":734,"coverAlt":735},"llm-translation-pipeline-i18n",[671,672,673,598,674],"Translation","i18n","LLM","Localization",[676,677,678,679,680,681,682,683,684,685,686],"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",[688,691,694],{"name":689,"url":690},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":692,"url":693},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":695,"url":696},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[698,700,703,706,709,712,715,718,721,724,727],{"title":699,"url":693},"Unicode ICU User Guide: Formatting Messages",{"title":701,"url":702},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":704,"url":705},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":707,"url":708},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":710,"url":711},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":713,"url":714},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":716,"url":717},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":719,"url":720},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":722,"url":723},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":725,"url":726},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":728,"url":729},"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",[76,77,78],"An LLM translation pipeline for i18n: glossary, placeholders and review","How to translate product and website strings with LLMs without breaking placeholders, plurals or tone: glossary, ICU messages, QA checks and review gates.","Three source cards, one translated card with a glossary ribbon, then a checked clipboard.",1792337027429]