JSON-LD belongs in the <head> section of your page, wrapped in a <script type="application/ld+json"> tag. This is the method Google prefers and what we use for 95% of implementations at Ottawa SEO Inc. You can add multiple schema blocks—one for Organization, one for LocalBusiness, one for Article or Product—all sitting in the head without touching your visible HTML. Microdata and RDFa go directly on HTML elements in the <body>, using attributes like itemscope, itemtype, and itemprop. You'll see this on older sites or when developers want schema tightly coupled to the markup, like wrapping product prices or review stars. It works, but it's messier to maintain and harder to audit. If your CMS or theme injects microdata automatically, leave it unless it conflicts with your JSON-LD. For WordPress, plugins like Rank Math or Yoast inject JSON-LD into the head automatically. Shopify themes often do the same for products and breadcrumbs. If you're hand-coding or using a headless CMS, drop JSON-LD scripts into your template partials so they render on every relevant page type. Where it gets tricky: e-commerce sites sometimes split schema between head and body. JSON-LD in the head covers Organization and WebSite schema, while microdata on product cards handles Offer and AggregateRating. That's fine as long as you're not duplicating the same entity with conflicting properties—Google will ignore or merge them unpredictably. Test every implementation in Google's Rich Results Test and Schema Markup Validator. We've seen clients add schema to the wrong template, so a blog post gets Product markup or a service page gets Recipe. Also common: JSON-LD syntax errors—missing commas, unescaped quotes—that break the entire block. When you're managing 500+ domains, you automate validation in your deployment pipeline. For single sites, manual checks after any theme or plugin update catch 90% of issues before Google does.