{"id":10295,"date":"2026-08-26T07:30:00","date_gmt":"2026-08-26T05:30:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10295"},"modified":"2026-09-25T10:49:18","modified_gmt":"2026-09-25T08:49:18","slug":"tutorial-json-ld-that-search-engines-actually-read","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/","title":{"rendered":"Tutorial: JSON-LD That Search Engines Actually Read"},"content":{"rendered":"<p>Structured data has no error state that anyone notices. A page carrying a relative image path, a date in local notation or a price with a currency symbol is served exactly like a correct one, ranks exactly like a correct one, and simply never receives the rich result it was written for. The markup is there, the crawler reads it, and nothing happens.<\/p>\n<p>That makes structured data a maintenance problem rather than a writing problem. The mistakes are mechanical, they repeat across every page built from the same template, and a single wrong character in a field no visitor ever sees decides whether a listing shows a rating or a bare blue link. What follows is the chain a piece of markup has to pass through, and the four places where it usually drops out.<\/p>\n<figure class=\"lw-diagram\">\n<img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/json-ld-en.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Four stages a piece of JSON-LD passes through - parsing, type recognition, mandatory fields and agreement with the visible page - with the markup that drops out at each stage\"><figcaption>Four stages, four ways to fall out: nothing here reports an error, the rich result simply stays away.<\/figcaption><\/figure>\n<h2>The Two Lines That Decide Everything<\/h2>\n<p>Before a single property is read, two fields decide whether the block is looked at at all. <code>@context<\/code> has to point at <code>https:\/\/schema.org<\/code>; without it the object is a piece of JSON without a vocabulary, and every property in it means nothing. <code>@type<\/code> then names the thing being described. Its spelling is case sensitive: <code>Article<\/code> is a type, <code>article<\/code> is not, and the difference produces no warning anywhere.<\/p>\n<p>Where several objects belong to one page &#8211; an article, its author and the breadcrumb trail &#8211; they can sit in one block under <code>@graph<\/code> or in separate script elements. Both work. What does not work is two blocks describing the same thing differently, because the parser has no rule for deciding which of them is meant.<\/p>\n<h2>Four Mistakes That Produce No Error<\/h2>\n<p>These four account for most of the markup that validates and still shows nothing. They share one trait: the field involved is invisible to visitors, so nobody notices it is wrong.<\/p>\n<table style=\"width:100%;border-collapse:collapse\">\n<thead>\n<tr>\n<th style=\"white-space:nowrap;vertical-align:top\">Written like this<\/th>\n<th>What happens<\/th>\n<th>What it has to be<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>\"image\": \"\/img\/a.jpg\"<\/code><\/td>\n<td>The path is never resolved, the image counts as missing, and with it the most visible part of the result.<\/td>\n<td>An absolute URL including the scheme.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>\"datePublished\": \"26.08.2026\"<\/code><\/td>\n<td>The field is dropped. An article without a publication date loses its date in the listing.<\/td>\n<td>ISO 8601: <code>2026-08-26<\/code> or with a time and offset.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>\"price\": \"49,90 EUR\"<\/code><\/td>\n<td>The offer is discarded as a whole &#8211; price and availability disappear together.<\/td>\n<td>A bare number with a dot, currency in <code>priceCurrency<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"white-space:nowrap;vertical-align:top\"><code>\"@type\": \"article\"<\/code><\/td>\n<td>The type is unknown, so every property below it is read as an unspecified thing.<\/td>\n<td>Exactly <code>Article<\/code>, capital letter included.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The first three come from templates that fill the markup from the same variables as the page itself: The image path is relative because the template writes relative paths. The date is formatted because it is the formatted date that was already at hand. And the price carries its currency because that is how it is printed. Structured data needs the raw values, not the ones prepared for display.<\/p>\n<h2>Article: The One Mandatory Field, and the Four That Matter<\/h2>\n<p>An article needs a <code>headline<\/code> and nothing else. Everything that makes a result look like a result is optional, which is why so much markup passes the test and shows nothing.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>&lt;script type=\"application\/ld+json\"&gt;\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"JSON-LD that search engines actually read\",\n  \"description\": \"Why structured data fails without an error message.\",\n  \"image\": [\"https:\/\/www.example.com\/images\/json-ld.png\"],\n  \"author\": { \"@type\": \"Person\", \"name\": \"Lukas Wojcik\" },\n  \"datePublished\": \"2026-08-26\",\n  \"dateModified\": \"2026-08-26\",\n  \"mainEntityOfPage\": { \"@type\": \"WebPage\", \"@id\": \"https:\/\/www.example.com\/blog\/json-ld\/\" }\n}\n&lt;\/script&gt;<\/code><\/pre>\n<p>Four details decide whether this markup earns anything. The <code>headline<\/code> is cut off beyond roughly 110 characters, so a title built from the page title plus the site name loses its ending. The <code>author<\/code> belongs in an object with a <code>@type<\/code>. A bare string is accepted, but it says nothing about whether a person or an organisation wrote the piece. <code>dateModified<\/code> must not lie before <code>datePublished<\/code>, a combination that appears whenever a migration writes the import date into one of the two fields. And the image should exist in more than one aspect ratio, because the layout that a result ends up in is not the one the markup asks for.<\/p>\n<h2>FAQPage: The Rule That Reaches Into the Page<\/h2>\n<p>An FAQ block is the one type whose validity depends on something outside the markup: every question and every answer has to be visible on the page itself. Markup describing an accordion that never opens, or questions that exist only in the JSON, counts as misleading rather than incomplete &#8211; and that is a manual action, not a missing feature.<\/p>\n<p>Since 2023 the FAQ rich result itself is shown almost exclusively for authoritative government and health sites, so for most pages the visible reward is gone. The markup is still worth writing, only for different consumers: internal search, the assistants that read a page to answer a question, and every downstream system that would otherwise have to guess which part of the text is a question. Whoever expects the star-and-arrow listing from it will be disappointed; whoever wants a machine-readable question and answer pair gets exactly that.<\/p>\n<h2>Product: Price, Currency, Availability<\/h2>\n<p>A product without an <code>offers<\/code> block is a product without a price, and a price is the only reason a product result exists.<\/p>\n<pre class=\"wp-block-kevinbatdorf-code-block-pro\"><code>&lt;script type=\"application\/ld+json\"&gt;\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"Product\",\n  \"name\": \"Compact PoE switch, 8 ports\",\n  \"image\": [\"https:\/\/www.example.com\/images\/switch.png\"],\n  \"brand\": { \"@type\": \"Brand\", \"name\": \"Example\" },\n  \"offers\": {\n    \"@type\": \"Offer\",\n    \"price\": \"149.00\",\n    \"priceCurrency\": \"EUR\",\n    \"availability\": \"https:\/\/schema.org\/InStock\",\n    \"url\": \"https:\/\/www.example.com\/switch\/\"\n  }\n}\n&lt;\/script&gt;<\/code><\/pre>\n<p>The <code>availability<\/code> field takes a schema.org address, not the word behind it: <code>InStock<\/code> on its own is not a value. Where an <code>aggregateRating<\/code> is added, it needs both a <code>ratingValue<\/code> and a count &#8211; one without the other is dropped, and a rating that appears on the page but not in the markup is worth nothing to the listing. Ratings that a page cannot show, on the other hand, must not appear in the markup at all.<\/p>\n<h2>Checking Before It Goes Live<\/h2>\n<p>Three checks catch nearly everything, and they answer different questions. A structural check reads the block on its own: are the mandatory fields there, is the date an ISO date, is the price a number. The Rich Results Test then says whether Google recognises a type at all, which is the only place where a lowercase <code>@type<\/code> becomes visible. And the enhancement reports in Search Console show what happens across the whole site over time, which is where a template error surfaces as several hundred identical warnings rather than one.<\/p>\n<p>What none of them answers is whether a result will be shown. Valid markup is a condition, not a claim: Google decides per query and per page whether a rich result appears, and a correct block that produces nothing is the normal case rather than a fault. The reason to write structured data is the one that survives that decision &#8211; a page whose statements are readable by machines, at a moment when more and more of them are doing the reading.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>What happens when an SEO plugin and the theme each output their own Article block?<\/h3>\n<p>Then two blocks describe the same thing, and usually not identically: the plugin may take the SEO title and a full-size image, the theme the post title and the thumbnail, and the dates differ by a time zone. For exactly this case the parser has no rule for deciding which block is meant. Even so, there is no error message; the Rich Results Test merely shows two detected items of type Article.<\/p>\n<p>The remedy is a single source. An SEO plugin often builds a @graph with website, page, author and breadcrumb trail anyway, which makes it the better choice, while the theme\u2019s output is switched off. If the theme is to add something, it refers to the article in the plugin\u2019s graph via @id instead of creating a second article.<\/p>\n<p>After every change of plugin or theme, the source of a post page is worth a look: how often does application\/ld+json appear there? Two blocks are not a fault; two blocks describing the same page differently are.<\/p>\n<h3>Does Google read JSON-LD that is only inserted by JavaScript, for example through Tag Manager?<\/h3>\n<p>Google can read it, because its crawler renders pages before evaluating the structured data, and the Rich Results Test shows blocks inserted this way too. Rendering happens in a separate, later step, however, and a block that is only inserted after a user action or after consent never reaches the crawler.<\/p>\n<p>For the other consumers, such as the assistants and downstream systems named under the FAQ type, the picture is worse. Many machines that collect pages for language models or generate previews execute no JavaScript and see only the delivered HTML. To them, a block from Tag Manager does not exist. Structured data meant to do more than earn a single rich result therefore belongs in the delivered HTML, generated on the server.<\/p>\n<h3>How can a template produce the date and the price in the right format from the start?<\/h3>\n<p>By formatting the raw value specifically for the markup instead of reusing the display version. In PHP, <code>date('c', $timestamp)<\/code> returns an ISO 8601 date with time and offset, and in WordPress <code>get_the_date('c')<\/code> does the same for the post. For the price, <code>number_format($price, 2, '.', '')<\/code> yields a bare number with a dot and no thousands separator, so 49.90 rather than 49,90 EUR.<\/p>\n<p>In JavaScript, <code>toISOString()<\/code> also produces a valid date, but always in UTC with a trailing Z. That is correct, except that a post published shortly after midnight local time then still carries the previous day\u2019s date.<\/p>\n<h3>Which count does an aggregateRating need besides the ratingValue?<\/h3>\n<p>Either ratingCount, the number of ratings given, or reviewCount, the number of reviews; one of the two is enough. If the scale is not one to five, bestRating and worstRating belong in the markup as well; otherwise the five-point scale applies, and a value of 8 on a ten-point scale does not fit it.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/intro-structured-data\" target=\"_blank\" rel=\"noopener noreferrer\">Google Search Central: structured data<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Structured data fails without an error message. The four mistakes that quietly cost a rich result, and how Article, FAQPage and Product markup has to look to survive them.<\/p>\n","protected":false},"author":1,"featured_media":13848,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[127],"tags":[91297,91386],"class_list":["post-10295","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-digital-marketing","tag-data-quality","tag-marketing-cyfrowy-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: JSON-LD That Search Engines Actually Read | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Why structured data fails silently: relative image paths, local date formats, prices with currency symbols and a lowercase type.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: JSON-LD That Search Engines Actually Read | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Why structured data fails silently: relative image paths, local date formats, prices with currency symbols and a lowercase type.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-26T05:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-25T08:49:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10295-tutorial-json-ld-that-search-engines-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: JSON-LD That Search Engines Actually Read\",\"datePublished\":\"2026-08-26T05:30:00+00:00\",\"dateModified\":\"2026-09-25T08:49:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/\"},\"wordCount\":1565,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10295-tutorial-json-ld-that-search-engines-g.png\",\"keywords\":[\"Data Quality\",\"Digital Marketing\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/\",\"name\":\"Tutorial: JSON-LD That Search Engines Actually Read | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10295-tutorial-json-ld-that-search-engines-g.png\",\"datePublished\":\"2026-08-26T05:30:00+00:00\",\"dateModified\":\"2026-09-25T08:49:18+00:00\",\"description\":\"Why structured data fails silently: relative image paths, local date formats, prices with currency symbols and a lowercase type.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10295-tutorial-json-ld-that-search-engines-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-10295-tutorial-json-ld-that-search-engines-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: JSON-LD That Search Engines Actually Read\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/tutorial-json-ld-that-search-engines-actually-read\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: JSON-LD That Search Engines Actually Read\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: JSON-LD That Search Engines Actually Read | Lukas Wojcik","description":"Why structured data fails silently: relative image paths, local date formats, prices with currency symbols and a lowercase type.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: JSON-LD That Search Engines Actually Read | Lukas Wojcik","og_description":"Why structured data fails silently: relative image paths, local date formats, prices with currency symbols and a lowercase type.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-08-26T05:30:00+00:00","article_modified_time":"2026-09-25T08:49:18+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10295-tutorial-json-ld-that-search-engines-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: JSON-LD That Search Engines Actually Read","datePublished":"2026-08-26T05:30:00+00:00","dateModified":"2026-09-25T08:49:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/"},"wordCount":1565,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10295-tutorial-json-ld-that-search-engines-g.png","keywords":["Data Quality","Digital Marketing"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/","name":"Tutorial: JSON-LD That Search Engines Actually Read | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10295-tutorial-json-ld-that-search-engines-g.png","datePublished":"2026-08-26T05:30:00+00:00","dateModified":"2026-09-25T08:49:18+00:00","description":"Why structured data fails silently: relative image paths, local date formats, prices with currency symbols and a lowercase type.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10295-tutorial-json-ld-that-search-engines-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-10295-tutorial-json-ld-that-search-engines-g.png","width":1200,"height":630,"caption":"Tutorial: JSON-LD That Search Engines Actually Read"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/tutorial-json-ld-that-search-engines-actually-read\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: JSON-LD That Search Engines Actually Read"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10295","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10295"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10295\/revisions"}],"predecessor-version":[{"id":17287,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10295\/revisions\/17287"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/13848"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10295"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10295"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10295"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}