Why JSON‑LD Matters for a Small Business
When I rebuilt my own site for Dream Futures Tech, the first thing I wanted was a clean way to tell search engines who I am, what I offer, and how my content is organized. Google recommends JSON‑LD because it lives in a <script type="application/ld+json"> tag, keeps the markup out of the HTML flow, and is easy to validate with the Rich Results Test.
In this article I walk through the four most useful schema types for a typical small‑business site:
- Organization – the business identity.
- WebSite – the site as a searchable entity.
- BlogPosting – each blog article.
- BreadcrumbList – the navigation trail.
I’ll show the exact JSON I use, where I drop it in the page, and a few gotchas I ran into while keeping the syntax valid.
1. The Organization Block
The Organization object is the anchor for everything else. It tells Google the name, logo, address, and contact details.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Organization", "name": "Dream Futures Tech", "url": "https://dreamfuturestech.com", "logo": "https://dreamfuturestech.com/assets/logo.png", "contactPoint": [{ "@type": "ContactPoint", "telephone": "+1-954-555-0123", "contactType": "Customer Service", "areaServed": "US", "availableLanguage": ["English"] }], "address": { "@type": "PostalAddress", "streetAddress": "123 Ocean Drive", "addressLocality": "Pompano Beach", "addressRegion": "FL", "postalCode": "33062", "addressCountry": "US" } } </script> I keep this block in a partial file (_org-ld.html) and include it in the <head> of every page via my templating engine (I use PHP with Blade‑like syntax, but the idea works in any stack).
<?php include 'partials/_org-ld.html'; ?> 2. Declaring the WebSite
The WebSite schema lets Google know the primary search URL for the site and optionally provides a potentialAction for site search.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "WebSite", "url": "https://dreamfuturestech.com/", "name": "Dream Futures Tech", "potentialAction": { "@type": "SearchAction", "target": "https://dreamfuturestech.com/search?q={search_term_string}", "query-input": "required name=search_term_string" } } </script> I only add this once, right after the Organization block. Because both blocks share the same @context, I could combine them into a single JSON array, but keeping them separate makes debugging easier.
3. Structured Data for Blog Posts
Every article on my blog now carries a BlogPosting object. The key fields are headline, author, datePublished, image, and articleBody (or a short description). I generate the JSON dynamically from the post metadata, so the markup always matches the content.
<?php $ld = [ "@context" => "https://schema.org", "@type" => "BlogPosting", "headline" => $post->title, "image" => $post->featured_image, "author" => [ "@type" => "Person", "name" => "Kaleb Martinez" ], "publisher" => [ "@type" => "Organization", "name" => "Dream Futures Tech", "logo" => [ "@type" => "ImageObject", "url" => "https://dreamfuturestech.com/assets/logo.png" ] ], "datePublished" => $post->date->format('Y-m-d'), "dateModified" => $post->updated_at->format('Y-m-d'), "description" => $post->excerpt, "mainEntityOfPage" => [ "@type" => "WebPage", "@id" => $post->url ] ]; ?> <script type="application/ld+json"><?php echo json_encode($ld, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT); ?></script> A few practical notes:
- Images must be absolute URLs – relative paths break the validator.
-
mainEntityOfPageties the markup back to the canonical URL, which helps Google avoid duplicate‑content warnings. - I omit
articleBodybecause the full HTML body can be huge; a concisedescriptionis enough for most rich‑result types.
4. BreadcrumbList for Navigation
Breadcrumbs improve internal linking and appear as a navigation trail in SERPs. The schema is a simple ordered list of ListItem objects.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://dreamfuturestech.com/" }, { "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://dreamfuturestech.com/blog/" }, { "@type": "ListItem", "position": 3, "name": "<?= htmlspecialchars($post->title) ?>", "item": "<?= $post->url ?>" } ] } </script> I generate the breadcrumb array in PHP based on the current route. If a page isn’t part of the blog hierarchy (e.g., a service page), I adjust the list accordingly.
5. Keeping the JSON Valid
The biggest practical hurdle for me was keeping the JSON syntax correct while mixing server‑side variables. A missing comma or an unescaped quote will cause the entire block to be ignored. Here are the safeguards I use:
- Always generate JSON with
json_encode– never hand‑type the final string. - Enable
JSON_UNESCAPED_SLASHESso URLs stay readable. - Run the output through the Rich Results Test after each deployment. The tool points out exact line numbers for syntax errors.
- Version‑control the partial files (
_org-ld.html,_website-ld.html, etc.) so any accidental change shows up in a diff.
6. Deploying and Verifying
After I push the changes, I clear the Cloudflare cache (I use Cloudflare for CDN) and then run two checks:
- Google’s Rich Results Test – paste the live URL, verify that each schema type appears without errors.
- Schema.org’s validator – useful for catching warnings like missing
@idfields.
If a warning shows up, I usually add an @id that points to the canonical URL of the entity. It isn’t required, but it helps Google treat the object as a stable identifier.
7. What I Learned
- JSON‑LD is lightweight, but the devil is in the details: absolute URLs, proper dates (
YYYY‑MM‑DD), and matching@typenames. - Keeping the markup in reusable partials makes updates painless – a single logo change propagates to all schema blocks.
- Validation tools are your friends; they catch the tiny syntax slip that would otherwise silently break the rich results.
With these four schema types in place, my site now shows a logo in the knowledge panel, breadcrumb trails in search results, and enhanced blog snippets when Google deems the content relevant. The implementation is straightforward, and the SEO payoff is visible without any exotic hardware or third‑party services.
I build sites and automations for small businesses at dreamfuturestech.com.