seo-blog-ctr-body-cta
Find high-impression, zero/near-zero CTR blog pages from GSC data and add mid-body CTA blocks using the MyImageUpscaler blog API or static blog-data fallback. Use for blog CTR recovery passes where pa
SKILL.md.agents/skills/seo-blog-ctr-body-cta/SKILL.md
GitHubSEO Blog CTR Body CTA Pass
Use this skill when GSC shows blog pages with high impressions and 0% or very low CTR, especially pages near positions 4-15. The goal is to add in-body click-confirmation and CTA blocks, not rewrite the whole article.
Inputs
- GSC CTR export from
gsc-analysis, usually generated by:
node ./.agents/skills/gsc-analysis/scripts/ctr-tracker.cjs \
--site=myimageupscaler.com \
--all-ctr-deficit \
--min-impressions=1000 \
--output=/tmp/ctr-miu.json
BLOG_API_KEYin.env.apifor Supabase blog posts.content/blog-data.jsonfor static legacy posts.
Workflow
- Read recent context first:
tail -80 .claude/skills/blog-changelog.md 2>/dev/null || true
sed -n '1,140p' docs/SEO/maintenance/seo-changes-backlog.md
sed -n '1,120p' docs/SEO/maintenance/gsc-request-indexing-backlog.md
- Identify candidates:
- Include blog URLs with impressions >= 1000 and CTR <= 0.25%.
- Prioritize pages with average position 4-15.
- Deduplicate URL fragments to the canonical
/blog/{slug}. - Do not patch the control/example post if it already has good body CTA markers.
- Add body CTAs:
- Keep edits surgical.
- Add
> [!CTA_TRY]after an early relevant tool link or first major section. - Add
> [!CTA_DEMO]mid-article after a decision/use-case section. - Add one sentence before each marker that matches the article intent and explains what the user should try.
- Avoid metadata changes unless explicitly requested.
- Verify:
- API-backed posts:
GET /api/blog/posts/{slug}confirms both markers. - Static posts:
content/blog-data.jsonconfirms both markers. - Spot-check 1-2 public URLs with
curl -Ior rendered HTML.
- Log the change:
- Append concise entries to
.claude/skills/blog-changelog.mdanddocs/SEO/maintenance/seo-changes-backlog.md. - Add unchecked URLs to
docs/SEO/maintenance/gsc-request-indexing-backlog.mdonly if not already present.
Script
Run the helper with dry-run first:
node .agents/skills/seo-blog-ctr-body-cta/scripts/ctr-body-cta-pass.cjs \
--gsc=/tmp/ctr-miu.json \
--dry-run
Apply:
node .agents/skills/seo-blog-ctr-body-cta/scripts/ctr-body-cta-pass.cjs \
--gsc=/tmp/ctr-miu.json \
--apply
Useful flags:
--min-impressions=1000--max-ctr=0.0025--max-pages=20--include-low-positionto include pages outside positions 4-15
The script is idempotent: it skips posts that already contain both [!CTA_TRY] and [!CTA_DEMO].