Why this article is necessary: the 90/10 rule of schema.org
The Schema.org vocabulary has 800+ types. But in practice:
- 15 types cover 90% of any website’s needs
- Using it wrong is worse than not using it at all (when AI detects schema misuse, it demotes you)
- “Completeness” beats “variety” (5 complete schemas > 20 half-finished ones)
Below we break down the 4 categories of schema that actually work, the logic for choosing a type, nested structures, and 5 real misuse cases I’ve seen.
Category 1: Entity schemas — a must for any website
These answer “who / what is behind this website.”
Organization (company / organization)
Use on: homepage, about-us page
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "您的公司名稱",
"alternateName": "Your Company",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"foundingDate": "2018-03-15",
"description": "B2B SaaS demand generation 行銷顧問",
"address": {
"@type": "PostalAddress",
"streetAddress": "信義路五段 7 號",
"addressLocality": "台北市",
"postalCode": "110",
"addressCountry": "TW"
},
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+886-2-1234-5678",
"contactType": "customer service",
"email": "[email protected]"
},
"sameAs": [
"https://www.linkedin.com/company/example",
"https://twitter.com/example_tw",
"https://www.crunchbase.com/organization/example"
]
}
Key fields:
name+alternateName: list both the Chinese and English names so AI can align across languagessameAs: official pages across platforms — the single most important signal for AI to align your entityaddress+contactPoint: verifiable proof the entity existsfoundingDate: a temporal anchor
LocalBusiness (physical store / local service)
Use on: local services, restaurants, clinics, retail stores, etc.
Extends Organization, adding:
openingHoursSpecification: business hoursgeo: latitude and longitudepriceRange: price range (marked with$,$$,$$$)
Why it matters: for local search and “X near me” type queries, AI preferentially cites results that have LocalBusiness schema.
Person (personal brand / author)
Use on: personal websites, author pages
{
"@context": "https://schema.org",
"@type": "Person",
"name": "陳大華",
"jobTitle": "B2B 行銷顧問",
"worksFor": {
"@type": "Organization",
"name": "您的公司名稱",
"url": "https://example.com"
},
"alumniOf": "國立台灣大學",
"image": "https://example.com/photo.jpg",
"url": "https://example.com/about",
"sameAs": [
"https://www.linkedin.com/in/daihua-chen",
"https://github.com/daihua",
"https://medium.com/@daihua"
]
}
See also: Getting started with GEO for personal brands / freelancers.
WebSite
Use on: homepage
{
"@context": "https://schema.org",
"@type": "WebSite",
"url": "https://example.com",
"name": "您的公司名稱",
"potentialAction": {
"@type": "SearchAction",
"target": "https://example.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
}
}
Why it matters: SearchAction tells AI how to operate your on-site search. Some AI agents invoke it when handling “find X on this website” type requests.
Category 2: Content schemas — a must for content sites
Article / BlogPosting / NewsArticle — pick one
Their inheritance relationship:
CreativeWork
└── Article
├── BlogPosting ← for blogs
├── NewsArticle ← for news
└── ScholarlyArticle ← for academic work
How to choose:
- Blog / opinion posts →
BlogPosting - News reporting / current events →
NewsArticle - Not sure → use
Article(the most generic)
A complete Article schema
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "10 個 GEO 常見迷思",
"description": "本文拆 10 個常見 GEO 迷思...",
"image": "https://example.com/blog/myths-hero.png",
"author": {
"@type": "Person",
"name": "陳大華",
"url": "https://example.com/author/daihua"
},
"publisher": {
"@type": "Organization",
"name": "您的公司名稱",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.png"
}
},
"datePublished": "2026-04-30T08:00:00+08:00",
"dateModified": "2026-04-30T08:00:00+08:00",
"mainEntityOfPage": "https://example.com/blog/post-1",
"wordCount": 2400
}
The most commonly overlooked key fields:
authormust be aPersonobject (not a string) + include aurllinking to the author pagedatePublished+dateModified— you need bothmainEntityOfPagepoints back to the article’s canonical URL
WebPage (general pages)
Use on: non-article content pages (product intros, services, pricing, about)
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "服務介紹 - B2B SaaS demand generation",
"description": "...",
"url": "https://example.com/services",
"isPartOf": {
"@type": "WebSite",
"url": "https://example.com"
},
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "首頁", "item": "https://example.com"},
{"@type": "ListItem", "position": 2, "name": "服務", "item": "https://example.com/services"}
]
}
}
Category 3: Product / review schemas — a must for e-commerce
The Product + Offer + AggregateRating trio
These three must be done together — doing Product alone, without a price and without ratings, is of limited help for AI product recommendations.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "[產品名] CRM 標準版",
"image": ["https://example.com/products/crm-1.jpg"],
"description": "中小企業適用的客戶管理系統,含潛客、商機、自動化。",
"sku": "CRM-STD-001",
"brand": {
"@type": "Brand",
"name": "您的公司名稱"
},
"offers": {
"@type": "Offer",
"url": "https://example.com/products/crm-standard",
"priceCurrency": "TWD",
"price": "9900",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "您的公司名稱"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "127"
},
"review": [
{
"@type": "Review",
"author": {"@type": "Person", "name": "王大明"},
"datePublished": "2025-12-15",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
},
"reviewBody": "導入後 6 個月業務循環縮短 25%..."
}
]
}
Why this combination is especially critical
When a user asks “recommend an X tool” or “what Y software is out there,” AI preferentially selects the option that has the Product + Offer + AggregateRating trio — because AI can answer directly:
- What is it? (Product.name + description)
- How much? (Offer.price)
- How are the reviews? (AggregateRating.ratingValue)
- Where to buy? (Offer.url)
A plain HTML intro page lacks this structure, so when AI slices it up it can’t produce complete information.
Category 4: Action / process schemas — a must for tutorial content
HowTo (tutorial steps)
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "如何在 30 分鐘內設定 robots.txt 開放 AI 爬蟲",
"description": "完整步驟引導...",
"totalTime": "PT30M",
"supply": [
{"@type": "HowToSupply", "name": "你的網站 robots.txt 檔案存取權"}
],
"tool": [
{"@type": "HowToTool", "name": "文字編輯器"}
],
"step": [
{
"@type": "HowToStep",
"name": "找到 robots.txt 位置",
"text": "進入網站根目錄...",
"url": "https://example.com/blog/robots#step1"
},
{
"@type": "HowToStep",
"name": "加入 AI bot 開放規則",
"text": "貼上以下內容..."
}
]
}
FAQPage
FAQPage was discussed in depth in an earlier article: FAQPage and Q&A structure deep design (VIP).
Key point: every Question in the mainEntity array must contain a complete acceptedAnswer.text — no empty strings.
Course (courses)
Use on: online course platforms, educational institutions
{
"@context": "https://schema.org",
"@type": "Course",
"name": "GEO 30 天起步課程",
"description": "從零開始建立 GEO 月度節奏",
"provider": {
"@type": "Organization",
"name": "您的公司名稱",
"url": "https://example.com"
},
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"duration": "P30D"
}
}
5 real misuse cases
Below are real-world traps the industry has actually fallen into (common schema misuse cases compiled by AI).
Misuse 1: adding both Product and Article schema to a product page
Scenario: the client wants to “capture the benefits of both product search and content search at the same time,” and adds both schemas to every product page.
The problem: - The schema types conflict on the same page - AI is unsure whether the page is a “product intro” or an “article review” - Google will simply refuse to show a rich result
The fix: pick one. A product page uses Product; an intro/article page uses Article. One identity per page.
Misuse 2: tagging every page on the entire site as NewsArticle
Scenario: “We’re a content company, everything is news articles” — but in reality, the product intros, service pages, and pricing pages are also tagged NewsArticle.
The problem: - Tagging a service page as NewsArticle is schema misuse (a service page is not news) - AI detects the inconsistency and demotes the entire site - Google may directly issue a manual action penalty
The fix: choose the matching schema by page type — Product for product pages, WebPage for service pages, and NewsArticle only for actual news articles.
Misuse 3: faking AggregateRating numbers
Scenario: a product page adds "ratingValue": "5.0", "reviewCount": "1000" but there aren’t actually 1000 reviews.
The problem: - Users who click through don’t see the corresponding reviews → AI detects the inconsistency - Google has manual actions for “rating spam” - AI’s trust in this site’s schema permanently declines
The fix: the numbers must match the reviews actually displayed on the page. If there are no reviews, don’t add AggregateRating — adding it anyway is a negative signal.
Misuse 4: the Organization schema’s sameAs lists outdated / wrong links
Scenario: sameAs lists a Twitter account from 5 years ago (now deactivated), a LinkedIn company page from before a rename, and a Crunchbase entry that doesn’t exist.
The problem: - When AI aligns across platforms, it follows those links and finds 404s or mismatched content - The overall credibility of your entity signals drops
The fix: check sameAs once a year. Better to list fewer than to list wrong ones.
Misuse 5: the Article schema’s author uses a string instead of a Person object
Scenario:
"author": "陳大華" ❌ 字串
vs
"author": { ✅ 物件
"@type": "Person",
"name": "陳大華",
"url": "https://example.com/author/daihua"
}
The problem: - With the string version, AI cannot map it to the author page on your site - “Same author” identification across articles fails - Your site’s accumulated E-E-A-T gets scattered
The fix: always use a Person object for author + include a url linking back to the author page.
Advanced: nested structures and @id references
As your site accumulates a lot of schema, you’ll run into situations like “the same Person appears in multiple Articles” and “the same Organization appears across multiple pages.” Redefining it in full in every place is inelegant, and AI may treat them as different entities.
Use @id to unify the reference:
In the Person’s main definition (the author page):
{
"@type": "Person",
"@id": "https://example.com/author/daihua#person",
"name": "陳大華",
...完整資訊...
}
Reference it in the Article schema:
"author": {
"@id": "https://example.com/author/daihua#person"
}
The benefits:
- AI treats everything that references the same
@idas the same entity - Maintenance only needs to happen in one place
- Less duplicated data
Step one: run a schema validator to check your site’s schema health
Two free tools:
- Google Rich Results Test — see how Google interprets it
- Schema Markup Validator — see pure schema.org compliance
Run your homepage + 5 important pages, and check:
- All schemas pass validation
- No incorrect type nesting
- No expired sameAs links
👉 The “structured data” dimension of the GeoWeb health check automatically surfaces the most common schema problems.
The sample schemas are skeletons, not paste-ready templates — actual deployment involves: which type combination fits your industry, designing a cross-page @id system, dynamically generating schema in the CMS / backend, integrating with your existing SEO structure, and validating regularly to avoid drift. Most companies choose GEO hosting to get this done correctly in one pass, avoiding the discovery six months later that the schema was written wrong and the entire site’s rich results have stopped working: [email protected]
GEO advanced series. Previous article: «The 5 content traits that LLMs prefer to cite»