Put schema markup in the <head> section as JSON-LD script tags. Google explicitly supports JSON-LD, Microdata, and RDFa, and it crawls schema regardless of placement, but JSON-LD in the <head> wins for practical reasons: it doesn't clutter your visible HTML, your developers can manage it separately from page content, and tag managers like GTM can inject or modify it without touching template files. Microdata and RDFa live inline with your HTML elements in the <body>, wrapping the actual content they describe. That's semantically pure but makes templates messy. If you're marking up a product price, Microdata requires span tags around the price itself with itemprop attributes. JSON-LD lets you declare the same data in a script block with no impact on your front-end code. Most CMS plugins and enterprise setups use JSON-LD for this reason. Placement specifics that matter: - JSON-LD can sit anywhere in <head> or <body>, but <head> is conventional and keeps all structured data in one scan when you audit pages. - Multiple JSON-LD blocks on one page are fine. Google merges them. Useful when you have product schema, breadcrumb schema, and organization schema each generated by different systems. - Microdata must wrap the actual DOM elements it describes, so it's inherently in the <body> wherever that content renders. - RDFa works the same way as Microdata, inline in the <body>. At Ottawa SEO, we default to JSON-LD in the <head> unless a client's legacy system already uses Microdata and refactoring isn't worth it. We've run splits on 40+ domains where we moved Microdata to JSON-LD with zero ranking or rich result changes, just easier maintenance. The only exception: if you're server-side rendering content that changes per user session, sometimes it's simpler to generate Microdata in the same loop that builds your HTML rather than construct a separate JSON-LD object. Test your schema with Google's Rich Results Test and Schema Markup Validator regardless of placement. Valid schema in the wrong spot still validates, but schema in the <head> as JSON-LD passes every audit tool cleanly and survives CMS updates without breaking.