luckiest-co 1.0.47 → 1.0.48
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/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/coder-brainstorming/spec-document-reviewer-prompt.md +0 -49
- package/skills/trends/scripts/lib/reddit_rss.py +0 -224
|
@@ -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.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Title Tags
|
|
2
|
+
|
|
3
|
+
How to write and audit titles for both rankings and clicks. The title is the strongest on-page relevance signal you control and the first thing a searcher reads, so it has two jobs. It has to match the query, and it has to win the click against nine other results.
|
|
4
|
+
|
|
5
|
+
## Start from the results page
|
|
6
|
+
|
|
7
|
+
Search the page's target query before writing. The titles already ranking tell you three things:
|
|
8
|
+
- **The format Google rewards** for this query: lists, guides, tools, product pages, comparisons.
|
|
9
|
+
- **The words searchers expect to see**: modifiers like "best," "free," "template," "vs," a year, a number.
|
|
10
|
+
- **The gap**: what every title promises, and what none of them do.
|
|
11
|
+
|
|
12
|
+
Match the format, use the expected words, and differentiate on the gap. A how-to title on a query where every result is a tool page loses no matter how well it's written.
|
|
13
|
+
|
|
14
|
+
## Default structure
|
|
15
|
+
|
|
16
|
+
```text
|
|
17
|
+
[Primary query] + [what makes this result worth clicking] + [brand, if it helps]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- **Query first.** Put it in the first few words, where both the ranking and the reader's scan start.
|
|
21
|
+
- **Then the reason to click**: a number, a specific outcome, a scope ("for Shopify stores"), freshness, or a format ("free template").
|
|
22
|
+
- **Brand last**, and only where it earns the space. A well-known brand adds clicks; an unknown one mostly adds truncation risk.
|
|
23
|
+
- **About 50–60 characters.** Google truncates by pixel width, not characters, so keep the important words in the first 50.
|
|
24
|
+
|
|
25
|
+
## Pattern by page type
|
|
26
|
+
|
|
27
|
+
Pick the page type first, then the pattern. Don't blend two patterns in one title unless the results page does.
|
|
28
|
+
|
|
29
|
+
| Page type | When | Pattern |
|
|
30
|
+
|-----------|------|---------|
|
|
31
|
+
| Product / feature | Commercial query for what you sell | `[Category] for [Audience] \| [Brand]` |
|
|
32
|
+
| Pricing | "[brand] pricing," "[category] cost" | `[Brand] Pricing: Plans and Costs` |
|
|
33
|
+
| Comparison | "X vs Y" | `[A] vs [B]: [the deciding difference]` |
|
|
34
|
+
| Alternatives | "[competitor] alternatives" | `[N] Best [Competitor] Alternatives ([Year])` |
|
|
35
|
+
| Listicle | "best [things]" | `[N] Best [Things] for [Audience] in [Year]` |
|
|
36
|
+
| How-to | Task query | `How to [Task]` or `How to [Task] Without [Obstacle]` |
|
|
37
|
+
| Definition | "what is [term]" | `What Is [Term]? [Short payoff]` |
|
|
38
|
+
| Guide / pillar | Broad topic | `[Topic]: A Complete Guide for [Audience]` |
|
|
39
|
+
| Template / tool | "[thing] template," "[thing] calculator" | `Free [Thing] [Template/Calculator] ([Format])` |
|
|
40
|
+
| Troubleshooting | Error or problem query | `How to Fix [Problem]` or `[Error]: What It Means and How to Fix It` |
|
|
41
|
+
|
|
42
|
+
Only use "free," a year, or a number when the page delivers on it. A "2026" title on a page last updated in 2024 is a promise the content breaks.
|
|
43
|
+
|
|
44
|
+
## Keep the set consistent
|
|
45
|
+
|
|
46
|
+
- **Title, H1, URL slug, and meta description** should all describe the same topic. They don't need identical wording, but a reader moving from the title to the page should never wonder whether they landed in the right place.
|
|
47
|
+
- **Every title is unique.** Duplicates split relevance and usually mean a template is filling in the same string everywhere.
|
|
48
|
+
- **Don't change slugs** to chase a year or a number. Change the title; leave the URL and its links alone.
|
|
49
|
+
|
|
50
|
+
## Google rewrites titles
|
|
51
|
+
|
|
52
|
+
Google replaces the title tag with its own text in a meaningful share of results, usually taking it from the H1 or anchor text. It does this most often when a title is:
|
|
53
|
+
- Much longer than the display width
|
|
54
|
+
- Stuffed with keywords or repeated boilerplate ("| Brand | Brand Blog | Home")
|
|
55
|
+
- Out of line with the page's H1 or content
|
|
56
|
+
- Generic ("Home," "Products," "Untitled")
|
|
57
|
+
|
|
58
|
+
If Search Console or a live search shows a different title than the one you wrote, treat it as a signal: tighten the title and align it with the H1.
|
|
59
|
+
|
|
60
|
+
## Fixing low click-through
|
|
61
|
+
|
|
62
|
+
A page in the top five with a click-through rate well below other pages at the same position has a title or description problem, not a content problem. Compare it to the results around it and rewrite to:
|
|
63
|
+
- State the specific outcome or answer, not the topic
|
|
64
|
+
- Add the qualifier the searcher is filtering for (audience, platform, price, format)
|
|
65
|
+
- Remove words that add length without meaning ("Ultimate," "Complete Guide to the Many...")
|
|
66
|
+
|
|
67
|
+
Change one page at a time and record the baseline CTR, so a gain is attributable. Allow 3–4 weeks before judging.
|
|
68
|
+
|
|
69
|
+
## Common fixes
|
|
70
|
+
|
|
71
|
+
| Problem | Before | After |
|
|
72
|
+
|---------|--------|-------|
|
|
73
|
+
| Says nothing | `Home` | `Invoicing Software for Freelancers \| Acme` |
|
|
74
|
+
| Bloated | `The Ultimate Complete Guide to Everything About Email Deliverability` | `Email Deliverability: 12 Fixes for Inbox Placement` |
|
|
75
|
+
| Wrong page type | `Plans That Grow With You` | `Acme Pricing: Plans and Costs` |
|
|
76
|
+
| Brand first on an unknown brand | `Acme \| Project Management for Agencies` | `Project Management for Agencies \| Acme` |
|
|
77
|
+
| Promise the page breaks | `Free CRM Templates` (one paid template) | `CRM Template for Small Teams (Google Sheets)` |
|
|
78
|
+
|
|
79
|
+
## Bulk audits
|
|
80
|
+
|
|
81
|
+
Work from a crawl export (URL, title, H1, length, indexable status) and, if available, Search Console queries per page. Return changes as a table the owner can approve line by line:
|
|
82
|
+
|
|
83
|
+
```markdown
|
|
84
|
+
| Page | Current title | Proposed title | Reason |
|
|
85
|
+
|------|---------------|----------------|--------|
|
|
86
|
+
| /pricing | Plans That Grow With You | Acme Pricing: Plans and Costs | Matches the "acme pricing" query |
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Give 2–3 options only for the pages that matter most (top revenue pages, top-5 rankings with weak CTR). For the long tail, one proposal per page keeps the review fast.
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog — luckiest-signup
|
|
2
2
|
|
|
3
|
+
## 1.1.1 — 2026-10-16
|
|
4
|
+
From coreyhaines31/marketingskills at 1efedbc (issue #174, MIT).
|
|
5
|
+
|
|
6
|
+
- Sales-assist handoff points at the luckiest-revops inbound-routing playbook.
|
|
7
|
+
|
|
3
8
|
## 1.1.0 — 2026-07-06
|
|
4
9
|
Skill updater pass: analytics integration.
|
|
5
10
|
|