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

GitHub

SEO 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_KEY in .env.api for Supabase blog posts.
  • content/blog-data.json for static legacy posts.

Workflow

  1. 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
  1. 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.
  1. 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.
  1. Verify:
  • API-backed posts: GET /api/blog/posts/{slug} confirms both markers.
  • Static posts: content/blog-data.json confirms both markers.
  • Spot-check 1-2 public URLs with curl -I or rendered HTML.
  1. Log the change:
  • Append concise entries to .claude/skills/blog-changelog.md and docs/SEO/maintenance/seo-changes-backlog.md.
  • Add unchecked URLs to docs/SEO/maintenance/gsc-request-indexing-backlog.md only 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-position to include pages outside positions 4-15

The script is idempotent: it skips posts that already contain both [!CTA_TRY] and [!CTA_DEMO].