ctr-optimization

Installation
SKILL.md

CTR Optimization

Find where the property's click-through rate falls short of what its positions should earn, and produce a candidates table plus a rewrite brief per page. The user's request may contain a property, a date range, a site section or path, a country, and a focus hint such as "product pages only"; honor all of them. When the user wants one merged list of every kind of opportunity, run the quick-wins skill instead.

Workflow

  1. Resolve the property and the window. If the user's request or the conversation names a property, use it. Site URLs use GSC formats: sc-domain:example.com or https://www.example.com/. Otherwise call list_sites and pick the obvious match. If several plausible properties exist, ask the user which one before continuing.

    • Use the last 28 days unless the user specifies dates; a shorter window makes the per-position CTR too noisy to judge.
    • When the user's request names a section, a path or a country, carry it into the step 4 filters rather than judging the whole property.
    • GSC data lags about 2 to 3 days: never treat the most recent 2 days as complete, and if a dip appears at the very edge of the range, say it is likely reporting lag, not a real drop.
  2. CTR curve against benchmarks. Call analyze_ctr_curve with siteUrl, the dates, minImpressions: 10 and benchmarkSource: "all" (or one of awr, awr2026, awrAio, firstPageSage, sistrix, backlinko, which adds the flat expectedCtr and ctrDelta fields). buckets always holds positions 1 to 20 in order, each with clicks, impressions, queryCount, ctr, benchmarks (expected CTR per source) and deltas (actual minus expected).

    • ctr values are already percentages on a 0-100 scale, never multiply them by 100, and the deltas are percentage points: a negative delta means the bucket underperforms that benchmark.
    • Keep the buckets whose delta is negative against most sources and whose impressions are large; a bucket with queryCount 0 has no data, and emptyBecause means every bucket is empty, so its zeros are placeholders, not underperformance.
    • The gap between awr2026 and awrAio is the AI Overview click tax: a property that trails awr2026 but matches awrAio is probably losing clicks to AI Overviews rather than to weak titles, which a rewrite cannot fix.
    • truncated: true means the live API read was cut at scanLimit queries and zero-click queries were dropped first, so the bucket CTRs read high, not low.
Installs
2
First Seen
2 days ago