Technische seo voor webshops zit niet meer in de basis: in de meting van Oase Creative van 31 oktober hadden 56 van de 66 productpagina's de basis voor Google op orde, maar slechts 17 ook verzending en retour.
Wat betekent technische seo voor een webshop?
Technische seo voor een webshop draait om één vraag. Wat krijgt een bot binnen als hij je productpagina ophaalt zonder JavaScript uit te voeren? Dat is de pagina waar Google zijn productresultaten op bouwt, en de ruwe HTML die een AI-crawler zonder JavaScript binnenkrijgt. Wij hebben dat op 31 oktober 2026 gemeten op 66 Nederlandse productpagina's, één per webshop.
De basis staat: 56 van de 66 pagina's hebben naam, afbeelding, prijs en valuta in gestructureerde data, het minimum dat Google vraagt voor een productresultaat met prijs. Wat een koper daarna wil weten, staat er meestal niet. Verzending en retour samen vonden we op 17 van de 66 pagina's, GTIN op 31, varianten op 6. En waar het misgaat, is het bijna nooit een keuze, maar een verkeerd attribuut in het thema, een prijs die alleen in de trackingcode staat of een pagina die pas met JavaScript ontstaat.
Dit is het vervolg op onze meting van 70 webshops op AI-toegang. Daar keken we of een bot binnenkomt en schreven we dat verzending en retour nog niet gemeten waren. Dat hebben we nu gedaan. Wat je hieronder leest, is een eigen telling met de methode erbij, zodat je hem op je eigen winkel kunt herhalen.
Hoe hebben we 66 productpagina's gemeten?
We hebben per webshop één productpagina opgehaald zoals een eenvoudige crawler dat doet, en geteld welke productgegevens er in de ruwe HTML staan.
Steekproef. Dezelfde 70 webshops als in onze vorige meting: de top 10 van de Twinkle100 2026 en 60 mkb-winkels uit de winnaars en finalisten van de Shopping Awards 2025. Voor 69 shops vonden we een productpagina die op voorraad was, via de productsitemap of de homepage. 66 waren meetbaar. Albert Heijn en Zalando weigerden ons adres, Picnic heeft geen productpagina's op het web en MyJewellery was onbereikbaar. Daardoor telt de top 10 in deze meting zeven shops.
Ophalen. Eerst een gewone HTTP-aanvraag met de user-agent van Chrome. Gaf de server een 403 of 429, dan nog één keer met een headless browser waarin JavaScript uitstond. Dat gold voor 21 van de 66, waaronder 11 van de 13 Shopify-winkels. In beide gevallen is het resultaat de HTML die de server stuurt, zonder dat er een script heeft gedraaid.
Tellen. Een parser leest JSON-LD en microdata, volgt verwijzingen tussen blokken en kiest per pagina het hoofdproduct. Als "basis" telt wat Google vraagt voor een merchant listing: naam, afbeelding, een Offer met een prijs boven nul en een valuta.
Beperkingen. Eén productpagina per winkel, één moment, gemeten vanaf ons eigen Nederlandse IP-adres. We hebben velden geteld als aanwezig, niet elke pagina door de Rich Results Test van Google gehaald. Een winkel kan een ander sjabloon hebben voor varianten of bundels.
Welke productdata staat er zonder JavaScript op de pagina?
Naam, afbeelding en prijs staan er bijna altijd. Hoe verder je komt van "wat kost het" richting "kan ik het terugsturen", hoe dunner het wordt.
| Veld in de gestructureerde data | Alle shops (n=66) | Top 10 (n=7) | mkb (n=59) |
|---|---|---|---|
| Product-blok aanwezig | 91% (60) | 6 | 54 |
| Basis voor merchant listing | 85% (56) | 5 | 51 |
| Beschikbaarheid | 83% (55) | 5 | 50 |
| SKU | 80% (53) | 5 | 48 |
| Merk | 71% (47) | 6 | 41 |
| Staat (nieuw, gebruikt) | 56% (37) | 5 | 32 |
| GTIN | 47% (31) | 4 | 27 |
| Gemiddelde beoordeling | 39% (26) | 5 | 21 |
| Prijs geldig tot | 33% (22) | 0 | 22 |
| Verzending (shippingDetails) | 32% (21) | 3 | 18 |
| Retourbeleid (hasMerchantReturnPolicy) | 30% (20) | 2 | 18 |
| Losse reviews | 18% (12) | 3 | 9 |
| Varianten (ProductGroup) | 9% (6) | 1 | 5 |
| Basis plus verzending plus retour | 26% (17) | 2 | 15 |
Van de 60 Product-blokken staan er 57 als JSON-LD en 3 als microdata. Het mkb doet het in deze tabel niet slechter dan de grote spelers: 51 van de 59 mkb-pagina's hebben de basis, tegen 5 van de 7 in de top 10. Met zeven grote shops is dat een aanwijzing, geen conclusie.
Twee velden springen eruit. GTIN staat bij minder dan de helft, terwijl dat de code is waarmee Google en marktplaatsen een product over winkels heen herkennen. En varianten staan bij 6 van de 66 als ProductGroup in de markup. Bij een kledingwinkel of een shop met kleuren en maten kan dat betekenen dat een bot elke maat als een los product ziet, zonder verband met de rest.
Ter vergelijking: de Web Almanac van HTTP Archive vond in 2024 Product als JSON-LD op 0,77% van alle pagina's. Dat gaat over het hele web, niet over productpagina's, dus het zegt weinig over webshops. Een Nederlandse telling per veld op productpagina's hebben we niet gevonden.
Waarom mist de basis bij 10 van de 66 webshops?
Bij tien winkels vonden we geen bruikbare productdata voor een merchant listing. We hebben de opvallendste met de hand opnieuw opgehaald. Bijna nergens is het een bewuste keuze.
| Webshop | Wat we vonden | Gevolg voor Google |
|---|---|---|
| Bamboo Basics (Shopify) | Volledig Product-object, maar in <script type="application/json"> |
Wordt niet als gestructureerde data gelezen |
| Gewoonstijl (Magento) | Product met naam, SKU en GTIN, zonder Offer; de prijs staat alleen in de dataLayer van Google Tag Manager | Geen merchant listing |
| Wijnvoordeel | Een lege schil met alleen og-tags; alles komt via JavaScript | Niets te lezen zonder rendering |
| Amazon.nl | Geen JSON-LD, geen microdata en geen prijs in de ruwe HTML | Niets te lezen in de HTML |
| Jumbo en LuxuryFires | Alleen een AggregateOffer met een prijsrange | Genoeg voor een product snippet, niet voor een merchant listing |
De rest van de tien zijn een configuratorpagina zonder Product-blok, een WooCommerce-winkel met wel drie JSON-LD-blokken maar geen product erin, een merkwinkel zonder Product-blok en een Magento-pagina zonder Offer.
Bamboo Basics is het duidelijkste voorbeeld van hoe klein de oorzaak kan zijn. Het product staat er compleet: naam, afbeelding, beschrijving. Maar het script-blok heeft het type application/json in plaats van application/ld+json. Voor een mens is dat één woord. Voor Google is het verschil tussen een product en een stuk code dat hij overslaat.
Bij Gewoonstijl is het andersom: de gegevens over het product staan er goed in, maar de prijs zit alleen in de code die naar Google Analytics gaat. De marketingafdeling heeft de prijs, de zoekmachine niet.
Een waarschuwing voor wie zelf meet. Kamera Express leek in onze eerste telling een pagina zonder prijs. Het Offer-blok verwijst daar met een @id naar een los blok elders op de pagina. Een parser die die verwijzing niet volgt, ziet geen prijs. Na de correctie had de pagina gewoon een prijs en voorraad. Zo'n fout zit dus in het meetgereedschap, niet in de winkel.
Moeten verzending en retour op je productpagina staan?
Samen met de basis staan ze er bij 17 van de 66, ongeveer een kwart, en dat is minder erg dan het klinkt. Google wil die gegevens liever één keer op winkelniveau dan op elke pagina.
Op de productpagina vonden we verzending bij 21 van de 66 en retour bij 20. Basis, verzending en retour samen: 17. Shopify valt op: 12 van de 13 Shopify-winkels hebben de basis, maar slechts één zet er ook verzending en retour bij. Het standaardthema zet Product en Offer neer en laat de rest leeg.
Toch is "ontbreekt" hier het verkeerde woord. In de documentatie voor het retourbeleid en het verzendbeleid raadt Google aan om één beleid voor de hele winkel vast te leggen onder Organization, en alleen per product af te wijken als dat product andere voorwaarden heeft. Instellingen in Merchant Center of Search Console gaan daar nog voor. Wie dat geregeld heeft, hoeft het niet op elke productpagina te zetten.
Daarom keken we ook naar de homepage. 50 van de 66 winkels hebben daar een Organization-blok. Een retourbeleid staat er bij 6, een verzendbeleid bij 1. Beleid op een aparte retourpagina of in Merchant Center valt buiten onze meting, dus dat is een ondergrens.
Ter vergelijking een grotere internationale meting. ARC Report controleert ruim tienduizend winkels via gewone HTTP-aanvragen, zonder Nederlandse uitsplitsing:
| Meting | Retour in gestructureerde data | Verzending in gestructureerde data |
|---|---|---|
| ARC Report, stand 4 november 2026 | 4,5% | 3,8% |
| Onze meting, productpagina (n=66) | 30% | 32% |
| Onze meting, homepage (n=66) | 9% | 2% |
Onze Nederlandse steekproef zit daar ruim boven. Dat komt deels doordat ARC ook veel kleine winkels meet en wij prijswinnaars. Het patroon is hetzelfde: het beleid bestaat, maar staat zelden in een vorm die een machine zonder raden kan lezen.
Wat ziet een AI-agent als hij geen JavaScript uitvoert?
Bij de meeste winkels genoeg. Bij een paar bijna niets. Het verschil zit niet in de gestructureerde data, die komt bijna altijd van de server, maar in de tekst eromheen.
Daarvoor hebben we bij 20 productpagina's de ruwe HTML naast de door JavaScript opgebouwde pagina gelegd. Bij 16 kon dat. We telden op twee manieren: alles wat in de broncode staat, ook verborgen blokken, en alleen wat een browser zonder JavaScript echt toont.
| Uitkomst (n=16) | Hele broncode | Alleen zichtbaar |
|---|---|---|
| Prijs in JSON-LD, alleen na JavaScript | 0 | 0 |
| Kernveld (naam, prijs, beschrijving, reviews of levering) alleen na JavaScript | 2 | 3 |
| Aandeel tekst dat pas door JavaScript verschijnt | 21% | 29% |
| Mediaan per pagina in de ruwe HTML | 90,5% | 87,8% |
Bij alle 15 pagina's met een Product-blok stond de prijs al in de ruwe HTML. De uitzonderingen zitten in de tekst:
- Belsimpel. Zonder JavaScript staat er alleen "Oeps, je hebt Javascript uitgeschakeld!". De beschrijving, de reviews en de levertijd komen pas na het script. Naam en prijs staan wel in de JSON-LD.
- Coolblue. De server stuurt alle tekst mee, maar in verborgen blokken die een script op hun plek zet. Een parser vindt alles. Een browser zonder JavaScript toont 25 woorden van de hele pagina.
- Seepje. Het reviewblok met de score en het aantal beoordelingen verschijnt alleen via JavaScript.
- Kookwinkel Oldenhof. De ruwe HTML is een controlepagina die vraagt of je een mens bent. Een crawler zonder JavaScript komt niet verder.
Waarom dat telt: Vercel en MERJ schreven in december 2024 dat geen van de grote AI-crawlers JavaScript uitvoert, met OpenAI, Anthropic en Perplexity bij naam. Gemini, dat de infrastructuur van Googlebot gebruikt, is de uitzondering. Glenn Gabe herhaalde de test in oktober 2026 en kwam op hetzelfde uit. De documentatie van OpenAI, Anthropic en Perplexity zegt er zelf niets over. Wat hun fetchers met verborgen tekst doen, weet niemand buiten die bedrijven.
Een beschrijving of reviewblok dat pas via JavaScript verschijnt, kan een AI-assistent dus niet citeren. Een AI-agent leest de pagina anders dan een bezoeker, zoals we eerder zagen in onze meting van wat een AI-agent van je productpagina afleest.
Leest ChatGPT dezelfde technische seo als Google?
Nee. Google leest de markup op je pagina. De winkelkanalen van ChatGPT en Shopify werken met een eigen feed of catalogus. Technische seo voor webshops gaat daarmee over twee lagen.
| Gegeven | Google merchant listing | OpenAI-productfeed | Shopify Catalog (UCP) |
|---|---|---|---|
| Naam, prijs, valuta | vereist | vereist | vereist |
| Afbeelding | vereist | vereist | optioneel |
| Beschikbaarheid | aanbevolen | vereist | optioneel |
| Beschrijving | aanbevolen | vereist | vereist |
| GTIN | aanbevolen | optioneel | optioneel (barcodes) |
| Retour | aanbevolen, liefst op winkelniveau | optioneel | optioneel (beleid) |
| Leest de JSON-LD op je pagina | ja | niet gedocumenteerd | nee, via het platform |
De feedspecificatie van OpenAI is een uploadformaat met eigen velden, zoals een veld voor of je retouren accepteert en binnen hoeveel dagen. Schema.org komt er niet in voor. Het gedeelde formaat noemt alleen de Verenigde Staten, Canada en Mexico als markt. Op de hulppagina over winkelen in ChatGPT staat dat productgegevens van externe aanbieders en van winkels zelf komen, en dat ze voor Shopify-winkels al via Shopify Catalog binnenkomen. De Catalog-specificatie van UCP haalt producten uit het platform, niet uit de pagina.
Voor jou betekent dat: de markup op je productpagina is voor Google, en de feed of de productgegevens in je platform zijn voor de agents. Een gat in de ene laag los je niet op in de andere. Hoe sterk de Google-feed doorwerkt in ChatGPT, zie je in ons artikel over de Google Shopping-feed en AI-aanbevelingen. Hoe agents via Shopify kopen, staat in agentic commerce via Shopify.
Moet je trainingsbots nu anders regelen in robots.txt?
Nog niet, maar het kan straks met één regel. Op 30 oktober 2026 schreef OpenAI dat het een gezamenlijk signaal in robots.txt gaat respecteren voor training van generatieve modellen, "in the coming months". Het signaal komt uit een IETF-draft van dezelfde dag. Je schrijft een gewone robots.txt-groep met User-Agent: __usage_ai-training en daaronder Disallow: /.
Wij hebben op 31 oktober de robots.txt van dezelfde 70 webshops opgehaald. 62 waren leesbaar.
- Het nieuwe signaal: bij 0 van de 62. Eén dag na publicatie is dat logisch; het is de nulmeting.
- Trainingsbots per naam: 14 van de 62 noemen er minstens één apart, zoals GPTBot, CCBot of Google-Extended, gemiddeld ruim vijf per winkel.
- Het signaal van Cloudflare: 5 van de 62 gebruiken
Content-Signal. Vier daarvan zeggen nee tegen training, één ja. OpenAI noemt dat signaal niet.
Eén regel uit de draft is belangrijk voor wie nu al iets heeft staan: een groep met User-Agent: * telt uitdrukkelijk niet als voorkeur. Wie training wil weigeren, moet het token bij naam noemen.
Dit gaat alleen over training, niet over zoeken. Zoek- en gebruikersbots laat je los daarvan open, zoals we in onze meting van AI-toegang beschreven. De draft heeft nog geen formele status. Zet de regel er gerust bij als je training wilt weigeren, maar haal je bestaande regels per bot er niet voor weg.
Hoe controleer je zelf de technische seo van je productpagina?
Met vijf stappen op één productpagina. Je hebt er geen betaald gereedschap voor nodig, wel de broncode.
- Open de broncode, niet de pagina. Gebruik "paginabron weergeven" of
curlmet een gewone browser-user-agent. Wat je daar ziet, is wat een crawler zonder JavaScript krijgt. Het inspectievenster van je browser laat de opgebouwde pagina zien en verbergt dus precies het probleem. - Zoek
application/ld+json. Staat er een Product met een Offer? Controleer het type van het script-blok.application/jsonlijkt erop, maar wordt niet gelezen. - Kijk naar de prijs. Een Offer met een prijs boven nul en een valuta. Een AggregateOffer met alleen een range is genoeg voor een product snippet, niet voor een merchant listing. Staat je prijs alleen in de dataLayer, dan ziet alleen je tracking hem.
- Kies één plek voor verzending en retour. Leg het beleid vast in Merchant Center of als Organization-markup op je site. Zet het alleen op de productpagina voor producten met afwijkende voorwaarden, en vul dan land en soort beleid in.
- Zet JavaScript uit. Kijk wat er van je beschrijving, reviews en levertijd overblijft. Verdwijnt de beschrijving, dan kan een AI-assistent hem niet citeren.
Daarna pas loont de Rich Results Test van Google om de blokken te valideren. Wie categoriepagina's ook wil nalopen, kan verder met wat je op Shopify-categoriepagina's niet hoeft te repareren.
Wat vonden we toen we dezelfde meting op onze eigen site draaiden?
Een schone basis en één verouderde gewoonte. We haalden alle 156 Nederlandse pagina's van oasecreative.nl op uit de sitemap van 31 oktober en lazen de gestructureerde data zoals hierboven.
Het goede nieuws: nul kapotte JSON-LD-blokken, en op elke pagina precies één organisatieblok met dezelfde naam, hetzelfde adres en hetzelfde telefoonnummer. Elk kennisbankartikel heeft een BlogPosting, elke dienstpagina een Service.
Het minder goede nieuws: 119 van de 156 pagina's dragen FAQPage-markup. Volgens het wijzigingslogboek van Google Search Central verschijnt dat rijke resultaat sinds 7 mei 2026 niet meer in Google. Het is geen fout, de markup klopt. Maar het is werk voor een resultaat dat niet meer bestaat, en dat zie je alleen als je naar je eigen markup kijkt.
Een tweede punt: bij 32 van de 91 artikelen ontbrak de datum van de laatste wijziging in het schema, omdat ons sjabloon die alleen zet als het artikel een bijwerkdatum heeft. Google noemt dat veld aanbevolen, niet vereist. Het is precies het soort gat uit deze meting: technisch niets mis, maar een veld minder dan kan.
En op het zoekwoord technische seo hadden we in Search Console over 90 dagen nul vertoningen. Dit artikel is onze eerste pagina erover. Dat we het met een meting openen en niet met een checklist, is een bewuste keuze. De checklists die bovenaan staan, noemen verzending en retour niet en hebben geen eigen cijfers.
Hoe helpt Oase Creative met technische seo voor je webshop?
Wij draaien dezelfde meting op jouw winkel. We halen een productpagina per sjabloon op zonder JavaScript, tellen elk veld, en leggen de ruwe HTML naast de opgebouwde pagina. Dat laat in een paar minuten zien of je probleem in het thema, in de prijs of in de tekst zit.
Daarna loopt het werk langs drie lagen:
- De pagina. Product en Offer compleet, GTIN en varianten erin, en het type van het script-blok goed. Dat valt onder onze SEO-dienst. Draait je winkel op Shopify, dan passen we het thema aan in ons Shopify-werk.
- De winkel. Eén verzend- en retourbeleid, in Merchant Center of als Organization-markup, en niet per ongeluk op twee plekken anders.
- De feed. Productgegevens in je platform die dezelfde prijs, voorraad en voorwaarden geven als je pagina. Wil je merken dat een thema-update een veld weer weghaalt? Dan laten we de controle automatisch draaien, via AI-automatisering.
Wat AI-zoeken verder van je webshop vraagt, staat in GEO voor webshops. Deze meting is van 31 oktober 2026. We herhalen hem met dezelfde winkels en werken dit artikel bij als de cijfers verschuiven.
Stuur Louie de link naar één productpagina. Wij halen hem op zonder JavaScript en sturen je terug welke velden een bot vindt en welke niet.

