native-update 1.4.9 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +13 -1
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdatePlugin.kt +15 -0
- package/android/src/main/java/com/aoneahsan/nativeupdate/BackgroundUpdateWorker.kt +23 -7
- package/android/src/main/java/com/aoneahsan/nativeupdate/LiveUpdatePlugin.kt +152 -4
- package/android/src/main/java/com/aoneahsan/nativeupdate/NativeUpdatePlugin.kt +14 -1
- package/android/src/main/java/com/aoneahsan/nativeupdate/NotificationActionReceiver.kt +10 -1
- package/android/src/main/java/com/aoneahsan/nativeupdate/SecurityManager.kt +18 -18
- package/cli/AGENTS.md +29 -0
- package/cli/CLAUDE.md +51 -0
- package/dist/esm/__tests__/security-enforcement.test.d.ts +1 -0
- package/dist/esm/__tests__/security-enforcement.test.js +95 -0
- package/dist/esm/__tests__/security-enforcement.test.js.map +1 -0
- package/dist/esm/core/config.d.ts +6 -15
- package/dist/esm/core/config.js +1 -4
- package/dist/esm/core/config.js.map +1 -1
- package/dist/esm/core/security.d.ts +11 -3
- package/dist/esm/core/security.js +19 -6
- package/dist/esm/core/security.js.map +1 -1
- package/dist/esm/definitions.d.ts +13 -29
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/index.d.ts +0 -2
- package/dist/esm/index.js +0 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/live-update/download-manager.d.ts +36 -5
- package/dist/esm/live-update/download-manager.js +61 -22
- package/dist/esm/live-update/download-manager.js.map +1 -1
- package/dist/esm/live-update/update-manager.d.ts +12 -1
- package/dist/esm/live-update/update-manager.js +38 -10
- package/dist/esm/live-update/update-manager.js.map +1 -1
- package/dist/esm/live-update/version-manager.d.ts +9 -0
- package/dist/esm/live-update/version-manager.js +40 -0
- package/dist/esm/live-update/version-manager.js.map +1 -1
- package/dist/esm/plugin.js +13 -46
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/web.d.ts +18 -1
- package/dist/esm/web.js +69 -24
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +1 -1
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.esm.js +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/plugin.js +2 -2
- package/dist/plugin.js.map +1 -1
- package/docs/AGENTS.md +38 -0
- package/docs/CHANGELOG.md +151 -0
- package/docs/CLAUDE.md +101 -0
- package/docs/MIGRATION.md +87 -0
- package/docs/README.md +13 -2
- package/docs/deployment/HOSTINGER_DEPLOY.md +329 -0
- package/docs/features/laravel-nova-backend/ASSESSMENT-SUMMARY.md +96 -0
- package/docs/features/laravel-nova-backend/IMPLEMENTATION-PLAN.md +504 -0
- package/docs/features/laravel-nova-backend/credentials.ignore.md +34 -0
- package/docs/features/laravel-nova-backend/progress-tracker.json +184 -0
- package/docs/project-knowledge-base/01-system-overview.md +218 -0
- package/docs/project-knowledge-base/02-routes-pages-forms-users.md +346 -0
- package/docs/project-knowledge-base/03-tech-stack-modules-services.md +347 -0
- package/docs/project-knowledge-base/04-data-models-integrations.md +307 -0
- package/docs/project-knowledge-base/05-docs-corpus-inventory.md +193 -0
- package/docs/project-knowledge-base/06-operations-testing-legal-content.md +170 -0
- package/docs/project-knowledge-base/README.md +90 -0
- package/docs/project-profiles/native-update-capacitor-update-platform-project-profile-last-updated-2026-03-16.md +454 -0
- package/docs/project-profiles/native-update-capacitor-update-platform-project-profile-last-updated-2026-03-24.md +66 -0
- package/docs/project-profiles/native-update-capacitor-update-platform-project-profile-last-updated-2026-03-25.md +67 -0
- package/docs/seo-aeo-rules.json +3043 -0
- package/docs/tracking/seo-checklist-tracker.json +333 -0
- package/ios/Plugin/BackgroundUpdate/BackgroundUpdatePlugin.swift +50 -6
- package/ios/Plugin/LiveUpdate/LiveUpdatePlugin.swift +238 -8
- package/ios/Plugin/NativeUpdatePlugin.swift +8 -0
- package/ios/Plugin/Security/SecurityManager.swift +13 -14
- package/package.json +30 -31
- package/docs/play-console-rejection-rules.json +0 -428
|
@@ -0,0 +1,3043 @@
|
|
|
1
|
+
{
|
|
2
|
+
"metadata": {
|
|
3
|
+
"title": "Comprehensive SEO & AEO Rules and Guidelines",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"lastUpdated": "2026-04-12",
|
|
6
|
+
"description": "Complete reference of SEO and AEO (Answer Engine Optimization) rules compiled from Google, Bing, and authoritative third-party sources. Covers technical SEO, on-page optimization, structured data, AI search optimization, and monitoring.",
|
|
7
|
+
"totalRules": 236,
|
|
8
|
+
"sources": [
|
|
9
|
+
"https://developers.google.com/search/docs/fundamentals/seo-starter-guide",
|
|
10
|
+
"https://developers.google.com/search/docs/fundamentals/how-search-works",
|
|
11
|
+
"https://developers.google.com/search/docs/fundamentals/creating-helpful-content",
|
|
12
|
+
"https://developers.google.com/search/docs/fundamentals/get-started",
|
|
13
|
+
"https://developers.google.com/search/docs/fundamentals/get-started-developers",
|
|
14
|
+
"https://developers.google.com/search/docs/fundamentals/get-on-google",
|
|
15
|
+
"https://developers.google.com/search/docs/fundamentals/using-gen-ai-content",
|
|
16
|
+
"https://developers.google.com/search/docs/appearance",
|
|
17
|
+
"https://developers.google.com/search/docs/appearance/ai-features",
|
|
18
|
+
"https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data",
|
|
19
|
+
"https://developers.google.com/search/docs/appearance/structured-data/sd-policies",
|
|
20
|
+
"https://developers.google.com/search/docs/appearance/enriched-search-results",
|
|
21
|
+
"https://developers.google.com/search/docs/appearance/structured-data/generate-structured-data-with-javascript",
|
|
22
|
+
"https://developers.google.com/search/docs/appearance/publication-dates",
|
|
23
|
+
"https://developers.google.com/search/docs/appearance/favicon-in-search",
|
|
24
|
+
"https://developers.google.com/search/docs/appearance/featured-snippets",
|
|
25
|
+
"https://developers.google.com/search/docs/appearance/flexible-sampling",
|
|
26
|
+
"https://developers.google.com/search/docs/appearance/google-discover",
|
|
27
|
+
"https://developers.google.com/search/docs/appearance/google-images",
|
|
28
|
+
"https://developers.google.com/search/docs/appearance/preferred-sources",
|
|
29
|
+
"https://developers.google.com/search/docs/appearance/site-names",
|
|
30
|
+
"https://developers.google.com/search/docs/appearance/sitelinks",
|
|
31
|
+
"https://developers.google.com/search/docs/appearance/snippet",
|
|
32
|
+
"https://developers.google.com/search/docs/appearance/title-link",
|
|
33
|
+
"https://developers.google.com/search/docs/appearance/video",
|
|
34
|
+
"https://www.bing.com/webmasters/help/webmaster-guidelines-30fba23a",
|
|
35
|
+
"https://www.bing.com/webmasters/help/marking-up-your-site-with-structured-data-3a93e731",
|
|
36
|
+
"https://www.bing.com/webmasters/help/404pages-best-practices-1c9f53b3",
|
|
37
|
+
"https://www.bing.com/webmasters/help/media-rss-mrss-video-feed-specification-350cfabf",
|
|
38
|
+
"https://www.bing.com/webmasters/help/special-announcement-specifications-5cbd6249",
|
|
39
|
+
"https://www.bing.com/webmasters/help/link-building-7a3f99b7",
|
|
40
|
+
"https://www.bing.com/webmasters/help/pubhub-publisher-guidelines-32ce5239",
|
|
41
|
+
"https://www.bing.com/webmasters/help/block-urls-from-bing-264e560a",
|
|
42
|
+
"https://www.bing.com/webmasters/help/how-to-verify-bingbot-3905dc26",
|
|
43
|
+
"https://www.bing.com/webmasters/help/how-to-create-a-robotstxt-file-cb7c31ec",
|
|
44
|
+
"https://www.bing.com/webmasters/help/robots-meta-tags-and-attributes-that-bing-supports-5198d240",
|
|
45
|
+
"https://www.bing.com/webmasters/help/first-click-free-implementation-details-c6b0f0b9",
|
|
46
|
+
"https://www.yotpo.com/blog/full-technical-seo-checklist/",
|
|
47
|
+
"https://www.incremys.com/en/resources/blog/schema-seo",
|
|
48
|
+
"https://www.digitalapplied.com/blog/structured-data-seo-2026-rich-results-guide",
|
|
49
|
+
"https://www.seologist.com/knowledge-sharing/beginners-guide-on-page-seo-2026/",
|
|
50
|
+
"https://www.w3era.com/blog/seo/technical-seo-complete-guide/",
|
|
51
|
+
"https://almcorp.com/blog/seo-checklist/",
|
|
52
|
+
"https://webcraftdev.com/en/blog/seo-2026-complete-guide-website-visibility"
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
"categories": {
|
|
56
|
+
"title_tags": {
|
|
57
|
+
"name": "Title Tags",
|
|
58
|
+
"description": "Rules for HTML <title> elements which appear as the clickable headline in search results. Titles are a strong ranking signal for both Google and Bing.",
|
|
59
|
+
"rules": [
|
|
60
|
+
{
|
|
61
|
+
"id": "title-001",
|
|
62
|
+
"rule": "Title length under 60-70 characters",
|
|
63
|
+
"description": "Google truncates titles based on pixel width (roughly 600px on desktop). Bing recommends under 65 characters. Keep titles concise to avoid truncation in SERPs.",
|
|
64
|
+
"priority": "critical",
|
|
65
|
+
"applies_to": [
|
|
66
|
+
"google",
|
|
67
|
+
"bing"
|
|
68
|
+
],
|
|
69
|
+
"implementation": "Set <title> content to 60 characters max for safety. Use a character counter during content creation. For Bing, aim for under 65 characters.",
|
|
70
|
+
"validation": "Run a crawl tool (Screaming Frog) to check all page titles. Flag any over 60 characters. Use Google Search Console to see how titles render."
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "title-002",
|
|
74
|
+
"rule": "Place primary keyword in first part of title",
|
|
75
|
+
"description": "Front-loading the primary keyword improves relevance signals and ensures visibility even if truncated.",
|
|
76
|
+
"priority": "high",
|
|
77
|
+
"applies_to": [
|
|
78
|
+
"google",
|
|
79
|
+
"bing"
|
|
80
|
+
],
|
|
81
|
+
"implementation": "Structure titles as: Primary Keyword - Secondary Info | Brand. Example: 'JSON Formatter - Free Online Tool | ZTools' rather than 'ZTools | JSON Formatter Tool'.",
|
|
82
|
+
"validation": "For each page, verify the target keyword appears within the first 30 characters of the title tag."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "title-003",
|
|
86
|
+
"rule": "Each page must have a unique descriptive title",
|
|
87
|
+
"description": "Duplicate titles confuse search engines about which page to rank. Every page should have a title that uniquely describes its content.",
|
|
88
|
+
"priority": "critical",
|
|
89
|
+
"applies_to": [
|
|
90
|
+
"google",
|
|
91
|
+
"bing"
|
|
92
|
+
],
|
|
93
|
+
"implementation": "Maintain a title inventory. For dynamic pages, use templates with unique identifiers. Never use the same title for multiple URLs.",
|
|
94
|
+
"validation": "Crawl the site and export all title tags. Sort and check for duplicates. Google Search Console reports duplicate titles under 'Page indexing'."
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id": "title-004",
|
|
98
|
+
"rule": "Title must match visible H1/primary heading",
|
|
99
|
+
"description": "The title tag and H1 should reinforce each other. They don't need to be identical but should convey the same topic.",
|
|
100
|
+
"priority": "high",
|
|
101
|
+
"applies_to": [
|
|
102
|
+
"google",
|
|
103
|
+
"bing"
|
|
104
|
+
],
|
|
105
|
+
"implementation": "When setting page titles, ensure the H1 covers the same primary topic. Core keyword/topic must align.",
|
|
106
|
+
"validation": "For each page, compare <title> with <h1>. Flag pages where primary keyword differs between them."
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "title-005",
|
|
110
|
+
"rule": "Include brand name with delimiter",
|
|
111
|
+
"description": "Including brand name builds recognition and trust. Use dash, pipe, or colon as delimiter.",
|
|
112
|
+
"priority": "medium",
|
|
113
|
+
"applies_to": [
|
|
114
|
+
"google",
|
|
115
|
+
"bing"
|
|
116
|
+
],
|
|
117
|
+
"implementation": "Use consistent pattern: 'Page Topic - Brand Name' or 'Page Topic | Brand Name'. Brand at end for most pages.",
|
|
118
|
+
"validation": "Check all titles follow chosen brand delimiter pattern. Verify consistency."
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "title-006",
|
|
122
|
+
"rule": "No keyword stuffing or repeated words in titles",
|
|
123
|
+
"description": "Repeating keywords looks spammy and can trigger Google to rewrite the title or demote the page.",
|
|
124
|
+
"priority": "high",
|
|
125
|
+
"applies_to": [
|
|
126
|
+
"google",
|
|
127
|
+
"bing"
|
|
128
|
+
],
|
|
129
|
+
"implementation": "Use each keyword once. Avoid 'Free JSON Formatter | JSON Format | JSON Formatting Tool'. Instead: 'Free JSON Formatter - Format & Validate JSON | ZTools'.",
|
|
130
|
+
"validation": "Review titles for repeated words. No word should appear more than twice. Use a script to flag repetitive titles."
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"id": "title-007",
|
|
134
|
+
"rule": "No vague or generic titles",
|
|
135
|
+
"description": "Titles like 'Home', 'Profile', 'Page 1' provide no ranking signal and poor UX.",
|
|
136
|
+
"priority": "high",
|
|
137
|
+
"applies_to": [
|
|
138
|
+
"google",
|
|
139
|
+
"bing"
|
|
140
|
+
],
|
|
141
|
+
"implementation": "Every page must have descriptive title. Homepage: 'ZTools - 500+ Free Online Developer Tools'. Profile: 'Your Profile Settings | ZTools'.",
|
|
142
|
+
"validation": "Crawl and flag generic titles (Home, Untitled, Page, Profile without context)."
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "title-008",
|
|
146
|
+
"rule": "Avoid boilerplate text repeated across pages",
|
|
147
|
+
"description": "Same long boilerplate in every title wastes characters and makes pages look identical in SERPs.",
|
|
148
|
+
"priority": "medium",
|
|
149
|
+
"applies_to": [
|
|
150
|
+
"google",
|
|
151
|
+
"bing"
|
|
152
|
+
],
|
|
153
|
+
"implementation": "Keep shared text minimal (just brand). Rest should be page-specific. Avoid 'MyBrand - The Best Tool Platform - [Page Name]' on every page.",
|
|
154
|
+
"validation": "Extract titles and check boilerplate percentage. Should be under 30%."
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"id": "title-009",
|
|
158
|
+
"rule": "Title language must match page content language",
|
|
159
|
+
"description": "Mismatched languages confuse search engines about target audience.",
|
|
160
|
+
"priority": "medium",
|
|
161
|
+
"applies_to": [
|
|
162
|
+
"google",
|
|
163
|
+
"bing"
|
|
164
|
+
],
|
|
165
|
+
"implementation": "Set title in same language as primary content. Multilingual sites need properly translated titles.",
|
|
166
|
+
"validation": "Verify title language matches lang attribute and body content."
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "title-010",
|
|
170
|
+
"rule": "Google may rewrite titles if issues detected",
|
|
171
|
+
"description": "Google algorithmically rewrites titles it considers too long, stuffed, inaccurate, or boilerplate-heavy.",
|
|
172
|
+
"priority": "medium",
|
|
173
|
+
"applies_to": [
|
|
174
|
+
"google"
|
|
175
|
+
],
|
|
176
|
+
"implementation": "Follow all title rules. If Google rewrites, check: too long? Matches H1? Keyword-stuffed? Fix underlying issue.",
|
|
177
|
+
"validation": "Compare titles in GSC (Search Results > Pages) with actual <title> tags. Investigate discrepancies."
|
|
178
|
+
}
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
"meta_descriptions": {
|
|
182
|
+
"name": "Meta Descriptions",
|
|
183
|
+
"description": "Rules for meta description tags that provide page summaries for search engine result snippets.",
|
|
184
|
+
"rules": [
|
|
185
|
+
{
|
|
186
|
+
"id": "meta-001",
|
|
187
|
+
"rule": "Keep between 25-160 characters",
|
|
188
|
+
"description": "Google truncates based on device width. Stay within 155-160 for desktop, core message in first 120 for mobile.",
|
|
189
|
+
"priority": "high",
|
|
190
|
+
"applies_to": [
|
|
191
|
+
"google",
|
|
192
|
+
"bing"
|
|
193
|
+
],
|
|
194
|
+
"implementation": "Write descriptions 120-155 characters. Front-load important information. Include call-to-action.",
|
|
195
|
+
"validation": "Crawl all pages. Flag under 25 (too short) or over 160 (truncated)."
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"id": "meta-002",
|
|
199
|
+
"rule": "Write unique descriptions for each page",
|
|
200
|
+
"description": "Duplicate descriptions waste opportunity to differentiate pages in results.",
|
|
201
|
+
"priority": "high",
|
|
202
|
+
"applies_to": [
|
|
203
|
+
"google",
|
|
204
|
+
"bing"
|
|
205
|
+
],
|
|
206
|
+
"implementation": "Create unique description for every indexable page. Use templates with variables for dynamic pages.",
|
|
207
|
+
"validation": "Export all descriptions. Sort and check for duplicates. GSC flags duplicates."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"id": "meta-003",
|
|
211
|
+
"rule": "Include page-specific details",
|
|
212
|
+
"description": "For articles: author/date. For products: price. For tools: what it does. Specifics increase CTR.",
|
|
213
|
+
"priority": "medium",
|
|
214
|
+
"applies_to": [
|
|
215
|
+
"google",
|
|
216
|
+
"bing"
|
|
217
|
+
],
|
|
218
|
+
"implementation": "Articles: 'By [Author] - [Date]. [Summary].' Tools: 'Free online [tool]. [What it does] instantly.'",
|
|
219
|
+
"validation": "Review descriptions per content type. Verify appropriate details included."
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"id": "meta-004",
|
|
223
|
+
"rule": "Must be truly descriptive and human-readable",
|
|
224
|
+
"description": "Descriptions should read as natural sentences. They serve as ad copy in search results.",
|
|
225
|
+
"priority": "high",
|
|
226
|
+
"applies_to": [
|
|
227
|
+
"google",
|
|
228
|
+
"bing"
|
|
229
|
+
],
|
|
230
|
+
"implementation": "Write 1-2 complete sentences. Include primary keyword naturally. Add value proposition or CTA.",
|
|
231
|
+
"validation": "Read aloud. Should sound natural and compelling. Flag keyword lists or incoherent descriptions."
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"id": "meta-005",
|
|
235
|
+
"rule": "No keyword lists without explanation",
|
|
236
|
+
"description": "Comma-separated keyword lists may cause Google to ignore your description entirely.",
|
|
237
|
+
"priority": "high",
|
|
238
|
+
"applies_to": [
|
|
239
|
+
"google",
|
|
240
|
+
"bing"
|
|
241
|
+
],
|
|
242
|
+
"implementation": "Instead of 'JSON formatter, JSON validator, JSON beautifier', write 'Format, validate, and beautify JSON with our free online tool.'",
|
|
243
|
+
"validation": "Check for 3+ comma-separated keywords without sentence structure. Rewrite."
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"id": "meta-006",
|
|
247
|
+
"rule": "Google does NOT use meta keywords tag for ranking",
|
|
248
|
+
"description": "The <meta name='keywords'> tag has been ignored by Google since 2009 and Bing since 2014.",
|
|
249
|
+
"priority": "low",
|
|
250
|
+
"applies_to": [
|
|
251
|
+
"google",
|
|
252
|
+
"bing"
|
|
253
|
+
],
|
|
254
|
+
"implementation": "Don't waste time on meta keywords tags. Focus on title and description.",
|
|
255
|
+
"validation": "Optional: check if meta keywords exist. Harmless but unnecessary."
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"id": "meta-007",
|
|
259
|
+
"rule": "Use nosnippet/max-snippet to control snippets",
|
|
260
|
+
"description": "Prevent or limit snippet display with meta robots directives.",
|
|
261
|
+
"priority": "low",
|
|
262
|
+
"applies_to": [
|
|
263
|
+
"google",
|
|
264
|
+
"bing"
|
|
265
|
+
],
|
|
266
|
+
"implementation": "Prevent: <meta name='robots' content='nosnippet'>. Limit: content='max-snippet:150'>. Exclude sections: data-nosnippet attribute.",
|
|
267
|
+
"validation": "Check snippet directives. Verify intentional, not accidentally blocking important pages."
|
|
268
|
+
}
|
|
269
|
+
]
|
|
270
|
+
},
|
|
271
|
+
"headings_structure": {
|
|
272
|
+
"name": "Headings Structure",
|
|
273
|
+
"description": "Rules for HTML heading elements (H1-H6) that define content hierarchy and help search engines understand page structure.",
|
|
274
|
+
"rules": [
|
|
275
|
+
{
|
|
276
|
+
"id": "heading-001",
|
|
277
|
+
"rule": "One H1 per page as main topic indicator",
|
|
278
|
+
"description": "Best practice is one H1 per page clearly stating the primary topic.",
|
|
279
|
+
"priority": "critical",
|
|
280
|
+
"applies_to": [
|
|
281
|
+
"google",
|
|
282
|
+
"bing"
|
|
283
|
+
],
|
|
284
|
+
"implementation": "Every page: exactly one <h1>. First heading, describes main topic.",
|
|
285
|
+
"validation": "Crawl and count H1s per page. Flag 0 or 2+ H1 tags."
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"id": "heading-001b",
|
|
289
|
+
"rule": "Check UI library Heading defaults — Radix UI defaults to h1",
|
|
290
|
+
"description": "Radix UI Themes Heading component defaults to as='h1' when no as prop is specified. This silently creates multiple H1 tags. Always use as='h2' or as='h3' for non-primary headings. Same issue may apply to other component libraries.",
|
|
291
|
+
"priority": "critical",
|
|
292
|
+
"applies_to": ["all"],
|
|
293
|
+
"implementation": "Every <Heading> without as='h1' must explicitly set as='h2' or as='h3'. Only the page's primary heading should be as='h1'.",
|
|
294
|
+
"validation": "grep '<Heading' src/ | grep -v 'as=' to find implicit H1s. Crawl pages and count rendered <h1> elements."
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"id": "heading-002",
|
|
298
|
+
"rule": "H1 must be visible, not hidden with CSS",
|
|
299
|
+
"description": "Hiding H1 with display:none, visibility:hidden, font-size:0 is considered deceptive.",
|
|
300
|
+
"priority": "high",
|
|
301
|
+
"applies_to": [
|
|
302
|
+
"google",
|
|
303
|
+
"bing"
|
|
304
|
+
],
|
|
305
|
+
"implementation": "H1 must be visually rendered. Redesign if needed rather than hiding. sr-only/clip for accessibility is acceptable.",
|
|
306
|
+
"validation": "Inspect H1 for hiding CSS properties. Only sr-only/clip acceptable."
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"id": "heading-003",
|
|
310
|
+
"rule": "Use H2s for major subtopics",
|
|
311
|
+
"description": "H2 headings break the page into major sections under H1.",
|
|
312
|
+
"priority": "high",
|
|
313
|
+
"applies_to": [
|
|
314
|
+
"google",
|
|
315
|
+
"bing"
|
|
316
|
+
],
|
|
317
|
+
"implementation": "Under H1, use H2 for each major section. Each H2 introduces distinct subtopic.",
|
|
318
|
+
"validation": "Review page outlines. Each H2 should represent meaningful subtopic."
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"id": "heading-004",
|
|
322
|
+
"rule": "Semantic H1-H6 hierarchy for structure not styling",
|
|
323
|
+
"description": "Headings for document structure, not visual styling. Use CSS for sizing.",
|
|
324
|
+
"priority": "high",
|
|
325
|
+
"applies_to": [
|
|
326
|
+
"google",
|
|
327
|
+
"bing"
|
|
328
|
+
],
|
|
329
|
+
"implementation": "Follow logical hierarchy: H1>H2>H3>H4. Don't skip levels. Don't use headings for styling.",
|
|
330
|
+
"validation": "Extract heading outline. Verify no skipped levels. Check headings aren't purely for styling."
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"id": "heading-005",
|
|
334
|
+
"rule": "Heading hierarchy shows parent-child relationships",
|
|
335
|
+
"description": "Nesting communicates topic relationships. Content under H3 is subtopic of preceding H2.",
|
|
336
|
+
"priority": "medium",
|
|
337
|
+
"applies_to": [
|
|
338
|
+
"google",
|
|
339
|
+
"bing"
|
|
340
|
+
],
|
|
341
|
+
"implementation": "Treat headings like outline: H1=title, H2=chapters, H3=sections within chapters.",
|
|
342
|
+
"validation": "Generate heading outline. Verify it reads logically as table of contents."
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
"id": "heading-006",
|
|
346
|
+
"rule": "No penalty for order violations but best practice",
|
|
347
|
+
"description": "Google confirmed no ranking penalty for heading order violations. Proper order still best practice.",
|
|
348
|
+
"priority": "medium",
|
|
349
|
+
"applies_to": [
|
|
350
|
+
"google",
|
|
351
|
+
"bing"
|
|
352
|
+
],
|
|
353
|
+
"implementation": "Always aim for proper order. Fix legacy issues but don't panic.",
|
|
354
|
+
"validation": "Use HTML validator to flag out-of-order headings. Fix on high-traffic pages."
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
"id": "heading-007",
|
|
358
|
+
"rule": "H1 content should match and reinforce title tag",
|
|
359
|
+
"description": "H1 and title should convey same primary topic. Core message must align.",
|
|
360
|
+
"priority": "high",
|
|
361
|
+
"applies_to": [
|
|
362
|
+
"google",
|
|
363
|
+
"bing"
|
|
364
|
+
],
|
|
365
|
+
"implementation": "If title is 'JSON Formatter - Free Tool | ZTools', H1 should be 'JSON Formatter' or similar.",
|
|
366
|
+
"validation": "Compare title and H1 per page. Primary keyword should match."
|
|
367
|
+
}
|
|
368
|
+
]
|
|
369
|
+
},
|
|
370
|
+
"content_quality": {
|
|
371
|
+
"name": "Content Quality",
|
|
372
|
+
"description": "Rules for creating high-quality, helpful content satisfying users and search engine quality guidelines.",
|
|
373
|
+
"rules": [
|
|
374
|
+
{
|
|
375
|
+
"id": "content-001",
|
|
376
|
+
"rule": "Original, helpful, people-first content",
|
|
377
|
+
"description": "Google's Helpful Content system rewards content created primarily to help people.",
|
|
378
|
+
"priority": "critical",
|
|
379
|
+
"applies_to": [
|
|
380
|
+
"google",
|
|
381
|
+
"bing",
|
|
382
|
+
"ai_engines"
|
|
383
|
+
],
|
|
384
|
+
"implementation": "Ask: 'Would someone find this useful regardless of search engines?' Write from genuine expertise. Add unique insights.",
|
|
385
|
+
"validation": "Review against Google's helpful content questions: substantial value? Expert-written? Goes beyond obvious?"
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"id": "content-002",
|
|
389
|
+
"rule": "E-E-A-T: Experience, Expertise, Authoritativeness, Trustworthiness",
|
|
390
|
+
"description": "Google evaluates content on creator's Experience, Expertise, Authoritativeness, and Trustworthiness. YMYL requires high E-E-A-T.",
|
|
391
|
+
"priority": "critical",
|
|
392
|
+
"applies_to": [
|
|
393
|
+
"google",
|
|
394
|
+
"bing",
|
|
395
|
+
"ai_engines"
|
|
396
|
+
],
|
|
397
|
+
"implementation": "Show credentials: author bios. Demonstrate experience: first-hand accounts. Build authority: cite sources. Build trust: accurate info, HTTPS.",
|
|
398
|
+
"validation": "Check: author identified? Credentials shown? Experience demonstrated? Claims sourced? HTTPS? About page?"
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"id": "content-003",
|
|
402
|
+
"rule": "No keyword stuffing",
|
|
403
|
+
"description": "Unnaturally repeating keywords is a spam signal. Write naturally for humans.",
|
|
404
|
+
"priority": "critical",
|
|
405
|
+
"applies_to": [
|
|
406
|
+
"google",
|
|
407
|
+
"bing"
|
|
408
|
+
],
|
|
409
|
+
"implementation": "Use primary keyword 2-3 times naturally. Use synonyms. If awkward, rewrite naturally.",
|
|
410
|
+
"validation": "Calculate density (<2-3%). Read aloud. Check alt text and meta data."
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"id": "content-004",
|
|
414
|
+
"rule": "No copied or scraped content",
|
|
415
|
+
"description": "Duplicating content from other sites provides no unique value. Spam policies target this.",
|
|
416
|
+
"priority": "critical",
|
|
417
|
+
"applies_to": [
|
|
418
|
+
"google",
|
|
419
|
+
"bing"
|
|
420
|
+
],
|
|
421
|
+
"implementation": "All content must be original. Add substantial original analysis if referencing sources. Never copy-paste.",
|
|
422
|
+
"validation": "Use Copyscape. Check GSC for manual actions related to copied content."
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
"id": "content-005",
|
|
426
|
+
"rule": "Keep content current and updated",
|
|
427
|
+
"description": "Outdated content loses relevance. Regular updates signal freshness.",
|
|
428
|
+
"priority": "high",
|
|
429
|
+
"applies_to": [
|
|
430
|
+
"google",
|
|
431
|
+
"bing",
|
|
432
|
+
"ai_engines"
|
|
433
|
+
],
|
|
434
|
+
"implementation": "Review quarterly. Update statistics, check links, refresh examples. Show 'Last updated' dates.",
|
|
435
|
+
"validation": "Track update dates. Flag content not updated in 6+ months."
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
"id": "content-006",
|
|
439
|
+
"rule": "Short paragraphs, bullet lists, tables",
|
|
440
|
+
"description": "Well-structured content improves readability and featured snippet/AI citation chances.",
|
|
441
|
+
"priority": "high",
|
|
442
|
+
"applies_to": [
|
|
443
|
+
"google",
|
|
444
|
+
"bing",
|
|
445
|
+
"ai_engines"
|
|
446
|
+
],
|
|
447
|
+
"implementation": "2-3 sentence paragraphs. Bullet lists for features/steps. Tables for comparisons. Bold key terms. Subheadings every 200-300 words.",
|
|
448
|
+
"validation": "Check paragraph length (<4 sentences). Verify lists/tables where appropriate."
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
"id": "content-007",
|
|
452
|
+
"rule": "BLUF - Bottom Line Up Front",
|
|
453
|
+
"description": "Core answer in first paragraph satisfies quick answers and increases AI citation.",
|
|
454
|
+
"priority": "high",
|
|
455
|
+
"applies_to": [
|
|
456
|
+
"google",
|
|
457
|
+
"bing",
|
|
458
|
+
"ai_engines"
|
|
459
|
+
],
|
|
460
|
+
"implementation": "Start with direct answer. For 'What is JSON?', start with definition before history.",
|
|
461
|
+
"validation": "Check if first paragraph directly addresses primary topic. Key info in first paragraph?"
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
"id": "content-008",
|
|
465
|
+
"rule": "Include author bios with credentials",
|
|
466
|
+
"description": "Visible author information builds E-E-A-T signals.",
|
|
467
|
+
"priority": "medium",
|
|
468
|
+
"applies_to": [
|
|
469
|
+
"google",
|
|
470
|
+
"bing",
|
|
471
|
+
"ai_engines"
|
|
472
|
+
],
|
|
473
|
+
"implementation": "Add author section: name, photo, role, qualifications, links. Use Person schema.",
|
|
474
|
+
"validation": "Check articles have visible author info with credentials. Check for Person schema."
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"id": "content-009",
|
|
478
|
+
"rule": "No artificial freshness signals",
|
|
479
|
+
"description": "Changing dates without updating content is deceptive. Google detects this.",
|
|
480
|
+
"priority": "high",
|
|
481
|
+
"applies_to": [
|
|
482
|
+
"google",
|
|
483
|
+
"bing"
|
|
484
|
+
],
|
|
485
|
+
"implementation": "Only update dateModified with substantive changes. Keep changelog.",
|
|
486
|
+
"validation": "Compare dateModified changes with actual content diffs."
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
"id": "content-010",
|
|
490
|
+
"rule": "Depth over volume",
|
|
491
|
+
"description": "10 comprehensive 2000-word articles outperform 50 shallow 500-word articles.",
|
|
492
|
+
"priority": "high",
|
|
493
|
+
"applies_to": [
|
|
494
|
+
"google",
|
|
495
|
+
"bing",
|
|
496
|
+
"ai_engines"
|
|
497
|
+
],
|
|
498
|
+
"implementation": "Aim to be most comprehensive resource. Cover all aspects, answer questions, include examples and data.",
|
|
499
|
+
"validation": "Compare depth with top-ranking competitors. Should cover equal or more subtopics."
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
"id": "content-011",
|
|
503
|
+
"rule": "Primary keyword in first 100 words",
|
|
504
|
+
"description": "Including primary keyword early confirms topic. Reinforces title and H1 signals.",
|
|
505
|
+
"priority": "medium",
|
|
506
|
+
"applies_to": [
|
|
507
|
+
"google",
|
|
508
|
+
"bing"
|
|
509
|
+
],
|
|
510
|
+
"implementation": "Include keyword in first 100 words naturally. Should happen organically with BLUF.",
|
|
511
|
+
"validation": "Check if target keyword appears in first 100 words."
|
|
512
|
+
}
|
|
513
|
+
]
|
|
514
|
+
},
|
|
515
|
+
"urls": {
|
|
516
|
+
"name": "URL Structure",
|
|
517
|
+
"description": "Rules for clean, descriptive URLs that help users and search engines understand page content.",
|
|
518
|
+
"rules": [
|
|
519
|
+
{
|
|
520
|
+
"id": "url-001",
|
|
521
|
+
"rule": "Use descriptive, human-readable URLs",
|
|
522
|
+
"description": "URLs should be readable and give clear idea of page content. Avoid query strings, random IDs.",
|
|
523
|
+
"priority": "high",
|
|
524
|
+
"applies_to": [
|
|
525
|
+
"google",
|
|
526
|
+
"bing"
|
|
527
|
+
],
|
|
528
|
+
"implementation": "Use /tools/json-formatter not /tool?id=47. Include keywords. Lowercase only.",
|
|
529
|
+
"validation": "Review sitemap URLs. Flag query parameters, random IDs, non-descriptive segments."
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
"id": "url-002",
|
|
533
|
+
"rule": "Hyphens not underscores in URLs",
|
|
534
|
+
"description": "Google treats hyphens as word separators, underscores as joiners. 'json-formatter' = two words.",
|
|
535
|
+
"priority": "high",
|
|
536
|
+
"applies_to": [
|
|
537
|
+
"google",
|
|
538
|
+
"bing"
|
|
539
|
+
],
|
|
540
|
+
"implementation": "Always hyphens (-). Never underscores (_), spaces (%20), or camelCase.",
|
|
541
|
+
"validation": "Crawl URLs. Flag underscores or spaces. Set up redirects if both versions exist."
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
"id": "url-003",
|
|
545
|
+
"rule": "Keep URLs short and keyword-rich",
|
|
546
|
+
"description": "Shorter URLs are easier to share and display. Include primary keyword.",
|
|
547
|
+
"priority": "medium",
|
|
548
|
+
"applies_to": [
|
|
549
|
+
"google",
|
|
550
|
+
"bing"
|
|
551
|
+
],
|
|
552
|
+
"implementation": "3-5 words in path. Remove stop words. /blog/json-guide not /blog/the-complete-guide-to-json-formatting-in-2026.",
|
|
553
|
+
"validation": "Flag URLs over 75 characters in path."
|
|
554
|
+
},
|
|
555
|
+
{
|
|
556
|
+
"id": "url-004",
|
|
557
|
+
"rule": "Group topically similar pages in directories",
|
|
558
|
+
"description": "Logical directory structure helps search engines understand site organization.",
|
|
559
|
+
"priority": "medium",
|
|
560
|
+
"applies_to": [
|
|
561
|
+
"google",
|
|
562
|
+
"bing"
|
|
563
|
+
],
|
|
564
|
+
"implementation": "Group: /tools/json/formatter, /tools/json/validator. Consistent directory naming.",
|
|
565
|
+
"validation": "Review URL hierarchy. Similar content should share parent directories."
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"id": "url-005",
|
|
569
|
+
"rule": "Keywords in domain/path have minimal ranking effect",
|
|
570
|
+
"description": "Google confirmed keywords in URL have minimal direct ranking effect.",
|
|
571
|
+
"priority": "low",
|
|
572
|
+
"applies_to": [
|
|
573
|
+
"google",
|
|
574
|
+
"bing"
|
|
575
|
+
],
|
|
576
|
+
"implementation": "Choose domains for brand identity, not keyword matching. Include keywords in paths for user clarity.",
|
|
577
|
+
"validation": "Informational - don't over-optimize URLs for keywords."
|
|
578
|
+
}
|
|
579
|
+
]
|
|
580
|
+
},
|
|
581
|
+
"images": {
|
|
582
|
+
"name": "Image Optimization",
|
|
583
|
+
"description": "Rules for optimizing images for search discovery, performance, and visual search results.",
|
|
584
|
+
"rules": [
|
|
585
|
+
{
|
|
586
|
+
"id": "img-001",
|
|
587
|
+
"rule": "Short, descriptive filenames",
|
|
588
|
+
"description": "Filenames are signals for image understanding. Describe content with keywords.",
|
|
589
|
+
"priority": "medium",
|
|
590
|
+
"applies_to": [
|
|
591
|
+
"google",
|
|
592
|
+
"bing"
|
|
593
|
+
],
|
|
594
|
+
"implementation": "Use 'json-formatter-screenshot.webp' not 'IMG_20260412_001.jpg'. Hyphens, 3-5 words.",
|
|
595
|
+
"validation": "Flag generic camera names (IMG_, DSC_, Screenshot_) or random strings."
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"id": "img-002",
|
|
599
|
+
"rule": "Alt text describes image purpose in context",
|
|
600
|
+
"description": "Alt text should describe function on page, not just appearance. No keyword stuffing.",
|
|
601
|
+
"priority": "high",
|
|
602
|
+
"applies_to": [
|
|
603
|
+
"google",
|
|
604
|
+
"bing"
|
|
605
|
+
],
|
|
606
|
+
"implementation": "Describe what image shows AND why it's there. 'JSON Formatter showing formatted output' not 'json formatter free online json'.",
|
|
607
|
+
"validation": "Flag missing alt, keyword-stuffed alt (5+ keywords), or generic alt ('image', 'photo')."
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
"id": "img-003",
|
|
611
|
+
"rule": "Decorative images use empty alt",
|
|
612
|
+
"description": "Purely decorative images should have alt='' to be skipped by screen readers.",
|
|
613
|
+
"priority": "medium",
|
|
614
|
+
"applies_to": [
|
|
615
|
+
"google",
|
|
616
|
+
"bing"
|
|
617
|
+
],
|
|
618
|
+
"implementation": "<img src='divider.svg' alt='' role='presentation'>. Not alt='decorative image'.",
|
|
619
|
+
"validation": "Review decorative images for empty alt attribute."
|
|
620
|
+
},
|
|
621
|
+
{
|
|
622
|
+
"id": "img-004",
|
|
623
|
+
"rule": "Compress images and serve in modern formats",
|
|
624
|
+
"description": "Large images slow load, hurting Core Web Vitals. Use WebP/AVIF.",
|
|
625
|
+
"priority": "high",
|
|
626
|
+
"applies_to": [
|
|
627
|
+
"google",
|
|
628
|
+
"bing"
|
|
629
|
+
],
|
|
630
|
+
"implementation": "Convert to WebP/AVIF. Use <picture> with fallbacks. Compress to 80-85% quality. Use srcset.",
|
|
631
|
+
"validation": "Flag JPEG/PNG that could be WebP/AVIF. Photos over 200KB need investigation. Run Lighthouse."
|
|
632
|
+
},
|
|
633
|
+
{
|
|
634
|
+
"id": "img-005",
|
|
635
|
+
"rule": "Set explicit width and height to prevent CLS",
|
|
636
|
+
"description": "Without dimensions, images cause layout shift hurting CLS scores.",
|
|
637
|
+
"priority": "high",
|
|
638
|
+
"applies_to": [
|
|
639
|
+
"google",
|
|
640
|
+
"bing"
|
|
641
|
+
],
|
|
642
|
+
"implementation": "Add width and height to every <img>. CSS aspect-ratio as alternative.",
|
|
643
|
+
"validation": "Flag <img> missing width/height. Run Lighthouse CLS audit."
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
"id": "img-006",
|
|
647
|
+
"rule": "Use fetchpriority='high' on LCP image",
|
|
648
|
+
"description": "LCP image should be prioritized. fetchpriority tells browser to load first.",
|
|
649
|
+
"priority": "high",
|
|
650
|
+
"applies_to": [
|
|
651
|
+
"google",
|
|
652
|
+
"bing"
|
|
653
|
+
],
|
|
654
|
+
"implementation": "Identify LCP element. Add fetchpriority='high'. Ensure not lazy-loaded.",
|
|
655
|
+
"validation": "Use Lighthouse to identify LCP. Verify fetchpriority='high' and no loading='lazy'."
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
"id": "img-007",
|
|
659
|
+
"rule": "Responsive images with max-width 100%",
|
|
660
|
+
"description": "Images must not overflow containers on mobile.",
|
|
661
|
+
"priority": "high",
|
|
662
|
+
"applies_to": [
|
|
663
|
+
"google",
|
|
664
|
+
"bing"
|
|
665
|
+
],
|
|
666
|
+
"implementation": "CSS: img { max-width: 100%; height: auto; }. Use srcset and sizes for responsive serving.",
|
|
667
|
+
"validation": "Test at 320px. No horizontal scroll from images."
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
"id": "img-008",
|
|
671
|
+
"rule": "Google does NOT index CSS background images",
|
|
672
|
+
"description": "Only <img> with src are indexed. CSS background-image is not discoverable.",
|
|
673
|
+
"priority": "medium",
|
|
674
|
+
"applies_to": [
|
|
675
|
+
"google"
|
|
676
|
+
],
|
|
677
|
+
"implementation": "For indexable images, use <img> not CSS background-image.",
|
|
678
|
+
"validation": "Check if important images use CSS backgrounds. Convert to <img> if needed."
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
"id": "img-009",
|
|
682
|
+
"rule": "Use image sitemaps for hard-to-discover images",
|
|
683
|
+
"description": "JS-loaded or behind-interaction images may need image sitemap.",
|
|
684
|
+
"priority": "low",
|
|
685
|
+
"applies_to": [
|
|
686
|
+
"google",
|
|
687
|
+
"bing"
|
|
688
|
+
],
|
|
689
|
+
"implementation": "Add <image:image> in sitemap entries. Include URL, caption, title, license.",
|
|
690
|
+
"validation": "Verify important images in Google Images results. Add to sitemap if missing."
|
|
691
|
+
}
|
|
692
|
+
]
|
|
693
|
+
},
|
|
694
|
+
"structured_data": {
|
|
695
|
+
"name": "Structured Data / Schema.org",
|
|
696
|
+
"description": "Rules for structured data markup enabling rich results and helping AI systems understand page content.",
|
|
697
|
+
"rules": [
|
|
698
|
+
{
|
|
699
|
+
"id": "schema-001",
|
|
700
|
+
"rule": "JSON-LD is the preferred format",
|
|
701
|
+
"description": "Google recommends JSON-LD over Microdata or RDFa. Easier to implement and maintain.",
|
|
702
|
+
"priority": "critical",
|
|
703
|
+
"applies_to": [
|
|
704
|
+
"google",
|
|
705
|
+
"bing"
|
|
706
|
+
],
|
|
707
|
+
"implementation": "Add as <script type='application/ld+json'> in <head> or <body>. Don't use Microdata/RDFa for new implementations.",
|
|
708
|
+
"validation": "Check all structured data uses JSON-LD. Test with Rich Results Test and Schema.org Validator."
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"id": "schema-002",
|
|
712
|
+
"rule": "Embed in head or body as script tag",
|
|
713
|
+
"description": "JSON-LD can be placed anywhere in HTML. <head> preferred for clarity.",
|
|
714
|
+
"priority": "high",
|
|
715
|
+
"applies_to": [
|
|
716
|
+
"google",
|
|
717
|
+
"bing"
|
|
718
|
+
],
|
|
719
|
+
"implementation": "Place in <head> for consistency. For SPAs, ensure present in server-rendered HTML.",
|
|
720
|
+
"validation": "View page source (not DevTools) to confirm structured data in initial HTML."
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
"id": "schema-003",
|
|
724
|
+
"rule": "Must match visible page content exactly",
|
|
725
|
+
"description": "Structured data must accurately represent visible content. Violations result in manual actions.",
|
|
726
|
+
"priority": "critical",
|
|
727
|
+
"applies_to": [
|
|
728
|
+
"google",
|
|
729
|
+
"bing"
|
|
730
|
+
],
|
|
731
|
+
"implementation": "Every property should correspond to visible content. Rating 4.8 must be displayed. Price must be visible.",
|
|
732
|
+
"validation": "Compare structured data properties with visible content. Flag mismatches."
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
"id": "schema-004",
|
|
736
|
+
"rule": "Only mark up genuinely present content",
|
|
737
|
+
"description": "Don't add schema for non-existent content types on the page.",
|
|
738
|
+
"priority": "critical",
|
|
739
|
+
"applies_to": [
|
|
740
|
+
"google",
|
|
741
|
+
"bing"
|
|
742
|
+
],
|
|
743
|
+
"implementation": "Audit each page's schema against actual content. Remove speculative markup.",
|
|
744
|
+
"validation": "For each schema type, verify corresponding content exists and is visible."
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
"id": "schema-005",
|
|
748
|
+
"rule": "Use the most specific Schema.org type",
|
|
749
|
+
"description": "Use most specific type in hierarchy. SoftwareApplication not Thing. BlogPosting not Article.",
|
|
750
|
+
"priority": "high",
|
|
751
|
+
"applies_to": [
|
|
752
|
+
"google",
|
|
753
|
+
"bing",
|
|
754
|
+
"ai_engines"
|
|
755
|
+
],
|
|
756
|
+
"implementation": "Check Schema.org hierarchy. Tools: SoftwareApplication. Blog: BlogPosting. Docs: TechArticle.",
|
|
757
|
+
"validation": "Review @type properties. Check for more specific subtypes."
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
"id": "schema-006",
|
|
761
|
+
"rule": "Required schema types for key pages",
|
|
762
|
+
"description": "Homepage: WebSite+SearchAction+Organization. Interior: BreadcrumbList. Tools: SoftwareApplication. Blog: BlogPosting.",
|
|
763
|
+
"priority": "critical",
|
|
764
|
+
"applies_to": [
|
|
765
|
+
"google",
|
|
766
|
+
"bing",
|
|
767
|
+
"ai_engines"
|
|
768
|
+
],
|
|
769
|
+
"implementation": "Homepage: WebSite with SearchAction + Organization. All interior: BreadcrumbList. Tools: SoftwareApplication. Blog: BlogPosting with author, dates.",
|
|
770
|
+
"validation": "Checklist per page type. Verify with Rich Results Test."
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
"id": "schema-007",
|
|
774
|
+
"rule": "Use stable @id values to connect entities",
|
|
775
|
+
"description": "Use @id identifiers referenced across structured data to build knowledge graph.",
|
|
776
|
+
"priority": "high",
|
|
777
|
+
"applies_to": [
|
|
778
|
+
"google",
|
|
779
|
+
"bing",
|
|
780
|
+
"ai_engines"
|
|
781
|
+
],
|
|
782
|
+
"implementation": "URL-based @id: Organization @id: 'https://example.com/#organization'. Reference: 'publisher': {'@id': '...'}.",
|
|
783
|
+
"validation": "Check @id consistency across pages. Verify cross-references match."
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
"id": "schema-008",
|
|
787
|
+
"rule": "AggregateRating only if genuinely displayed",
|
|
788
|
+
"description": "Only add if real user ratings displayed. Fake ratings result in penalties.",
|
|
789
|
+
"priority": "critical",
|
|
790
|
+
"applies_to": [
|
|
791
|
+
"google",
|
|
792
|
+
"bing"
|
|
793
|
+
],
|
|
794
|
+
"implementation": "Only add if: real rating system, actual users, displayed on page, accurate values.",
|
|
795
|
+
"validation": "For every AggregateRating, verify rating visually displayed and matches values."
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
"id": "schema-009",
|
|
799
|
+
"rule": "Validate with Rich Results Test and Schema.org Validator",
|
|
800
|
+
"description": "Always validate before deploying. Both tools catch different issues.",
|
|
801
|
+
"priority": "high",
|
|
802
|
+
"applies_to": [
|
|
803
|
+
"google",
|
|
804
|
+
"bing"
|
|
805
|
+
],
|
|
806
|
+
"implementation": "Test with: Rich Results Test, Schema.org Validator, Bing Markup Validator. Fix all errors.",
|
|
807
|
+
"validation": "Run both validators on representative pages. Zero errors required."
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
"id": "schema-010",
|
|
811
|
+
"rule": "FAQPage restricted since late 2023",
|
|
812
|
+
"description": "Google restricted FAQPage rich results to government/health sites in August 2023.",
|
|
813
|
+
"priority": "medium",
|
|
814
|
+
"applies_to": [
|
|
815
|
+
"google"
|
|
816
|
+
],
|
|
817
|
+
"implementation": "Don't rely on FAQPage for rich results. Keep for AI/semantic purposes or remove.",
|
|
818
|
+
"validation": "If FAQPage exists, understand no rich results. Keep for AI or remove."
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
"id": "schema-011",
|
|
822
|
+
"rule": "HowTo rich results deprecated since September 2023",
|
|
823
|
+
"description": "HowTo no longer produces visual rich results in Google.",
|
|
824
|
+
"priority": "medium",
|
|
825
|
+
"applies_to": [
|
|
826
|
+
"google"
|
|
827
|
+
],
|
|
828
|
+
"implementation": "Don't add HowTo expecting rich results. Keep for semantic value or remove.",
|
|
829
|
+
"validation": "Check for HowTo schema. Decide: keep for semantic value or remove."
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
"id": "schema-012",
|
|
833
|
+
"rule": "Structured data enables rich results, not direct ranking boost",
|
|
834
|
+
"description": "Doesn't directly boost rankings. Enables rich results improving CTR ~35%.",
|
|
835
|
+
"priority": "medium",
|
|
836
|
+
"applies_to": [
|
|
837
|
+
"google",
|
|
838
|
+
"bing"
|
|
839
|
+
],
|
|
840
|
+
"implementation": "Implement for rich result benefits and AI understanding, not as ranking factor.",
|
|
841
|
+
"validation": "Monitor rich results in GSC Enhancements. Track CTR changes."
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
"id": "schema-013",
|
|
845
|
+
"rule": "~35% higher CTR with proper structured data",
|
|
846
|
+
"description": "Pages with rich results have ~35% higher click-through rates.",
|
|
847
|
+
"priority": "medium",
|
|
848
|
+
"applies_to": [
|
|
849
|
+
"google",
|
|
850
|
+
"bing"
|
|
851
|
+
],
|
|
852
|
+
"implementation": "Prioritize types producing visible rich results: Product, Article, BreadcrumbList, SoftwareApplication.",
|
|
853
|
+
"validation": "Compare CTR for pages with/without rich results in GSC."
|
|
854
|
+
}
|
|
855
|
+
]
|
|
856
|
+
},
|
|
857
|
+
"robots_txt": {
|
|
858
|
+
"name": "Robots.txt",
|
|
859
|
+
"description": "Rules for the robots.txt file controlling search engine crawler access.",
|
|
860
|
+
"rules": [
|
|
861
|
+
{
|
|
862
|
+
"id": "robots-001",
|
|
863
|
+
"rule": "Place at root as /robots.txt",
|
|
864
|
+
"description": "Must be at domain root, case-sensitive, lowercase, UTF-8 encoded.",
|
|
865
|
+
"priority": "critical",
|
|
866
|
+
"applies_to": [
|
|
867
|
+
"google",
|
|
868
|
+
"bing"
|
|
869
|
+
],
|
|
870
|
+
"implementation": "Create at web root. Serve with text/plain. UTF-8 encoding.",
|
|
871
|
+
"validation": "Access /robots.txt in browser. Verify 200 status and text/plain content type."
|
|
872
|
+
},
|
|
873
|
+
{
|
|
874
|
+
"id": "robots-002",
|
|
875
|
+
"rule": "Controls crawling, NOT indexing",
|
|
876
|
+
"description": "Controls whether bots crawl pages. Does NOT prevent indexing. Use noindex for that.",
|
|
877
|
+
"priority": "critical",
|
|
878
|
+
"applies_to": [
|
|
879
|
+
"google",
|
|
880
|
+
"bing"
|
|
881
|
+
],
|
|
882
|
+
"implementation": "Prevent crawling: robots.txt Disallow. Prevent indexing: <meta noindex>. Don't block AND noindex (bot can't see noindex if blocked).",
|
|
883
|
+
"validation": "Check if blocked pages still appear in results. If so, need noindex instead."
|
|
884
|
+
},
|
|
885
|
+
{
|
|
886
|
+
"id": "robots-003",
|
|
887
|
+
"rule": "Include Sitemap directive with absolute URL",
|
|
888
|
+
"description": "Sitemap directive tells bots where to find your sitemap.",
|
|
889
|
+
"priority": "high",
|
|
890
|
+
"applies_to": [
|
|
891
|
+
"google",
|
|
892
|
+
"bing"
|
|
893
|
+
],
|
|
894
|
+
"implementation": "Add: Sitemap: https://yourdomain.com/sitemap.xml. Absolute URL with HTTPS.",
|
|
895
|
+
"validation": "Check for Sitemap directive. Verify absolute URL. Access sitemap URL."
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
"id": "robots-004",
|
|
899
|
+
"rule": "Never block CSS/JS files needed for rendering",
|
|
900
|
+
"description": "Bots need to render pages. Blocking CSS/JS prevents proper rendering.",
|
|
901
|
+
"priority": "critical",
|
|
902
|
+
"applies_to": [
|
|
903
|
+
"google",
|
|
904
|
+
"bing"
|
|
905
|
+
],
|
|
906
|
+
"implementation": "Don't Disallow /static/, /assets/, /css/, /js/. Be specific if blocking.",
|
|
907
|
+
"validation": "Use URL Inspection to check rendering. If different from user view, check robots.txt."
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
"id": "robots-005",
|
|
911
|
+
"rule": "Bing supports Crawl-delay directive",
|
|
912
|
+
"description": "Bing respects Crawl-delay. Google does NOT (use Search Console).",
|
|
913
|
+
"priority": "low",
|
|
914
|
+
"applies_to": [
|
|
915
|
+
"bing"
|
|
916
|
+
],
|
|
917
|
+
"implementation": "For Bing: User-agent: Bingbot / Crawl-delay: 5. Only if server load is issue.",
|
|
918
|
+
"validation": "Check Crawl-delay in robots.txt. Verify under Bing-specific block."
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
"id": "robots-006",
|
|
922
|
+
"rule": "Pattern matching with wildcards",
|
|
923
|
+
"description": "Supports * (any chars) and $ (end of URL) for precise blocking.",
|
|
924
|
+
"priority": "medium",
|
|
925
|
+
"applies_to": [
|
|
926
|
+
"google",
|
|
927
|
+
"bing"
|
|
928
|
+
],
|
|
929
|
+
"implementation": "Block PDFs: /*.pdf$. Block params: /*?sort=. Block patterns: /admin/*.",
|
|
930
|
+
"validation": "Test patterns with robots.txt testers. Verify matches."
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
"id": "robots-007",
|
|
934
|
+
"rule": "Test with robots.txt testers before deploying",
|
|
935
|
+
"description": "Misconfigured robots.txt can block important pages.",
|
|
936
|
+
"priority": "high",
|
|
937
|
+
"applies_to": [
|
|
938
|
+
"google",
|
|
939
|
+
"bing"
|
|
940
|
+
],
|
|
941
|
+
"implementation": "Use GSC and Bing Webmaster Tools testers. Test critical URLs.",
|
|
942
|
+
"validation": "After changes, test: homepage, landing pages, sitemap, CSS/JS files."
|
|
943
|
+
}
|
|
944
|
+
]
|
|
945
|
+
},
|
|
946
|
+
"meta_robots": {
|
|
947
|
+
"name": "Meta Robots Tags",
|
|
948
|
+
"description": "Rules for meta robots tags and X-Robots-Tag HTTP header controlling indexing and snippet behavior.",
|
|
949
|
+
"rules": [
|
|
950
|
+
{
|
|
951
|
+
"id": "metarobots-001",
|
|
952
|
+
"rule": "Default is index, follow",
|
|
953
|
+
"description": "No tag needed for default behavior. Only add to change defaults.",
|
|
954
|
+
"priority": "medium",
|
|
955
|
+
"applies_to": [
|
|
956
|
+
"google",
|
|
957
|
+
"bing"
|
|
958
|
+
],
|
|
959
|
+
"implementation": "Don't add redundant 'index, follow'. Only add when changing default.",
|
|
960
|
+
"validation": "Remove any 'index, follow' only tags."
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
"id": "metarobots-002",
|
|
964
|
+
"rule": "noindex prevents page indexing",
|
|
965
|
+
"description": "Tells search engines not to include page in index. Crawler must access page to see it.",
|
|
966
|
+
"priority": "high",
|
|
967
|
+
"applies_to": [
|
|
968
|
+
"google",
|
|
969
|
+
"bing"
|
|
970
|
+
],
|
|
971
|
+
"implementation": "Apply to: admin, thank-you, internal search, staging, user-specific pages. Don't block in robots.txt AND noindex.",
|
|
972
|
+
"validation": "Search site:yourdomain.com for noindex pages appearing. Monitor GSC."
|
|
973
|
+
},
|
|
974
|
+
{
|
|
975
|
+
"id": "metarobots-003",
|
|
976
|
+
"rule": "nofollow prevents following links",
|
|
977
|
+
"description": "Tells bots not to follow or pass signals through links. Use sparingly.",
|
|
978
|
+
"priority": "medium",
|
|
979
|
+
"applies_to": [
|
|
980
|
+
"google",
|
|
981
|
+
"bing"
|
|
982
|
+
],
|
|
983
|
+
"implementation": "Use for untrusted/UGC pages. For individual links, use rel='nofollow' on <a> tag.",
|
|
984
|
+
"validation": "Review pages with nofollow. Ensure intentional."
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
"id": "metarobots-004",
|
|
988
|
+
"rule": "noarchive/nocache prevents cached copies",
|
|
989
|
+
"description": "Prevents cached copy display. Bing: 'nocache', Google: 'noarchive'.",
|
|
990
|
+
"priority": "low",
|
|
991
|
+
"applies_to": [
|
|
992
|
+
"google",
|
|
993
|
+
"bing"
|
|
994
|
+
],
|
|
995
|
+
"implementation": "Use for rapidly changing or privacy-sensitive content.",
|
|
996
|
+
"validation": "Check important pages don't have unneeded noarchive/nocache."
|
|
997
|
+
},
|
|
998
|
+
{
|
|
999
|
+
"id": "metarobots-005",
|
|
1000
|
+
"rule": "nosnippet prevents text snippets",
|
|
1001
|
+
"description": "Page appears with only title and URL. Generally not recommended.",
|
|
1002
|
+
"priority": "low",
|
|
1003
|
+
"applies_to": [
|
|
1004
|
+
"google",
|
|
1005
|
+
"bing"
|
|
1006
|
+
],
|
|
1007
|
+
"implementation": "Use only with specific reason. Snippets help CTR.",
|
|
1008
|
+
"validation": "Verify nosnippet is intentional on affected pages."
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
"id": "metarobots-006",
|
|
1012
|
+
"rule": "max-snippet limits snippet length",
|
|
1013
|
+
"description": "Limits text snippet to N characters. -1 for no limit, 0 for none.",
|
|
1014
|
+
"priority": "low",
|
|
1015
|
+
"applies_to": [
|
|
1016
|
+
"google",
|
|
1017
|
+
"bing"
|
|
1018
|
+
],
|
|
1019
|
+
"implementation": "<meta name='robots' content='max-snippet:150'>.",
|
|
1020
|
+
"validation": "If set, verify allows enough text (100+ chars)."
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
"id": "metarobots-007",
|
|
1024
|
+
"rule": "max-image-preview controls image preview size",
|
|
1025
|
+
"description": "Options: none, standard, large. 'large' required for Discover.",
|
|
1026
|
+
"priority": "medium",
|
|
1027
|
+
"applies_to": [
|
|
1028
|
+
"google",
|
|
1029
|
+
"bing"
|
|
1030
|
+
],
|
|
1031
|
+
"implementation": "Use 'large' for most pages for best visual presentation.",
|
|
1032
|
+
"validation": "Check content pages have max-image-preview:large."
|
|
1033
|
+
},
|
|
1034
|
+
{
|
|
1035
|
+
"id": "metarobots-008",
|
|
1036
|
+
"rule": "max-video-preview limits video preview duration",
|
|
1037
|
+
"description": "Controls preview duration in seconds. -1 for no limit.",
|
|
1038
|
+
"priority": "low",
|
|
1039
|
+
"applies_to": [
|
|
1040
|
+
"google",
|
|
1041
|
+
"bing"
|
|
1042
|
+
],
|
|
1043
|
+
"implementation": "Set to -1 (no limit) recommended.",
|
|
1044
|
+
"validation": "If video, verify allows sufficient preview."
|
|
1045
|
+
},
|
|
1046
|
+
{
|
|
1047
|
+
"id": "metarobots-009",
|
|
1048
|
+
"rule": "data-nosnippet excludes specific sections",
|
|
1049
|
+
"description": "HTML attribute excluding elements from snippets while allowing rest.",
|
|
1050
|
+
"priority": "low",
|
|
1051
|
+
"applies_to": [
|
|
1052
|
+
"google"
|
|
1053
|
+
],
|
|
1054
|
+
"implementation": "<div data-nosnippet>Excluded content</div>.",
|
|
1055
|
+
"validation": "Verify data-nosnippet on correct elements only."
|
|
1056
|
+
},
|
|
1057
|
+
{
|
|
1058
|
+
"id": "metarobots-010",
|
|
1059
|
+
"rule": "X-Robots-Tag HTTP header for non-HTML files",
|
|
1060
|
+
"description": "Applies directives to PDFs, images, videos via HTTP header.",
|
|
1061
|
+
"priority": "medium",
|
|
1062
|
+
"applies_to": [
|
|
1063
|
+
"google",
|
|
1064
|
+
"bing"
|
|
1065
|
+
],
|
|
1066
|
+
"implementation": "Set in server config. Example: X-Robots-Tag: noindex.",
|
|
1067
|
+
"validation": "Check HTTP headers of non-HTML resources."
|
|
1068
|
+
},
|
|
1069
|
+
{
|
|
1070
|
+
"id": "metarobots-011",
|
|
1071
|
+
"rule": "Bot must crawl page to see meta robots",
|
|
1072
|
+
"description": "If blocked by robots.txt, bot can't see meta directives.",
|
|
1073
|
+
"priority": "high",
|
|
1074
|
+
"applies_to": [
|
|
1075
|
+
"google",
|
|
1076
|
+
"bing"
|
|
1077
|
+
],
|
|
1078
|
+
"implementation": "Don't combine robots.txt blocking with noindex. Allow crawling for noindex to work.",
|
|
1079
|
+
"validation": "Cross-reference blocked URLs with noindex pages. Flag overlaps."
|
|
1080
|
+
},
|
|
1081
|
+
{
|
|
1082
|
+
"id": "metarobots-012",
|
|
1083
|
+
"rule": "More restrictive directive wins when conflicting",
|
|
1084
|
+
"description": "If index and noindex from different sources, noindex wins.",
|
|
1085
|
+
"priority": "medium",
|
|
1086
|
+
"applies_to": [
|
|
1087
|
+
"google",
|
|
1088
|
+
"bing"
|
|
1089
|
+
],
|
|
1090
|
+
"implementation": "Avoid conflicting directives across meta tags, HTTP headers, robots.txt.",
|
|
1091
|
+
"validation": "Check all directive sources for conflicts."
|
|
1092
|
+
}
|
|
1093
|
+
]
|
|
1094
|
+
},
|
|
1095
|
+
"sitemap_xml": {
|
|
1096
|
+
"name": "XML Sitemap",
|
|
1097
|
+
"description": "Rules for creating and maintaining XML sitemaps for URL discovery.",
|
|
1098
|
+
"rules": [
|
|
1099
|
+
{
|
|
1100
|
+
"id": "sitemap-001",
|
|
1101
|
+
"rule": "Include only canonical, indexable URLs",
|
|
1102
|
+
"description": "Only URLs returning 200, self-canonical, and indexable. No bad URLs.",
|
|
1103
|
+
"priority": "critical",
|
|
1104
|
+
"applies_to": [
|
|
1105
|
+
"google",
|
|
1106
|
+
"bing"
|
|
1107
|
+
],
|
|
1108
|
+
"implementation": "Filter: 200 OK, self-canonical, no noindex. Exclude redirects, 404s, noindex, non-canonical.",
|
|
1109
|
+
"validation": "Crawl sitemap URLs. Flag non-200, noindex, or non-canonical."
|
|
1110
|
+
},
|
|
1111
|
+
{
|
|
1112
|
+
"id": "sitemap-002",
|
|
1113
|
+
"rule": "No noindex, redirect, or blocked pages",
|
|
1114
|
+
"description": "Including these contradicts their directives.",
|
|
1115
|
+
"priority": "high",
|
|
1116
|
+
"applies_to": [
|
|
1117
|
+
"google",
|
|
1118
|
+
"bing"
|
|
1119
|
+
],
|
|
1120
|
+
"implementation": "Filter out noindex, redirecting, and robots.txt-blocked pages.",
|
|
1121
|
+
"validation": "Cross-reference sitemap with noindex, redirects, robots.txt blocks."
|
|
1122
|
+
},
|
|
1123
|
+
{
|
|
1124
|
+
"id": "sitemap-003",
|
|
1125
|
+
"rule": "Split at 50,000 URLs per file",
|
|
1126
|
+
"description": "Max 50,000 URLs and 50MB uncompressed per file.",
|
|
1127
|
+
"priority": "medium",
|
|
1128
|
+
"applies_to": [
|
|
1129
|
+
"google",
|
|
1130
|
+
"bing"
|
|
1131
|
+
],
|
|
1132
|
+
"implementation": "Use sitemap index for larger sites.",
|
|
1133
|
+
"validation": "Check file size (<50MB) and URL count (<50,000)."
|
|
1134
|
+
},
|
|
1135
|
+
{
|
|
1136
|
+
"id": "sitemap-004",
|
|
1137
|
+
"rule": "Accurate lastmod dates",
|
|
1138
|
+
"description": "Reflect actual content changes. Don't auto-set to today.",
|
|
1139
|
+
"priority": "high",
|
|
1140
|
+
"applies_to": [
|
|
1141
|
+
"google",
|
|
1142
|
+
"bing"
|
|
1143
|
+
],
|
|
1144
|
+
"implementation": "Track real modification dates. ISO 8601 format.",
|
|
1145
|
+
"validation": "Check dates against actual changes. Flag identical dates."
|
|
1146
|
+
},
|
|
1147
|
+
{
|
|
1148
|
+
"id": "sitemap-005",
|
|
1149
|
+
"rule": "Submit in GSC and Bing Webmaster Tools",
|
|
1150
|
+
"description": "Explicit submission ensures discovery and feedback.",
|
|
1151
|
+
"priority": "high",
|
|
1152
|
+
"applies_to": [
|
|
1153
|
+
"google",
|
|
1154
|
+
"bing"
|
|
1155
|
+
],
|
|
1156
|
+
"implementation": "Submit in both tools. Re-submit after major changes.",
|
|
1157
|
+
"validation": "Verify submitted and processed. Check for errors."
|
|
1158
|
+
},
|
|
1159
|
+
{
|
|
1160
|
+
"id": "sitemap-006",
|
|
1161
|
+
"rule": "Reference in robots.txt",
|
|
1162
|
+
"description": "Sitemap directive with absolute URL.",
|
|
1163
|
+
"priority": "high",
|
|
1164
|
+
"applies_to": [
|
|
1165
|
+
"google",
|
|
1166
|
+
"bing"
|
|
1167
|
+
],
|
|
1168
|
+
"implementation": "Add: Sitemap: https://yourdomain.com/sitemap.xml",
|
|
1169
|
+
"validation": "Check robots.txt for Sitemap directive."
|
|
1170
|
+
},
|
|
1171
|
+
{
|
|
1172
|
+
"id": "sitemap-007",
|
|
1173
|
+
"rule": "Update when pages added, removed, or changed",
|
|
1174
|
+
"description": "Keep sitemap current with live content.",
|
|
1175
|
+
"priority": "high",
|
|
1176
|
+
"applies_to": [
|
|
1177
|
+
"google",
|
|
1178
|
+
"bing"
|
|
1179
|
+
],
|
|
1180
|
+
"implementation": "Automate generation in build process.",
|
|
1181
|
+
"validation": "Compare sitemap with actual site URLs."
|
|
1182
|
+
}
|
|
1183
|
+
]
|
|
1184
|
+
},
|
|
1185
|
+
"canonicalization": {
|
|
1186
|
+
"name": "Canonicalization",
|
|
1187
|
+
"description": "Rules for canonical URLs preventing duplicate content and consolidating ranking signals.",
|
|
1188
|
+
"rules": [
|
|
1189
|
+
{
|
|
1190
|
+
"id": "canon-001",
|
|
1191
|
+
"rule": "Every indexable page should have self-referencing canonical",
|
|
1192
|
+
"description": "Confirms preferred URL version. Prevents parameter/trailing slash issues.",
|
|
1193
|
+
"priority": "critical",
|
|
1194
|
+
"applies_to": [
|
|
1195
|
+
"google",
|
|
1196
|
+
"bing"
|
|
1197
|
+
],
|
|
1198
|
+
"implementation": "Add <link rel='canonical' href='...'> pointing to own clean URL on every page.",
|
|
1199
|
+
"validation": "Crawl for missing canonical tags. Verify self-referencing correctness."
|
|
1200
|
+
},
|
|
1201
|
+
{
|
|
1202
|
+
"id": "canon-002",
|
|
1203
|
+
"rule": "Use rel='canonical' for duplicate content",
|
|
1204
|
+
"description": "Point all duplicate versions to preferred URL.",
|
|
1205
|
+
"priority": "high",
|
|
1206
|
+
"applies_to": [
|
|
1207
|
+
"google",
|
|
1208
|
+
"bing"
|
|
1209
|
+
],
|
|
1210
|
+
"implementation": "Identify duplicates (/page and /page?ref=email). Point duplicate to preferred.",
|
|
1211
|
+
"validation": "Verify duplicate groups all point to same canonical."
|
|
1212
|
+
},
|
|
1213
|
+
{
|
|
1214
|
+
"id": "canon-003",
|
|
1215
|
+
"rule": "Never point canonical to noindex page",
|
|
1216
|
+
"description": "Contradictory signals: canonical says index, noindex says don't.",
|
|
1217
|
+
"priority": "high",
|
|
1218
|
+
"applies_to": [
|
|
1219
|
+
"google",
|
|
1220
|
+
"bing"
|
|
1221
|
+
],
|
|
1222
|
+
"implementation": "Audit canonical targets. None should have noindex.",
|
|
1223
|
+
"validation": "Crawl canonical targets. Check for noindex."
|
|
1224
|
+
},
|
|
1225
|
+
{
|
|
1226
|
+
"id": "canon-004",
|
|
1227
|
+
"rule": "Never point canonical to a redirect",
|
|
1228
|
+
"description": "Should point to final destination, not redirecting URL.",
|
|
1229
|
+
"priority": "high",
|
|
1230
|
+
"applies_to": [
|
|
1231
|
+
"google",
|
|
1232
|
+
"bing"
|
|
1233
|
+
],
|
|
1234
|
+
"implementation": "Canonical URLs must resolve with 200, not 301/302.",
|
|
1235
|
+
"validation": "Check HTTP status of canonical targets. Flag redirects."
|
|
1236
|
+
},
|
|
1237
|
+
{
|
|
1238
|
+
"id": "canon-005",
|
|
1239
|
+
"rule": "Only one canonical tag per page",
|
|
1240
|
+
"description": "Multiple canonicals create ambiguity. May all be ignored.",
|
|
1241
|
+
"priority": "high",
|
|
1242
|
+
"applies_to": [
|
|
1243
|
+
"google",
|
|
1244
|
+
"bing"
|
|
1245
|
+
],
|
|
1246
|
+
"implementation": "Check for duplicates from CMS plugins or template layering.",
|
|
1247
|
+
"validation": "Parse rendered HTML. Count canonicals. Flag >1."
|
|
1248
|
+
},
|
|
1249
|
+
{
|
|
1250
|
+
"id": "canon-006",
|
|
1251
|
+
"rule": "Canonical must be in <head> section",
|
|
1252
|
+
"description": "Tags in <body> are ignored.",
|
|
1253
|
+
"priority": "high",
|
|
1254
|
+
"applies_to": [
|
|
1255
|
+
"google",
|
|
1256
|
+
"bing"
|
|
1257
|
+
],
|
|
1258
|
+
"implementation": "Place between <head> and </head>. Ensure in server-rendered HTML for SPAs.",
|
|
1259
|
+
"validation": "Verify canonical appears in <head> section."
|
|
1260
|
+
}
|
|
1261
|
+
]
|
|
1262
|
+
},
|
|
1263
|
+
"indexing": {
|
|
1264
|
+
"name": "Indexing Control",
|
|
1265
|
+
"description": "Rules for controlling which pages get indexed.",
|
|
1266
|
+
"rules": [
|
|
1267
|
+
{
|
|
1268
|
+
"id": "index-001",
|
|
1269
|
+
"rule": "noindex appropriate page types",
|
|
1270
|
+
"description": "Admin, thank-you, duplicates, staging, search results, login, profiles.",
|
|
1271
|
+
"priority": "high",
|
|
1272
|
+
"applies_to": [
|
|
1273
|
+
"google",
|
|
1274
|
+
"bing"
|
|
1275
|
+
],
|
|
1276
|
+
"implementation": "Apply <meta name='robots' content='noindex'> to non-public pages.",
|
|
1277
|
+
"validation": "List all page types. Verify noindex on non-public types."
|
|
1278
|
+
},
|
|
1279
|
+
{
|
|
1280
|
+
"id": "index-002",
|
|
1281
|
+
"rule": "robots.txt blocks crawling but NOT indexing",
|
|
1282
|
+
"description": "Blocked pages can still appear in results if linked from elsewhere.",
|
|
1283
|
+
"priority": "high",
|
|
1284
|
+
"applies_to": [
|
|
1285
|
+
"google",
|
|
1286
|
+
"bing"
|
|
1287
|
+
],
|
|
1288
|
+
"implementation": "Use noindex to prevent indexing. Don't block in robots.txt so crawler sees noindex.",
|
|
1289
|
+
"validation": "Search site:yourdomain.com for blocked pages. Switch to noindex."
|
|
1290
|
+
},
|
|
1291
|
+
{
|
|
1292
|
+
"id": "index-003",
|
|
1293
|
+
"rule": "Combine methods for complete removal",
|
|
1294
|
+
"description": "noindex + GSC removal request + 404/410 for complete removal.",
|
|
1295
|
+
"priority": "medium",
|
|
1296
|
+
"applies_to": [
|
|
1297
|
+
"google",
|
|
1298
|
+
"bing"
|
|
1299
|
+
],
|
|
1300
|
+
"implementation": "Add noindex, submit removal request, return 404/410 for deleted content.",
|
|
1301
|
+
"validation": "Monitor GSC for index status. Allow 2-4 weeks."
|
|
1302
|
+
},
|
|
1303
|
+
{
|
|
1304
|
+
"id": "index-004",
|
|
1305
|
+
"rule": "Use 404/410 for permanently removed content",
|
|
1306
|
+
"description": "410 signals permanent removal for faster de-indexing.",
|
|
1307
|
+
"priority": "medium",
|
|
1308
|
+
"applies_to": [
|
|
1309
|
+
"google",
|
|
1310
|
+
"bing"
|
|
1311
|
+
],
|
|
1312
|
+
"implementation": "Return 410 for permanent, 404 for temporary. Don't redirect to homepage.",
|
|
1313
|
+
"validation": "Check for soft 404s (200 status with 'not found' content)."
|
|
1314
|
+
},
|
|
1315
|
+
{
|
|
1316
|
+
"id": "index-005",
|
|
1317
|
+
"rule": "Index pruning for zero-traffic pages",
|
|
1318
|
+
"description": "Zero traffic 12+ months = wasting crawl budget.",
|
|
1319
|
+
"priority": "medium",
|
|
1320
|
+
"applies_to": [
|
|
1321
|
+
"google",
|
|
1322
|
+
"bing"
|
|
1323
|
+
],
|
|
1324
|
+
"implementation": "Analyze 12 months GSC data. Improve, consolidate, redirect, or noindex zero-traffic pages.",
|
|
1325
|
+
"validation": "Export GSC data. Filter zero-click pages in 12 months."
|
|
1326
|
+
}
|
|
1327
|
+
]
|
|
1328
|
+
},
|
|
1329
|
+
"core_web_vitals": {
|
|
1330
|
+
"name": "Core Web Vitals",
|
|
1331
|
+
"description": "Rules for meeting Google's Core Web Vitals performance thresholds.",
|
|
1332
|
+
"rules": [
|
|
1333
|
+
{
|
|
1334
|
+
"id": "cwv-001",
|
|
1335
|
+
"rule": "LCP under 2.5 seconds",
|
|
1336
|
+
"description": "Largest Contentful Paint. Good: <2.5s. Poor: >4s.",
|
|
1337
|
+
"priority": "critical",
|
|
1338
|
+
"applies_to": [
|
|
1339
|
+
"google"
|
|
1340
|
+
],
|
|
1341
|
+
"implementation": "fetchpriority='high' on LCP image, preload critical resources, WebP/AVIF, eliminate render-blocking.",
|
|
1342
|
+
"validation": "Test PageSpeed Insights. Monitor CrUX in GSC. Target <2.5s at 75th percentile."
|
|
1343
|
+
},
|
|
1344
|
+
{
|
|
1345
|
+
"id": "cwv-002",
|
|
1346
|
+
"rule": "CLS under 0.1",
|
|
1347
|
+
"description": "Cumulative Layout Shift. Good: <0.1. Poor: >0.25.",
|
|
1348
|
+
"priority": "critical",
|
|
1349
|
+
"applies_to": [
|
|
1350
|
+
"google"
|
|
1351
|
+
],
|
|
1352
|
+
"implementation": "Explicit width/height on images. Reserve space for ads. font-display: swap. No inserting above existing content.",
|
|
1353
|
+
"validation": "Test PageSpeed Insights. Target <0.1 at 75th percentile."
|
|
1354
|
+
},
|
|
1355
|
+
{
|
|
1356
|
+
"id": "cwv-003",
|
|
1357
|
+
"rule": "INP under 200ms",
|
|
1358
|
+
"description": "Interaction to Next Paint. Replaced FID March 2024. Good: <200ms. Poor: >500ms.",
|
|
1359
|
+
"priority": "critical",
|
|
1360
|
+
"applies_to": [
|
|
1361
|
+
"google"
|
|
1362
|
+
],
|
|
1363
|
+
"implementation": "scheduler.yield(), debounce handlers, defer non-critical JS, web workers for heavy computation.",
|
|
1364
|
+
"validation": "Monitor CrUX in GSC. Target <200ms at 75th percentile."
|
|
1365
|
+
},
|
|
1366
|
+
{
|
|
1367
|
+
"id": "cwv-004",
|
|
1368
|
+
"rule": "Fix LCP: preload, compress, prioritize",
|
|
1369
|
+
"description": "Preload LCP resource, compress images, fetchpriority='high', content-visibility: auto.",
|
|
1370
|
+
"priority": "high",
|
|
1371
|
+
"applies_to": [
|
|
1372
|
+
"google"
|
|
1373
|
+
],
|
|
1374
|
+
"implementation": "Identify LCP with Lighthouse. Preload, fetchpriority='high', WebP/AVIF, remove render-blocking.",
|
|
1375
|
+
"validation": "Run Lighthouse. Check LCP timing."
|
|
1376
|
+
},
|
|
1377
|
+
{
|
|
1378
|
+
"id": "cwv-005",
|
|
1379
|
+
"rule": "Fix CLS: explicit dimensions, reserved space, font-display",
|
|
1380
|
+
"description": "Width/height on images, min-height for ads, font-display: swap.",
|
|
1381
|
+
"priority": "high",
|
|
1382
|
+
"applies_to": [
|
|
1383
|
+
"google"
|
|
1384
|
+
],
|
|
1385
|
+
"implementation": "Images: always width/height. Ads: CSS min-height. Fonts: font-display: swap/optional.",
|
|
1386
|
+
"validation": "Run Lighthouse CLS audit. Total <0.1."
|
|
1387
|
+
},
|
|
1388
|
+
{
|
|
1389
|
+
"id": "cwv-006",
|
|
1390
|
+
"rule": "Fix INP: yield, debounce, defer",
|
|
1391
|
+
"description": "scheduler.yield(), debounce handlers, defer scripts, React.lazy.",
|
|
1392
|
+
"priority": "high",
|
|
1393
|
+
"applies_to": [
|
|
1394
|
+
"google"
|
|
1395
|
+
],
|
|
1396
|
+
"implementation": "scheduler.yield() or requestIdleCallback. Debounce scroll/resize/input. async/defer on scripts.",
|
|
1397
|
+
"validation": "Chrome DevTools Performance panel. No >200ms blocking during interaction."
|
|
1398
|
+
}
|
|
1399
|
+
]
|
|
1400
|
+
},
|
|
1401
|
+
"mobile_first": {
|
|
1402
|
+
"name": "Mobile-First Design",
|
|
1403
|
+
"description": "Rules for mobile-first design since Google uses mobile-first indexing.",
|
|
1404
|
+
"rules": [
|
|
1405
|
+
{
|
|
1406
|
+
"id": "mobile-001",
|
|
1407
|
+
"rule": "Google uses mobile version for indexing/ranking",
|
|
1408
|
+
"description": "Mobile version is what Google crawls, indexes, ranks.",
|
|
1409
|
+
"priority": "critical",
|
|
1410
|
+
"applies_to": [
|
|
1411
|
+
"google"
|
|
1412
|
+
],
|
|
1413
|
+
"implementation": "All content, links, structured data, meta tags on mobile. Responsive design. Test Mobile-Friendly.",
|
|
1414
|
+
"validation": "URL Inspection in GSC. Compare mobile/desktop rendered pages."
|
|
1415
|
+
},
|
|
1416
|
+
{
|
|
1417
|
+
"id": "mobile-002",
|
|
1418
|
+
"rule": "Same content on mobile and desktop",
|
|
1419
|
+
"description": "Hidden mobile content = hidden from Google's index.",
|
|
1420
|
+
"priority": "critical",
|
|
1421
|
+
"applies_to": [
|
|
1422
|
+
"google"
|
|
1423
|
+
],
|
|
1424
|
+
"implementation": "Don't hide content on mobile. Accordion/tab content should be in DOM.",
|
|
1425
|
+
"validation": "Compare rendered content at mobile vs desktop widths."
|
|
1426
|
+
},
|
|
1427
|
+
{
|
|
1428
|
+
"id": "mobile-003",
|
|
1429
|
+
"rule": "Structured data must be on mobile pages",
|
|
1430
|
+
"description": "JSON-LD must be in mobile HTML for mobile-first indexing.",
|
|
1431
|
+
"priority": "high",
|
|
1432
|
+
"applies_to": [
|
|
1433
|
+
"google"
|
|
1434
|
+
],
|
|
1435
|
+
"implementation": "Ensure JSON-LD in mobile-served HTML. Automatic for responsive.",
|
|
1436
|
+
"validation": "Test mobile URL with Rich Results Test."
|
|
1437
|
+
},
|
|
1438
|
+
{
|
|
1439
|
+
"id": "mobile-004",
|
|
1440
|
+
"rule": "Minimum 16px body text",
|
|
1441
|
+
"description": "Text <16px difficult to read without zooming.",
|
|
1442
|
+
"priority": "high",
|
|
1443
|
+
"applies_to": [
|
|
1444
|
+
"google",
|
|
1445
|
+
"bing"
|
|
1446
|
+
],
|
|
1447
|
+
"implementation": "Base font-size 16px. No important text <14px. Use rem/em.",
|
|
1448
|
+
"validation": "Mobile-Friendly Test. Lighthouse 'Text too small'."
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
"id": "mobile-005",
|
|
1452
|
+
"rule": "Touch targets 48x48px with spacing",
|
|
1453
|
+
"description": "Interactive elements 48x48px minimum with 8px+ spacing.",
|
|
1454
|
+
"priority": "high",
|
|
1455
|
+
"applies_to": [
|
|
1456
|
+
"google",
|
|
1457
|
+
"bing"
|
|
1458
|
+
],
|
|
1459
|
+
"implementation": "Min 48px touch targets. 8px+ spacing. Use padding.",
|
|
1460
|
+
"validation": "Lighthouse tap target audit. Flag <48px."
|
|
1461
|
+
},
|
|
1462
|
+
{
|
|
1463
|
+
"id": "mobile-006",
|
|
1464
|
+
"rule": "No intrusive interstitials",
|
|
1465
|
+
"description": "Full-screen mobile popups lower rankings.",
|
|
1466
|
+
"priority": "high",
|
|
1467
|
+
"applies_to": [
|
|
1468
|
+
"google"
|
|
1469
|
+
],
|
|
1470
|
+
"implementation": "No full-screen popups on mobile load. OK: small banners, legal notices.",
|
|
1471
|
+
"validation": "Test landing pages on mobile for blocking popups."
|
|
1472
|
+
},
|
|
1473
|
+
{
|
|
1474
|
+
"id": "mobile-007",
|
|
1475
|
+
"rule": "Responsive design preferred",
|
|
1476
|
+
"description": "Google recommends responsive over separate mobile URLs.",
|
|
1477
|
+
"priority": "high",
|
|
1478
|
+
"applies_to": [
|
|
1479
|
+
"google",
|
|
1480
|
+
"bing"
|
|
1481
|
+
],
|
|
1482
|
+
"implementation": "CSS media queries. <meta name='viewport' content='width=device-width, initial-scale=1'>. Same HTML all devices.",
|
|
1483
|
+
"validation": "Verify viewport meta. Test at multiple widths. No horizontal scroll."
|
|
1484
|
+
}
|
|
1485
|
+
]
|
|
1486
|
+
},
|
|
1487
|
+
"https_security": {
|
|
1488
|
+
"name": "HTTPS & Security",
|
|
1489
|
+
"description": "Rules for HTTPS implementation, a confirmed ranking signal.",
|
|
1490
|
+
"rules": [
|
|
1491
|
+
{
|
|
1492
|
+
"id": "https-001",
|
|
1493
|
+
"rule": "Valid auto-renewing SSL/TLS certificate",
|
|
1494
|
+
"description": "HTTPS is confirmed ranking signal. Must be valid, trusted, auto-renewing.",
|
|
1495
|
+
"priority": "critical",
|
|
1496
|
+
"applies_to": [
|
|
1497
|
+
"google",
|
|
1498
|
+
"bing"
|
|
1499
|
+
],
|
|
1500
|
+
"implementation": "Use Let's Encrypt or trusted CA. Auto-renewal. TLS 1.2+.",
|
|
1501
|
+
"validation": "SSL Labs test. Verify auto-renewal. Monitor expiration."
|
|
1502
|
+
},
|
|
1503
|
+
{
|
|
1504
|
+
"id": "https-002",
|
|
1505
|
+
"rule": "All HTTP 301 redirected to HTTPS",
|
|
1506
|
+
"description": "Every HTTP URL must 301 to HTTPS.",
|
|
1507
|
+
"priority": "critical",
|
|
1508
|
+
"applies_to": [
|
|
1509
|
+
"google",
|
|
1510
|
+
"bing"
|
|
1511
|
+
],
|
|
1512
|
+
"implementation": "Server-level 301 from http:// to https://. Add HSTS header.",
|
|
1513
|
+
"validation": "Test HTTP URLs. Verify 301 to HTTPS. Check HSTS."
|
|
1514
|
+
},
|
|
1515
|
+
{
|
|
1516
|
+
"id": "https-003",
|
|
1517
|
+
"rule": "All internal links use HTTPS",
|
|
1518
|
+
"description": "Prevent unnecessary redirects and clean link graph.",
|
|
1519
|
+
"priority": "high",
|
|
1520
|
+
"applies_to": [
|
|
1521
|
+
"google",
|
|
1522
|
+
"bing"
|
|
1523
|
+
],
|
|
1524
|
+
"implementation": "Use https:// or protocol-relative in all internal links.",
|
|
1525
|
+
"validation": "Crawl internal links. Flag http://."
|
|
1526
|
+
},
|
|
1527
|
+
{
|
|
1528
|
+
"id": "https-004",
|
|
1529
|
+
"rule": "Canonical tags point to HTTPS",
|
|
1530
|
+
"description": "Canonical URLs must use HTTPS.",
|
|
1531
|
+
"priority": "high",
|
|
1532
|
+
"applies_to": [
|
|
1533
|
+
"google",
|
|
1534
|
+
"bing"
|
|
1535
|
+
],
|
|
1536
|
+
"implementation": "Ensure all canonicals use https://.",
|
|
1537
|
+
"validation": "Crawl canonical URLs. Flag http://."
|
|
1538
|
+
},
|
|
1539
|
+
{
|
|
1540
|
+
"id": "https-005",
|
|
1541
|
+
"rule": "Sitemap uses HTTPS URLs only",
|
|
1542
|
+
"description": "All sitemap URLs must be HTTPS.",
|
|
1543
|
+
"priority": "high",
|
|
1544
|
+
"applies_to": [
|
|
1545
|
+
"google",
|
|
1546
|
+
"bing"
|
|
1547
|
+
],
|
|
1548
|
+
"implementation": "Ensure sitemap generation uses https://.",
|
|
1549
|
+
"validation": "Parse sitemap. Check all URLs start with https://."
|
|
1550
|
+
},
|
|
1551
|
+
{
|
|
1552
|
+
"id": "https-006",
|
|
1553
|
+
"rule": "No mixed content",
|
|
1554
|
+
"description": "HTTPS pages must not load HTTP resources.",
|
|
1555
|
+
"priority": "high",
|
|
1556
|
+
"applies_to": [
|
|
1557
|
+
"google",
|
|
1558
|
+
"bing"
|
|
1559
|
+
],
|
|
1560
|
+
"implementation": "All resources over HTTPS. Add CSP: upgrade-insecure-requests.",
|
|
1561
|
+
"validation": "Chrome DevTools for mixed content warnings. Lighthouse security audit."
|
|
1562
|
+
}
|
|
1563
|
+
]
|
|
1564
|
+
},
|
|
1565
|
+
"internal_linking": {
|
|
1566
|
+
"name": "Internal Linking",
|
|
1567
|
+
"description": "Rules for effective internal link structure.",
|
|
1568
|
+
"rules": [
|
|
1569
|
+
{
|
|
1570
|
+
"id": "intlink-001",
|
|
1571
|
+
"rule": "2-6 internal links per important page",
|
|
1572
|
+
"description": "Important pages need multiple contextual internal links.",
|
|
1573
|
+
"priority": "high",
|
|
1574
|
+
"applies_to": [
|
|
1575
|
+
"google",
|
|
1576
|
+
"bing"
|
|
1577
|
+
],
|
|
1578
|
+
"implementation": "Ensure 2-6 pages link to each important page with relevant anchors.",
|
|
1579
|
+
"validation": "Crawl tool: check internal link counts. Flag <2."
|
|
1580
|
+
},
|
|
1581
|
+
{
|
|
1582
|
+
"id": "intlink-002",
|
|
1583
|
+
"rule": "Descriptive anchor text",
|
|
1584
|
+
"description": "Describe target page. Never 'click here' or 'read more'.",
|
|
1585
|
+
"priority": "high",
|
|
1586
|
+
"applies_to": [
|
|
1587
|
+
"google",
|
|
1588
|
+
"bing"
|
|
1589
|
+
],
|
|
1590
|
+
"implementation": "'Our JSON formatter tool' not 'click here'.",
|
|
1591
|
+
"validation": "Extract anchor text. Flag generic anchors."
|
|
1592
|
+
},
|
|
1593
|
+
{
|
|
1594
|
+
"id": "intlink-003",
|
|
1595
|
+
"rule": "Use crawlable <a href> elements",
|
|
1596
|
+
"description": "Standard <a href> required for bot discovery.",
|
|
1597
|
+
"priority": "critical",
|
|
1598
|
+
"applies_to": [
|
|
1599
|
+
"google",
|
|
1600
|
+
"bing"
|
|
1601
|
+
],
|
|
1602
|
+
"implementation": "Always <a href='/path'>. No onClick-only navigation.",
|
|
1603
|
+
"validation": "Check navigation uses <a href>. Disable JS to verify."
|
|
1604
|
+
},
|
|
1605
|
+
{
|
|
1606
|
+
"id": "intlink-004",
|
|
1607
|
+
"rule": "Every important page within 3 clicks of homepage",
|
|
1608
|
+
"description": "Deep pages get less crawl priority.",
|
|
1609
|
+
"priority": "high",
|
|
1610
|
+
"applies_to": [
|
|
1611
|
+
"google",
|
|
1612
|
+
"bing"
|
|
1613
|
+
],
|
|
1614
|
+
"implementation": "Use breadcrumbs, categories, footer links to reduce depth.",
|
|
1615
|
+
"validation": "Measure click depth. Flag 4+ clicks."
|
|
1616
|
+
},
|
|
1617
|
+
{
|
|
1618
|
+
"id": "intlink-005",
|
|
1619
|
+
"rule": "No orphan pages",
|
|
1620
|
+
"description": "Pages with no internal links are undiscoverable.",
|
|
1621
|
+
"priority": "high",
|
|
1622
|
+
"applies_to": [
|
|
1623
|
+
"google",
|
|
1624
|
+
"bing"
|
|
1625
|
+
],
|
|
1626
|
+
"implementation": "Every sitemap page needs at least one internal link.",
|
|
1627
|
+
"validation": "Compare sitemap with crawled URLs. Orphans = in sitemap but not crawled."
|
|
1628
|
+
},
|
|
1629
|
+
{
|
|
1630
|
+
"id": "intlink-006",
|
|
1631
|
+
"rule": "Fix broken internal links",
|
|
1632
|
+
"description": "404 links waste budget and hurt UX.",
|
|
1633
|
+
"priority": "high",
|
|
1634
|
+
"applies_to": [
|
|
1635
|
+
"google",
|
|
1636
|
+
"bing"
|
|
1637
|
+
],
|
|
1638
|
+
"implementation": "Monthly crawl for broken links. Update, redirect, or remove.",
|
|
1639
|
+
"validation": "Monthly crawl. Fix all broken links."
|
|
1640
|
+
},
|
|
1641
|
+
{
|
|
1642
|
+
"id": "intlink-007",
|
|
1643
|
+
"rule": "Flatten redirect chains",
|
|
1644
|
+
"description": "A->B->C wastes budget. Link directly to C.",
|
|
1645
|
+
"priority": "medium",
|
|
1646
|
+
"applies_to": [
|
|
1647
|
+
"google",
|
|
1648
|
+
"bing"
|
|
1649
|
+
],
|
|
1650
|
+
"implementation": "Update internal links to final URL. Fix redirects to single-hop.",
|
|
1651
|
+
"validation": "Crawl for chains. Target zero chains."
|
|
1652
|
+
}
|
|
1653
|
+
]
|
|
1654
|
+
},
|
|
1655
|
+
"external_links": {
|
|
1656
|
+
"name": "External Links",
|
|
1657
|
+
"description": "Rules for outbound links and link profile.",
|
|
1658
|
+
"rules": [
|
|
1659
|
+
{
|
|
1660
|
+
"id": "extlink-001",
|
|
1661
|
+
"rule": "Link only to trustworthy resources",
|
|
1662
|
+
"description": "Linking to spam hurts trust signals.",
|
|
1663
|
+
"priority": "high",
|
|
1664
|
+
"applies_to": [
|
|
1665
|
+
"google",
|
|
1666
|
+
"bing"
|
|
1667
|
+
],
|
|
1668
|
+
"implementation": "Only reputable, authoritative sources.",
|
|
1669
|
+
"validation": "Audit outbound links periodically."
|
|
1670
|
+
},
|
|
1671
|
+
{
|
|
1672
|
+
"id": "extlink-002",
|
|
1673
|
+
"rule": "nofollow on untrusted/user-generated links",
|
|
1674
|
+
"description": "rel='nofollow' on UGC and untrusted links. rel='ugc' for UGC. rel='sponsored' for paid.",
|
|
1675
|
+
"priority": "high",
|
|
1676
|
+
"applies_to": [
|
|
1677
|
+
"google",
|
|
1678
|
+
"bing"
|
|
1679
|
+
],
|
|
1680
|
+
"implementation": "nofollow on comments, user URLs. ugc for UGC. sponsored for paid.",
|
|
1681
|
+
"validation": "Check UGC areas for missing nofollow/ugc."
|
|
1682
|
+
},
|
|
1683
|
+
{
|
|
1684
|
+
"id": "extlink-003",
|
|
1685
|
+
"rule": "Quality over quantity for inbound links",
|
|
1686
|
+
"description": "Few high-authority links > hundreds of low-quality.",
|
|
1687
|
+
"priority": "high",
|
|
1688
|
+
"applies_to": [
|
|
1689
|
+
"google",
|
|
1690
|
+
"bing"
|
|
1691
|
+
],
|
|
1692
|
+
"implementation": "Create link-worthy content. Build relationships. Avoid mass link-building.",
|
|
1693
|
+
"validation": "Monitor in GSC and Bing. Disavow toxic if needed."
|
|
1694
|
+
},
|
|
1695
|
+
{
|
|
1696
|
+
"id": "extlink-004",
|
|
1697
|
+
"rule": "No buying or selling links",
|
|
1698
|
+
"description": "Prohibited. Results in penalties.",
|
|
1699
|
+
"priority": "critical",
|
|
1700
|
+
"applies_to": [
|
|
1701
|
+
"google",
|
|
1702
|
+
"bing"
|
|
1703
|
+
],
|
|
1704
|
+
"implementation": "Never buy links. rel='sponsored' on paid links. Earn natural links.",
|
|
1705
|
+
"validation": "Audit practices. Check GSC manual actions."
|
|
1706
|
+
},
|
|
1707
|
+
{
|
|
1708
|
+
"id": "extlink-005",
|
|
1709
|
+
"rule": "Diverse, natural anchor text",
|
|
1710
|
+
"description": "Unnatural anchor profile signals manipulation.",
|
|
1711
|
+
"priority": "medium",
|
|
1712
|
+
"applies_to": [
|
|
1713
|
+
"google",
|
|
1714
|
+
"bing"
|
|
1715
|
+
],
|
|
1716
|
+
"implementation": "Don't over-optimize anchors. Use brand, URL, natural phrases.",
|
|
1717
|
+
"validation": "Check distribution. >30% exact-match = suspicious."
|
|
1718
|
+
},
|
|
1719
|
+
{
|
|
1720
|
+
"id": "extlink-006",
|
|
1721
|
+
"rule": "No link farms, PBNs, or automated building",
|
|
1722
|
+
"description": "All link schemes violate guidelines.",
|
|
1723
|
+
"priority": "critical",
|
|
1724
|
+
"applies_to": [
|
|
1725
|
+
"google",
|
|
1726
|
+
"bing"
|
|
1727
|
+
],
|
|
1728
|
+
"implementation": "No PBNs, link wheels, automated submissions. Build through relationships.",
|
|
1729
|
+
"validation": "Review all link activities. Check GSC manual actions."
|
|
1730
|
+
}
|
|
1731
|
+
]
|
|
1732
|
+
},
|
|
1733
|
+
"error_pages_404": {
|
|
1734
|
+
"name": "404 Error Pages",
|
|
1735
|
+
"description": "Rules for handling missing pages.",
|
|
1736
|
+
"rules": [
|
|
1737
|
+
{
|
|
1738
|
+
"id": "error-001",
|
|
1739
|
+
"rule": "Return proper 404 HTTP status",
|
|
1740
|
+
"description": "Must return 404, not 200 (soft 404). Confuses search engines.",
|
|
1741
|
+
"priority": "critical",
|
|
1742
|
+
"applies_to": [
|
|
1743
|
+
"google",
|
|
1744
|
+
"bing"
|
|
1745
|
+
],
|
|
1746
|
+
"implementation": "Configure server for 404 on missing pages. SPAs: handle unknown routes with 404.",
|
|
1747
|
+
"validation": "Request non-existent URLs. Verify 404 status. GSC reports soft 404s."
|
|
1748
|
+
},
|
|
1749
|
+
{
|
|
1750
|
+
"id": "error-002",
|
|
1751
|
+
"rule": "Use 410 for permanently removed content",
|
|
1752
|
+
"description": "410 signals permanent removal for faster de-indexing.",
|
|
1753
|
+
"priority": "medium",
|
|
1754
|
+
"applies_to": [
|
|
1755
|
+
"google",
|
|
1756
|
+
"bing"
|
|
1757
|
+
],
|
|
1758
|
+
"implementation": "Return 410 for permanently removed. 404 for never-existed.",
|
|
1759
|
+
"validation": "Verify deleted URLs return 410."
|
|
1760
|
+
},
|
|
1761
|
+
{
|
|
1762
|
+
"id": "error-003",
|
|
1763
|
+
"rule": "Custom 404 page with search and navigation",
|
|
1764
|
+
"description": "Retains users hitting broken URLs.",
|
|
1765
|
+
"priority": "medium",
|
|
1766
|
+
"applies_to": [
|
|
1767
|
+
"google",
|
|
1768
|
+
"bing"
|
|
1769
|
+
],
|
|
1770
|
+
"implementation": "Include: search box, popular links, navigation, friendly message.",
|
|
1771
|
+
"validation": "Visit non-existent URL. Verify custom 404, search, navigation, 404 status."
|
|
1772
|
+
},
|
|
1773
|
+
{
|
|
1774
|
+
"id": "error-004",
|
|
1775
|
+
"rule": "Don't redirect all 404s to homepage",
|
|
1776
|
+
"description": "Blanket homepage redirect = poor UX and confusing signals.",
|
|
1777
|
+
"priority": "high",
|
|
1778
|
+
"applies_to": [
|
|
1779
|
+
"google",
|
|
1780
|
+
"bing"
|
|
1781
|
+
],
|
|
1782
|
+
"implementation": "Moved: 301 to new URL. Deleted: 404/410 with helpful page. Never mass-redirect.",
|
|
1783
|
+
"validation": "Test non-existent URLs. None should redirect to homepage."
|
|
1784
|
+
},
|
|
1785
|
+
{
|
|
1786
|
+
"id": "error-005",
|
|
1787
|
+
"rule": "Monitor crawl errors regularly",
|
|
1788
|
+
"description": "Regular monitoring catches problems early.",
|
|
1789
|
+
"priority": "high",
|
|
1790
|
+
"applies_to": [
|
|
1791
|
+
"google",
|
|
1792
|
+
"bing"
|
|
1793
|
+
],
|
|
1794
|
+
"implementation": "Check GSC and Bing weekly. Alert on spikes.",
|
|
1795
|
+
"validation": "Review reports. Track counts. Investigate increases."
|
|
1796
|
+
},
|
|
1797
|
+
{
|
|
1798
|
+
"id": "error-006",
|
|
1799
|
+
"rule": "Fix broken internal links promptly",
|
|
1800
|
+
"description": "Internal 404 links indicate poor maintenance.",
|
|
1801
|
+
"priority": "high",
|
|
1802
|
+
"applies_to": [
|
|
1803
|
+
"google",
|
|
1804
|
+
"bing"
|
|
1805
|
+
],
|
|
1806
|
+
"implementation": "Crawl regularly. Update, redirect, or remove broken links.",
|
|
1807
|
+
"validation": "Monthly crawl. Target zero broken internal links."
|
|
1808
|
+
}
|
|
1809
|
+
]
|
|
1810
|
+
},
|
|
1811
|
+
"ai_search_optimization": {
|
|
1812
|
+
"name": "AI Search Optimization (AEO)",
|
|
1813
|
+
"description": "Rules for AI-powered search engines, LLMs, and answer engines.",
|
|
1814
|
+
"rules": [
|
|
1815
|
+
{
|
|
1816
|
+
"id": "aeo-001",
|
|
1817
|
+
"rule": "Allow AI crawlers in robots.txt",
|
|
1818
|
+
"description": "Don't block: GPTBot, ChatGPT-User, ClaudeBot, PerplexityBot, Google-Extended, Amazonbot, Applebot, cohere-ai, YouBot, BraveBot, Bytespider, FacebookBot, CCBot.",
|
|
1819
|
+
"priority": "critical",
|
|
1820
|
+
"applies_to": [
|
|
1821
|
+
"ai_engines"
|
|
1822
|
+
],
|
|
1823
|
+
"implementation": "Don't block AI crawler user agents. Ensure User-agent: * doesn't block important content.",
|
|
1824
|
+
"validation": "Review robots.txt for AI crawler blocks. Test each user-agent."
|
|
1825
|
+
},
|
|
1826
|
+
{
|
|
1827
|
+
"id": "aeo-002",
|
|
1828
|
+
"rule": "Consider creating llms.txt at site root",
|
|
1829
|
+
"description": "Emerging standard providing LLMs guidance about your site.",
|
|
1830
|
+
"priority": "medium",
|
|
1831
|
+
"applies_to": [
|
|
1832
|
+
"ai_engines"
|
|
1833
|
+
],
|
|
1834
|
+
"implementation": "Create /llms.txt with: site description, content categories, citation format, key pages, licensing.",
|
|
1835
|
+
"validation": "Access /llms.txt. Verify useful information."
|
|
1836
|
+
},
|
|
1837
|
+
{
|
|
1838
|
+
"id": "aeo-003",
|
|
1839
|
+
"rule": "Clear H2/H3 headings for extraction",
|
|
1840
|
+
"description": "AI parses headings to extract sections. Clear headings improve citation.",
|
|
1841
|
+
"priority": "high",
|
|
1842
|
+
"applies_to": [
|
|
1843
|
+
"ai_engines"
|
|
1844
|
+
],
|
|
1845
|
+
"implementation": "Question-format headings: 'What Is JSON?' not 'Introduction'. Self-explanatory.",
|
|
1846
|
+
"validation": "Read heading outline. Each should clearly indicate content topic."
|
|
1847
|
+
},
|
|
1848
|
+
{
|
|
1849
|
+
"id": "aeo-004",
|
|
1850
|
+
"rule": "Short paragraphs with direct answers",
|
|
1851
|
+
"description": "AI prefers concise, extractable content.",
|
|
1852
|
+
"priority": "high",
|
|
1853
|
+
"applies_to": [
|
|
1854
|
+
"ai_engines"
|
|
1855
|
+
],
|
|
1856
|
+
"implementation": "2-3 sentences per paragraph. Start with key point. Answer immediately after question headings.",
|
|
1857
|
+
"validation": "Paragraphs under 100 words. First sentences contain key info."
|
|
1858
|
+
},
|
|
1859
|
+
{
|
|
1860
|
+
"id": "aeo-005",
|
|
1861
|
+
"rule": "Definition lists 30-40% more cited by LLMs",
|
|
1862
|
+
"description": "HTML <dl>/<dt>/<dd> particularly effective for AI citation.",
|
|
1863
|
+
"priority": "high",
|
|
1864
|
+
"applies_to": [
|
|
1865
|
+
"ai_engines"
|
|
1866
|
+
],
|
|
1867
|
+
"implementation": "Use for glossaries, features, FAQ. <dl><dt>Term</dt><dd>Definition</dd></dl>.",
|
|
1868
|
+
"validation": "Identify suitable content. Verify proper HTML structure."
|
|
1869
|
+
},
|
|
1870
|
+
{
|
|
1871
|
+
"id": "aeo-006",
|
|
1872
|
+
"rule": "BLUF method for AI citation",
|
|
1873
|
+
"description": "Core answer in first sentence maximizes citation likelihood.",
|
|
1874
|
+
"priority": "high",
|
|
1875
|
+
"applies_to": [
|
|
1876
|
+
"ai_engines"
|
|
1877
|
+
],
|
|
1878
|
+
"implementation": "Sentence 1 = answer, 2-3 = evidence, rest = examples. Inverted pyramid.",
|
|
1879
|
+
"validation": "First sentence of each section: standalone answer?"
|
|
1880
|
+
},
|
|
1881
|
+
{
|
|
1882
|
+
"id": "aeo-007",
|
|
1883
|
+
"rule": "Cite authoritative sources with statistics",
|
|
1884
|
+
"description": "Sourced statistics = 30-40% more AI visibility.",
|
|
1885
|
+
"priority": "high",
|
|
1886
|
+
"applies_to": [
|
|
1887
|
+
"ai_engines"
|
|
1888
|
+
],
|
|
1889
|
+
"implementation": "Specific numbers from authoritative sources. Inline citations. Update annually.",
|
|
1890
|
+
"validation": "Check for unsourced claims. Verify statistics current (<2 years)."
|
|
1891
|
+
},
|
|
1892
|
+
{
|
|
1893
|
+
"id": "aeo-008",
|
|
1894
|
+
"rule": "Refresh content quarterly minimum",
|
|
1895
|
+
"description": "AI favors fresh content. Quarterly = maintenance signal.",
|
|
1896
|
+
"priority": "high",
|
|
1897
|
+
"applies_to": [
|
|
1898
|
+
"ai_engines"
|
|
1899
|
+
],
|
|
1900
|
+
"implementation": "Quarterly reviews. Update statistics, examples, dateModified. Show 'Last updated'.",
|
|
1901
|
+
"validation": "Flag >3 months stale. Verify dateModified reflects real changes."
|
|
1902
|
+
},
|
|
1903
|
+
{
|
|
1904
|
+
"id": "aeo-009",
|
|
1905
|
+
"rule": "Build multi-platform presence",
|
|
1906
|
+
"description": "AI aggregates from multiple sources.",
|
|
1907
|
+
"priority": "medium",
|
|
1908
|
+
"applies_to": [
|
|
1909
|
+
"ai_engines"
|
|
1910
|
+
],
|
|
1911
|
+
"implementation": "Profiles on Reddit, YouTube, LinkedIn, Stack Overflow, GitHub. Cross-reference website.",
|
|
1912
|
+
"validation": "Check brand on major platforms. Verify website links."
|
|
1913
|
+
},
|
|
1914
|
+
{
|
|
1915
|
+
"id": "aeo-010",
|
|
1916
|
+
"rule": "IndexNow for fast AI feed updates",
|
|
1917
|
+
"description": "Updates to Bing, Yandex, ChatGPT feeds within minutes.",
|
|
1918
|
+
"priority": "high",
|
|
1919
|
+
"applies_to": [
|
|
1920
|
+
"bing",
|
|
1921
|
+
"ai_engines"
|
|
1922
|
+
],
|
|
1923
|
+
"implementation": "Implement IndexNow API. Host key file. POST URLs on changes. CDN one-click integration.",
|
|
1924
|
+
"validation": "Verify key file. Check Bing Webmaster Tools."
|
|
1925
|
+
},
|
|
1926
|
+
{
|
|
1927
|
+
"id": "aeo-011",
|
|
1928
|
+
"rule": "No special markup for Google AI Overviews",
|
|
1929
|
+
"description": "Standard SEO is the pathway.",
|
|
1930
|
+
"priority": "medium",
|
|
1931
|
+
"applies_to": [
|
|
1932
|
+
"google"
|
|
1933
|
+
],
|
|
1934
|
+
"implementation": "Standard SEO best practices. Clear, comprehensive content.",
|
|
1935
|
+
"validation": "Monitor AI Overviews in GSC."
|
|
1936
|
+
},
|
|
1937
|
+
{
|
|
1938
|
+
"id": "aeo-012",
|
|
1939
|
+
"rule": "Standard SEO is pathway to AI features",
|
|
1940
|
+
"description": "Strong SEO = AI search visibility.",
|
|
1941
|
+
"priority": "high",
|
|
1942
|
+
"applies_to": [
|
|
1943
|
+
"google",
|
|
1944
|
+
"bing",
|
|
1945
|
+
"ai_engines"
|
|
1946
|
+
],
|
|
1947
|
+
"implementation": "Don't treat AEO separate from SEO. Quality content, technical SEO, E-E-A-T, structured data, UX.",
|
|
1948
|
+
"validation": "Track traditional rankings and AI citations. Should correlate."
|
|
1949
|
+
}
|
|
1950
|
+
]
|
|
1951
|
+
},
|
|
1952
|
+
"social_signals": {
|
|
1953
|
+
"name": "Social Signals & Open Graph",
|
|
1954
|
+
"description": "Rules for social signals and sharing markup.",
|
|
1955
|
+
"rules": [
|
|
1956
|
+
{
|
|
1957
|
+
"id": "social-001",
|
|
1958
|
+
"rule": "Bing uses social signals as ranking factor",
|
|
1959
|
+
"description": "Bing confirms social signals influence rankings.",
|
|
1960
|
+
"priority": "high",
|
|
1961
|
+
"applies_to": [
|
|
1962
|
+
"bing"
|
|
1963
|
+
],
|
|
1964
|
+
"implementation": "Active social presence. Consistent sharing. Authoritative engagement.",
|
|
1965
|
+
"validation": "Monitor Bing rankings with social activity."
|
|
1966
|
+
},
|
|
1967
|
+
{
|
|
1968
|
+
"id": "social-002",
|
|
1969
|
+
"rule": "Authoritative account shares influence Bing",
|
|
1970
|
+
"description": "Established accounts carry more weight.",
|
|
1971
|
+
"priority": "medium",
|
|
1972
|
+
"applies_to": [
|
|
1973
|
+
"bing"
|
|
1974
|
+
],
|
|
1975
|
+
"implementation": "Build relationships with authoritative accounts. Share-worthy content.",
|
|
1976
|
+
"validation": "Track who shares content. Note verified accounts."
|
|
1977
|
+
},
|
|
1978
|
+
{
|
|
1979
|
+
"id": "social-003",
|
|
1980
|
+
"rule": "Implement Open Graph tags",
|
|
1981
|
+
"description": "Control appearance on Facebook, LinkedIn, etc.",
|
|
1982
|
+
"priority": "high",
|
|
1983
|
+
"applies_to": [
|
|
1984
|
+
"all"
|
|
1985
|
+
],
|
|
1986
|
+
"implementation": "og:title, og:description, og:image (1200x630), og:url, og:type, og:site_name per page.",
|
|
1987
|
+
"validation": "Facebook Sharing Debugger. Verify rendering."
|
|
1988
|
+
},
|
|
1989
|
+
{
|
|
1990
|
+
"id": "social-004",
|
|
1991
|
+
"rule": "Implement Twitter Card tags",
|
|
1992
|
+
"description": "Control appearance on Twitter/X.",
|
|
1993
|
+
"priority": "medium",
|
|
1994
|
+
"applies_to": [
|
|
1995
|
+
"all"
|
|
1996
|
+
],
|
|
1997
|
+
"implementation": "twitter:card (summary_large_image), twitter:title, twitter:description, twitter:image.",
|
|
1998
|
+
"validation": "Twitter Card Validator. Verify rendering."
|
|
1999
|
+
},
|
|
2000
|
+
{
|
|
2001
|
+
"id": "social-005",
|
|
2002
|
+
"rule": "OG image recommended 1200x630px",
|
|
2003
|
+
"description": "1.91:1 ratio for proper cross-platform display.",
|
|
2004
|
+
"priority": "medium",
|
|
2005
|
+
"applies_to": [
|
|
2006
|
+
"all"
|
|
2007
|
+
],
|
|
2008
|
+
"implementation": "1200x630px. Descriptive visuals. JPEG/PNG. Fast CDN.",
|
|
2009
|
+
"validation": "Check og:image dimensions. Test on platforms."
|
|
2010
|
+
}
|
|
2011
|
+
]
|
|
2012
|
+
},
|
|
2013
|
+
"publication_dates": {
|
|
2014
|
+
"name": "Publication Dates",
|
|
2015
|
+
"description": "Rules for publication and modification date markup.",
|
|
2016
|
+
"rules": [
|
|
2017
|
+
{
|
|
2018
|
+
"id": "pubdate-001",
|
|
2019
|
+
"rule": "Visible date with clear labeling",
|
|
2020
|
+
"description": "Display dates visibly with 'Published'/'Updated' labels.",
|
|
2021
|
+
"priority": "high",
|
|
2022
|
+
"applies_to": [
|
|
2023
|
+
"google",
|
|
2024
|
+
"bing",
|
|
2025
|
+
"ai_engines"
|
|
2026
|
+
],
|
|
2027
|
+
"implementation": "Show: 'Published: January 15, 2026' or 'Last updated: April 10, 2026'. Near title.",
|
|
2028
|
+
"validation": "Check dated content has visible dates with clear labels."
|
|
2029
|
+
},
|
|
2030
|
+
{
|
|
2031
|
+
"id": "pubdate-002",
|
|
2032
|
+
"rule": "datePublished and dateModified in structured data",
|
|
2033
|
+
"description": "ISO 8601 format in Article/BlogPosting schema.",
|
|
2034
|
+
"priority": "high",
|
|
2035
|
+
"applies_to": [
|
|
2036
|
+
"google",
|
|
2037
|
+
"bing",
|
|
2038
|
+
"ai_engines"
|
|
2039
|
+
],
|
|
2040
|
+
"implementation": "'datePublished': '2026-01-15T09:00:00+05:00'. Always ISO 8601 with timezone.",
|
|
2041
|
+
"validation": "Check structured data dates. Verify format. Compare with visible dates."
|
|
2042
|
+
},
|
|
2043
|
+
{
|
|
2044
|
+
"id": "pubdate-003",
|
|
2045
|
+
"rule": "Never specify future dates",
|
|
2046
|
+
"description": "Future dates are deceptive and confuse algorithms.",
|
|
2047
|
+
"priority": "high",
|
|
2048
|
+
"applies_to": [
|
|
2049
|
+
"google",
|
|
2050
|
+
"bing"
|
|
2051
|
+
],
|
|
2052
|
+
"implementation": "Validate dates. datePublished not in future.",
|
|
2053
|
+
"validation": "Check for future dates in structured data or visible."
|
|
2054
|
+
},
|
|
2055
|
+
{
|
|
2056
|
+
"id": "pubdate-004",
|
|
2057
|
+
"rule": "Match visible dates with structured data",
|
|
2058
|
+
"description": "Discrepancies cause search engines to ignore dates.",
|
|
2059
|
+
"priority": "high",
|
|
2060
|
+
"applies_to": [
|
|
2061
|
+
"google",
|
|
2062
|
+
"bing"
|
|
2063
|
+
],
|
|
2064
|
+
"implementation": "Update visible date and structured data simultaneously.",
|
|
2065
|
+
"validation": "Compare visible and structured data dates per page."
|
|
2066
|
+
},
|
|
2067
|
+
{
|
|
2068
|
+
"id": "pubdate-005",
|
|
2069
|
+
"rule": "Include timezone when possible",
|
|
2070
|
+
"description": "Removes ambiguity in ISO 8601.",
|
|
2071
|
+
"priority": "low",
|
|
2072
|
+
"applies_to": [
|
|
2073
|
+
"google",
|
|
2074
|
+
"bing"
|
|
2075
|
+
],
|
|
2076
|
+
"implementation": "Use '2026-04-10T14:30:00+05:00' not just '2026-04-10'.",
|
|
2077
|
+
"validation": "Check for timezone in structured data dates."
|
|
2078
|
+
},
|
|
2079
|
+
{
|
|
2080
|
+
"id": "pubdate-006",
|
|
2081
|
+
"rule": "Minimize competing dates on page",
|
|
2082
|
+
"description": "Multiple dates confuse which is publication date.",
|
|
2083
|
+
"priority": "medium",
|
|
2084
|
+
"applies_to": [
|
|
2085
|
+
"google"
|
|
2086
|
+
],
|
|
2087
|
+
"implementation": "Article date most prominent. Other dates less prominent. Structured data clarifies.",
|
|
2088
|
+
"validation": "Check for multiple dates. Ensure article date is primary."
|
|
2089
|
+
}
|
|
2090
|
+
]
|
|
2091
|
+
},
|
|
2092
|
+
"favicon": {
|
|
2093
|
+
"name": "Favicon",
|
|
2094
|
+
"description": "Rules for favicons in search results and browser tabs.",
|
|
2095
|
+
"rules": [
|
|
2096
|
+
{
|
|
2097
|
+
"id": "favicon-001",
|
|
2098
|
+
"rule": "Favicon link tag in homepage header",
|
|
2099
|
+
"description": "Google uses homepage <link> tag.",
|
|
2100
|
+
"priority": "medium",
|
|
2101
|
+
"applies_to": [
|
|
2102
|
+
"google",
|
|
2103
|
+
"bing"
|
|
2104
|
+
],
|
|
2105
|
+
"implementation": "<link rel='icon'> in <head>. Include apple-touch-icon.",
|
|
2106
|
+
"validation": "Check homepage for favicon links. Access URLs."
|
|
2107
|
+
},
|
|
2108
|
+
{
|
|
2109
|
+
"id": "favicon-002",
|
|
2110
|
+
"rule": "Min 8x8px, recommended 48x48px+",
|
|
2111
|
+
"description": "Google recommends 48x48px or multiples.",
|
|
2112
|
+
"priority": "medium",
|
|
2113
|
+
"applies_to": [
|
|
2114
|
+
"google"
|
|
2115
|
+
],
|
|
2116
|
+
"implementation": "Multiple sizes: 16, 32, 48, 180, 192. SVG for scaling.",
|
|
2117
|
+
"validation": "Check dimensions. Ensure 48x48+ exists."
|
|
2118
|
+
},
|
|
2119
|
+
{
|
|
2120
|
+
"id": "favicon-003",
|
|
2121
|
+
"rule": "Square 1:1 aspect ratio",
|
|
2122
|
+
"description": "Non-square will be distorted.",
|
|
2123
|
+
"priority": "medium",
|
|
2124
|
+
"applies_to": [
|
|
2125
|
+
"google",
|
|
2126
|
+
"bing"
|
|
2127
|
+
],
|
|
2128
|
+
"implementation": "Width equals height. Center in square canvas.",
|
|
2129
|
+
"validation": "Verify all favicon files are square."
|
|
2130
|
+
},
|
|
2131
|
+
{
|
|
2132
|
+
"id": "favicon-004",
|
|
2133
|
+
"rule": "Must be crawlable",
|
|
2134
|
+
"description": "Blocked favicon won't display in results.",
|
|
2135
|
+
"priority": "medium",
|
|
2136
|
+
"applies_to": [
|
|
2137
|
+
"google",
|
|
2138
|
+
"bing"
|
|
2139
|
+
],
|
|
2140
|
+
"implementation": "Don't block favicon in robots.txt.",
|
|
2141
|
+
"validation": "Test favicon URL against robots.txt."
|
|
2142
|
+
},
|
|
2143
|
+
{
|
|
2144
|
+
"id": "favicon-005",
|
|
2145
|
+
"rule": "Keep URL stable",
|
|
2146
|
+
"description": "Google caches. Changes take weeks.",
|
|
2147
|
+
"priority": "low",
|
|
2148
|
+
"applies_to": [
|
|
2149
|
+
"google"
|
|
2150
|
+
],
|
|
2151
|
+
"implementation": "Stable URL: /favicon.ico, /favicon.svg.",
|
|
2152
|
+
"validation": "Verify URL hasn't changed recently."
|
|
2153
|
+
}
|
|
2154
|
+
]
|
|
2155
|
+
},
|
|
2156
|
+
"site_name": {
|
|
2157
|
+
"name": "Site Name",
|
|
2158
|
+
"description": "Rules for site name in search results.",
|
|
2159
|
+
"rules": [
|
|
2160
|
+
{
|
|
2161
|
+
"id": "sitename-001",
|
|
2162
|
+
"rule": "WebSite schema on homepage",
|
|
2163
|
+
"description": "Google uses WebSite structured data for site name.",
|
|
2164
|
+
"priority": "high",
|
|
2165
|
+
"applies_to": [
|
|
2166
|
+
"google",
|
|
2167
|
+
"bing"
|
|
2168
|
+
],
|
|
2169
|
+
"implementation": "WebSite schema with name, url, SearchAction on homepage.",
|
|
2170
|
+
"validation": "Check homepage for WebSite schema. Rich Results Test."
|
|
2171
|
+
},
|
|
2172
|
+
{
|
|
2173
|
+
"id": "sitename-002",
|
|
2174
|
+
"rule": "Unique, accurate identity",
|
|
2175
|
+
"description": "Should uniquely represent your site.",
|
|
2176
|
+
"priority": "medium",
|
|
2177
|
+
"applies_to": [
|
|
2178
|
+
"google",
|
|
2179
|
+
"bing"
|
|
2180
|
+
],
|
|
2181
|
+
"implementation": "Unique, brand-consistent name. Not generic.",
|
|
2182
|
+
"validation": "Search site name - should uniquely identify site."
|
|
2183
|
+
},
|
|
2184
|
+
{
|
|
2185
|
+
"id": "sitename-003",
|
|
2186
|
+
"rule": "Concise, commonly recognized",
|
|
2187
|
+
"description": "1-3 words matching audience recognition.",
|
|
2188
|
+
"priority": "medium",
|
|
2189
|
+
"applies_to": [
|
|
2190
|
+
"google"
|
|
2191
|
+
],
|
|
2192
|
+
"implementation": "Shortest recognized name. No taglines.",
|
|
2193
|
+
"validation": "WebSite schema 'name' should be concise brand only."
|
|
2194
|
+
},
|
|
2195
|
+
{
|
|
2196
|
+
"id": "sitename-004",
|
|
2197
|
+
"rule": "Priority: WebSite > og:site_name > title > headings",
|
|
2198
|
+
"description": "Multiple sources, priority order.",
|
|
2199
|
+
"priority": "medium",
|
|
2200
|
+
"applies_to": [
|
|
2201
|
+
"google"
|
|
2202
|
+
],
|
|
2203
|
+
"implementation": "Set consistently: WebSite schema, og:site_name, title brand, header.",
|
|
2204
|
+
"validation": "Verify consistency across all sources."
|
|
2205
|
+
}
|
|
2206
|
+
]
|
|
2207
|
+
},
|
|
2208
|
+
"video_seo": {
|
|
2209
|
+
"name": "Video SEO",
|
|
2210
|
+
"description": "Rules for video content optimization.",
|
|
2211
|
+
"rules": [
|
|
2212
|
+
{
|
|
2213
|
+
"id": "video-001",
|
|
2214
|
+
"rule": "Proper HTML video elements",
|
|
2215
|
+
"description": "Discover via <video>, <embed>, <iframe>.",
|
|
2216
|
+
"priority": "high",
|
|
2217
|
+
"applies_to": [
|
|
2218
|
+
"google",
|
|
2219
|
+
"bing"
|
|
2220
|
+
],
|
|
2221
|
+
"implementation": "<video> for self-hosted, <iframe> for embedded. In initial HTML.",
|
|
2222
|
+
"validation": "Check video pages for proper HTML elements."
|
|
2223
|
+
},
|
|
2224
|
+
{
|
|
2225
|
+
"id": "video-002",
|
|
2226
|
+
"rule": "VideoObject structured data",
|
|
2227
|
+
"description": "Enables rich video results.",
|
|
2228
|
+
"priority": "high",
|
|
2229
|
+
"applies_to": [
|
|
2230
|
+
"google",
|
|
2231
|
+
"bing"
|
|
2232
|
+
],
|
|
2233
|
+
"implementation": "VideoObject: name, description, thumbnailUrl, uploadDate, contentUrl/embedUrl.",
|
|
2234
|
+
"validation": "Rich Results Test. GSC Video Indexing."
|
|
2235
|
+
},
|
|
2236
|
+
{
|
|
2237
|
+
"id": "video-003",
|
|
2238
|
+
"rule": "Video sitemaps",
|
|
2239
|
+
"description": "Helps discover dynamic/JS videos.",
|
|
2240
|
+
"priority": "medium",
|
|
2241
|
+
"applies_to": [
|
|
2242
|
+
"google",
|
|
2243
|
+
"bing"
|
|
2244
|
+
],
|
|
2245
|
+
"implementation": "Video sitemap with video-specific metadata.",
|
|
2246
|
+
"validation": "Verify valid and complete."
|
|
2247
|
+
},
|
|
2248
|
+
{
|
|
2249
|
+
"id": "video-004",
|
|
2250
|
+
"rule": "Unique page per video with text",
|
|
2251
|
+
"description": "Dedicated page with surrounding text content.",
|
|
2252
|
+
"priority": "medium",
|
|
2253
|
+
"applies_to": [
|
|
2254
|
+
"google",
|
|
2255
|
+
"bing"
|
|
2256
|
+
],
|
|
2257
|
+
"implementation": "Title, summary, transcript, related content per video.",
|
|
2258
|
+
"validation": "200+ words text. Each video has own URL."
|
|
2259
|
+
},
|
|
2260
|
+
{
|
|
2261
|
+
"id": "video-005",
|
|
2262
|
+
"rule": "Thumbnail min 60x30px, recommended 1280x720",
|
|
2263
|
+
"description": "For rich results display.",
|
|
2264
|
+
"priority": "medium",
|
|
2265
|
+
"applies_to": [
|
|
2266
|
+
"google"
|
|
2267
|
+
],
|
|
2268
|
+
"implementation": "High-quality 1280x720+. Stable URL.",
|
|
2269
|
+
"validation": "Check dimensions and accessibility."
|
|
2270
|
+
},
|
|
2271
|
+
{
|
|
2272
|
+
"id": "video-006",
|
|
2273
|
+
"rule": "MP4 preferred format",
|
|
2274
|
+
"description": "Most widely supported.",
|
|
2275
|
+
"priority": "medium",
|
|
2276
|
+
"applies_to": [
|
|
2277
|
+
"google",
|
|
2278
|
+
"bing"
|
|
2279
|
+
],
|
|
2280
|
+
"implementation": "MP4 (H.264) primary. WebM fallback. Not blocked.",
|
|
2281
|
+
"validation": "Check formats. MP4 available."
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
"id": "video-007",
|
|
2285
|
+
"rule": "Video elements in initial page load",
|
|
2286
|
+
"description": "Don't rely on user interaction to load.",
|
|
2287
|
+
"priority": "medium",
|
|
2288
|
+
"applies_to": [
|
|
2289
|
+
"google"
|
|
2290
|
+
],
|
|
2291
|
+
"implementation": "HTML elements in initial render. Lazy-load file OK.",
|
|
2292
|
+
"validation": "View source for video elements."
|
|
2293
|
+
}
|
|
2294
|
+
]
|
|
2295
|
+
},
|
|
2296
|
+
"hreflang_international": {
|
|
2297
|
+
"name": "Hreflang & International SEO",
|
|
2298
|
+
"description": "Rules for multilingual/multi-regional sites.",
|
|
2299
|
+
"rules": [
|
|
2300
|
+
{
|
|
2301
|
+
"id": "hreflang-001",
|
|
2302
|
+
"rule": "Self-referencing hreflang",
|
|
2303
|
+
"description": "Every page must reference itself.",
|
|
2304
|
+
"priority": "high",
|
|
2305
|
+
"applies_to": [
|
|
2306
|
+
"google"
|
|
2307
|
+
],
|
|
2308
|
+
"implementation": "Include self-referencing hreflang with all language versions.",
|
|
2309
|
+
"validation": "Check every hreflang page includes self-reference."
|
|
2310
|
+
},
|
|
2311
|
+
{
|
|
2312
|
+
"id": "hreflang-002",
|
|
2313
|
+
"rule": "Bidirectional references",
|
|
2314
|
+
"description": "If A references B, B must reference A.",
|
|
2315
|
+
"priority": "high",
|
|
2316
|
+
"applies_to": [
|
|
2317
|
+
"google"
|
|
2318
|
+
],
|
|
2319
|
+
"implementation": "When adding X->Y, also update Y to reference X.",
|
|
2320
|
+
"validation": "Crawl hreflang. Verify bidirectional. Flag unidirectional."
|
|
2321
|
+
},
|
|
2322
|
+
{
|
|
2323
|
+
"id": "hreflang-003",
|
|
2324
|
+
"rule": "Always include x-default",
|
|
2325
|
+
"description": "Fallback for unmatched languages.",
|
|
2326
|
+
"priority": "high",
|
|
2327
|
+
"applies_to": [
|
|
2328
|
+
"google"
|
|
2329
|
+
],
|
|
2330
|
+
"implementation": "hreflang='x-default' on all pages with hreflang.",
|
|
2331
|
+
"validation": "Check all hreflang pages for x-default."
|
|
2332
|
+
},
|
|
2333
|
+
{
|
|
2334
|
+
"id": "hreflang-004",
|
|
2335
|
+
"rule": "Proper locale codes",
|
|
2336
|
+
"description": "ISO 639-1 language + optional ISO 3166-1 region.",
|
|
2337
|
+
"priority": "high",
|
|
2338
|
+
"applies_to": [
|
|
2339
|
+
"google"
|
|
2340
|
+
],
|
|
2341
|
+
"implementation": "Correct: en-US, en-GB, fr-CA, pt-BR. Common mistakes: 'uk' not 'en-GB', 'jp' not 'ja'.",
|
|
2342
|
+
"validation": "Verify valid ISO codes. Use validation tools."
|
|
2343
|
+
}
|
|
2344
|
+
]
|
|
2345
|
+
},
|
|
2346
|
+
"javascript_rendering": {
|
|
2347
|
+
"name": "JavaScript & Rendering",
|
|
2348
|
+
"description": "Rules for JS-heavy sites and SPAs.",
|
|
2349
|
+
"rules": [
|
|
2350
|
+
{
|
|
2351
|
+
"id": "jsrender-001",
|
|
2352
|
+
"rule": "ISR preferred",
|
|
2353
|
+
"description": "ISR/SSG provides fully rendered HTML for best SEO.",
|
|
2354
|
+
"priority": "high",
|
|
2355
|
+
"applies_to": [
|
|
2356
|
+
"google",
|
|
2357
|
+
"bing"
|
|
2358
|
+
],
|
|
2359
|
+
"implementation": "Use ISR/SSG where possible. SSR for dynamic. Pre-rendering if CSR unavoidable.",
|
|
2360
|
+
"validation": "View page source. Content in initial HTML."
|
|
2361
|
+
},
|
|
2362
|
+
{
|
|
2363
|
+
"id": "jsrender-002",
|
|
2364
|
+
"rule": "Serve content with 200 OK before JS execution",
|
|
2365
|
+
"description": "Initial response should contain meaningful content.",
|
|
2366
|
+
"priority": "high",
|
|
2367
|
+
"applies_to": [
|
|
2368
|
+
"google",
|
|
2369
|
+
"bing"
|
|
2370
|
+
],
|
|
2371
|
+
"implementation": "Server-render critical content: title, meta, heading, primary text.",
|
|
2372
|
+
"validation": "curl page. Should contain content, not empty div#root."
|
|
2373
|
+
},
|
|
2374
|
+
{
|
|
2375
|
+
"id": "jsrender-003",
|
|
2376
|
+
"rule": "Only hydrate interactive islands",
|
|
2377
|
+
"description": "Static content doesn't need JS hydration.",
|
|
2378
|
+
"priority": "medium",
|
|
2379
|
+
"applies_to": [
|
|
2380
|
+
"google",
|
|
2381
|
+
"bing"
|
|
2382
|
+
],
|
|
2383
|
+
"implementation": "Island architecture. Static as server HTML. Only hydrate interactive components.",
|
|
2384
|
+
"validation": "Check JS bundle and hydration time."
|
|
2385
|
+
},
|
|
2386
|
+
{
|
|
2387
|
+
"id": "jsrender-004",
|
|
2388
|
+
"rule": "Verify with URL Inspection Tool",
|
|
2389
|
+
"description": "See exactly what Google sees.",
|
|
2390
|
+
"priority": "high",
|
|
2391
|
+
"applies_to": [
|
|
2392
|
+
"google"
|
|
2393
|
+
],
|
|
2394
|
+
"implementation": "Check every page type in GSC URL Inspection. Compare with user view.",
|
|
2395
|
+
"validation": "URL Inspection on representative pages."
|
|
2396
|
+
},
|
|
2397
|
+
{
|
|
2398
|
+
"id": "jsrender-005",
|
|
2399
|
+
"rule": "CSS content property NOT indexed",
|
|
2400
|
+
"description": "Text via ::before/::after not visible to search engines.",
|
|
2401
|
+
"priority": "medium",
|
|
2402
|
+
"applies_to": [
|
|
2403
|
+
"google",
|
|
2404
|
+
"bing"
|
|
2405
|
+
],
|
|
2406
|
+
"implementation": "Never place important content in CSS content property.",
|
|
2407
|
+
"validation": "Search CSS for content: with meaningful text."
|
|
2408
|
+
},
|
|
2409
|
+
{
|
|
2410
|
+
"id": "jsrender-006",
|
|
2411
|
+
"rule": "SPAs need unique URLs per screen",
|
|
2412
|
+
"description": "Each view must have own URL.",
|
|
2413
|
+
"priority": "critical",
|
|
2414
|
+
"applies_to": [
|
|
2415
|
+
"google",
|
|
2416
|
+
"bing"
|
|
2417
|
+
],
|
|
2418
|
+
"implementation": "Client-side routing updating URLs. History API. Direct navigation support.",
|
|
2419
|
+
"validation": "Navigate SPA. URL changes per screen. Copy URL to new tab: correct content."
|
|
2420
|
+
}
|
|
2421
|
+
]
|
|
2422
|
+
},
|
|
2423
|
+
"crawl_budget": {
|
|
2424
|
+
"name": "Crawl Budget",
|
|
2425
|
+
"description": "Rules for efficient crawl budget management.",
|
|
2426
|
+
"rules": [
|
|
2427
|
+
{
|
|
2428
|
+
"id": "crawl-001",
|
|
2429
|
+
"rule": "Critical for 1000+ page sites",
|
|
2430
|
+
"description": "Small sites fully crawled. Large sites need optimization.",
|
|
2431
|
+
"priority": "medium",
|
|
2432
|
+
"applies_to": [
|
|
2433
|
+
"google",
|
|
2434
|
+
"bing"
|
|
2435
|
+
],
|
|
2436
|
+
"implementation": "Prioritize important pages. Remove low-value. Fix errors. Fast responses.",
|
|
2437
|
+
"validation": "GSC Crawl Stats. Monitor rate and pages crawled."
|
|
2438
|
+
},
|
|
2439
|
+
{
|
|
2440
|
+
"id": "crawl-002",
|
|
2441
|
+
"rule": "Don't waste on parameter URLs",
|
|
2442
|
+
"description": "Sort/filter/session params create huge URL spaces.",
|
|
2443
|
+
"priority": "high",
|
|
2444
|
+
"applies_to": [
|
|
2445
|
+
"google",
|
|
2446
|
+
"bing"
|
|
2447
|
+
],
|
|
2448
|
+
"implementation": "Block params in robots.txt. Canonical tags. Configure in GSC.",
|
|
2449
|
+
"validation": "Check if Googlebot crawls many parameter URLs."
|
|
2450
|
+
},
|
|
2451
|
+
{
|
|
2452
|
+
"id": "crawl-003",
|
|
2453
|
+
"rule": "Block sort and session parameters",
|
|
2454
|
+
"description": "Create duplicate content.",
|
|
2455
|
+
"priority": "medium",
|
|
2456
|
+
"applies_to": [
|
|
2457
|
+
"google",
|
|
2458
|
+
"bing"
|
|
2459
|
+
],
|
|
2460
|
+
"implementation": "Disallow sort/session params. Canonicalize tracking params.",
|
|
2461
|
+
"validation": "Search site:yourdomain.com inurl:sort. Block if indexed."
|
|
2462
|
+
},
|
|
2463
|
+
{
|
|
2464
|
+
"id": "crawl-004",
|
|
2465
|
+
"rule": "Fix redirect chains",
|
|
2466
|
+
"description": "Multiple hops waste budget.",
|
|
2467
|
+
"priority": "medium",
|
|
2468
|
+
"applies_to": [
|
|
2469
|
+
"google",
|
|
2470
|
+
"bing"
|
|
2471
|
+
],
|
|
2472
|
+
"implementation": "Single-hop redirects. Update internal links to final URLs.",
|
|
2473
|
+
"validation": "Crawl for chains. Target zero."
|
|
2474
|
+
},
|
|
2475
|
+
{
|
|
2476
|
+
"id": "crawl-005",
|
|
2477
|
+
"rule": "Remove or block stale content",
|
|
2478
|
+
"description": "Stale pages consume budget without value.",
|
|
2479
|
+
"priority": "medium",
|
|
2480
|
+
"applies_to": [
|
|
2481
|
+
"google",
|
|
2482
|
+
"bing"
|
|
2483
|
+
],
|
|
2484
|
+
"implementation": "Audit zero-traffic pages (12+ months). Improve, consolidate, noindex, or 410.",
|
|
2485
|
+
"validation": "GSC data. Identify zero-click pages."
|
|
2486
|
+
}
|
|
2487
|
+
]
|
|
2488
|
+
},
|
|
2489
|
+
"bing_specific": {
|
|
2490
|
+
"name": "Bing-Specific Optimizations",
|
|
2491
|
+
"description": "Bing-specific rules and features.",
|
|
2492
|
+
"rules": [
|
|
2493
|
+
{
|
|
2494
|
+
"id": "bing-001",
|
|
2495
|
+
"rule": "Bing uses social signals",
|
|
2496
|
+
"description": "Explicitly confirmed as ranking factor.",
|
|
2497
|
+
"priority": "high",
|
|
2498
|
+
"applies_to": [
|
|
2499
|
+
"bing"
|
|
2500
|
+
],
|
|
2501
|
+
"implementation": "Active social presence. Share content. Engage authoritative accounts.",
|
|
2502
|
+
"validation": "Monitor Bing rankings with social activity."
|
|
2503
|
+
},
|
|
2504
|
+
{
|
|
2505
|
+
"id": "bing-002",
|
|
2506
|
+
"rule": "Crawl-delay supported",
|
|
2507
|
+
"description": "Bing respects Crawl-delay in robots.txt.",
|
|
2508
|
+
"priority": "low",
|
|
2509
|
+
"applies_to": [
|
|
2510
|
+
"bing"
|
|
2511
|
+
],
|
|
2512
|
+
"implementation": "User-agent: Bingbot / Crawl-delay: 5. Only if needed.",
|
|
2513
|
+
"validation": "Check Bing Webmaster Tools crawl rate."
|
|
2514
|
+
},
|
|
2515
|
+
{
|
|
2516
|
+
"id": "bing-003",
|
|
2517
|
+
"rule": "IndexNow for instant notification",
|
|
2518
|
+
"description": "Push protocol for immediate updates.",
|
|
2519
|
+
"priority": "high",
|
|
2520
|
+
"applies_to": [
|
|
2521
|
+
"bing",
|
|
2522
|
+
"ai_engines"
|
|
2523
|
+
],
|
|
2524
|
+
"implementation": "Generate key. Host file. POST URLs on changes.",
|
|
2525
|
+
"validation": "Bing Webmaster Tools IndexNow status."
|
|
2526
|
+
},
|
|
2527
|
+
{
|
|
2528
|
+
"id": "bing-004",
|
|
2529
|
+
"rule": "Submit sitemaps to Bing separately",
|
|
2530
|
+
"description": "Requires separate submission.",
|
|
2531
|
+
"priority": "high",
|
|
2532
|
+
"applies_to": [
|
|
2533
|
+
"bing"
|
|
2534
|
+
],
|
|
2535
|
+
"implementation": "Bing Webmaster Tools. Verify site. Submit sitemap.",
|
|
2536
|
+
"validation": "Verify submitted and processed."
|
|
2537
|
+
},
|
|
2538
|
+
{
|
|
2539
|
+
"id": "bing-005",
|
|
2540
|
+
"rule": "Bing Markup Validator",
|
|
2541
|
+
"description": "Bing's own structured data validator.",
|
|
2542
|
+
"priority": "medium",
|
|
2543
|
+
"applies_to": [
|
|
2544
|
+
"bing"
|
|
2545
|
+
],
|
|
2546
|
+
"implementation": "Test with Bing Markup Validator alongside Google Rich Results Test.",
|
|
2547
|
+
"validation": "Run key pages. Fix Bing-specific issues."
|
|
2548
|
+
},
|
|
2549
|
+
{
|
|
2550
|
+
"id": "bing-006",
|
|
2551
|
+
"rule": "Titles under 65 characters",
|
|
2552
|
+
"description": "Bing recommends under 65.",
|
|
2553
|
+
"priority": "medium",
|
|
2554
|
+
"applies_to": [
|
|
2555
|
+
"bing"
|
|
2556
|
+
],
|
|
2557
|
+
"implementation": "Aim under 65 characters.",
|
|
2558
|
+
"validation": "Check against 65-char limit."
|
|
2559
|
+
},
|
|
2560
|
+
{
|
|
2561
|
+
"id": "bing-007",
|
|
2562
|
+
"rule": "Content freshness strongly valued",
|
|
2563
|
+
"description": "Regular updates rank better in Bing.",
|
|
2564
|
+
"priority": "high",
|
|
2565
|
+
"applies_to": [
|
|
2566
|
+
"bing"
|
|
2567
|
+
],
|
|
2568
|
+
"implementation": "Update regularly. Show modified dates. dateModified in schema.",
|
|
2569
|
+
"validation": "Ensure important pages updated quarterly."
|
|
2570
|
+
},
|
|
2571
|
+
{
|
|
2572
|
+
"id": "bing-008",
|
|
2573
|
+
"rule": "Clean URL hierarchy",
|
|
2574
|
+
"description": "Well-structured URLs help Bing understand architecture.",
|
|
2575
|
+
"priority": "medium",
|
|
2576
|
+
"applies_to": [
|
|
2577
|
+
"bing"
|
|
2578
|
+
],
|
|
2579
|
+
"implementation": "Descriptive, hierarchical. Max 3-4 levels. Hyphens.",
|
|
2580
|
+
"validation": "Review structure for depth and cleanliness."
|
|
2581
|
+
}
|
|
2582
|
+
]
|
|
2583
|
+
},
|
|
2584
|
+
"google_discover": {
|
|
2585
|
+
"name": "Google Discover",
|
|
2586
|
+
"description": "Rules for Google Discover feed optimization.",
|
|
2587
|
+
"rules": [
|
|
2588
|
+
{
|
|
2589
|
+
"id": "discover-001",
|
|
2590
|
+
"rule": "Auto-qualifies if indexed",
|
|
2591
|
+
"description": "No special registration. Algorithmic selection.",
|
|
2592
|
+
"priority": "medium",
|
|
2593
|
+
"applies_to": [
|
|
2594
|
+
"google"
|
|
2595
|
+
],
|
|
2596
|
+
"implementation": "Standard SEO. Engaging content. No special implementation.",
|
|
2597
|
+
"validation": "GSC > Performance > Discover."
|
|
2598
|
+
},
|
|
2599
|
+
{
|
|
2600
|
+
"id": "discover-002",
|
|
2601
|
+
"rule": "Images min 1200px wide, 300K pixels",
|
|
2602
|
+
"description": "For large image treatment.",
|
|
2603
|
+
"priority": "high",
|
|
2604
|
+
"applies_to": [
|
|
2605
|
+
"google"
|
|
2606
|
+
],
|
|
2607
|
+
"implementation": "1200px+ wide. 16:9 preferred. High quality.",
|
|
2608
|
+
"validation": "Check dimensions. 1200x675 meets both."
|
|
2609
|
+
},
|
|
2610
|
+
{
|
|
2611
|
+
"id": "discover-003",
|
|
2612
|
+
"rule": "16:9 aspect ratio preferred",
|
|
2613
|
+
"description": "Best display for large cards.",
|
|
2614
|
+
"priority": "medium",
|
|
2615
|
+
"applies_to": [
|
|
2616
|
+
"google"
|
|
2617
|
+
],
|
|
2618
|
+
"implementation": "1200x675 or 1600x900.",
|
|
2619
|
+
"validation": "Check featured image ratios."
|
|
2620
|
+
},
|
|
2621
|
+
{
|
|
2622
|
+
"id": "discover-004",
|
|
2623
|
+
"rule": "Enable with max-image-preview:large",
|
|
2624
|
+
"description": "Required for large image format.",
|
|
2625
|
+
"priority": "high",
|
|
2626
|
+
"applies_to": [
|
|
2627
|
+
"google"
|
|
2628
|
+
],
|
|
2629
|
+
"implementation": "<meta name='robots' content='max-image-preview:large'>.",
|
|
2630
|
+
"validation": "Check meta robots. No conflicting directives."
|
|
2631
|
+
},
|
|
2632
|
+
{
|
|
2633
|
+
"id": "discover-005",
|
|
2634
|
+
"rule": "No clickbait or text-heavy images",
|
|
2635
|
+
"description": "Prohibited by Discover policies.",
|
|
2636
|
+
"priority": "high",
|
|
2637
|
+
"applies_to": [
|
|
2638
|
+
"google"
|
|
2639
|
+
],
|
|
2640
|
+
"implementation": "Honest titles. No misleading thumbnails. Text overlay <20%.",
|
|
2641
|
+
"validation": "Review titles and images."
|
|
2642
|
+
},
|
|
2643
|
+
{
|
|
2644
|
+
"id": "discover-006",
|
|
2645
|
+
"rule": "Traffic fluctuates - supplemental",
|
|
2646
|
+
"description": "Volatile. Don't depend on it.",
|
|
2647
|
+
"priority": "low",
|
|
2648
|
+
"applies_to": [
|
|
2649
|
+
"google"
|
|
2650
|
+
],
|
|
2651
|
+
"implementation": "Focus on standard SEO. Discover = bonus.",
|
|
2652
|
+
"validation": "Monitor but focus on organic search."
|
|
2653
|
+
}
|
|
2654
|
+
]
|
|
2655
|
+
},
|
|
2656
|
+
"featured_snippets": {
|
|
2657
|
+
"name": "Featured Snippets",
|
|
2658
|
+
"description": "Rules for featured snippet selection.",
|
|
2659
|
+
"rules": [
|
|
2660
|
+
{
|
|
2661
|
+
"id": "snippet-001",
|
|
2662
|
+
"rule": "Cannot request - algorithmic",
|
|
2663
|
+
"description": "Selected by algorithm. Optimize structure for eligibility.",
|
|
2664
|
+
"priority": "medium",
|
|
2665
|
+
"applies_to": [
|
|
2666
|
+
"google"
|
|
2667
|
+
],
|
|
2668
|
+
"implementation": "Question headings. Direct answers. Lists, tables, definitions.",
|
|
2669
|
+
"validation": "Search target queries. Optimize page 1 content."
|
|
2670
|
+
},
|
|
2671
|
+
{
|
|
2672
|
+
"id": "snippet-002",
|
|
2673
|
+
"rule": "Opt out with nosnippet/data-nosnippet",
|
|
2674
|
+
"description": "Remove from featured snippets.",
|
|
2675
|
+
"priority": "low",
|
|
2676
|
+
"applies_to": [
|
|
2677
|
+
"google"
|
|
2678
|
+
],
|
|
2679
|
+
"implementation": "Full: <meta content='nosnippet'>. Selective: data-nosnippet. nosnippet removes ALL snippets.",
|
|
2680
|
+
"validation": "Verify opt-out intentional."
|
|
2681
|
+
},
|
|
2682
|
+
{
|
|
2683
|
+
"id": "snippet-003",
|
|
2684
|
+
"rule": "max-snippet low value discourages",
|
|
2685
|
+
"description": "Low max-snippet makes selection unlikely but not guaranteed.",
|
|
2686
|
+
"priority": "low",
|
|
2687
|
+
"applies_to": [
|
|
2688
|
+
"google"
|
|
2689
|
+
],
|
|
2690
|
+
"implementation": "max-snippet:50 discourages. Use nosnippet for guaranteed prevention.",
|
|
2691
|
+
"validation": "Verify value low enough (<50 chars)."
|
|
2692
|
+
}
|
|
2693
|
+
]
|
|
2694
|
+
},
|
|
2695
|
+
"things_to_avoid": {
|
|
2696
|
+
"name": "Things to Avoid (Spam Policies)",
|
|
2697
|
+
"description": "Prohibited practices resulting in penalties.",
|
|
2698
|
+
"rules": [
|
|
2699
|
+
{
|
|
2700
|
+
"id": "avoid-001",
|
|
2701
|
+
"rule": "No cloaking",
|
|
2702
|
+
"description": "Different content for bots vs users = severe violation.",
|
|
2703
|
+
"priority": "critical",
|
|
2704
|
+
"applies_to": [
|
|
2705
|
+
"google",
|
|
2706
|
+
"bing"
|
|
2707
|
+
],
|
|
2708
|
+
"implementation": "Never serve different HTML by user-agent. Content must match.",
|
|
2709
|
+
"validation": "URL Inspection vs browser. Check for user-agent routing."
|
|
2710
|
+
},
|
|
2711
|
+
{
|
|
2712
|
+
"id": "avoid-002",
|
|
2713
|
+
"rule": "No hidden text or links",
|
|
2714
|
+
"description": "Invisible text (white-on-white, font-size:0) = penalties.",
|
|
2715
|
+
"priority": "critical",
|
|
2716
|
+
"applies_to": [
|
|
2717
|
+
"google",
|
|
2718
|
+
"bing"
|
|
2719
|
+
],
|
|
2720
|
+
"implementation": "No same-color text, font-size:0, off-screen positioning. Exception: sr-only.",
|
|
2721
|
+
"validation": "Search CSS for hiding techniques on content text."
|
|
2722
|
+
},
|
|
2723
|
+
{
|
|
2724
|
+
"id": "avoid-003",
|
|
2725
|
+
"rule": "No keyword stuffing",
|
|
2726
|
+
"description": "Unnatural repetition is spam signal.",
|
|
2727
|
+
"priority": "critical",
|
|
2728
|
+
"applies_to": [
|
|
2729
|
+
"google",
|
|
2730
|
+
"bing"
|
|
2731
|
+
],
|
|
2732
|
+
"implementation": "Write naturally. 2-3 keyword uses. Synonyms.",
|
|
2733
|
+
"validation": "Read aloud. Density <3%. Check alt and meta."
|
|
2734
|
+
},
|
|
2735
|
+
{
|
|
2736
|
+
"id": "avoid-004",
|
|
2737
|
+
"rule": "No link schemes",
|
|
2738
|
+
"description": "Buying/selling links, exchanges, PBNs.",
|
|
2739
|
+
"priority": "critical",
|
|
2740
|
+
"applies_to": [
|
|
2741
|
+
"google",
|
|
2742
|
+
"bing"
|
|
2743
|
+
],
|
|
2744
|
+
"implementation": "Never buy links. rel='sponsored'. Natural earning.",
|
|
2745
|
+
"validation": "Audit practices. GSC manual actions."
|
|
2746
|
+
},
|
|
2747
|
+
{
|
|
2748
|
+
"id": "avoid-005",
|
|
2749
|
+
"rule": "No doorway pages",
|
|
2750
|
+
"description": "Low-quality pages for keyword variations.",
|
|
2751
|
+
"priority": "high",
|
|
2752
|
+
"applies_to": [
|
|
2753
|
+
"google",
|
|
2754
|
+
"bing"
|
|
2755
|
+
],
|
|
2756
|
+
"implementation": "Every page: unique value. No location-only variations.",
|
|
2757
|
+
"validation": "Check for similar pages targeting slight variations."
|
|
2758
|
+
},
|
|
2759
|
+
{
|
|
2760
|
+
"id": "avoid-006",
|
|
2761
|
+
"rule": "No scraped/copied content",
|
|
2762
|
+
"description": "Copying without adding value violates policies.",
|
|
2763
|
+
"priority": "critical",
|
|
2764
|
+
"applies_to": [
|
|
2765
|
+
"google",
|
|
2766
|
+
"bing"
|
|
2767
|
+
],
|
|
2768
|
+
"implementation": "Original content. Add analysis if referencing. Attribute.",
|
|
2769
|
+
"validation": "Copyscape. GSC manual actions."
|
|
2770
|
+
},
|
|
2771
|
+
{
|
|
2772
|
+
"id": "avoid-007",
|
|
2773
|
+
"rule": "No deceptive redirects",
|
|
2774
|
+
"description": "Different destinations for bots and users.",
|
|
2775
|
+
"priority": "critical",
|
|
2776
|
+
"applies_to": [
|
|
2777
|
+
"google",
|
|
2778
|
+
"bing"
|
|
2779
|
+
],
|
|
2780
|
+
"implementation": "Same destination for all. No user-agent routing.",
|
|
2781
|
+
"validation": "Test as browser and bot. Same destination."
|
|
2782
|
+
},
|
|
2783
|
+
{
|
|
2784
|
+
"id": "avoid-008",
|
|
2785
|
+
"rule": "No rich snippet abuse",
|
|
2786
|
+
"description": "Fake reviews, fabricated ratings, invisible markup.",
|
|
2787
|
+
"priority": "critical",
|
|
2788
|
+
"applies_to": [
|
|
2789
|
+
"google",
|
|
2790
|
+
"bing"
|
|
2791
|
+
],
|
|
2792
|
+
"implementation": "Only visible, genuine content. Real ratings. Never fabricate.",
|
|
2793
|
+
"validation": "Verify visible counterpart for every structured property."
|
|
2794
|
+
},
|
|
2795
|
+
{
|
|
2796
|
+
"id": "avoid-009",
|
|
2797
|
+
"rule": "No auto-generated low-quality content",
|
|
2798
|
+
"description": "Mass thin content without human oversight.",
|
|
2799
|
+
"priority": "high",
|
|
2800
|
+
"applies_to": [
|
|
2801
|
+
"google",
|
|
2802
|
+
"bing"
|
|
2803
|
+
],
|
|
2804
|
+
"implementation": "Human oversight required. AI content OK if reviewed and valuable.",
|
|
2805
|
+
"validation": "Review quality. Flag machine-generated without editing."
|
|
2806
|
+
},
|
|
2807
|
+
{
|
|
2808
|
+
"id": "avoid-010",
|
|
2809
|
+
"rule": "No intrusive mobile interstitials",
|
|
2810
|
+
"description": "Full-screen popups on mobile = ranking penalty.",
|
|
2811
|
+
"priority": "high",
|
|
2812
|
+
"applies_to": [
|
|
2813
|
+
"google"
|
|
2814
|
+
],
|
|
2815
|
+
"implementation": "No popups on mobile load. OK: small banners, legal notices.",
|
|
2816
|
+
"validation": "Mobile from search. No blocking popups."
|
|
2817
|
+
}
|
|
2818
|
+
]
|
|
2819
|
+
},
|
|
2820
|
+
"monitoring_tools": {
|
|
2821
|
+
"name": "Monitoring & Validation Tools",
|
|
2822
|
+
"description": "Essential SEO monitoring and validation tools.",
|
|
2823
|
+
"rules": [
|
|
2824
|
+
{
|
|
2825
|
+
"id": "monitor-001",
|
|
2826
|
+
"rule": "Google Search Console primary",
|
|
2827
|
+
"description": "Authoritative for Google indexing, performance, CWV, manual actions.",
|
|
2828
|
+
"priority": "critical",
|
|
2829
|
+
"applies_to": [
|
|
2830
|
+
"google"
|
|
2831
|
+
],
|
|
2832
|
+
"implementation": "Verify site. Weekly: Performance, Indexing, CWV, Manual actions.",
|
|
2833
|
+
"validation": "GSC set up. Pages indexed. No manual actions."
|
|
2834
|
+
},
|
|
2835
|
+
{
|
|
2836
|
+
"id": "monitor-002",
|
|
2837
|
+
"rule": "Bing Webmaster Tools",
|
|
2838
|
+
"description": "Bing insights, IndexNow, Markup Validator.",
|
|
2839
|
+
"priority": "high",
|
|
2840
|
+
"applies_to": [
|
|
2841
|
+
"bing"
|
|
2842
|
+
],
|
|
2843
|
+
"implementation": "Verify. Submit sitemaps. IndexNow. Review reports.",
|
|
2844
|
+
"validation": "Setup verified. Sitemap processed."
|
|
2845
|
+
},
|
|
2846
|
+
{
|
|
2847
|
+
"id": "monitor-003",
|
|
2848
|
+
"rule": "Rich Results Test",
|
|
2849
|
+
"description": "Validates structured data, shows rich result eligibility.",
|
|
2850
|
+
"priority": "high",
|
|
2851
|
+
"applies_to": [
|
|
2852
|
+
"google"
|
|
2853
|
+
],
|
|
2854
|
+
"implementation": "Test every page type. Fix all errors.",
|
|
2855
|
+
"validation": "Run on representative pages. Zero errors."
|
|
2856
|
+
},
|
|
2857
|
+
{
|
|
2858
|
+
"id": "monitor-004",
|
|
2859
|
+
"rule": "Schema.org Validator",
|
|
2860
|
+
"description": "General spec validation. Catches issues Google misses.",
|
|
2861
|
+
"priority": "medium",
|
|
2862
|
+
"applies_to": [
|
|
2863
|
+
"google",
|
|
2864
|
+
"bing"
|
|
2865
|
+
],
|
|
2866
|
+
"implementation": "Test at validator.schema.org. Use with Rich Results Test.",
|
|
2867
|
+
"validation": "Run key pages. Fix compliance issues."
|
|
2868
|
+
},
|
|
2869
|
+
{
|
|
2870
|
+
"id": "monitor-005",
|
|
2871
|
+
"rule": "PageSpeed Insights",
|
|
2872
|
+
"description": "Lab and field CWV data.",
|
|
2873
|
+
"priority": "high",
|
|
2874
|
+
"applies_to": [
|
|
2875
|
+
"google"
|
|
2876
|
+
],
|
|
2877
|
+
"implementation": "Test key pages. Address Opportunities. Aim 90+.",
|
|
2878
|
+
"validation": "Run on key pages. Track scores."
|
|
2879
|
+
},
|
|
2880
|
+
{
|
|
2881
|
+
"id": "monitor-006",
|
|
2882
|
+
"rule": "Chrome DevTools and Lighthouse",
|
|
2883
|
+
"description": "Comprehensive performance, accessibility, SEO audits.",
|
|
2884
|
+
"priority": "high",
|
|
2885
|
+
"applies_to": [
|
|
2886
|
+
"all"
|
|
2887
|
+
],
|
|
2888
|
+
"implementation": "Lighthouse on key pages. All categories. SEO 90+. Performance 80+.",
|
|
2889
|
+
"validation": "Run Lighthouse. Address flagged issues."
|
|
2890
|
+
},
|
|
2891
|
+
{
|
|
2892
|
+
"id": "monitor-007",
|
|
2893
|
+
"rule": "Screaming Frog for crawls",
|
|
2894
|
+
"description": "Desktop crawler finding technical issues.",
|
|
2895
|
+
"priority": "medium",
|
|
2896
|
+
"applies_to": [
|
|
2897
|
+
"all"
|
|
2898
|
+
],
|
|
2899
|
+
"implementation": "Monthly crawl (free 500 URLs). Broken links, duplicates, missing meta, redirects.",
|
|
2900
|
+
"validation": "Full crawl. Fix identified issues."
|
|
2901
|
+
},
|
|
2902
|
+
{
|
|
2903
|
+
"id": "monitor-008",
|
|
2904
|
+
"rule": "Core Web Vitals report in GSC",
|
|
2905
|
+
"description": "Real-world CWV data by status and metric.",
|
|
2906
|
+
"priority": "high",
|
|
2907
|
+
"applies_to": [
|
|
2908
|
+
"google"
|
|
2909
|
+
],
|
|
2910
|
+
"implementation": "Monthly review. Focus on 'Poor'. Diagnose with PageSpeed.",
|
|
2911
|
+
"validation": "All URLs 'Good'. Fix 'Poor' first."
|
|
2912
|
+
}
|
|
2913
|
+
]
|
|
2914
|
+
},
|
|
2915
|
+
"feed_rss": {
|
|
2916
|
+
"name": "RSS Feed",
|
|
2917
|
+
"description": "Rules for RSS feeds.",
|
|
2918
|
+
"rules": [
|
|
2919
|
+
{
|
|
2920
|
+
"id": "feed-001",
|
|
2921
|
+
"rule": "Valid RSS 2.0 with atom:link self-reference",
|
|
2922
|
+
"description": "Conform to spec with self-referencing atom:link.",
|
|
2923
|
+
"priority": "high",
|
|
2924
|
+
"applies_to": [
|
|
2925
|
+
"all"
|
|
2926
|
+
],
|
|
2927
|
+
"implementation": "RSS 2.0 with xmlns:atom and atom:link rel='self'. Validate at w3.org/feed/.",
|
|
2928
|
+
"validation": "Validate. Check atom:link. Test in readers."
|
|
2929
|
+
},
|
|
2930
|
+
{
|
|
2931
|
+
"id": "feed-002",
|
|
2932
|
+
"rule": "Proper lastBuildDate",
|
|
2933
|
+
"description": "Reflect most recent content update.",
|
|
2934
|
+
"priority": "medium",
|
|
2935
|
+
"applies_to": [
|
|
2936
|
+
"all"
|
|
2937
|
+
],
|
|
2938
|
+
"implementation": "RFC 822 date of most recent item or generation time.",
|
|
2939
|
+
"validation": "Check lastBuildDate matches recent update."
|
|
2940
|
+
},
|
|
2941
|
+
{
|
|
2942
|
+
"id": "feed-003",
|
|
2943
|
+
"rule": "Category per item",
|
|
2944
|
+
"description": "Categorize each feed item.",
|
|
2945
|
+
"priority": "medium",
|
|
2946
|
+
"applies_to": [
|
|
2947
|
+
"all"
|
|
2948
|
+
],
|
|
2949
|
+
"implementation": "<category> on each <item>. Match site taxonomy.",
|
|
2950
|
+
"validation": "Each item has category. Consistent taxonomy."
|
|
2951
|
+
},
|
|
2952
|
+
{
|
|
2953
|
+
"id": "feed-004",
|
|
2954
|
+
"rule": "Keep updated, remove deleted",
|
|
2955
|
+
"description": "No 404 links in feed. Current content.",
|
|
2956
|
+
"priority": "high",
|
|
2957
|
+
"applies_to": [
|
|
2958
|
+
"all"
|
|
2959
|
+
],
|
|
2960
|
+
"implementation": "Regenerate on changes. Remove deleted. Automate in build.",
|
|
2961
|
+
"validation": "Check item links. None 404."
|
|
2962
|
+
},
|
|
2963
|
+
{
|
|
2964
|
+
"id": "feed-005",
|
|
2965
|
+
"rule": "Max 50,000 entries or 50MB",
|
|
2966
|
+
"description": "Practical limits. Paginate if needed.",
|
|
2967
|
+
"priority": "low",
|
|
2968
|
+
"applies_to": [
|
|
2969
|
+
"all"
|
|
2970
|
+
],
|
|
2971
|
+
"implementation": "50-100 recent items. Category feeds for large libraries.",
|
|
2972
|
+
"validation": "Check size and count."
|
|
2973
|
+
}
|
|
2974
|
+
]
|
|
2975
|
+
},
|
|
2976
|
+
"indexnow_protocol": {
|
|
2977
|
+
"name": "IndexNow Protocol",
|
|
2978
|
+
"description": "Rules for IndexNow instant URL notification.",
|
|
2979
|
+
"rules": [
|
|
2980
|
+
{
|
|
2981
|
+
"id": "indexnow-001",
|
|
2982
|
+
"rule": "Push protocol for instant notification",
|
|
2983
|
+
"description": "Notify search engines immediately on content changes.",
|
|
2984
|
+
"priority": "high",
|
|
2985
|
+
"applies_to": [
|
|
2986
|
+
"bing",
|
|
2987
|
+
"ai_engines"
|
|
2988
|
+
],
|
|
2989
|
+
"implementation": "Generate key at bing.com/indexnow. Host key file. POST URLs on changes.",
|
|
2990
|
+
"validation": "Key file accessible. Bing Webmaster Tools status."
|
|
2991
|
+
},
|
|
2992
|
+
{
|
|
2993
|
+
"id": "indexnow-002",
|
|
2994
|
+
"rule": "Supported by Bing, Yandex, ChatGPT feeds",
|
|
2995
|
+
"description": "Shared across participants. Google not yet.",
|
|
2996
|
+
"priority": "medium",
|
|
2997
|
+
"applies_to": [
|
|
2998
|
+
"bing",
|
|
2999
|
+
"ai_engines"
|
|
3000
|
+
],
|
|
3001
|
+
"implementation": "Submit to api.indexnow.org. Auto-shared. Continue sitemaps for Google.",
|
|
3002
|
+
"validation": "Bing Webmaster Tools confirmation."
|
|
3003
|
+
},
|
|
3004
|
+
{
|
|
3005
|
+
"id": "indexnow-003",
|
|
3006
|
+
"rule": "Updates within minutes vs days",
|
|
3007
|
+
"description": "Minutes instead of days for crawl discovery.",
|
|
3008
|
+
"priority": "high",
|
|
3009
|
+
"applies_to": [
|
|
3010
|
+
"bing",
|
|
3011
|
+
"ai_engines"
|
|
3012
|
+
],
|
|
3013
|
+
"implementation": "Trigger immediately after changes. Integrate into build pipeline.",
|
|
3014
|
+
"validation": "Check Bing results within 1 hour."
|
|
3015
|
+
},
|
|
3016
|
+
{
|
|
3017
|
+
"id": "indexnow-004",
|
|
3018
|
+
"rule": "CDN one-click integration",
|
|
3019
|
+
"description": "Cloudflare, Akamai offer built-in support.",
|
|
3020
|
+
"priority": "medium",
|
|
3021
|
+
"applies_to": [
|
|
3022
|
+
"bing",
|
|
3023
|
+
"ai_engines"
|
|
3024
|
+
],
|
|
3025
|
+
"implementation": "Enable in CDN dashboard. Cloudflare: Speed > Optimization.",
|
|
3026
|
+
"validation": "Check CDN settings. Verify submissions."
|
|
3027
|
+
},
|
|
3028
|
+
{
|
|
3029
|
+
"id": "indexnow-005",
|
|
3030
|
+
"rule": "Up to 10,000 URLs per request",
|
|
3031
|
+
"description": "Batch submissions for efficiency.",
|
|
3032
|
+
"priority": "low",
|
|
3033
|
+
"applies_to": [
|
|
3034
|
+
"bing",
|
|
3035
|
+
"ai_engines"
|
|
3036
|
+
],
|
|
3037
|
+
"implementation": "POST batch with urlList (max 10K). Include host, key, keyLocation.",
|
|
3038
|
+
"validation": "Verify 200 OK. Check for rejected URLs."
|
|
3039
|
+
}
|
|
3040
|
+
]
|
|
3041
|
+
}
|
|
3042
|
+
}
|
|
3043
|
+
}
|