Schema markup is structured data that tells Google what your page is about beyond what the HTML says. It can earn you rich results (star ratings, FAQ panels, business hours, structured snippets) which dramatically improve click-through rates. It’s also one of the most over-engineered parts of SMB SEO. Three schema types cover 90% of the value for SMB sites. Here they are.
Type 1: Organization (for the site)
One Organization schema, placed on the homepage, identifying who the business is. Includes name, logo, URL, social profiles, contact info. Google uses this for the Knowledge Panel (the box that sometimes appears on the right side of branded searches) and to associate every page on your site with a verified entity.
// app/layout.tsx — root layout
const orgJsonLd = {
"@context": "https://schema.org",
"@type": "Organization",
name: "Frontend Horizon",
url: "https://frontendhorizon.com",
logo: "https://frontendhorizon.com/branding/logo/frontendhorizon-logo-variant.svg",
sameAs: [
"https://www.linkedin.com/company/frontendhorizon",
"https://www.instagram.com/frontendhorizon",
],
contactPoint: {
"@type": "ContactPoint",
contactType: "customer service",
email: "hello@frontendhorizon.com",
},
};
// In the layout:
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(orgJsonLd) }}
/>Type 2: LocalBusiness (for location-based services)
If your business serves customers at a physical location or covers a defined service area, use LocalBusiness (or a more specific subtype like Plumber, Restaurant, Dentist). Include address, hours, phone, geo coordinates, service area. Google uses it for the local pack alongside Google Business Profile signals.
const localBusinessJsonLd = {
"@context": "https://schema.org",
"@type": "GeneralContractor",
name: "BHR Construction",
url: "https://bhrconstruction.com",
telephone: "+1-214-555-0100",
address: {
"@type": "PostalAddress",
streetAddress: "123 Main St",
addressLocality: "Dallas",
addressRegion: "TX",
postalCode: "75201",
addressCountry: "US",
},
geo: { "@type": "GeoCoordinates", latitude: 32.7767, longitude: -96.797 },
areaServed: [
{ "@type": "City", name: "Dallas" },
{ "@type": "City", name: "Fort Worth" },
{ "@type": "City", name: "Plano" },
],
openingHoursSpecification: [
{ "@type": "OpeningHoursSpecification", dayOfWeek: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"], opens: "08:00", closes: "17:00" },
],
};Type 3: FAQPage (for pages with question-answer sections)
Service pages and pricing pages almost always have an FAQ section. Wrapping it in FAQPage schema makes the questions eligible to appear directly in the SERP as a structured snippet — visible, clickable, and conversion-friendly.
const faqJsonLd = {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: [
{
"@type": "Question",
name: "How long does a custom home build take?",
acceptedAnswer: {
"@type": "Answer",
text: "Typical custom home builds run 12-18 months from contract to certificate of occupancy.",
},
},
// … more questions …
],
};Schema types that are mostly noise for SMBs
- Article schema on every blog post. Google handles this fine from your meta tags; the schema rarely earns a rich result.
- Product schema unless you’re actually selling products with prices.
- Review schema in self-published reviews. Google explicitly disallows self-serving review markup.
- Event schema unless you actually host events.
- BreadcrumbList. Google often shows breadcrumbs in the SERP automatically; adding schema is fine but not high-leverage.
Validating your schema
Use Google’s Rich Results Test to paste a URL or HTML and check what schema Google detected, whether it’s valid, and whether it’s eligible for rich results. Run this every time you add or change schema.
Where schema appears in the SERP
Google decides whether to show rich results based on the schema’s quality, the query, and the SERP context. Adding valid schema doesn’t guarantee a rich result — it makes you eligible. For SMB sites, FAQ rich results are the most reliably-shown; LocalBusiness rarely appears in the SERP itself but feeds into the Knowledge Panel and local pack.
Schema and Search Console
GSC has a dedicated section under Enhancements for each schema type you’ve implemented. It shows valid items, items with warnings, items with errors. Fix errors first; warnings are usually optional. We check this monthly.
Implementing in Next.js
Two patterns. (1) Static schema in the root layout for Organization and LocalBusiness — always present, always the same. (2) Per-page schema in the route’s page component for FAQPage, Article, etc. Use `dangerouslySetInnerHTML` with `JSON.stringify` to inject the JSON-LD script tag.
Schema for blog posts
We use Article schema on every FH blog post — see the blog post template in [[/blog/static-generation-at-scale-why-fh-builds-ship-800-pages-without-a-headless-cms|app/blog/[slug]/page.tsx]]. Includes headline, author, datePublished, dateModified, publisher. Doesn’t produce visible rich results in most cases but feeds entity associations.
Common errors we see in audits
- Schema referencing an image URL that 404s. The rich result silently doesn’t appear.
- Address fields in the wrong format (city in streetAddress, etc.).
- Hours specified in 12-hour format instead of 24-hour.
- Service area as a generic ‘USA’ when the business serves a defined region.
- FAQPage schema on a page that doesn’t actually have those Q&As visible to users. Google considers this misleading; the rich result is suppressed.
Schema for ecommerce
Different game. Product, Offer, AggregateRating, Review schemas all matter. We don’t cover them here because the FH client book is mostly service businesses. If you’re running ecommerce, plan a dedicated schema implementation per the Schema.org Product spec.
How this lands across FH client work
Every FH client site ships with Organization in the root layout, LocalBusiness on the homepage and locations pages, and FAQPage on service pages with FAQ sections. Total schema code per site: about 200 lines. FAQ rich results appear on ~40% of relevant queries we rank for, lifting CTR roughly 15-25% on those queries. If your site has no schema or has schema that hasn’t been validated, book a consultation — adding the three core types is a one-day engagement with measurable CTR improvement inside a month.