luckiest-co 1.0.47 → 1.0.49
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/ab-testing/CHANGELOG.md +5 -0
- package/skills/ab-testing/SKILL.md +12 -9
- package/skills/ab-testing/evals/evals.json +18 -7
- package/skills/ab-testing/references/sample-size-guide.md +2 -2
- package/skills/ads/CHANGELOG.md +5 -0
- package/skills/ads/SKILL.md +4 -4
- package/skills/ai-seo/CHANGELOG.md +7 -0
- package/skills/ai-seo/SKILL.md +27 -20
- package/skills/analytics/CHANGELOG.md +6 -0
- package/skills/analytics/SKILL.md +4 -3
- package/skills/analytics/evals/evals.json +27 -0
- package/skills/analytics/references/ga4-implementation.md +7 -3
- package/skills/analytics/references/gtm-implementation.md +8 -2
- package/skills/aso/CHANGELOG.md +5 -0
- package/skills/aso/SKILL.md +4 -4
- package/skills/aso/evals/evals.json +15 -2
- package/skills/aso/references/benchmarks.md +4 -2
- package/skills/aso/references/google-play-specs.md +5 -1
- package/skills/brainstorm/SKILL.md +59 -16
- package/skills/brainstorm/builder-check-prompt.md +23 -0
- package/skills/churn-prevention/CHANGELOG.md +5 -0
- package/skills/churn-prevention/SKILL.md +3 -3
- package/skills/churn-prevention/evals/evals.json +14 -0
- package/skills/churn-prevention/references/dunning-playbook.md +6 -1
- package/skills/coder-brainstorming/CHANGELOG.md +10 -0
- package/skills/coder-brainstorming/SKILL.md +62 -20
- package/skills/coder-brainstorming/builder-check-prompt.md +23 -0
- package/skills/coder-brainstorming/scripts/server.cjs +1 -1
- package/skills/coder-debugging/CHANGELOG.md +4 -0
- package/skills/coder-debugging/SKILL.md +5 -5
- package/skills/coder-requesting-code-review/CHANGELOG.md +4 -0
- package/skills/coder-requesting-code-review/SKILL.md +4 -4
- package/skills/coder-subagent-driven-development/CHANGELOG.md +4 -0
- package/skills/coder-subagent-driven-development/SKILL.md +3 -3
- package/skills/coder-subagent-driven-development/scripts/sdd-workspace +3 -1
- package/skills/cold-email/CHANGELOG.md +7 -0
- package/skills/cold-email/SKILL.md +27 -7
- package/skills/cold-email/evals/evals.json +30 -0
- package/skills/cold-email/references/benchmarks.md +15 -11
- package/skills/cold-email/references/deliverability.md +110 -0
- package/skills/cold-email/references/linkedin-outreach.md +91 -0
- package/skills/cold-email/references/multichannel-cadence.md +79 -0
- package/skills/cold-email/references/outbound-plays.md +88 -0
- package/skills/cold-email/references/personalization.md +11 -0
- package/skills/cold-email/references/reply-handling.md +65 -0
- package/skills/competitor-profiling/CHANGELOG.md +5 -0
- package/skills/competitor-profiling/SKILL.md +4 -4
- package/skills/content-strategy/CHANGELOG.md +5 -0
- package/skills/content-strategy/SKILL.md +5 -3
- package/skills/copy-editing/CHANGELOG.md +5 -0
- package/skills/copy-editing/SKILL.md +5 -5
- package/skills/copy-editing/references/content-refresh.md +33 -0
- package/skills/cro/CHANGELOG.md +5 -0
- package/skills/cro/SKILL.md +14 -3
- package/skills/cro/references/form.md +1 -1
- package/skills/directory-submissions/CHANGELOG.md +5 -0
- package/skills/directory-submissions/SKILL.md +13 -4
- package/skills/directory-submissions/evals/evals.json +15 -1
- package/skills/directory-submissions/references/directory-list.md +2 -4
- package/skills/emails/CHANGELOG.md +5 -0
- package/skills/emails/SKILL.md +14 -4
- package/skills/launch/CHANGELOG.md +7 -0
- package/skills/launch/SKILL.md +8 -4
- package/skills/launch/evals/evals.json +29 -0
- package/skills/launch/references/shipped-changes.md +84 -0
- package/skills/launch/references/site-launch-qa.md +55 -0
- package/skills/lead-magnets/CHANGELOG.md +5 -0
- package/skills/lead-magnets/SKILL.md +6 -4
- package/skills/lead-magnets/evals/evals.json +18 -0
- package/skills/lead-magnets/references/content-to-skill-corpus-design.md +89 -0
- package/skills/lead-magnets/references/content-to-skill-release.md +71 -0
- package/skills/lead-magnets/references/content-to-skill.md +108 -0
- package/skills/marketing-plan/CHANGELOG.md +5 -0
- package/skills/marketing-plan/SKILL.md +3 -3
- package/skills/marketing-plan/evals/evals.json +13 -0
- package/skills/marketing-plan/references/budget-planning.md +26 -17
- package/skills/model-router/CHANGELOG.md +6 -0
- package/skills/model-router/SKILL.md +3 -3
- package/skills/model-router/scripts/route.py +1 -1
- package/skills/model-router/scripts/test_route.py +5 -0
- package/skills/pricing/CHANGELOG.md +5 -0
- package/skills/pricing/SKILL.md +4 -4
- package/skills/pricing/evals/evals.json +12 -0
- package/skills/pricing/references/research-methods.md +8 -4
- package/skills/programmatic-seo/CHANGELOG.md +5 -0
- package/skills/programmatic-seo/SKILL.md +8 -4
- package/skills/programmatic-seo/evals/evals.json +13 -0
- package/skills/programmatic-seo/references/implementation-platforms.md +37 -0
- package/skills/prospecting/CHANGELOG.md +7 -0
- package/skills/prospecting/SKILL.md +27 -13
- package/skills/prospecting/evals/evals.json +41 -0
- package/skills/prospecting/references/account-research.md +59 -0
- package/skills/prospecting/references/b2b-prospecting.md +1 -1
- package/skills/prospecting/references/compliance.md +44 -6
- package/skills/prospecting/references/data-sources.md +13 -15
- package/skills/prospecting/references/enrichment-playbook.md +61 -0
- package/skills/prospecting/references/saas-prospecting.md +1 -1
- package/skills/prospecting/references/signal-plays.md +99 -0
- package/skills/prospecting/references/sourcing-and-enrichment.md +89 -0
- package/skills/referrals/CHANGELOG.md +5 -0
- package/skills/referrals/SKILL.md +10 -4
- package/skills/referrals/evals/evals.json +99 -0
- package/skills/referrals/references/affiliate-operations.md +64 -0
- package/skills/referrals/references/affiliate-programs.md +2 -2
- package/skills/referrals/references/program-examples.md +14 -6
- package/skills/referrals/references/review-platform-rules.md +36 -0
- package/skills/referrals/references/review-program-operations.md +62 -0
- package/skills/referrals/references/review-programs.md +96 -0
- package/skills/revops/CHANGELOG.md +5 -0
- package/skills/revops/SKILL.md +10 -6
- package/skills/revops/evals/evals.json +13 -0
- package/skills/revops/references/automation-playbooks.md +1 -1
- package/skills/revops/references/inbound-routing.md +43 -0
- package/skills/revops/references/lifecycle-definitions.md +31 -0
- package/skills/sales-enablement/CHANGELOG.md +5 -0
- package/skills/sales-enablement/SKILL.md +6 -4
- package/skills/sales-enablement/evals/evals.json +14 -0
- package/skills/sales-enablement/references/cold-call-scripts.md +68 -0
- package/skills/schema/CHANGELOG.md +5 -0
- package/skills/schema/SKILL.md +20 -8
- package/skills/schema/evals/evals.json +40 -0
- package/skills/schema/references/schema-examples.md +9 -15
- package/skills/seo-audit/CHANGELOG.md +5 -0
- package/skills/seo-audit/SKILL.md +10 -16
- package/skills/seo-audit/evals/evals.json +68 -0
- package/skills/seo-audit/references/international-seo.md +9 -11
- package/skills/seo-audit/references/local-seo-pages-and-measurement.md +39 -0
- package/skills/seo-audit/references/local-seo-profile-and-citations.md +41 -0
- package/skills/seo-audit/references/local-seo.md +86 -0
- package/skills/seo-audit/references/rankings-push.md +62 -0
- package/skills/seo-audit/references/title-tags.md +89 -0
- package/skills/signup/CHANGELOG.md +5 -0
- package/skills/signup/SKILL.md +7 -3
- package/skills/site-architecture/CHANGELOG.md +5 -0
- package/skills/site-architecture/SKILL.md +5 -4
- package/skills/site-architecture/evals/evals.json +25 -0
- package/skills/site-architecture/references/platforms-and-migration.md +84 -0
- package/skills/social/CHANGELOG.md +5 -0
- package/skills/social/SKILL.md +4 -4
- package/skills/trends/.skillignore +3 -0
- package/skills/trends/CHANGELOG.md +20 -0
- package/skills/trends/SKILL.md +12 -8
- package/skills/trends/references/agent-mode.md +36 -0
- package/skills/trends/references/category-peers.md +38 -0
- package/skills/trends/references/comparison.md +227 -0
- package/skills/trends/references/competitors.md +29 -0
- package/skills/trends/references/discovery.md +90 -0
- package/skills/trends/references/engine-contract.md +111 -1889
- package/skills/trends/references/followups.md +112 -0
- package/skills/trends/references/grok-bot-x.md +55 -0
- package/skills/trends/references/hiring-signals.md +19 -0
- package/skills/trends/references/library-queue.md +33 -0
- package/skills/trends/references/recommendations.md +86 -0
- package/skills/trends/references/research-runbook.md +781 -0
- package/skills/trends/references/runtime.md +165 -0
- package/skills/trends/references/save-html-brief.md +39 -20
- package/skills/trends/references/setup-wizard.md +253 -0
- package/skills/trends/references/synthesis.md +289 -0
- package/skills/trends/scripts/box_chrome_login.py +209 -0
- package/skills/trends/scripts/briefing.py +9 -17
- package/skills/trends/scripts/last30days.py +3247 -280
- package/skills/trends/scripts/lib/agentcookie.py +196 -0
- package/skills/trends/scripts/lib/amazon.py +877 -0
- package/skills/trends/scripts/lib/arxiv.py +42 -8
- package/skills/trends/scripts/lib/backends.py +769 -0
- package/skills/trends/scripts/lib/bird_x.py +340 -57
- package/skills/trends/scripts/lib/bluesky.py +84 -10
- package/skills/trends/scripts/lib/bounded_get.py +156 -0
- package/skills/trends/scripts/lib/brightdata.py +291 -0
- package/skills/trends/scripts/lib/categories.py +7 -1
- package/skills/trends/scripts/lib/chrome_cdp.py +455 -0
- package/skills/trends/scripts/lib/chrome_cookies.py +132 -39
- package/skills/trends/scripts/lib/cluster.py +31 -54
- package/skills/trends/scripts/lib/competitors.py +10 -1
- package/skills/trends/scripts/lib/cookie_extract.py +221 -44
- package/skills/trends/scripts/lib/cookie_paths.py +27 -0
- package/skills/trends/scripts/lib/corpus.py +439 -0
- package/skills/trends/scripts/lib/devto.py +313 -0
- package/skills/trends/scripts/lib/discovery_handoff.py +988 -0
- package/skills/trends/scripts/lib/doctor.py +2166 -0
- package/skills/trends/scripts/lib/dripstack.py +203 -0
- package/skills/trends/scripts/lib/entity_extract.py +37 -0
- package/skills/trends/scripts/lib/env.py +1092 -138
- package/skills/trends/scripts/lib/fanout.py +11 -1
- package/skills/trends/scripts/lib/feed.py +61 -0
- package/skills/trends/scripts/lib/fetch_memo.py +135 -0
- package/skills/trends/scripts/lib/freshness.py +566 -0
- package/skills/trends/scripts/lib/fusion.py +314 -28
- package/skills/trends/scripts/lib/github.py +438 -24
- package/skills/trends/scripts/lib/grok_x.py +1237 -0
- package/skills/trends/scripts/lib/grounding.py +129 -11
- package/skills/trends/scripts/lib/hackernews.py +61 -4
- package/skills/trends/scripts/lib/health.py +373 -0
- package/skills/trends/scripts/lib/hosted.py +333 -0
- package/skills/trends/scripts/lib/html_publish.py +34 -0
- package/skills/trends/scripts/lib/html_render.py +169 -3
- package/skills/trends/scripts/lib/http.py +1215 -70
- package/skills/trends/scripts/lib/instagram.py +132 -9
- package/skills/trends/scripts/lib/jobs.py +4 -2
- package/skills/trends/scripts/lib/library.py +308 -0
- package/skills/trends/scripts/lib/library_index.py +477 -0
- package/skills/trends/scripts/lib/linkedin.py +271 -24
- package/skills/trends/scripts/lib/log.py +5 -2
- package/skills/trends/scripts/lib/meta_ads.py +982 -0
- package/skills/trends/scripts/lib/normalize.py +382 -28
- package/skills/trends/scripts/lib/parallel_mcp.py +234 -0
- package/skills/trends/scripts/lib/permission_preflight.py +42 -3
- package/skills/trends/scripts/lib/perplexity.py +1080 -468
- package/skills/trends/scripts/lib/pipeline.py +5079 -211
- package/skills/trends/scripts/lib/planner.py +396 -53
- package/skills/trends/scripts/lib/polymarket.py +285 -23
- package/skills/trends/scripts/lib/prescriptions.py +432 -0
- package/skills/trends/scripts/lib/private_files.py +21 -0
- package/skills/trends/scripts/lib/providers.py +231 -10
- package/skills/trends/scripts/lib/quality_nudge.py +122 -37
- package/skills/trends/scripts/lib/reddit.py +177 -12
- package/skills/trends/scripts/lib/reddit_arctic.py +146 -5
- package/skills/trends/scripts/lib/reddit_keyless.py +121 -60
- package/skills/trends/scripts/lib/reddit_listing.py +215 -14
- package/skills/trends/scripts/lib/reddit_public.py +12 -13
- package/skills/trends/scripts/lib/reddit_search.py +304 -0
- package/skills/trends/scripts/lib/reddit_shreddit.py +51 -7
- package/skills/trends/scripts/lib/registers.py +134 -0
- package/skills/trends/scripts/lib/relevance.py +17 -0
- package/skills/trends/scripts/lib/render.py +2161 -271
- package/skills/trends/scripts/lib/rerank.py +623 -55
- package/skills/trends/scripts/lib/resolve.py +50 -1
- package/skills/trends/scripts/lib/safari_cookies.py +42 -15
- package/skills/trends/scripts/lib/schema.py +782 -1
- package/skills/trends/scripts/lib/setup_wizard.py +779 -120
- package/skills/trends/scripts/lib/signals.py +206 -7
- package/skills/trends/scripts/lib/stocktwits.py +374 -0
- package/skills/trends/scripts/lib/subproc.py +307 -53
- package/skills/trends/scripts/lib/techmeme.py +89 -64
- package/skills/trends/scripts/lib/telegram.py +317 -0
- package/skills/trends/scripts/lib/tiktok.py +13 -9
- package/skills/trends/scripts/lib/topic_shape.py +340 -0
- package/skills/trends/scripts/lib/transcribe.py +12 -3
- package/skills/trends/scripts/lib/trustpilot.py +256 -5
- package/skills/trends/scripts/lib/truthsocial.py +9 -1
- package/skills/trends/scripts/lib/ui.py +6 -0
- package/skills/trends/scripts/lib/usage.py +132 -0
- package/skills/trends/scripts/lib/web_search_keyless.py +63 -4
- package/skills/trends/scripts/lib/windows_job.py +138 -0
- package/skills/trends/scripts/lib/x_api.py +824 -0
- package/skills/trends/scripts/lib/x_envelope.py +733 -0
- package/skills/trends/scripts/lib/x_judge.py +292 -0
- package/skills/trends/scripts/lib/xai_x.py +26 -3
- package/skills/trends/scripts/lib/xquik.py +89 -15
- package/skills/trends/scripts/lib/xurl_x.py +284 -91
- package/skills/trends/scripts/lib/youtube_yt.py +570 -119
- package/skills/trends/scripts/setup-keychain.sh +12 -4
- package/skills/trends/scripts/setup-pass.sh +3 -0
- package/skills/trends/scripts/store.py +444 -50
- package/skills/trends/scripts/watchlist.py +38 -11
- package/skills/trends/scripts/x_lane_parity.py +107 -0
- package/skills/video-studio/CHANGELOG.md +4 -0
- package/skills/video-studio/SKILL.md +4 -4
- package/skills/video-studio/references/styles/product-flight.md +45 -0
- package/skills/video-studio/references/styles.md +3 -1
- package/skills/video-studio-motion/ATTRIBUTION.md +1 -1
- package/skills/video-studio-motion/CHANGELOG.md +4 -0
- package/skills/video-studio-motion/SKILL.md +8 -5
- package/skills/youtube-planner/ATTRIBUTION.md +25 -0
- package/skills/youtube-planner/CHANGELOG.md +12 -0
- package/skills/youtube-planner/SKILL.md +191 -0
- package/skills/youtube-planner/references/plan-template.md +57 -0
- package/skills/youtube-planner/references/stages.md +119 -0
- package/skills/youtube-planner/scripts/floor_ceiling.py +132 -0
- package/skills/coder-brainstorming/spec-document-reviewer-prompt.md +0 -49
- package/skills/trends/scripts/lib/reddit_rss.py +0 -224
|
@@ -83,6 +83,46 @@
|
|
|
83
83
|
"Does not attempt full SEO audit using schema markup patterns"
|
|
84
84
|
],
|
|
85
85
|
"files": []
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": 7,
|
|
89
|
+
"prompt": "Our Next.js product page embeds JSON-LD with dangerouslySetInnerHTML and JSON.stringify(schema). Product names come from a CMS and can contain HTML, quotes, ampersands and Unicode. How do we keep product text intact without allowing it to terminate the JSON-LD script element?",
|
|
90
|
+
"expected_output": "Should use the schema implementation example and escape the serialized JSON for its HTML script context by replacing every less-than character with a literal JSON Unicode escape before assigning __html. Should explain that JSON.stringify alone does not protect the HTML parser boundary, preserve the original product text when JSON is parsed, and avoid deleting content, HTML-entity escaping JSON or directly interpolating raw names. Should refer to the current official Next.js guidance.",
|
|
91
|
+
"assertions": [
|
|
92
|
+
"Identifies the script element HTML parsing boundary",
|
|
93
|
+
"Escapes every less-than character after JSON serialization",
|
|
94
|
+
"Preserves original product text after JSON.parse",
|
|
95
|
+
"Does not treat JSON.stringify alone as safe HTML embedding",
|
|
96
|
+
"Uses the linked Next.js guidance"
|
|
97
|
+
],
|
|
98
|
+
"files": []
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": 8,
|
|
102
|
+
"prompt": "It's October 2026. Our product FAQ has 20 questions. Add FAQ schema so Google shows expandable questions in our search result, and tell us how to validate that feature.",
|
|
103
|
+
"expected_output": "Should explain before offering implementation that Google stopped showing FAQ rich results in May 2026, citing Google's current documentation updates. The earlier government/health exception does not apply now. Should separate Schema.org vocabulary validity from Google feature eligibility. If semantic FAQPage markup is still wanted for another consumer, ask for the actual visible questions and answers and use mainEntity > Question > acceptedAnswer; don't invent product answers. Recommend Schema.org Validator for vocabulary. Missing FAQ detection or reports in Rich Results Test or Search Console is not an implementation defect. Do not promise expandable results or tell the user to delete unrelated supported markup.",
|
|
104
|
+
"assertions": [
|
|
105
|
+
"Explains Google FAQ rich results were retired before proposing code",
|
|
106
|
+
"Cites current official Google feature guidance",
|
|
107
|
+
"Does not present the old government/health exception as current eligibility",
|
|
108
|
+
"Separates Schema.org validity from Google feature eligibility",
|
|
109
|
+
"Offers semantic markup only with a separate purpose and actual visible content",
|
|
110
|
+
"Does not treat missing retired-feature detection/reporting as a defect",
|
|
111
|
+
"Does not promise the requested retired search appearance"
|
|
112
|
+
],
|
|
113
|
+
"files": []
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"id": 9,
|
|
117
|
+
"prompt": "Our tutorial uses valid HowTo JSON-LD but the Rich Results Test does not detect it. Should we fix the syntax until Google shows tutorial steps? Also, our homepage lost its sitelinks search box; should we delete all WebSite markup?",
|
|
118
|
+
"expected_output": "Should check current feature support and explain Google's HowTo and sitelinks search box retirements with official references. Valid vocabulary cannot restore those appearances. Use Schema.org Validator if there is a semantic consumer; do not diagnose missing retired-feature detection as a syntax failure. Preserve useful WebSite site-name markup and unrelated supported features. Separate remaining syntax/content issues from feature availability.",
|
|
119
|
+
"assertions": [
|
|
120
|
+
"Recognizes retired HowTo and sitelinks search box features",
|
|
121
|
+
"Separates syntax errors from unavailable appearances",
|
|
122
|
+
"Keeps WebSite site identity and unrelated supported markup",
|
|
123
|
+
"Uses official feature-support sources and appropriate validators"
|
|
124
|
+
],
|
|
125
|
+
"files": []
|
|
86
126
|
}
|
|
87
127
|
]
|
|
88
128
|
}
|
|
@@ -4,7 +4,7 @@ Complete JSON-LD examples for common schema types.
|
|
|
4
4
|
|
|
5
5
|
## Contents
|
|
6
6
|
- Organization
|
|
7
|
-
- WebSite (
|
|
7
|
+
- WebSite (site identity)
|
|
8
8
|
- Article / BlogPosting
|
|
9
9
|
- Product
|
|
10
10
|
- SoftwareApplication
|
|
@@ -42,24 +42,16 @@ For company/brand homepage or about page.
|
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
## WebSite (
|
|
45
|
+
## WebSite (site identity)
|
|
46
46
|
|
|
47
|
-
For homepage
|
|
47
|
+
For homepage/site identity. Google retired the sitelinks search box in November 2024; adding `SearchAction` cannot restore it. Keep useful `WebSite` markup for site names. See the [search box announcement](https://developers.google.com/search/blog/2024/10/sitelinks-search-box).
|
|
48
48
|
|
|
49
49
|
```json
|
|
50
50
|
{
|
|
51
51
|
"@context": "https://schema.org",
|
|
52
52
|
"@type": "WebSite",
|
|
53
53
|
"name": "Example",
|
|
54
|
-
"url": "https://example.com"
|
|
55
|
-
"potentialAction": {
|
|
56
|
-
"@type": "SearchAction",
|
|
57
|
-
"target": {
|
|
58
|
-
"@type": "EntryPoint",
|
|
59
|
-
"urlTemplate": "https://example.com/search?q={search_term_string}"
|
|
60
|
-
},
|
|
61
|
-
"query-input": "required name=search_term_string"
|
|
62
|
-
}
|
|
54
|
+
"url": "https://example.com"
|
|
63
55
|
}
|
|
64
56
|
```
|
|
65
57
|
|
|
@@ -162,7 +154,7 @@ For SaaS product pages and app landing pages.
|
|
|
162
154
|
|
|
163
155
|
## FAQPage
|
|
164
156
|
|
|
165
|
-
For
|
|
157
|
+
For visible frequently asked questions when a consumer needs Schema.org semantics. Google FAQ rich results were retired in May 2026; this example cannot enable expandable Google search results. Use the Schema.org Validator for vocabulary validation, not missing Rich Results Test detection as a failure. See [Google's documentation updates](https://developers.google.com/search/updates).
|
|
166
158
|
|
|
167
159
|
```json
|
|
168
160
|
{
|
|
@@ -193,7 +185,7 @@ For pages with frequently asked questions.
|
|
|
193
185
|
|
|
194
186
|
## HowTo
|
|
195
187
|
|
|
196
|
-
For instructional content and tutorials.
|
|
188
|
+
For instructional content and tutorials when a consumer needs Schema.org semantics. Google retired HowTo rich results in September 2023; this example does not restore that appearance. See the [retirement announcement](https://developers.google.com/search/blog/2023/08/howto-faq-changes).
|
|
197
189
|
|
|
198
190
|
```json
|
|
199
191
|
{
|
|
@@ -388,7 +380,7 @@ export default function ProductPage({ product }) {
|
|
|
388
380
|
<Head>
|
|
389
381
|
<script
|
|
390
382
|
type="application/ld+json"
|
|
391
|
-
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
|
|
383
|
+
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema).replace(/</g, '\\u003c') }}
|
|
392
384
|
/>
|
|
393
385
|
</Head>
|
|
394
386
|
{/* Page content */}
|
|
@@ -396,3 +388,5 @@ export default function ProductPage({ product }) {
|
|
|
396
388
|
);
|
|
397
389
|
}
|
|
398
390
|
```
|
|
391
|
+
|
|
392
|
+
When JSON-LD is inserted as raw HTML, JSON escaping alone does not stop a product string containing a script-closing tag from terminating the element. Escape every `<` in the serialized JSON as `\u003c`, as in the example above; parsing the JSON recovers the original product text. Do this at the HTML embedding boundary, without deleting legitimate characters from the source data. See the [Next.js JSON-LD guide](https://nextjs.org/docs/app/guides/json-ld).
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog — luckiest-seo-audit
|
|
2
2
|
|
|
3
|
+
## 1.2.0 — 2026-10-16
|
|
4
|
+
From coreyhaines31/marketingskills at 1efedbc (issue #174, MIT).
|
|
5
|
+
|
|
6
|
+
- New references: title tags, rankings push (striking-distance keywords), local SEO (profile, citations, pages and measurement).
|
|
7
|
+
|
|
3
8
|
## 1.1.0 — 2026-07-06
|
|
4
9
|
Skill updater pass: analytics integration.
|
|
5
10
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: seo-audit
|
|
3
|
-
description: When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO audit," "technical SEO," "why am I not ranking," "SEO issues," "on-page SEO," "meta tags review," "SEO health check," "my traffic dropped," "lost rankings," "not showing up in Google," "site isn't ranking," "Google update hit me," "page speed," "core web vitals," "crawl errors," or "
|
|
3
|
+
description: When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO audit," "technical SEO," "why am I not ranking," "SEO issues," "on-page SEO," "meta tags review," "SEO health check," "my traffic dropped," "lost rankings," "not showing up in Google," "site isn't ranking," "Google update hit me," "page speed," "core web vitals," "crawl errors," "indexing issues," "stuck on page 2," "striking distance keywords," "title tag rewrite," "low CTR," "local SEO," "Google Business Profile," or "map pack." Use this even if the user just says something vague like "my SEO is bad" or "help with SEO" — start with an audit. For building pages at scale to target keywords, see luckiest-programmatic-seo. For adding structured data, see luckiest-schema. For AI search optimization, see luckiest-ai-seo.
|
|
4
4
|
license: See ATTRIBUTION.md
|
|
5
5
|
metadata:
|
|
6
|
-
version: "1.
|
|
6
|
+
version: "1.2.0"
|
|
7
7
|
listing_id: luckiest-seo-audit
|
|
8
8
|
author: luckiest
|
|
9
9
|
---
|
|
@@ -14,9 +14,9 @@ This skill helps identify SEO issues and provide actionable recommendations to i
|
|
|
14
14
|
|
|
15
15
|
## Staying current
|
|
16
16
|
|
|
17
|
-
On activation, call the Luckiest MCP check_updates tool with { listingId: "eb3e5efe-31ff-46bc-9aea-0df6bb2afc36", installedSemver: "1.
|
|
17
|
+
On activation, call the Luckiest MCP check_updates tool with { listingId: "eb3e5efe-31ff-46bc-9aea-0df6bb2afc36", installedSemver: "1.2.0" }. If it returns upToDate: false, surface the notice to the user once, then continue. Do nothing further if upToDate: true. Never block on this check — if the tool is unavailable, proceed.
|
|
18
18
|
|
|
19
|
-
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-seo-audit", skill_version: "1.
|
|
19
|
+
When the skill's work is done, call the Luckiest MCP report_usage tool once with { listing_id: "luckiest-seo-audit", skill_version: "1.2.0", matched: true, success: <true if the skill completed, false otherwise> }. Metadata only, never prompt text. Never block on it — if the tool is unavailable, skip silently.
|
|
20
20
|
|
|
21
21
|
## Initial Assessment
|
|
22
22
|
|
|
@@ -76,6 +76,8 @@ The same blind spot that hides JS-injected schema also hides primary content and
|
|
|
76
76
|
4. **Content Quality** (does it deserve to rank?)
|
|
77
77
|
5. **Authority & Links** (does it have credibility?)
|
|
78
78
|
|
|
79
|
+
Once the foundations are sound, the fastest wins are usually pages already ranking in positions 8–20. See [rankings-push.md](references/rankings-push.md) for that workflow and the checklist for shipping new pages.
|
|
80
|
+
|
|
79
81
|
---
|
|
80
82
|
|
|
81
83
|
## Technical SEO Audit
|
|
@@ -259,19 +261,9 @@ Three equivalent placement methods: HTML `<link>` in `<head>`, HTTP `Link` heade
|
|
|
259
261
|
|
|
260
262
|
### Title Tags
|
|
261
263
|
|
|
262
|
-
**Check for:**
|
|
263
|
-
- Unique titles for each page
|
|
264
|
-
- Primary keyword near beginning
|
|
265
|
-
- 50-60 characters (visible in SERP)
|
|
266
|
-
- Compelling and click-worthy
|
|
267
|
-
- Brand name placement (end, usually)
|
|
264
|
+
**Check for:** unique titles, primary query near the front, about 50–60 characters, a reason to click, alignment with the H1, and a pattern that fits the page type.
|
|
268
265
|
|
|
269
|
-
**Common issues:**
|
|
270
|
-
- Duplicate titles
|
|
271
|
-
- Too long (truncated)
|
|
272
|
-
- Too short (wasted opportunity)
|
|
273
|
-
- Keyword stuffing
|
|
274
|
-
- Missing entirely
|
|
266
|
+
**Common issues:** duplicates, truncation, keyword stuffing, missing titles, and titles Google rewrites in results. Patterns by page type, the rewrite triggers, and a bulk-audit format are in [title-tags.md](references/title-tags.md).
|
|
275
267
|
|
|
276
268
|
### Meta Descriptions
|
|
277
269
|
|
|
@@ -442,6 +434,8 @@ Three equivalent placement methods: HTML `<link>` in `<head>`, HTTP `Link` heade
|
|
|
442
434
|
- Missing location pages
|
|
443
435
|
- No local content
|
|
444
436
|
|
|
437
|
+
For Google Business Profiles, the map pack, citations, reviews, and location pages, see [local-seo.md](references/local-seo.md).
|
|
438
|
+
|
|
445
439
|
---
|
|
446
440
|
|
|
447
441
|
## Output Format
|
|
@@ -131,6 +131,74 @@
|
|
|
131
131
|
"May briefly mention FAQ schema benefits"
|
|
132
132
|
],
|
|
133
133
|
"files": []
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": 9,
|
|
137
|
+
"prompt": "Search Console shows a bunch of our pages sitting at positions 9 to 15, and our pricing page ranks #3 but barely gets clicks. Where do we start?",
|
|
138
|
+
"expected_output": "Should load the rankings push reference. Should bucket candidates: striking distance (positions 8-20 above an impression floor) for content and link fixes, and weak click-through at a top-5 position for title and meta description fixes only. Should prioritize by business value, check for cannibalization first, diagnose each page against the top three results (intent, missing section, freshness, format, links), and make the smallest change that closes the gap, including answering the query in the first two sentences and adding internal links from strong pages. For the pricing page, should rewrite only the title and meta description using the pricing pattern from the title-tags reference. Should record baselines, wait 3-4 weeks before judging, and stop after two rounds with no movement.",
|
|
139
|
+
"assertions": [
|
|
140
|
+
"Separates striking-distance pages from the weak-CTR pricing page",
|
|
141
|
+
"For the pricing page, changes only title and meta description",
|
|
142
|
+
"Checks for cannibalization before editing",
|
|
143
|
+
"Diagnoses against the top three results with a concrete reason",
|
|
144
|
+
"Recommends internal links from strong related pages",
|
|
145
|
+
"Records baselines and waits 3-4 weeks before judging",
|
|
146
|
+
"Does not recommend repeatedly resubmitting URLs in Search Console"
|
|
147
|
+
],
|
|
148
|
+
"files": []
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"id": 10,
|
|
152
|
+
"prompt": "Our example.de/ and example.com/de/ pages contain equivalent German content for two regions. The audit says every locale must self-canonicalize and cross-locale canonicals always conflict with hreflang. Must we keep both self-canonicals? Our separate French translation and page-two pagination also need review.",
|
|
153
|
+
"expected_output": "Reject the blanket rule. For similar or duplicate same-language regional content, consider a preferred canonical with consistent hreflang using current Google guidance. Preserve distinct French translation and per-page pagination strategies; do not consolidate different languages merely because the product matches. Check actual content and signals and avoid promising all regional URLs will stay indexed.",
|
|
154
|
+
"assertions": [
|
|
155
|
+
"Distinguishes same-language regional duplicates from distinct translations",
|
|
156
|
+
"Allows a preferred canonical for same-language duplicates",
|
|
157
|
+
"Keeps canonical and hreflang signals consistent",
|
|
158
|
+
"Preserves distinct-language and pagination controls",
|
|
159
|
+
"Does not guarantee independent indexing"
|
|
160
|
+
],
|
|
161
|
+
"files": []
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"id": 11,
|
|
165
|
+
"prompt": "I am a mobile locksmith based at my house in Denver. Customers never visit me. I cover Denver and Aurora and want three profiles to rank everywhere. My old citation has the wrong phone. Also write a review request offering $10 off for five stars, and local schema. Give me a practical plan.",
|
|
166
|
+
"expected_output": "Diagnoses one actual service-area base, hides the private address, corrects the wrong phone, replaces an incentivized/rating-directed request with a neutral honest request, and avoids invented branches or an address in public markup. Explains Google rich-result address requirements without claiming areaServed substitutes or guaranteed map rankings.",
|
|
167
|
+
"assertions": [
|
|
168
|
+
"Distinguishes service coverage from additional eligible locations",
|
|
169
|
+
"Keeps private home address out of public citations and markup",
|
|
170
|
+
"Corrects observed wrong phone before growing listings",
|
|
171
|
+
"Provides an honest review request without incentive or five-star requirement",
|
|
172
|
+
"Does not promise Google rich-result eligibility without a public address",
|
|
173
|
+
"Explains searcher distance and avoids ranking guarantees"
|
|
174
|
+
],
|
|
175
|
+
"files": []
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": 12,
|
|
179
|
+
"prompt": "Write a Google Business Profile description for Harbor Cycle, our staffed bike shop in Bristol. We sell commuter bikes and do same-day puncture repairs when capacity allows. Open Tuesday to Saturday, 10–6. Keep this focused on the description.",
|
|
180
|
+
"expected_output": "Produces a factual concise description using supplied facts. Does not add unsupported superlatives, promotions, links, or require a full audit. Keeps conditional same-day availability accurate.",
|
|
181
|
+
"assertions": [
|
|
182
|
+
"Delivers requested description directly",
|
|
183
|
+
"Preserves capacity condition for same-day repairs",
|
|
184
|
+
"No invented prices, promotions, reviews, links, or unsupported superiority claims",
|
|
185
|
+
"Does not require unrelated analytics or a complete audit"
|
|
186
|
+
],
|
|
187
|
+
"files": []
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"id": 13,
|
|
191
|
+
"prompt": "We have two staffed dental practices. One moved last month and has an old profile address; the other is correct. Make a local SEO recovery plan. A crawler text export has no JSON-LD; can you say schema is missing? We also want to seed 20 profile Q&A through the API.",
|
|
192
|
+
"expected_output": "Treats the move as a location identity/update task, preserves the other real branch, requests specific profile and website evidence, refuses to infer absence of rendered JSON-LD from stripped text, and explains that the old Q&A API is discontinued. Gives a prioritized location-specific plan and measured outcomes without assuming suspension or promising recovery speed.",
|
|
193
|
+
"assertions": [
|
|
194
|
+
"Maintains two distinct actual practices",
|
|
195
|
+
"Prioritizes old-address correction for moved location",
|
|
196
|
+
"Labels unknown profile status and asks for relevant evidence",
|
|
197
|
+
"Does not infer absent schema from a stripped text export",
|
|
198
|
+
"Does not propose discontinued Q&A API calls",
|
|
199
|
+
"Links follow-up to correct contact paths and qualified bookings"
|
|
200
|
+
],
|
|
201
|
+
"files": []
|
|
134
202
|
}
|
|
135
203
|
]
|
|
136
204
|
}
|
|
@@ -64,30 +64,28 @@ For both engines: implement hreflang (Google/Yandex) + `<html lang="...">` + `<m
|
|
|
64
64
|
|
|
65
65
|
## Canonicalization & i18n
|
|
66
66
|
|
|
67
|
-
###
|
|
67
|
+
### Choose Canonicals by Content and Language
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
Use self-referencing canonicals for distinct locale pages, including genuinely translated content. Do not consolidate different-language translations merely because they describe the same product.
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
For similar or duplicate regional pages in the **same language**, Google recommends choosing a preferred canonical and using consistent `hreflang` annotations. For example, equivalent German content at `example.de/` and `example.com/de/` can share a preferred canonical; every regional URL is not required to canonicalize to itself.
|
|
72
72
|
|
|
73
|
-
- [
|
|
73
|
+
- [Google: Handling duplicate multilingual/multi-regional pages](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites#handling-duplicate-pages-with-multilingualmulti-regional-sites)
|
|
74
74
|
- [Google: Consolidate Duplicate URLs](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)
|
|
75
75
|
|
|
76
|
-
### Canonical
|
|
76
|
+
### Align Canonical and Hreflang Signals
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
Keep canonical targets and `hreflang` clusters consistent with the chosen content/language strategy. `hreflang` identifies localized alternatives; it does not force Google to index each URL independently. Canonicals are signals to Google's selection process, not an indexing guarantee.
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
The preferred canonical must be a URL inside the `hreflang` cluster. Google ignores `hreflang` on a URL that is canonicalized to another one.
|
|
81
81
|
|
|
82
|
-
- [John Mueller: hreflang canonical](https://johnmu.com/hreflang-canonical/)
|
|
83
|
-
- [SEJ: Hreflang Tags Are Hints](https://www.searchenginejournal.com/google-reminds-that-hreflang-tags-are-hints-not-directives/546428/)
|
|
84
82
|
- [Google: Consolidate Duplicate URLs](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)
|
|
85
83
|
|
|
86
84
|
### Near-Duplicate Regional Variants
|
|
87
85
|
|
|
88
86
|
Mueller (2023 Office Hours): "If the content is completely the same, and we can't tell any difference, then for simplicity and user experience we may just show one version -- even if hreflang is present."
|
|
89
87
|
|
|
90
|
-
Google
|
|
88
|
+
Google may consolidate identical or near-duplicate regional content despite `hreflang`. Use the same-language preferred-canonical strategy above where appropriate; do not promise that either self-canonicals or cosmetic differences will keep every regional URL indexed.
|
|
91
89
|
|
|
92
90
|
- [International Web Mastery: Same-Language Duplicate Pages](https://internationalwebmastery.com/blog/how-google-handles-canonicalization-of-same-language-duplicate-near-duplicate-pages/)
|
|
93
91
|
- [Google: Managing Multi-Regional Sites](https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites)
|
|
@@ -194,7 +192,7 @@ Reddit scaled AI translations to 35+ languages with Google's knowledge. The key
|
|
|
194
192
|
|
|
195
193
|
Google: "Localized versions of a page are only considered duplicates if the main content of the page remains untranslated." Pages with only translated boilerplate get clustered as duplicates.
|
|
196
194
|
|
|
197
|
-
Do NOT use noindex for unwanted locale pages (wastes crawl budget). Do
|
|
195
|
+
Do NOT use noindex for unwanted locale pages (wastes crawl budget). Do not canonicalize distinct translations to another language merely to hide thin content. Best approach: don't create locale pages you can't make genuinely helpful.
|
|
198
196
|
|
|
199
197
|
- [Google: Localized Versions](https://developers.google.com/search/docs/specialty/international/localized-versions)
|
|
200
198
|
- [Google: Crawl Budget Management](https://developers.google.com/search/docs/crawling-indexing/large-site-managing-crawl-budget)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Location Pages and Measurement
|
|
2
|
+
|
|
3
|
+
Use this when the request includes local pages, schema, or performance reporting.
|
|
4
|
+
|
|
5
|
+
## Page Content That Helps a Local Customer
|
|
6
|
+
|
|
7
|
+
For a real customer-facing location, include accurate location/contact details, hours, services available there, booking/call links, access/parking directions where known, staff or location evidence, and useful nearby/service information. Link it from a location index and relevant service pages.
|
|
8
|
+
|
|
9
|
+
For service coverage without an office, explain actual availability, constraints, travel or call-out policies, relevant local work examples when available, and a clear enquiry path. Say that it is a service area. Do not show a fake street address or imply a staffed branch.
|
|
10
|
+
|
|
11
|
+
Example decision: a plumber has one operating base and serves two nearby towns. One honest coverage page may suffice. Separate town pages are justified only by additional useful information or evidence; neither town automatically merits another Business Profile.
|
|
12
|
+
|
|
13
|
+
Before scaling, confirm a stable data source and meaningful differences across pages. Check the current [doorway-abuse policy](https://developers.google.com/search/docs/essentials/spam-policies#doorway-abuse). Route justified templates to programmatic-seo and hierarchy to site-architecture; consolidate pages when the proposed variants add no value.
|
|
14
|
+
|
|
15
|
+
## Local Structured Data
|
|
16
|
+
|
|
17
|
+
Use the most specific accurate LocalBusiness subtype and a stable identifier for each real location. Match the visible page facts; connect the location URL, public phone, hours, and physical coordinates where applicable. Do not mark service cities as invented branches or publish a hidden residential address through JSON-LD.
|
|
18
|
+
|
|
19
|
+
Important distinction: Schema.org can describe a business without satisfying Google's rich-result requirements. Google's [LocalBusiness documentation](https://developers.google.com/search/docs/appearance/structured-data/local-business) requires an address for that search feature. For a business that cannot publish one, preserve privacy and explain that the rich-result requirement is unmet; do not fabricate an address or promise eligibility from `areaServed` alone.
|
|
20
|
+
|
|
21
|
+
Self-serving LocalBusiness review markup does not earn review stars merely because the business displays testimonials. Do not import a profile rating into markup as a shortcut to stars.
|
|
22
|
+
|
|
23
|
+
Use schema for implementation. Validate the rendered page and relevant test tools, then verify deployed markup matches the public content. A stripped text fetch is insufficient proof that JavaScript-injected JSON-LD is absent. Validation does not guarantee display or a local-pack ranking change.
|
|
24
|
+
|
|
25
|
+
## Measure Customer Outcomes
|
|
26
|
+
|
|
27
|
+
Keep a baseline by location and period:
|
|
28
|
+
|
|
29
|
+
| Metric | Evidence | Interpretation limits |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Qualified calls/bookings/leads | CRM or owner-confirmed outcomes | Deduplicate; attribution may be incomplete |
|
|
32
|
+
| Profile interactions | Available Business Profile performance export | Interaction is not a completed sale |
|
|
33
|
+
| Organic local queries/pages | Search Console query/page reports | Privacy thresholds and aggregation limit detail |
|
|
34
|
+
| Website actions from profile links | Analytics with consistent campaign tags | Consent, blockers, and tagging can affect counts |
|
|
35
|
+
| Local visibility | Comparable query/location observations | Distance, personalization, and volatility matter |
|
|
36
|
+
|
|
37
|
+
Use a consistent tagging convention for profile website links while keeping the canonical location URL stable. Test that redirects and booking flows preserve the attribution needed. For call tracking, retain a genuine reachable business contact and verify the platform's current phone rules; do not blindly replace canonical citation numbers.
|
|
38
|
+
|
|
39
|
+
Review changes against a comparable period, seasonality, opening-hours changes, and service capacity. Record what changed and when. Treat a visibility increase as an observation, not proof of causation or additional revenue. Set follow-up timing with the user rather than promising a universal recovery deadline.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Profiles and Citations
|
|
2
|
+
|
|
3
|
+
Use this for profile eligibility, field changes, and name/address/phone cleanup. Verify facts with the owner and the current [business representation guidelines](https://support.google.com/business/answer/3038177).
|
|
4
|
+
|
|
5
|
+
## Model the Real Business
|
|
6
|
+
|
|
7
|
+
| Business | Profile approach | Common mistake |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Staffed storefront receiving customers | Actual location, public address and customer-facing hours | Keyword-stuffed name or wrong entrance |
|
|
10
|
+
| Service-area business visiting customers | Actual base with address hidden when customers are not served there | Profiles for every city or exposing a home address |
|
|
11
|
+
| Hybrid | Real customer-facing location plus actual coverage | Claiming unstaffed locations |
|
|
12
|
+
| Multiple locations | Verify each location and its staffing/eligibility separately | Assuming a location page or rented mailbox establishes eligibility |
|
|
13
|
+
| Online only | Use organic/AI search strategy appropriate to the business | Creating a fictitious local presence |
|
|
14
|
+
|
|
15
|
+
Exceptions for practitioners, departments, co-located businesses, and special business types require their specific rules. Do not merge two legitimately distinct entities just because they share an address. An actual relocation needs an update to the existing business identity rather than an unexplained new duplicate.
|
|
16
|
+
|
|
17
|
+
## Field-Level Review
|
|
18
|
+
|
|
19
|
+
- **Name:** match real-world branding. Put services and coverage in their proper fields rather than adding search keywords to the name.
|
|
20
|
+
- **Categories:** use the most specific accurate primary category and only justified additional categories. Check the current category options for that market.
|
|
21
|
+
- **Services:** describe services actually offered; distinguish availability, territory, and appointment requirements.
|
|
22
|
+
- **Description:** write factual business/service information. Keep promotions and links out of this field.
|
|
23
|
+
- **Hours and contact:** confirm regular/special hours, correct phone routing, and a location-specific working website/booking link.
|
|
24
|
+
- **Photos:** propose real exterior/entrance, interior, team, or service imagery appropriate to the business. Confirm permission before publishing identifiable customers.
|
|
25
|
+
- **Posts:** use them for relevant current updates, offers, or events where available; do not invent a posting-frequency ranking benefit.
|
|
26
|
+
- **Q&A:** Google [discontinued its Q&A API on November 3, 2025](https://developers.google.com/my-business/content/qanda/change-log). Do not prescribe API seeding or a universal editable Q&A section. Verify current interface availability; answer common customer questions in website content and accurate profile fields when a profile feature is unavailable.
|
|
27
|
+
|
|
28
|
+
For service areas, confirm actual coverage using [Google's service-area guidance](https://support.google.com/business/answer/9157481). Listing another town does not create a new location or remove searcher distance as a ranking factor.
|
|
29
|
+
|
|
30
|
+
## Citation Cleanup Table
|
|
31
|
+
|
|
32
|
+
Use one row per observed listing:
|
|
33
|
+
|
|
34
|
+
| Location/entity | Listing URL | Observed public facts | Verified source of truth | Correction / duplicate action | Access/status | Verification date |
|
|
35
|
+
|---|---|---|---|---|---|---|
|
|
36
|
+
|
|
37
|
+
Compare meaning, not merely punctuation: an abbreviation need not be an identity conflict. A wrong phone, old address, mismatched business, or duplicate that diverts customers deserves priority. Preserve location distinctions and legitimate branch phone numbers.
|
|
38
|
+
|
|
39
|
+
For a home-based service business, use supported hidden-address listings or skip platforms that require publishing private information. Maintain the private operating address separately from public citation data.
|
|
40
|
+
|
|
41
|
+
Select listings for customer relevance and accurate discovery. Bulk low-quality links, lifetime domain metrics, or a directory count alone do not demonstrate improved local outcomes. DIY corrections are a valid path; paid listing management is optional when its coverage, control, cost, and verification process fit the business.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Local SEO
|
|
2
|
+
|
|
3
|
+
Use this reference when the audit or request is about a local business: Google Business Profile, the map pack, citations, reviews, or location pages.
|
|
4
|
+
|
|
5
|
+
Help local customers find the right business and turn searches into qualified calls, bookings, and visits. Diagnose the specific location and search context before prescribing changes.
|
|
6
|
+
|
|
7
|
+
## Start With the Business Model
|
|
8
|
+
|
|
9
|
+
Read existing product context at `.agents/product-marketing.md` (or `.claude/product-marketing.md`, including older `product-marketing-context.md` setups). Ask only for missing facts relevant to the request:
|
|
10
|
+
|
|
11
|
+
- Business type: customers visit a storefront, staff travel to customers, both, or online only.
|
|
12
|
+
- Actual operating locations, staffed hours, service coverage, services, and capacity.
|
|
13
|
+
- Website and profile URLs; ownership, verification, duplicates, suspensions, or recent moves.
|
|
14
|
+
- Desired outcome and available evidence: qualified calls, bookings, visits, profile performance, Search Console, and location-level conversion data.
|
|
15
|
+
|
|
16
|
+
Use the requested scope. A profile description request needs a description, not a compulsory full audit. Without access, provide a provisional plan and identify the evidence needed; never report invented profile findings.
|
|
17
|
+
|
|
18
|
+
For profile eligibility, address visibility, duplicates, categories, and current feature availability, read [profile-and-citations.md](local-seo-profile-and-citations.md). An online-only business needs a different SEO plan. A service area is not a collection of extra storefronts.
|
|
19
|
+
|
|
20
|
+
## Diagnose the Local Search Problem
|
|
21
|
+
|
|
22
|
+
Keep the two surfaces separate:
|
|
23
|
+
|
|
24
|
+
| Surface | Inspect | Evidence to retain |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| Maps / local pack | Correct profile, query relevance, searcher distance, reputation | Query, observation date, search location, device/context, profile URL |
|
|
27
|
+
| Organic website results | Indexation, relevant location/service page, content, internal links | Query, page URL, Search Console data where available |
|
|
28
|
+
|
|
29
|
+
Google describes local ranking through relevance, distance, and prominence. Distance varies with the searcher's location; a larger declared service area does not establish a nearer physical location. Do not promise a top-three placement or a fixed ranking uplift.
|
|
30
|
+
|
|
31
|
+
Compare like with like: the same queries, locations, observation method, and time window. A single search from the owner's office is not evidence of visibility throughout a city. Separate branded from non-branded demand and label estimates, observed facts, and hypotheses.
|
|
32
|
+
|
|
33
|
+
Prioritize the constraint supported by evidence:
|
|
34
|
+
|
|
35
|
+
1. Wrong, ineligible, duplicate, unverified, or suspended profile: resolve the actual issue before adding promotional content.
|
|
36
|
+
2. Customers cannot contact or visit correctly: repair location facts, hours, destination links, and conversion paths.
|
|
37
|
+
3. Relevant demand is not represented: improve accurate categories, service information, and useful location pages.
|
|
38
|
+
4. Weak trust or discovery: address genuine customer feedback, relevant citations, and earned local mentions.
|
|
39
|
+
|
|
40
|
+
## Improve the Profile and Citation Record
|
|
41
|
+
|
|
42
|
+
Use [profile-and-citations.md](local-seo-profile-and-citations.md) for the requested profile or listing work. Produce field-level edits grounded in real business facts, with the existing value, proposed value, reason, and missing verification.
|
|
43
|
+
|
|
44
|
+
Build a canonical location record for the real-world name, public contact details, customer-facing hours, profile ID, and matching location URL. Keep a private operating address separate when customers do not visit it. Never publish a hidden home address merely to satisfy a citation checklist.
|
|
45
|
+
|
|
46
|
+
Citation cleanup should resolve conflicting identities and customer-facing information. Prioritize relevant maps, local/chamber, and industry listings customers actually use. Correct existing records and merge true duplicates through supported processes before creating more listings. For a software product directory campaign, use directory-submissions; its launch prerequisites and incentive rules are not a local Google review policy.
|
|
47
|
+
|
|
48
|
+
## Earn and Respond to Reviews
|
|
49
|
+
|
|
50
|
+
Ask customers with genuine experiences for honest feedback through a neutral request and the correct location's review link. Do not select only happy customers, buy reviews, offer incentives, require particular wording, or promise removal of criticism. Google's rules differ from other review platforms (see the luckiest-referrals skill's review programs reference); read the current [Maps review policy](https://support.google.com/contributionpolicy/answer/7400114?hl=en-GB).
|
|
51
|
+
|
|
52
|
+
Example request: "Thanks for choosing [business]. If you'd like to share your experience, you can leave a review here: [location review link]. We welcome your honest feedback."
|
|
53
|
+
|
|
54
|
+
Reply specifically and courteously. For a complaint, acknowledge the concern and offer an appropriate private contact path without exposing customer, medical, financial, or job details. Report a policy violation through the platform's process; an unfavorable genuine opinion is not automatically removable.
|
|
55
|
+
|
|
56
|
+
Track recurring feedback and service improvements alongside review volume and recency. A rating target must not become a staff quota for soliciting specified review content.
|
|
57
|
+
|
|
58
|
+
## Build Useful Location and Service Pages
|
|
59
|
+
|
|
60
|
+
Read [location-pages-and-measurement.md](local-seo-pages-and-measurement.md) when building pages, preparing local schema, or measuring results.
|
|
61
|
+
|
|
62
|
+
Give each real location a useful destination. A service-area page describes verified service coverage; it must not imply an office that does not exist. Publish a city page only when it adds meaningful local information, evidence, or customer utility. Swapping city names in duplicated text does not create that value.
|
|
63
|
+
|
|
64
|
+
Route implementation details to the relevant existing skill:
|
|
65
|
+
|
|
66
|
+
- **The rest of this skill (seo-audit):** crawling, indexing, redirects, speed, and technical diagnosis.
|
|
67
|
+
- **site-architecture:** location hierarchy, navigation, and internal links.
|
|
68
|
+
- **programmatic-seo:** scaling a justified page pattern backed by real data.
|
|
69
|
+
- **schema:** markup implementation after choosing accurate, public business facts.
|
|
70
|
+
- **ai-seo:** visibility in AI answers when that is part of the request.
|
|
71
|
+
|
|
72
|
+
## Return a Decision and an Actionable Artifact
|
|
73
|
+
|
|
74
|
+
For an audit or plan, return:
|
|
75
|
+
|
|
76
|
+
1. Business model and the specific location/search surface assessed.
|
|
77
|
+
2. Findings with source, date, customer impact, confidence, and missing evidence.
|
|
78
|
+
3. Prioritized changes with a responsible owner and a way to verify completion.
|
|
79
|
+
4. The requested artifact: field edits, citation cleanup table, review drafts, location-page outline, or measurement plan.
|
|
80
|
+
5. Follow-up measures tied to qualified customer actions rather than rankings alone.
|
|
81
|
+
|
|
82
|
+
For narrow requests, deliver the artifact directly and state only the relevant assumptions. Drafting a plan does not itself authorize profile changes, messages to customers, or directory submissions; follow the user's existing authorization for execution.
|
|
83
|
+
|
|
84
|
+
## Sources
|
|
85
|
+
|
|
86
|
+
Check current platform rules when a recommendation depends on them. The references link directly to the relevant Google documentation, including retired Q&A functionality and the distinction between Schema.org validity and Google rich-result eligibility.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Rankings Push
|
|
2
|
+
|
|
3
|
+
Audits find what's broken. This reference covers the next step: moving pages that already rank onto page one, and shipping new pages so they start strong. Both are cheaper than winning a query from nothing, because Google has already decided the site is relevant.
|
|
4
|
+
|
|
5
|
+
## Find the candidates
|
|
6
|
+
|
|
7
|
+
From Search Console, pull query + page pairs for the trailing 28 days (compare with the previous period to filter out spikes):
|
|
8
|
+
|
|
9
|
+
| Bucket | Filter | Fix type |
|
|
10
|
+
|--------|--------|----------|
|
|
11
|
+
| **Striking distance** | Average position 8–20, impressions above a floor that fits the site (often 100+/month) | Content and links |
|
|
12
|
+
| **Weak click-through** | Position 1–5, CTR well below other pages at similar positions | Title and meta description |
|
|
13
|
+
| **Near the top** | Position 4–7 on a revenue query | Content, links, and featured-snippet format |
|
|
14
|
+
|
|
15
|
+
Prioritize by business value: a position-11 query that drives demos beats a position-9 glossary term with three times the impressions.
|
|
16
|
+
|
|
17
|
+
Before touching a page, check for **cannibalization**: if two of your pages rank for the same query, positions often bounce between them and neither climbs. Pick one owner, merge the useful parts of the other into it, and redirect.
|
|
18
|
+
|
|
19
|
+
## Diagnose against the top three
|
|
20
|
+
|
|
21
|
+
Open the three results above you and write down, for each one, the concrete reason it wins. Usually one of these:
|
|
22
|
+
|
|
23
|
+
- **Intent match.** They answer the question the searcher is asking; your page answers a neighboring one. A pricing query answered with a features page loses.
|
|
24
|
+
- **A missing section.** They cover a sub-question you skip. The People Also Ask box and the subheadings across the top results show what searchers expect.
|
|
25
|
+
- **Freshness.** Their facts, screenshots, or year are current and yours aren't.
|
|
26
|
+
- **Format.** They have the table, steps, or tool the query calls for.
|
|
27
|
+
- **Links.** They're linked from more, and stronger, pages, inside their site and out.
|
|
28
|
+
|
|
29
|
+
If you can't name a reason, don't guess with a rewrite. The gap is more likely authority than on-page, and the fix is links (the `backlink-prospecting` loop in `marketing-loops`) rather than content.
|
|
30
|
+
|
|
31
|
+
## Make the smallest change that closes the gap
|
|
32
|
+
|
|
33
|
+
- **Answer the query in the first two sentences**, then expand. This is also the passage AI Overviews and assistants tend to quote.
|
|
34
|
+
- **Add the missing section**, not a rewrite of the whole page. Pages that already rank have signals worth keeping.
|
|
35
|
+
- **Put the query in the title and H1** if it reads naturally. If the title is already aligned, leave it.
|
|
36
|
+
- **Add internal links to the page** from your strongest related pages, with anchor text that describes the target. This is often the biggest single lever and the most neglected.
|
|
37
|
+
- **Refresh what's stale**: facts, screenshots, the year, broken links.
|
|
38
|
+
- **For weak click-through only**, change the title and meta description and nothing else, so the result is attributable. Patterns in [title-tags.md](title-tags.md).
|
|
39
|
+
|
|
40
|
+
Record the starting position, impressions, and CTR, then wait 3–4 weeks before judging or changing the page again. Rankings take time to settle after an edit, and stacked changes make it impossible to know what worked.
|
|
41
|
+
|
|
42
|
+
If two rounds move nothing, stop editing. The page is probably limited by intent mismatch (Google wants a different kind of page) or authority, and more on-page work won't fix either.
|
|
43
|
+
|
|
44
|
+
## Shipping a new page
|
|
45
|
+
|
|
46
|
+
A new page should launch with everything it needs to be found, so it doesn't spend months as an orphan:
|
|
47
|
+
|
|
48
|
+
- [ ] Internal links from at least three relevant existing pages, with descriptive anchors
|
|
49
|
+
- [ ] Unique title and meta description matching the target query
|
|
50
|
+
- [ ] One H1, aligned with the title
|
|
51
|
+
- [ ] Self-referencing canonical
|
|
52
|
+
- [ ] Added to the XML sitemap
|
|
53
|
+
- [ ] Structured data where the page type supports it (see `luckiest-schema`)
|
|
54
|
+
- [ ] Main content present in the server-rendered HTML, not only after JavaScript runs
|
|
55
|
+
- [ ] Indexable: no stray `noindex`, not blocked in robots.txt
|
|
56
|
+
- [ ] Linked to the right conversion path (see `cro`)
|
|
57
|
+
|
|
58
|
+
After it ships, request indexing once in Search Console. Requesting again doesn't speed anything up. If the page isn't indexed after a few weeks, check the causes in the Indexation section of the audit instead of resubmitting.
|
|
59
|
+
|
|
60
|
+
## Run it on a schedule
|
|
61
|
+
|
|
62
|
+
Run this weekly with state, cooldowns, and a stop rule, so the same page is not pushed again before its last change has had time to show.
|