[{"data":1,"prerenderedAt":793},["ShallowReactive",2],{"blog-schema-org-structured-data-b2b-shop-hu":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":26,"sources":35,"cover":72,"og":73,"expertise":74,"locales":75,"lang":78,"title":79,"description":80,"coverAlt":81,"metaTitle":82,"takeaways":83,"faq":89,"toc":105,"blocks":139,"others":565},"schema-org-structured-data-b2b-shop","2026-10-17",10,"web",[9,10,11,12,13],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[15,16,17,18,19,20,21,22,23,24,25],"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",[27,29,32],{"name":9,"url":28},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":30,"url":31},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":33,"url":34},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[36,39,42,45,48,51,54,57,60,63,66,69],{"title":37,"url":38},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":40,"url":41},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":43,"url":44},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":46,"url":47},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":49,"url":50},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":52,"url":53},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":55,"url":56},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":58,"url":59},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":61,"url":62},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":64,"url":65},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":67,"url":68},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":70,"url":71},"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","b2b-ecommerce-developer",[76,77,78],"en","de","hu","Schema.org strukturált adatok B2B webshopokhoz: bejelentkezés mögötti árak, egységek és változatok","Termék-markup B2B shopokhoz: snippet vagy kereskedői lista, melyik ár, cikkszámok, egységárak, változatok, Organization és SSR Nuxtban.","Terméktéglalap vékony kerettel, alsó kis mezőjét alacsony fal takarja el.","Schema.org strukturált adatok B2B shopokhoz · Balázs Csorba",[84,85,86,87,88],"A Google-nek két termékfunkciója van: a kereskedői listához megvásárolható oldal és nullánál nagyobb ár kell, a termék-snippethez nem.","Csak azt jelöld meg, amit a látogató lát; a bejelentkezés mögötti, ügyfélspecifikus ár nem való nyilvános JSON-LD-be.","A cikkszám a B2B előnye: a sku, mpn, gtin és brand kerüljön a markupba, ugyanazokból a PIM-mezőkből, amelyeket az oldal mutat.","Méterenkénti, kilogrammonkénti vagy csomagonkénti árhoz UnitPriceSpecification és referenceQuantity kell, valódi változatcsaládokhoz ProductGroup.","A JSON-LD-t a szerveren rendereld; a Google figyelmeztet, hogy a JavaScripttel generált Product markup ritkábbá és megbízhatatlanabbá teszi a Shopping-feltérképezést.",[90,93,96,99,102],{"q":91,"a":92},"Használhat Product strukturált adatot egy olyan B2B shop, ahol az ár csak bejelentkezés után látszik?","Igen, de általában termék-snippetként, nem kereskedői listaként. A termék-snippethez név és a review, aggregateRating vagy offers egyike kell. A kereskedői listához olyan ajánlat kell, amelynek nullánál nagyobb, a látogató számára látható ára van, így az ár nélküli oldal nem jogosult.",{"q":94,"a":95},"Melyik ár kerüljön a markupba?","Az az ár, amelyet egy névtelen látogató lát az oldalon, a megjelenített pénznemben. A Google előírja, hogy a markup látható tartalmat írjon le. A tárgyalt vagy ügyfélcsoport-árakat, amelyek csak bejelentkezés után jelennek meg, ne tedd közzé.",{"q":97,"a":98},"Hogyan jelöljem a méterenkénti vagy csomagonkénti árat?","Az aktív árat tedd egy UnitPriceSpecification objektumba, és add hozzá a referenceQuantity-t értékkel és UN\u002FCEFACT unitCode-dal. A Google ezt az egységárakra dokumentálja, amelyek az EU-ban a térfogat, hossz vagy súly szerint értékesített áruknál fontosak.",{"q":100,"a":101},"Minden opciókkal rendelkező termékhez ProductGroup kell?","Akkor, ha az opciók egy termék valódi változatai, például saját cikkszámmal rendelkező méretek vagy színek. Minden változatnak egyedi azonosító kell, például sku vagy gtin, a csoportnak pedig productGroupID. A több ezer kombinációjú konfigurálható termékeket jobb egy termékként, kezdőárral leírni.",{"q":103,"a":104},"Segítenek a strukturált adatok az AI-asszisztenseknek és válaszmotoroknak?","A Google dokumentálja, mit használnak a saját keresési funkciói. Más rendszerek is olvashatják ugyanazt a JSON-LD-t, de nincs nyilvános specifikáció arról, hogyan súlyozzák. A tiszta látható tartalom és a konzisztens azonosítók az a rész, amit te irányítasz.",[106,109,112,115,118,121,124,127,130,133,136],{"id":107,"title":108},"why-b2b-is-different","Miért kell más markup-döntés a B2B termékoldalakhoz",{"id":110,"title":111},"snippet-or-merchant-listing","Termék-snippet vagy kereskedői lista",{"id":113,"title":114},"which-price","Melyik árat tedd közzé, és hogyan",{"id":116,"title":117},"identifiers","Azonosítók: amit a B2B shopok ingyen jól csinálhatnak",{"id":119,"title":120},"units-and-packs","Egységek, csomagok és méterár",{"id":122,"title":123},"variants","Változatok a markup felrobbantása nélkül",{"id":125,"title":126},"organization","Organization, visszaküldési és szállítási szabályzat",{"id":128,"title":129},"nuxt-ssr","JSON-LD renderelése Nuxtban, szerveroldalon",{"id":131,"title":132},"data-pipeline","Egyetlen igazságforrás a PIM-től a markupig",{"id":134,"title":135},"testing-markup","Tesztelés és monitorozás",{"id":137,"title":138},"sources","Források",[140,144,147,150,153,198,199,236,242,249,250,265,276,277,313,322,323,346,348,351,352,377,385,386,423,442,443,458,460,468,469,472,481,489,490,493,512,524,525],{"type":141,"content":142},"paragraph",[143],"A strukturált adatokról szóló útmutatók többsége fogyasztói webshopokra készül: egy nyilvános ár, csillagos értékelés, ingyenes szállítás. Egy B2B shop ezek többségét felborítja. Az ár az ügyféltől függ, és gyakran csak bejelentkezés után látszik, a termékeket méterre vagy 50 darabos csomagban árulják, egyetlen cikknek több száz változata lehet, és a legértékesebb keresőkifejezések nem terméknevek, hanem gyártói cikkszámok.",{"type":141,"content":145},[146],"Ez a bejegyzés azokat a döntéseket veszi sorra, amelyeket akkor hozok, amikor Nuxtra épülő, commerce vagy PIM backendes B2B shopokba schema.org markupot teszek. Ahhoz tartja magát, amit a Google a termékfunkcióihoz dokumentál, mert ennek a résznek van nyilvános specifikációja, és megmutatja, hol kíván a B2B adat más választ, mint a fogyasztói alapeset.",{"type":148,"level":149,"id":107,"text":108},"heading",2,{"type":141,"content":151},[152],"A strukturált adatoknál van egy szabály, amely szinte minden B2B döntést meghatároz. A Google általános irányelvei szerint nem szabad olyan tartalmat megjelölni, amely nem látható az oldal olvasói számára. A markup az oldal leírása, nem mellékcsatorna olyan adatokhoz, amelyeket inkább nem mutatnál. Minden további ebből a kérdésből következik: tulajdonságonként mit lát valójában egy névtelen látogató és a Googlebot.",{"type":154,"head":155,"rows":162},"table",[156,158,160],[157],"B2B jellemző",[159],"Fogyasztói alapeset",[161],"B2B válasz",[163,170,177,184,191],[164,166,168],[165],"Ár bejelentkezés után",[167],"Offer nyilvános árral",[169],"Snippet ár nélkül, vagy nyilvános listaár, ha megjelenik",[171,173,175],[172],"Méterre, kilóra vagy csomagra árulva",[174],"Darabár",[176],"UnitPriceSpecification referenceQuantity-vel",[178,180,182],[179],"Cikkszám szerinti keresés",[181],"Név és márka",[183],"sku, mpn, gtin, brand a PIM-ből",[185,187,189],[186],"Több száz változat",[188],"Méret és szín",[190],"ProductGroup csak valódi SKU-változatokhoz",[192,194,196],[193],"A cégidentitás számít",[195],"Logó és közösségi linkek",[197],"Organization cégnévvel, adószámmal, visszaküldési szabályzattal",{"type":148,"level":149,"id":110,"text":111},{"type":141,"content":200},[201,202,206,207,210,211,214,215,218,219,210,221,224,225,228,229,232,233,235],"A Google a Product markupot két funkcióra bontja. A termék-snippet olyan oldalakhoz való, ahol közvetlenül nem lehet vásárolni; ehhez ",{"tag":203,"children":204},"code",[205],"name"," és legalább egy ",{"tag":203,"children":208},[209],"review",", ",{"tag":203,"children":212},[213],"aggregateRating"," vagy ",{"tag":203,"children":216},[217],"offers"," kell. A kereskedői lista olyan oldalakhoz, ahol az ügyfelek tőled vásárolhatnak; ehhez ",{"tag":203,"children":220},[205],{"tag":203,"children":222},[223],"image"," és egy ",{"tag":203,"children":226},[227],"price"," és ",{"tag":203,"children":230},[231],"priceCurrency"," mezőket tartalmazó ",{"tag":203,"children":234},[217]," objektum kell, és a snippettel ellentétben nullánál nagyobb árat követel meg. A Google szerint a kereskedői lista tulajdonságainak megadásával az oldal általában a snippetre is jogosulttá válik.",{"type":141,"content":237},[238,239,241],"Egy B2B shopnál a választás abból következik, amit a nyilvános oldal mutat. Ha a névtelen látogató listaárat lát és rendelhet, vagy legalább látja, mennyit fizetne, a kereskedői lista a cél. Ha az árnál az áll, hogy „jelentkezz be az árad megtekintéséhez”, akkor snippet-terepen vagy: jelöld meg a nevet, a képet, az azonosítókat, a márkát és a leírást, az ",{"tag":203,"children":240},[217]," mezőt pedig hagyd ki ahelyett, hogy kitalálnál egy számot. A B2B vevők ritkán írnak értékelést a shopban, így ezeknek az oldalaknak a gyakorlatban sokszor egyáltalán nincs rich resultjuk, és ez rendben van; az azonosítók ettől még segítenek a Google-nek a cikkszámos keresésekhez társítani az oldalt.",{"type":243,"variant":244,"title":245,"body":246},"callout","warn","Ügyfélárat soha ne tegyél nyilvános markupba",[247],[248],"A bejelentkezett munkamenettel futó szerveroldali renderelés egy tárgyalt árat juttathat a JSON-LD-be, amelyet aztán egy cache mindenkinek kiszolgál. A markupot csak a névtelen árkontextusból generáld, és a bejelentkezett válaszokat zárd ki a megosztott cache-ekből.",{"type":148,"level":149,"id":113,"text":114},{"type":141,"content":251},[252,253,256,257,260,261,264],"Ha árat teszel közzé, az oldalon szereplőt tedd közzé, az oldal pénznemében, az oldalon látható adókezeléssel. Sok B2B shop nettó árat mutat a cégeknek; a markup egyszerűen ezt a számot ismétli. A Google háromféle árat ismer: az aktív árat, a ",{"tag":203,"children":254},[255],"priceType"," = ",{"tag":203,"children":258},[259],"https:\u002F\u002Fschema.org\u002FStrikethroughPrice"," jelölésű áthúzott árat és a ",{"tag":203,"children":262},[263],"validForMemberTier"," jelölésű tagsági árat. A két jelölést nem szabad egy árspecifikációban kombinálni, az aktív ár pedig egyiket sem viseli.",{"type":141,"content":266},[267,268,271,272,275],"A sávos áraknak, a sok B2B oldalon látható „100 darabtól” táblázatnak nincs külön Google-funkciója. A schema.org az Offer és az árspecifikáció ",{"tag":203,"children":269},[270],"eligibleQuantity"," tulajdonságával teszi lehetővé annak a mennyiségi intervallumnak a megadását, amelyre egy ár vonatkozik, az ",{"tag":203,"children":273},[274],"eligibleCustomerType"," pedig azt az ügyféltípust adja meg, amelyre az ajánlat érvényes. Ez érvényes szókészlet, de a Google kereskedői listáról szóló dokumentációja nem sorolja fel, ezért csak akkor teszem bele, ha a PIM-ben tiszta adat van, és látható hatást nem várok tőle. A markupban az aktív ár az az egységár legyen, amelyet az oldal elsőként mutat.",{"type":148,"level":149,"id":116,"text":117},{"type":141,"content":278},[279,280,283,284,287,288,291,292,295,296,210,299,210,302,305,306,309,310,312],"A B2B vevők ",{"tag":203,"children":281},[282],"6ES7 214-1AG40-0XB0","-re keresnek, nem „kis PLC”-re. A PIM-ed már tartalmazza azokat az azonosítókat, amelyekkel az ilyen keresések működnek, tehát tedd közzé őket: ",{"tag":203,"children":285},[286],"sku"," a saját cikkszámodhoz, ",{"tag":203,"children":289},[290],"mpn"," a gyártói cikkszámhoz, ",{"tag":203,"children":293},[294],"gtin"," (vagy ",{"tag":203,"children":297},[298],"gtin8",{"tag":203,"children":300},[301],"gtin13",{"tag":203,"children":303},[304],"gtin14","), ha a terméknek van ilyen, és ",{"tag":203,"children":307},[308],"brand"," beágyazott Brandként. A Google szerint az ",{"tag":203,"children":311},[290]," egy adott gyártónál egyedileg azonosítja a terméket. Ugyanezek az értékek látszódjanak a termékadatok között is; a markupnak és az oldalnak egyeznie kell.",{"type":141,"content":314},[315,316,321],"A cikkszámok a belső keresést is hajtják. Ha azon az oldalon dolgozol, a ",{"tag":317,"to":318,"children":319},"link","\u002Fblog\u002Fsemantic-product-search-b2b",[320],"szemantikus termékkeresés B2B-ben"," cikk bemutatja, hogyan illeszkednek egymáshoz a pontos azonosítók és a szemantikus visszakeresés, és mindkettő ugyanazokon a tiszta PIM-mezőkön múlik.",{"type":148,"level":149,"id":119,"text":120},{"type":141,"content":324},[325,326,329,330,333,334,337,338,341,342,345],"Méteráru kábel, 200 darabos dobozban kapható csavar, kilóra mért granulátum: az egységár a B2B mindennapja. A Google a kereskedői listákhoz dokumentálja, és megjegyzi, hogy különösen az EU-ban, Új-Zélandon és Ausztráliában fontos a térfogat, hossz vagy súly szerint értékesített termékeknél. Ha az oldal egységárat mutat, az aktív árat tedd egy ",{"tag":203,"children":327},[328],"UnitPriceSpecification"," objektumba, és használd a ",{"tag":203,"children":331},[332],"referenceQuantity"," tulajdonságot egy ",{"tag":203,"children":335},[336],"QuantitativeValue"," értékkel, ahol a ",{"tag":203,"children":339},[340],"unitCode"," UN\u002FCEFACT kód, az opcionális ",{"tag":203,"children":343},[344],"valueReference"," pedig az alapmennyiséget adja meg.",{"type":203,"code":347},"{\n  \"@context\": \"https:\u002F\u002Fschema.org\",\n  \"@type\": \"Product\",\n  \"name\": \"Control cable 5G1.5, grey, sold by the metre\",\n  \"image\": \"https:\u002F\u002Fshop.example.at\u002Fmedia\u002Fcable-5g15.jpg\",\n  \"sku\": \"KAB-5G15-GR\",\n  \"mpn\": \"1119305\",\n  \"brand\": { \"@type\": \"Brand\", \"name\": \"ExampleCable\" },\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"url\": \"https:\u002F\u002Fshop.example.at\u002Fp\u002Fkab-5g15-gr\",\n    \"availability\": \"https:\u002F\u002Fschema.org\u002FInStock\",\n    \"itemCondition\": \"https:\u002F\u002Fschema.org\u002FNewCondition\",\n    \"priceSpecification\": {\n      \"@type\": \"UnitPriceSpecification\",\n      \"price\": 145.00,\n      \"priceCurrency\": \"EUR\",\n      \"referenceQuantity\": {\n        \"@type\": \"QuantitativeValue\",\n        \"value\": 100,\n        \"unitCode\": \"MTR\",\n        \"valueReference\": { \"@type\": \"QuantitativeValue\", \"value\": 1, \"unitCode\": \"MTR\" }\n      }\n    }\n  }\n}",{"type":141,"content":349},[350],"A példa azt mondja: egy 100 méteres tekercs 145 euró, méterenként kimutatva. Az oldalnak ugyanezt kell mutatnia: árat, tekercshosszt és méterárat. Ha a shop csak egész tekercset árul, ez kerüljön a névbe és a leírásba, mert az a vevő, aki 7 métert akar rendelni, különben elpattan.",{"type":148,"level":149,"id":122,"text":123},{"type":141,"content":353},[354,355,358,359,210,362,228,365,368,369,214,371,373,374,376],"Valódi változatcsaládokhoz, saját cikkszámos méretekhez vagy színekhez a Google a ",{"tag":203,"children":356},[357],"ProductGroup"," típust támogatja a ",{"tag":203,"children":360},[361],"hasVariant",{"tag":203,"children":363},[364],"variesBy",{"tag":203,"children":366},[367],"productGroupID"," tulajdonságokkal. Minden változatnak egyedi azonosító kell, például ",{"tag":203,"children":370},[286],{"tag":203,"children":372},[294],", minden csoportnak egyedi azonosító, és minden változatnak továbbra is kellenek a kereskedői lista szokásos tulajdonságai. Egyoldalas változatválasztónál a csoportnak egyetlen kanonikus URL-je legyen, jellemzően az az oldal, ahol nincs előre kiválasztott változat. A Google a változatok ",{"tag":203,"children":375},[357]," alá ágyazását ajánlja, mert ez a legtömörebb ábrázolás.",{"type":141,"content":378},[379,380,384],"A konfigurálható B2B termékek más eset. Egy 12 opciós, több ezer érvényes kombinációjú szelep nem változatcsalád, hanem egy termék konfigurátorral. Jelöld meg egyetlen Productként az oldalon látható kezdőárral, a többit pedig bízd a konfigurátorra, ahogy a ",{"tag":317,"to":381,"children":382},"\u002Fblog\u002Fheadless-product-configurator-b2b",[383],"headless B2B termékkonfigurátorok"," cikkben leírtam. Ha a generált kombinációkat változatként sorolod fel, olyan termékekhez készül markup, amelyekhez senki nem talál oldalt.",{"type":148,"level":149,"id":125,"text":126},{"type":141,"content":387},[388,389,210,392,210,395,214,398,210,401,404,405,408,409,412,413,210,416,228,419,422],"B2B-ben az eladó ugyanannyit számít, mint a termék. A Google Organization markupjának nincsenek kötelező tulajdonságai, és azt ajánlja, hogy minél több releváns tulajdonságot adj meg. Egy B2B kereskedőnél a hasznosak: ",{"tag":203,"children":390},[391],"legalName",{"tag":203,"children":393},[394],"address",{"tag":203,"children":396},[397],"vatID",{"tag":203,"children":399},[400],"taxID",{"tag":203,"children":402},[403],"iso6523Code"," (a Google a 0199 előtaggal a ",{"tag":203,"children":406},[407],"leiCode"," helyett, a 0060 előtaggal a ",{"tag":203,"children":410},[411],"duns"," helyett ajánlja), ",{"tag":203,"children":414},[415],"logo",{"tag":203,"children":417},[418],"contactPoint",{"tag":203,"children":420},[421],"sameAs",". Egyszer, az egész webhelyre add meg, jellemzően a kezdő- vagy a „rólunk” oldalon.",{"type":141,"content":424},[425,426,429,430,433,434,437,438,441],"A visszaküldési és szállítási szabályzat ma már Organization szinten is megadható: ",{"tag":203,"children":427},[428],"hasMerchantReturnPolicy"," egy ",{"tag":203,"children":431},[432],"MerchantReturnPolicy"," objektummal, és ",{"tag":203,"children":435},[436],"hasShippingService"," a szállítási szabályzathoz. A Google azt ajánlja, hogy a globális szállítási szabályzat az Organization alatt legyen, ne ismételd a ",{"tag":203,"children":439},[440],"shippingDetails"," mezőt minden ajánlatnál, az ajánlatszintű tulajdonságokat pedig tartsd meg a kivételekre. A B2B visszaküldési szabályok gyakran szigorúbbak a fogyasztóiaknál, a cégeknek nincs törvényes elállási joguk, ezért azt a szabályzatot tedd közzé, amelyet ténylegesen alkalmazol, valós napszámmal és díjtípussal.",{"type":148,"level":149,"id":128,"text":129},{"type":141,"content":444},[445,446,449,450,453,454,457],"A Google feldolgozza a JavaScripttel a DOM-ba illesztett strukturált adatot is, de a JavaScript-útmutatója külön figyelmeztet a Product markupra: a dinamikusan generált markup ritkábbá és megbízhatatlanabbá teheti a Shopping-feltérképezést, ami a gyorsan változó adatoknak, például az árnak és a készletnek árt. Nuxtban ez azt jelenti, hogy a JSON-LD SSR közben renderelődjön, ugyanabból az adatból, amelyet a template használ. A Nuxt Schema.org modul (Unhead alapon) ezt a ",{"tag":203,"children":447},[448],"useSchemaOrg"," és az olyan segédfüggvények révén végzi, mint a ",{"tag":203,"children":451},[452],"defineProduct","; a webhely identitása a ",{"tag":203,"children":455},[456],"nuxt.config.ts","-be kerül.",{"type":203,"code":459},"\u003C!-- pages\u002Fp\u002F[slug].vue -->\n\u003Cscript setup lang=\"ts\">\nconst route = useRoute()\n\u002F\u002F anonymous price context only: never the logged-in customer's price list\nconst { data: p } = await useFetch(`\u002Fapi\u002Fcatalog\u002F${route.params.slug}`, { query: { priceContext: 'public' } })\n\nuseSchemaOrg([\n  defineProduct({\n    name: p.value.name,\n    image: p.value.images.map(i => i.url),\n    sku: p.value.sku,\n    mpn: p.value.mpn,\n    ...(p.value.gtin ? { gtin: p.value.gtin } : {}),\n    brand: { '@type': 'Brand', name: p.value.brand },\n    \u002F\u002F publish an offer only when the page shows a public price\n    ...(p.value.publicPrice ? {\n      offers: {\n        price: p.value.publicPrice.net,\n        priceCurrency: 'EUR',\n        availability: p.value.inStock ? 'https:\u002F\u002Fschema.org\u002FInStock' : 'https:\u002F\u002Fschema.org\u002FBackOrder',\n      },\n    } : {}),\n  }),\n])\n\u003C\u002Fscript>\n",{"type":141,"content":461},[462,463,467],"A fontos sor az árkontextus. A markuphoz szükséges katalógusadatot kifejezetten a nyilvános árlistával kérd le, és gondoskodj róla, hogy a CDN és a route-cache soha ne tároljon bejelentkezett ügyfélnek renderelt választ. Az Unhead futásidőben nem ellenőrzi a Google jogosultsági szabályait, így a validálás továbbra is a saját pipeline-od dolga. Ha a shop többnyelvű, minden locale a saját URL-jét és pénznem-megjelenítését jelölje, összhangban a ",{"tag":317,"to":464,"children":465},"\u002Fblog\u002Fnuxt-i18n-multilingual-seo-hreflang",[466],"hreflang és canonical beállításokkal",".",{"type":148,"level":149,"id":131,"text":132},{"type":141,"content":470},[471],"A B2B shopok markup-hibái ritkán sémahibák. Adathibák: egy GTIN-mező, amelyben belső szám van, egy markupbeli ár, amely más listából jön, mint az oldalon látható, egy tegnapi ERP-exportból származó készletadat. A megoldás architekturális: a látható oldalt és a JSON-LD-t ugyanabból az API-válaszból generáld, és az adatot a forrásnál javítsd, ne a templateben.",{"type":473,"attrs":474,"inner":478,"caption":479},"diagram",{"viewBox":475,"role":476,"aria-labelledby":477},"0 0 720 180","img","sob2b-flow-t sob2b-flow-d","\u003Ctitle id=\"sob2b-flow-t\">A PIM-től és ERP-től a strukturált adatig\u003C\u002Ftitle>\u003Cdesc id=\"sob2b-flow-d\">A PIM és az ERP egy katalógus-API-t táplál; a Nuxt oldal egyetlen válaszból rendereli a HTML-t és a JSON-LD-t; egy CI-ellenőrzés összeveti a kettőt.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"sob2b-flow-ah\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"52\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"79\" y=\"86\" text-anchor=\"middle\" class=\"d-text\">PIM + ERP\u003C\u002Ftext>\u003Ctext x=\"79\" y=\"108\" text-anchor=\"middle\" class=\"d-small\">azonosító, egység, készlet\u003C\u002Ftext>\u003Cpath d=\"M138 90H158\" class=\"d-line\" marker-end=\"url(#sob2b-flow-ah)\" \u002F>\u003Crect x=\"160\" y=\"52\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"220\" y=\"86\" text-anchor=\"middle\" class=\"d-text\">Katalógus-API\u003C\u002Ftext>\u003Ctext x=\"220\" y=\"108\" text-anchor=\"middle\" class=\"d-small\">nyilvános árak\u003C\u002Ftext>\u003Cpath d=\"M279 90H299\" class=\"d-line\" marker-end=\"url(#sob2b-flow-ah)\" \u002F>\u003Crect x=\"301\" y=\"52\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-fill-accent\" \u002F>\u003Ctext x=\"360\" y=\"86\" text-anchor=\"middle\" class=\"d-text\">Nuxt SSR\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"108\" text-anchor=\"middle\" class=\"d-small\">HTML + JSON-LD\u003C\u002Ftext>\u003Cpath d=\"M419 90H439\" class=\"d-line\" marker-end=\"url(#sob2b-flow-ah)\" \u002F>\u003Crect x=\"441\" y=\"52\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"500\" y=\"86\" text-anchor=\"middle\" class=\"d-text\">CI-ellenőrzés\u003C\u002Ftext>\u003Ctext x=\"500\" y=\"108\" text-anchor=\"middle\" class=\"d-small\">markup = oldal\u003C\u002Ftext>\u003Cpath d=\"M560 90H580\" class=\"d-line\" marker-end=\"url(#sob2b-flow-ah)\" \u002F>\u003Crect x=\"582\" y=\"52\" width=\"118\" height=\"76\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"641\" y=\"86\" text-anchor=\"middle\" class=\"d-text\">Search Console\u003C\u002Ftext>\u003Ctext x=\"641\" y=\"108\" text-anchor=\"middle\" class=\"d-small\">jelentések\u003C\u002Ftext>",[480],"A markupot és a látható tartalmat ugyanabból a válaszból generáld, majd telepítés előtt és után ellenőrizd, hogy egyeznek-e.",{"type":141,"content":482},[483,484,488],"Ez ugyanaz a fegyelem, mint bármely PIM–shop integrációnál; ha a termékadat delta-szinkronnal érkezik SAP-ból vagy Inforból, a ",{"tag":317,"to":485,"children":486},"\u002Fblog\u002Fpimcore-erp-delta-sync",[487],"Pimcore ERP delta-szinkron"," cikk megállapításai közvetlenül érvényesek, mert a markupban elavult ár egyszerűen elavult ár.",{"type":148,"level":149,"id":134,"text":135},{"type":141,"content":491},[492],"A Google saját munkafolyamata: Rich Results Test az egyes URL-ekhez, aztán az URL-ellenőrző eszköz, hogy lásd, hogyan rendereli a Google a telepített oldalt, végül a Search Console jelentései. Egy több tízezer termékes shopnál hozzáadok egy automatizált réteget, amelyet ezek az eszközök nem adnak: egy CI-feladatot, amely termékoldalak egy mintáját rendereli, és összeveti a JSON-LD-t a látható DOM-mal.",{"type":494,"items":495},"list",[496,498,500,508,510],[497],"A markupbeli ár megegyezik a látható árral, és a pénznem is egyezik.",[499],"Az „árért jelentkezz be” feliratú oldalakon nincs ajánlat.",[501,502,504,505,507],"Az ",{"tag":203,"children":503},[286]," és az ",{"tag":203,"children":506},[290]," szerepel a látható termékadatok között.",[509],"A GTIN-értékek ellenőrző számjegye érvényes; a GTIN-mezőben lévő belső szám gyakori PIM-hiba.",[511],"Bejelentkezési sütivel renderelt oldal soha nem kerül ki a megosztott cache-ből.",{"type":141,"content":513},[514,515,504,519,523],"A strukturált adat nem menti meg a sovány termékoldalakat, és egy csak bejelentkezéssel elérhető katalógust sem fog úgy rangsoroltatni, mint egy fogyasztói shopot. Amit tesz: olyan formában írja le a termékeidet, amelyet a keresőmotorok és más gépek találgatás nélkül fel tudnak dolgozni. Arról a tágabb kérdésről, hogyan olvassák az AI-rendszerek az oldalaidat, a ",{"tag":317,"to":516,"children":517},"\u002Fblog\u002Fgenerative-engine-optimization-audit",[518],"GEO-auditom",{"tag":317,"to":520,"children":521},"\u002Fblog\u002Fagentic-commerce-protocols-ucp-acp-guide",[522],"agentic commerce protokollok"," áttekintése szól, amelyek ugyanerre a tiszta termékadatra épülnek.",{"type":148,"level":149,"id":137,"text":138},{"type":494,"ordered":526,"items":527},true,[528,532,535,538,541,544,547,550,553,556,559,562],[529],{"tag":530,"href":38,"children":531},"a",[37],[533],{"tag":530,"href":41,"children":534},[40],[536],{"tag":530,"href":44,"children":537},[43],[539],{"tag":530,"href":47,"children":540},[46],[542],{"tag":530,"href":50,"children":543},[49],[545],{"tag":530,"href":53,"children":546},[52],[548],{"tag":530,"href":56,"children":549},[55],[551],{"tag":530,"href":59,"children":552},[58],[554],{"tag":530,"href":62,"children":555},[61],[557],{"tag":530,"href":65,"children":558},[64],[560],{"tag":530,"href":68,"children":561},[67],[563],{"tag":530,"href":71,"children":564},[70],[566,622,674,742],{"slug":567,"published":5,"minutes":568,"category":7,"tags":569,"keywords":574,"about":586,"sources":594,"cover":616,"og":617,"expertise":74,"locales":618,"lang":78,"title":619,"description":620,"coverAlt":621},"ai-assistant-b2b-shop-customer-support",9,[11,570,571,572,573],"AI assistant","Customer support","LLM agents","EU AI Act",[575,576,577,578,579,580,581,582,583,584,585],"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",[587,590,593],{"name":588,"url":589},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":591,"url":592},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":33,"url":34},[595,598,601,604,607,610,613],{"title":596,"url":597},"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":599,"url":600},"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":602,"url":603},"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":605,"url":606},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":608,"url":609},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":611,"url":612},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":614,"url":615},"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],"AI-asszisztens a B2B webshop ügyfélszolgálatához: eszközök, jogosultságok és átadás embernek","Hogyan építs AI ügyfélszolgálati asszisztenst B2B shophoz: mit automatizálj, eszközök ügyfélkontextusban, átadás embernek, AI Act és mérőszámok.","Magas fal keskeny réssel: nyíl halad át rajta a három négyzetből álló bekerített mezőbe, egy másik lefelé, egy tálca felé mutat.",{"slug":623,"published":624,"minutes":625,"category":7,"tags":626,"keywords":631,"about":642,"sources":651,"cover":667,"og":668,"expertise":669,"locales":670,"lang":78,"title":671,"description":672,"coverAlt":673},"nuxt-i18n-multilingual-seo-hreflang","2026-10-16",8,[13,627,628,629,630],"i18n","SEO","hreflang","Multilingual",[632,633,634,635,636,637,638,639,640,641],"nuxt i18n seo","nuxt hreflang","useLocaleHead","nuxt i18n canonical","hreflang x-default","prefix_except_default","multilingual seo nuxt","nuxt i18n sitemap hreflang","hreflang self-referencing","nuxt i18n baseUrl",[643,645,648],{"name":13,"url":644},"https:\u002F\u002Fnuxt.com\u002F",{"name":646,"url":647},"Hreflang","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHreflang",{"name":649,"url":650},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",[652,655,658,661,664],{"title":653,"url":654},"Nuxt i18n docs: SEO (useLocaleHead)","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fguide\u002Fseo",{"title":656,"url":657},"Nuxt i18n docs: Routing strategies","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fguide",{"title":659,"url":660},"Google Search Central: Tell Google about localized versions of your page","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fspecialty\u002Finternational\u002Flocalized-versions",{"title":662,"url":663},"Google Search Central: Managing multi-regional and multilingual sites","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fspecialty\u002Finternational\u002Fmanaging-multi-regional-sites",{"title":665,"url":666},"Google Search Central: How to specify a canonical URL","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fcrawling-indexing\u002Fconsolidate-duplicate-urls","\u002Fimages\u002Fblog\u002Fnuxt-i18n-multilingual-seo-hreflang\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fnuxt-i18n-multilingual-seo-hreflang\u002Fog.jpg","vue-nuxt-developer",[76,77,78],"Többnyelvű SEO Nuxt i18n-nel: URL-stratégia, hreflang, canonical és sitemap","Így állítsd be a Nuxt i18n modult, hogy a keresők minden nyelvet indexeljenek: útvonal-stratégia, useLocaleHead, hreflang, részleges fordítás, sitemap.","Nagy lapot három vízszintes kapcsolat köt össze három kisebb lap oszlopával.",{"slug":675,"published":624,"minutes":676,"category":7,"tags":677,"keywords":682,"about":695,"sources":702,"cover":736,"og":737,"expertise":669,"locales":738,"lang":78,"title":739,"description":740,"coverAlt":741},"llm-endpoint-abuse-denial-of-wallet",14,[13,678,679,680,681],"LLM security","Rate limiting","OWASP","Cost control",[683,684,685,686,687,688,689,690,691,692,693,694],"denial of wallet llm","owasp llm10 unbounded consumption","rate limit llm api nuxt","nuxt security rate limiter","protect openai api key frontend","llm token budget per user","limit llm cost per user","nitro api rate limiting","cloudflare turnstile nuxt","anthropic spend limit","openai hard spend limit","llm prompt size limit",[696,698,701],{"name":679,"url":697},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",{"name":699,"url":700},"Denial-of-service attack","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FDenial-of-service_attack",{"name":13,"url":644},[703,706,709,712,715,718,721,724,727,730,733],{"title":704,"url":705},"OWASP GenAI Security Project: LLM10:2025 Unbounded Consumption","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm102025-unbounded-consumption\u002F",{"title":707,"url":708},"Nuxt Security: Rate Limiter middleware","https:\u002F\u002Fnuxt-security.vercel.app\u002Fmiddleware\u002Frate-limiter",{"title":710,"url":711},"Nuxt Security: Request Size Limiter middleware","https:\u002F\u002Fnuxt-security.vercel.app\u002Fmiddleware\u002Frequest-size-limiter",{"title":713,"url":714},"nuxt-auth-utils: README (GitHub)","https:\u002F\u002Fgithub.com\u002Fatinux\u002Fnuxt-auth-utils",{"title":716,"url":717},"h3: request utilities (getRequestIP, readValidatedBody)","https:\u002F\u002Fh3.dev\u002Futils\u002Frequest",{"title":719,"url":720},"Upstash: Ratelimiting algorithms","https:\u002F\u002Fupstash.com\u002Fdocs\u002Fredis\u002Fsdks\u002Fratelimit-ts\u002Falgorithms",{"title":722,"url":723},"Cloudflare Turnstile: Validate the token","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fturnstile\u002Fget-started\u002Fserver-side-validation\u002F",{"title":725,"url":726},"Claude Platform Docs: Rate limits and spend limits","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fapi\u002Frate-limits",{"title":728,"url":729},"Claude Platform Docs: Token counting","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Ftoken-counting",{"title":731,"url":732},"OpenAI API Docs: Spend limits","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fspend-limits",{"title":734,"url":735},"OpenAI API Docs: Rate limits","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Frate-limits","\u002Fimages\u002Fblog\u002Fllm-endpoint-abuse-denial-of-wallet\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-endpoint-abuse-denial-of-wallet\u002Fog.jpg",[76,77,78],"Denial of wallet: nyilvános LLM-végpontok védelme egy Nuxt-alkalmazásban","Visszaélés és elszabaduló költség megállítása egy nyilvános Nuxt LLM-útvonalon: auth, rate limit, promptkorlát, tokenkeret, Turnstile és költéskorlát.","Apró pontok torlódnak egy fal keskeny résénél, csak kettő jut át, felette korlátsín.",{"slug":743,"published":744,"minutes":568,"category":7,"tags":745,"keywords":749,"about":757,"sources":764,"cover":786,"og":787,"expertise":788,"locales":789,"lang":78,"title":790,"description":791,"coverAlt":792},"llms-txt-vs-markdown-content-negotiation","2026-10-07",[746,747,748,13],"llms.txt","Content negotiation","AI agents",[746,750,751,752,753,754,755,756],"markdown for agents","content negotiation","AI crawlers","generative engine optimization","Accept text\u002Fmarkdown header","llms-full.txt","agent-ready website",[758,761],{"name":759,"url":760},"Markdown","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMarkdown",{"name":762,"url":763},"Hypertext Transfer Protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHypertext_Transfer_Protocol",[765,768,771,774,777,780,783],{"title":766,"url":767},"llmstxt.org: The \u002Fllms.txt file (proposal, version 2)","https:\u002F\u002Fllmstxt.org\u002F",{"title":769,"url":770},"llmstxt.org: Changes from v1 to v2","https:\u002F\u002Fllmstxt.org\u002Fchanges.html",{"title":772,"url":773},"Cloudflare changelog: Markdown for Agents (12 February 2026)","https:\u002F\u002Fdevelopers.cloudflare.com\u002Fchangelog\u002Fpost\u002F2026-02-12-markdown-for-agents\u002F",{"title":775,"url":776},"Cloudflare docs: Markdown for Agents","https:\u002F\u002Fdevelopers.cloudflare.com\u002Ffundamentals\u002Freference\u002Fmarkdown-for-agents\u002F",{"title":778,"url":779},"Ahrefs: 137K sites analyzed, 97% of llms.txt files never get read (June 2026)","https:\u002F\u002Fahrefs.com\u002Fblog\u002Fllmstxt-study\u002F",{"title":781,"url":782},"Checkly: The current state of content negotiation for AI agents (February 2026)","https:\u002F\u002Fwww.checklyhq.com\u002Fblog\u002Fstate-of-ai-agent-content-negotation\u002F",{"title":784,"url":785},"Suganthan: tracking Cloudflare Markdown for Agents on one site","https:\u002F\u002Fsuganthan.com\u002Fblog\u002Fcloudflare-markdown-for-agents\u002F","\u002Fimages\u002Fblog\u002Fllms-txt-vs-markdown-content-negotiation\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllms-txt-vs-markdown-content-negotiation\u002Fog.jpg","ai-engineer",[76,77,78],"llms.txt vagy Markdown content negotiation: mit töltenek le valójában az ügynökök","Az llms.txt javaslat, a Markdown content negotiation fejléc. Mit töltenek le a MI-ügynökök, mit mutatnak a naplók, és hogyan működik mindez Nuxttal és nginxszel.","Két ajtó egymás mellett, négyzet és kör alakú kilinccsel, a közeledő négyzet jobbra fordul.",1792222774364]