[{"data":1,"prerenderedAt":766},["ShallowReactive",2],{"blog-b2b-email-order-entry-llm-en":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":25,"sources":35,"cover":66,"og":67,"expertise":68,"locales":69,"lang":70,"title":73,"description":74,"coverAlt":75,"metaTitle":76,"takeaways":77,"faq":83,"toc":99,"blocks":133,"others":494},"b2b-email-order-entry-llm","2026-10-14",9,"web",[9,10,11,12,13],"Order entry","ERP","Document AI","Idempotency","GDPR",[15,16,17,18,19,20,21,22,23,24],"email order entry automation","sales order automation","automate order entry from email","AI order processing ERP","order desk automation","PDF order to ERP","sales order automation ROI","order entry error rate","touchless order processing","order validation rules ERP",[26,29,32],{"name":27,"url":28},"Sales order","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSales_order",{"name":30,"url":31},"Enterprise resource planning","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnterprise_resource_planning",{"name":33,"url":34},"General Data Protection Regulation","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[36,39,42,45,48,51,54,57,60,63],{"title":37,"url":38},"Microsoft Learn: Receive change notifications through webhooks (Microsoft Graph)","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fgraph\u002Fchange-notifications-delivery-webhooks",{"title":40,"url":41},"Microsoft Learn: Azure OpenAI structured outputs","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fai-foundry\u002Fopenai\u002Fhow-to\u002Fstructured-outputs",{"title":43,"url":44},"Stripe API reference: Idempotent requests","https:\u002F\u002Fdocs.stripe.com\u002Fapi\u002Fidempotent_requests",{"title":46,"url":47},"Regulation (EU) 2016\u002F679 (GDPR), EUR-Lex","https:\u002F\u002Feur-lex.europa.eu\u002Flegal-content\u002FEN\u002FTXT\u002F?uri=CELEX%3A32016R0679",{"title":49,"url":50},"Peppol BIS Upgrade 3: ordering profiles and code lists","https:\u002F\u002Fdocs.peppol.eu\u002Fpoacc\u002Fupgrade-3\u002F",{"title":52,"url":53},"O*NET OnLine: Order Clerks (43-4151.00)","https:\u002F\u002Fwww.onetonline.org\u002Flink\u002Fsummary\u002F43-4151.00",{"title":55,"url":56},"Amazon Textract pricing","https:\u002F\u002Faws.amazon.com\u002Ftextract\u002Fpricing\u002F",{"title":58,"url":59},"Google Cloud: Document AI pricing","https:\u002F\u002Fcloud.google.com\u002Fdocument-ai\u002Fpricing",{"title":61,"url":62},"Mistral AI: OCR 4.1 model card","https:\u002F\u002Fdocs.mistral.ai\u002Fmodels\u002Focr-4-1",{"title":64,"url":65},"Conexiom: sales order automation (vendor)","https:\u002F\u002Fconexiom.com\u002F","\u002Fimages\u002Fblog\u002Fb2b-email-order-entry-llm\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fb2b-email-order-entry-llm\u002Fog.jpg","b2b-ecommerce-developer",[70,71,72],"en","de","hu","Email order entry automation: turning emailed orders into ERP orders","How to automate B2B order entry from email with LLMs: reliable mailbox intake, line extraction, validation rules as code, idempotency and GDPR.","Envelopes unfold into tidy rows on a clipboard that point to a box.","Email order entry automation · Balázs Csorba",[78,79,80,81,82],"In email order entry automation the model never writes to the ERP; it proposes a typed order that must pass the same validations a human-entered order would.","An order is created automatically only when every line passes every rule; anything else goes to an exception queue with the failing rule named.","Microsoft Graph counts a webhook notification as delivered only after a 2xx response within 3 seconds, so persist to a queue and answer 202 before doing any work.","Idempotency keys on the ERP create call and a line-level fingerprint stop the duplicate sales order, the archetypal incident of order automation.","B2B order emails still contain personal data of named employees, so legal basis, retention of the raw mailbox copy and processor agreements need decisions up front.",[84,87,90,93,96],{"q":85,"a":86},"What is email order entry automation?","It is a pipeline that reads purchase orders arriving by email, extracts the order lines with a document model or LLM, validates them against contracts, prices, stock and duplicates, and creates the sales order in the ERP only when every rule passes. Everything else goes to a person in an exception queue.",{"q":88,"a":89},"Can an LLM create sales orders in the ERP directly?","It should not. Let the model propose a structured order and let deterministic code decide whether the order may be created, through the one integration path that also handles idempotency and audit logging. The same validations apply as for an order typed in by the order desk.",{"q":91,"a":92},"How do you prevent duplicate orders from email automation?","Use an idempotency key on the ERP create call, derived from the message and its content, and a line-level fingerprint per customer within a time window to catch the same order sent twice by different routes. Test it by sending the same email twice and asserting exactly one sales order.",{"q":94,"a":95},"Is email order processing with AI allowed under GDPR?","Yes, with care. Order emails from named employees are personal data even in B2B. Processing for the order rests on contract performance, providers need processor agreements, prompts should contain only the order content, and the raw mailbox copy needs a defined retention that you have checked against the tenant’s own retention settings.",{"q":97,"a":98},"What does email order automation save?","No published benchmark for cost per email order was verified. Compute it from your own data: entry minutes per line times loaded wage, versus review minutes per line plus extraction cost per document. The US median wage for order clerks was $22.20 per hour in 2025, about $0.37 per minute before overhead.",[100,103,106,109,112,115,118,121,124,127,130],{"id":101,"title":102},"what-to-automate-and-what-to-keep-human","What should you automate, and what stays human?",{"id":104,"title":105},"the-pipeline-from-mailbox-to-erp","The pipeline from mailbox to ERP",{"id":107,"title":108},"listening-to-the-mailbox-reliably","How do you listen to the mailbox reliably?",{"id":110,"title":111},"extracting-order-lines-not-documents","How do you extract order lines from an email?",{"id":113,"title":114},"validation-rules-as-code","Which validation rules decide whether an order is created?",{"id":116,"title":117},"idempotency-and-audit-trails","How do you prevent duplicate ERP orders?",{"id":119,"title":120},"gdpr-practicalities-for-order-emails","What does GDPR require for order emails?",{"id":122,"title":123},"what-it-is-worth","What is email order automation worth?",{"id":125,"title":126},"change-management-and-when-not-to-use-it","When should you not automate email order entry?",{"id":128,"title":129},"order-entry-checklist","A checklist for an email order entry pilot",{"id":131,"title":132},"sources","Sources",[134,142,151,154,157,160,161,164,170,173,174,182,185,188,189,192,194,225,226,229,315,318,319,322,329,333,334,340,369,376,379,380,383,415,422,423,426,434,435,453,461,462],{"type":135,"content":136},"paragraph",[137,141],{"tag":138,"children":139},"strong",[140],"Email order entry automation"," turns purchase orders that arrive by email, as PDFs, spreadsheets or plain text in the message body, into sales orders in the ERP. A document model or LLM reads the order and proposes structured lines; deterministic code checks them against contracts, prices, stock and earlier orders; and the order is created only when every check passes. Everything else lands in front of a person.",{"type":135,"content":143},[144,145,150],"This article covers what happens before the ERP write: listening to the mailbox reliably, extracting lines rather than documents, validation rules as code, idempotency and the audit trail, GDPR for order emails, the business case and the order desk as the real user. If quotes are your bottleneck rather than orders, see ",{"tag":146,"to":147,"children":148},"link","\u002Fblog\u002Fllm-rfq-quote-automation",[149],"RFQ automation with LLMs",", which shares the extraction layer.",{"type":152,"level":153,"id":101,"text":102},"heading",2,{"type":135,"content":155},[156],"Automate intake, extraction and validation; keep the decision to create an ERP order under deterministic rules, and keep every exception with a person. The rule to hang the design on: the model never writes to the ERP. It proposes a typed order that has to pass the same validations as an order typed in by the order desk.",{"type":135,"content":158},[159],"Orders are less forgiving than quotes. A wrong quote can be corrected before the customer accepts it; a duplicate or wrong-quantity order moves stock, triggers invoices and costs trust immediately. So automatic creation is allowed only when every line passed every rule, and partial confidence is never enough. In my experience with B2B commerce systems, creating the order is the easy part. The hard part is that the customer’s email is the only record of what they believe they ordered, which is why extraction evidence and the exception queue matter more than the model.",{"type":152,"level":153,"id":104,"text":105},{"type":135,"content":162},[163],"The pipeline has one way into the ERP, through a validation gate, and one way around a failure, through a person who sends the corrected order back through the same gate. There is no bypass path for urgent orders, because the bypass is where duplicates come from.",{"type":165,"src":166,"alt":167,"wide":168,"caption":169},"image","\u002Fimages\u002Fblog\u002Fb2b-email-order-entry-llm\u002Fdiagram-7.webp","Email order pipeline with a validation gate An email arrives through Microsoft Graph or IMAP and is persisted to a queue before any work. Extraction turns it into typed order lines. A validation gate of code rules decides: if all lines are valid, an ERP writer creates the sales order with an idempotency key and a confirmation goes to the customer; if any rule fails, the order goes to an exception queue with the failing rule named, a person fixes it, and it returns to the same validation gate. There is no bypass path.",true,"The mailbox-to-ERP pipeline: the validation gate is the only way into the ERP, and corrected exceptions pass through the same gate again.",{"type":135,"content":171},[172],"Each stage stores its artifact: the raw message, the proposed order, the rule results, the ERP document number and the confirmation. Everything after the create call, such as the outbox, retries against the ERP API and nightly reconciliation, is system-to-system sync and should reuse the integration your shop already has for orders.",{"type":152,"level":153,"id":107,"text":108},{"type":135,"content":175},[176,177,181],"In Microsoft 365, which most Austrian and German B2B companies run, subscribe to Graph change notifications, validate each one, persist it to a queue and answer immediately. A notification counts as delivered only when your endpoint returns a 2xx within 3 seconds; otherwise Graph retries for up to 4 hours (",{"tag":178,"href":38,"children":179},"a",[180],"Microsoft Learn",").",{"type":183,"code":184},"code","\u002F\u002F Graph change-notification endpoint (sketch): validate, persist, answer fast\napp.post('\u002Fgraph\u002Fnotifications', async (req, res) => {\n  if (req.query.validationToken)                                   \u002F\u002F subscription handshake\n    return res.type('text\u002Fplain').send(String(req.query.validationToken))\n\n  for (const n of req.body.value ?? []) {\n    if (n.clientState !== process.env.GRAPH_CLIENT_STATE) continue  \u002F\u002F ignore forged notifications\n    await queue.send({ subscriptionId: n.subscriptionId, resource: n.resource })\n  }\n  res.sendStatus(202)                \u002F\u002F fetch, parse and extract later, from the queue worker\n})",{"type":135,"content":186},[187],"The same page documents the failure modes that matter. If more than 10% of responses exceed 3 seconds within 10 minutes, the endpoint is marked slow and new notifications are delayed by 10 minutes. If more than 15% exceed the 10-second window, it is marked drop, notifications are dropped for 10 minutes, and dropped notifications cannot be recovered. That is why the handler does no parsing at all. At low volume, polling a dedicated IMAP folder on a timer is an acceptable alternative. Either way, the mailbox copy stops being the record of truth once the order is extracted and logged.",{"type":152,"level":153,"id":110,"text":111},{"type":135,"content":190},[191],"Extract lines into a strict schema, keep the raw text next to every interpreted value, and do unit conversion in code. Per-line extraction is a different problem from summarizing a document: quantities like “2 Karton à 12 Stk.”, the customer’s own article numbers, delivery-date phrases and “wie letztes Mal” references to an earlier order all need to survive into fields a rule can check.",{"type":183,"code":193},"{\n  \"orderReference\": \"PO-88213\",\n  \"lines\": [\n    {\n      \"position\": \"10\",\n      \"customerPartNo\": \"4711-22\",\n      \"supplierPartNo\": null,\n      \"description\": \"Rillenkugellager 6204 2RS\",\n      \"quantityRaw\": \"2 Karton à 12 Stk.\",\n      \"quantity\": 2,\n      \"unitRaw\": \"Karton à 12\",\n      \"requestedDate\": \"2026-10-28\",\n      \"source\": { \"page\": 1, \"bbox\": [72, 310, 520, 326] }\n    }\n  ],\n  \"referencesPreviousOrder\": false\n}\n\u002F\u002F code, not the model, converts \"2 Karton à 12\" into 24 pieces (UN\u002FECE Rec 20 code H87)",{"type":135,"content":195},[196,197,200,201,204,205,208,209,211,212,215,216,219,220,224],"Structured outputs guarantee shape, not business validity. Azure OpenAI’s strict mode, for example, requires all fields to be required, so unknown values become nullable unions, and it does not support ",{"tag":183,"children":198},[199],"minimum",", ",{"tag":183,"children":202},[203],"pattern"," or ",{"tag":183,"children":206},[207],"format"," (",{"tag":178,"href":41,"children":210},[180],"). Ranges, unit codes such as UN\u002FECE Recommendation 20, which Peppol’s ordering code lists also use (",{"tag":178,"href":50,"children":213},[214],"Peppol BIS","), and date windows are therefore code. Attach the page and bounding box to every field for the review screen; Mistral OCR 4.1, at $4 per 1,000 pages as of October 2026, returns paragraph-level boxes and block confidence (",{"tag":178,"href":62,"children":217},[218],"Mistral","). The parsing layer itself is covered in ",{"tag":146,"to":221,"children":222},"\u002Fblog\u002Funstructured",[223],"Unstructured for document parsing",".",{"type":152,"level":153,"id":113,"text":114},{"type":135,"content":227},[228],"Rules that read from the system of record and run in code. There are only two outcomes per order: every line valid, then create; anything else, then the exception queue with the failing rule named. The model may propose values for some rules, but it decides none of them.",{"type":230,"head":231,"rows":242},"table",[232,234,236,238,240],[233],"Rule",[235],"Source of truth",[237],"LLM’s role",[239],"Deterministic check",[241],"On failure",[243,254,264,274,284,294,304],[244,246,248,250,252],[245],"Known customer",[247],"ERP, CRM",[249],"none",[251],"sender domain and contract, not only the From header",[253],"exception",[255,257,259,261,263],[256],"Agreed price",[258],"pricing, ERP",[260],"reads the price on the PO",[262],"contract price exists and matches",[253],[265,267,269,271,273],[266],"Article match",[268],"ERP, cross-reference",[270],"proposes candidates",[272],"exact identifier or known cross-reference only",[253],[275,277,279,281,283],[276],"Quantity and unit",[278],"article master",[280],"extracts raw text",[282],"unit conversion, minimum and increment",[253],[285,287,289,290,292],[286],"Availability",[288],"ERP, ATP",[249],[291],"available to promise against partial delivery policy",[293],"exception or confirm partial",[295,297,299,301,303],[296],"Delivery date",[298],"ERP, calendar",[300],"parses the phrase",[302],"date is feasible and in the future",[253],[305,307,309,311,313],[306],"Duplicate",[308],"order log",[310],"flags “wie letztes Mal”",[312],"same customer and line fingerprint within a window",[314],"exception, never auto-create",{"type":135,"content":316},[317],"Write the rules against your ERP’s real fields, minimum order quantity, packaging unit, available-to-promise and scheduling agreements, and version them. The rule version goes into the audit log with every decision, so a changed rule can be traced to the orders it let through.",{"type":152,"level":153,"id":116,"text":117},{"type":135,"content":320},[321],"Carry an idempotency key through the create call and keep a line-level fingerprint per customer. Duplicate sales orders are the archetypal incident of order automation: a webhook retried, a worker restarted, or the customer sending the same PDF again with “bitte bestätigen”.",{"type":135,"content":323},[324,325,328],"Stripe’s API is a good reference for the key semantics: client-generated keys of up to 255 characters, the saved response of the first request returned on retry, an error if the parameters differ from the original request, and keys that can be pruned after at least 24 hours (",{"tag":178,"href":44,"children":326},[327],"Stripe","). Derive your key from the message id and the attachment hash, never from personal data. The key catches technical retries; the fingerprint of customer plus line set within a time window catches the business duplicate, the same order sent twice.",{"type":165,"src":330,"alt":331,"wide":168,"caption":332},"\u002Fimages\u002Fblog\u002Fb2b-email-order-entry-llm\u002Fdiagram-24.webp","Append-only event log of one order Five events from left to right, each appended and never edited: the message received with its message id and attachment hash; the proposed order from extraction; the validations run with rule versions; the sales order created with its ERP number and idempotency key; and the confirmation sent to the customer.","The audit trail: five append-only events per order, so every ERP sales order can be traced back to the exact email and the rule versions that let it through.",{"type":152,"level":153,"id":119,"text":120},{"type":135,"content":335},[336,337,181],"GDPR applies even in B2B. Recital 14 excludes data about legal persons, such as the company name and its contact details, but an order email from a named employee, with a signature and a direct phone number, is still personal data (",{"tag":178,"href":47,"children":338},[339],"GDPR, EUR-Lex",{"type":341,"ordered":342,"items":343},"list",false,[344,349,354,364],[345,348],{"tag":138,"children":346},[347],"Legal basis:"," Article 6(1)(b), performance of the contract, covers processing the order; abuse and fraud checks rest on legitimate interests under Article 6(1)(f).",[350,353],{"tag":138,"children":351},[352],"Processors:"," every OCR or model provider in the path needs a processor agreement under Article 28, and the pipeline needs appropriate security under Article 32.",[355,358,359,363],{"tag":138,"children":356},[357],"Minimization:"," send the order document to the model, not the whole thread with signatures and history; ",{"tag":146,"to":360,"children":361},"\u002Fblog\u002Fpii-redaction-llm-pipelines",[362],"PII redaction in LLM pipelines"," covers the techniques.",[365,368],{"tag":138,"children":366},[367],"Storage limitation:"," under Article 5(1)(e), once the order is in the ERP, the raw mailbox copy needs a defined retention period and an archive or delete step.",{"type":370,"variant":371,"title":372,"body":373},"callout","warn","Check retention before promising deletion",[374],[375],"Do not promise that the mailbox copy is deleted after processing until you have checked the tenant’s own retention settings. Microsoft 365 retention policies can keep mail independently of what a user or a pipeline deletes, so the promise depends on the customer’s configuration, not on your code.",{"type":135,"content":377},[378],"An order-entry assistant is not on the EU AI Act’s Annex III high-risk list; frame it as an internal productivity tool, and do not claim a compliance status you have not checked.",{"type":152,"level":153,"id":122,"text":123},{"type":135,"content":381},[382],"It is worth the entry minutes it removes, the month-end peaks it absorbs and the wrong orders it stops, and none of these has a published B2B benchmark. No public cost-per-email-order figure or error-rate benchmark was verified for this article, so the case is built from formulas and the order desk’s own baseline.",{"type":341,"ordered":342,"items":384},[385,393,405,410],[386,389,390,181],{"tag":138,"children":387},[388],"Touch time:"," cost per line equals entry minutes times loaded wage, compared with review minutes per line times wage plus extraction cost per document. As a reference, O*NET lists a 2025 US median wage of $22.20 per hour for order clerks, about $0.37 per minute before overhead, with 78,900 employed and duties that include verifying order information and checking inventory availability (",{"tag":178,"href":53,"children":391},[392],"O*NET",[394,397,398,401,402,181],{"tag":138,"children":395},[396],"Extraction cost:"," small by comparison, as of October 2026 Amazon Textract charges $0.0015 per page for text and $0.015 per page with tables (",{"tag":178,"href":56,"children":399},[400],"AWS","), and Google Document AI OCR $1.50 per 1,000 pages (",{"tag":178,"href":59,"children":403},[404],"Google Cloud",[406,409],{"tag":138,"children":407},[408],"Wrong orders:"," a credit note, a replacement shipment, freight both ways and the customer’s own downstream cost. Name these components and measure them in the pilot rather than quoting an industry figure.",[411,414],{"tag":138,"children":412},[413],"Peaks:"," capacity without hiring shows up as backlog age and exception overflow at month end, not as headcount saved.",{"type":135,"content":416},[417,418,421],"Vendors such as Conexiom advertise this workflow at scale, claiming more than 1.5 billion line items a year and 40+ ERP integrations (",{"tag":178,"href":65,"children":419},[420],"Conexiom","); treat that as market evidence that the problem is real, not as a benchmark. The decision-maker, usually a COO, head of customer service or order-to-cash lead, searches for “automate order entry from email”, and the promise to make is a lower touch rate measured on the desk’s own numbers, never headcount reduction.",{"type":152,"level":153,"id":125,"text":126},{"type":135,"content":424},[425],"Do not automate when order volume is too low to justify a queue, when contract prices are out of reach, when customers already send EDI or Peppol orders, in which case fix the channel instead of parsing PDFs, or when legal will not accept an LLM in the path of customer documents, in which case deterministic templates and OCR alone are the fallback.",{"type":135,"content":427},[428,429,433],"The order desk is the user, the auditor and the change risk. Start with “AI drafts, humans send”, publish the touch rate, make corrections one click and treat each correction as an asset that improves matching. Where usage or per-person performance is logged, involve the works council early; ",{"tag":146,"to":430,"children":431},"\u002Fblog\u002Fworks-council-ai-tools-austria-germany",[432],"AI tools and the works council"," covers the Austrian and German framing.",{"type":152,"level":153,"id":128,"text":129},{"type":341,"ordered":168,"items":436},[437,439,441,443,445,447,449,451],[438],"Build a golden set from two to four weeks of real, anonymized mailbox history.",[440],"Measure extraction accuracy per field, not per document.",[442],"Review which rules fail most often and fix the data behind them.",[444],"Send the same order twice and assert exactly one sales order.",[446],"Run an end-to-end test through the one canonical ERP writer; I would drive it with Playwright MCP from a fixture email to the created order.",[448],"Agree an exception-queue response time with the order desk.",[450],"Write the retention policy for raw emails and enforce it.",[452],"Pin the extraction model version and re-run the golden set on every change.",{"type":135,"content":454},[455,456,460],"A fixed-scope pilot on a few weeks of real mailbox history, producing an extraction report, a working exception queue and a validated create path against an ERP test client, is a well-bounded project. If you are planning one, my ",{"tag":146,"to":457,"children":458},"\u002Fexpertise\u002Fb2b-ecommerce-developer",[459],"B2B e-commerce work"," covers the ERP and catalog side it depends on.",{"type":152,"level":153,"id":131,"text":132},{"type":341,"ordered":168,"items":463},[464,467,470,473,476,479,482,485,488,491],[465],{"tag":178,"href":38,"children":466},[37],[468],{"tag":178,"href":41,"children":469},[40],[471],{"tag":178,"href":44,"children":472},[43],[474],{"tag":178,"href":47,"children":475},[46],[477],{"tag":178,"href":50,"children":478},[49],[480],{"tag":178,"href":53,"children":481},[52],[483],{"tag":178,"href":56,"children":484},[55],[486],{"tag":178,"href":59,"children":487},[58],[489],{"tag":178,"href":62,"children":490},[61],[492],{"tag":178,"href":65,"children":493},[64],[495,569,624,698],{"slug":496,"published":497,"minutes":498,"category":7,"tags":499,"keywords":505,"about":517,"sources":526,"cover":563,"og":564,"expertise":68,"locales":565,"lang":70,"title":566,"description":567,"coverAlt":568},"schema-org-structured-data-b2b-shop","2026-10-17",10,[500,501,502,503,504],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[506,507,508,509,510,511,512,513,514,515,516],"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",[518,520,523],{"name":500,"url":519},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":521,"url":522},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":524,"url":525},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[527,530,533,536,539,542,545,548,551,554,557,560],{"title":528,"url":529},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":531,"url":532},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":534,"url":535},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":537,"url":538},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":540,"url":541},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":543,"url":544},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":546,"url":547},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":549,"url":550},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":552,"url":553},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":555,"url":556},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":558,"url":559},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":561,"url":562},"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",[70,71,72],"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":570,"published":497,"minutes":6,"category":7,"tags":571,"keywords":576,"about":588,"sources":596,"cover":618,"og":619,"expertise":68,"locales":620,"lang":70,"title":621,"description":622,"coverAlt":623},"ai-assistant-b2b-shop-customer-support",[502,572,573,574,575],"AI assistant","Customer support","LLM agents","EU AI Act",[577,578,579,580,581,582,583,584,585,586,587],"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",[589,592,595],{"name":590,"url":591},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":593,"url":594},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":524,"url":525},[597,600,603,606,609,612,615],{"title":598,"url":599},"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":601,"url":602},"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":604,"url":605},"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":607,"url":608},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":610,"url":611},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":613,"url":614},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":616,"url":617},"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",[70,71,72],"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":625,"published":497,"minutes":626,"category":7,"tags":627,"keywords":632,"about":644,"sources":654,"cover":691,"og":692,"expertise":693,"locales":694,"lang":70,"title":695,"description":696,"coverAlt":697},"vue-ai-chat-ui-streaming-accessibility",11,[628,504,629,630,631],"Vue","Accessibility","Streaming","AI chat",[633,634,635,636,637,638,639,640,641,642,643],"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",[645,648,651],{"name":646,"url":647},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":649,"url":650},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":652,"url":653},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[655,658,661,664,667,670,673,676,679,682,685,688],{"title":656,"url":657},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":659,"url":660},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":662,"url":663},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":665,"url":666},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":668,"url":669},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":671,"url":672},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":674,"url":675},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":677,"url":678},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":680,"url":681},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":683,"url":684},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":686,"url":687},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":689,"url":690},"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",[70,71,72],"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":699,"published":497,"minutes":6,"category":7,"tags":700,"keywords":705,"about":717,"sources":727,"cover":760,"og":761,"expertise":693,"locales":762,"lang":70,"title":763,"description":764,"coverAlt":765},"llm-translation-pipeline-i18n",[701,702,703,628,704],"Translation","i18n","LLM","Localization",[706,707,708,709,710,711,712,713,714,715,716],"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",[718,721,724],{"name":719,"url":720},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":722,"url":723},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":725,"url":726},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[728,730,733,736,739,742,745,748,751,754,757],{"title":729,"url":723},"Unicode ICU User Guide: Formatting Messages",{"title":731,"url":732},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":734,"url":735},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":737,"url":738},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":740,"url":741},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":743,"url":744},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":746,"url":747},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":749,"url":750},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":752,"url":753},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":755,"url":756},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":758,"url":759},"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",[70,71,72],"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.",1792337027374]