{"id":"landing","name":"google-ads-landing","summary":"Google広告のランディングページを評価し、診断しましょう。ランディングページの監査、品質チェック、高クリック率でコンバージョン率の低い広告グループの診断、Quality Scoreのランディングページ体験コンポーネントの改善、広告グループのメッセージとランディングページの比較などを依頼された際に活用してください。","body":"## Setup\n\nRead and follow `../shared/preamble.md` (MCP detection, account selection) and `../shared/analysis-principles.md` (evidence requirement, guardrails). Both apply throughout this skill — every dimension below is a measurement, not an opinion.\n\n# Landing Page Scoring + Diagnostic\n\nGoogle Ads campaigns fail on the landing page more often than in the auction. A great RSA that sends traffic to a slow, unfocused, or mismatched page burns budget twice — once on the click, once on the lost conversion. This skill scores landing pages on **5 weighted dimensions** and emits concrete fixes.\n\nOnly score pages that actually run ad traffic. Don't score random marketing pages. Run this on direct request, on auto-handoff from `/google-ads-audit` (high-CTR / low-CVR ad groups), when QS diagnosis flags \"Landing Page Experience: Below Average\", or as a preflight before `/google-ads-copy` writes new copy for a page nobody's validated.\n\nWhen the question is about ad-to-page fit, high CTR / low CVR, LPX, or testing ads and landing pages together, read `references/message-chain-testing.md` before scoring. It keeps the diagnosis focused on the paid-search message chain instead of drifting into a generic web-design audit.\n\n## Reference\n\n- `references/scoring-rubric.md` — the 5-dimension weighted rubric, thresholds, and evidence fields. Read before scoring.\n- `references/message-chain-testing.md` — query → ad → page message-chain diagnosis and ad+LP test design.\n- `../manage/references/quality-score-framework.md` — only when the user's explicit goal is QS improvement.\n\n## Phase 1: Resolve the target pages\n\nFigure out which URLs to score. In priority order:\n\n1. **User supplied a URL** — score that page, skip discovery.\n2. **User supplied an ad group or campaign name** — `runScript` a GAQL query against `ad_group_ad` filtered to that ad group; extract unique `final_urls`. Normalize (strip tracking params, preserve path + query that affects routing).\n3. **Auto-handoff from `/google-ads-audit`** — the handoff passes the specific ad groups flagged. Pull their final URLs the same way.\n4. **No arguments** — `runScript` an `ad_group_ad` query across the account ranking final URLs by last-30-day spend, propose the top 3, ask the user to confirm.\n\n**De-duplicate aggressively.** Many ads point to the same final URL — score each unique URL once, then map back to every ad group that uses it.\n\n## Phase 2: Gather signal (parallel)\n\nDo all of these in a single tool-use turn:\n\n1. **WebFetch the landing page** — capture visible headline, subheadline, primary CTA text, form fields, trust signals, body copy tone. Capture the full HTML so we can spot script bloat and above-the-fold content.\n2. **PageSpeed Insights API call** — `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url={url}&strategy=mobile&category=performance&category=accessibility&category=best-practices&category=seo` via WebFetch. No API key needed for single-URL queries. Extract LCP, CLS, INP, TTI, performance score, and the top 3 opportunities from `lighthouseResult.audits`.\n3. **Pull the referring ad copy and the ad group's conversion metrics** — one `runScript` call with `ads.gaqlParallel` against `ad_group_ad` (for headline/description text — the message-match baseline) and `ad_group` or `keyword_view` (for clicks, conversions, CVR — used to ground the dollar-impact estimate). One call covers both.\n4. **Read `{data_dir}/business-context.json`** — for brand voice, differentiators, offers, target audience. If missing, point the user to `/google-ads-audit` first. Don't guess the business.\n\nIf any single call fails, continue — note the gap in the report rather than blocking. PageSpeed Insights can rate-limit; if it does, fall back to a manual timing annotation (\"PSI unavailable — could not score Page Speed\") and deflate the final report's confidence rather than skipping the dimension.\n\n## Phase 3: Score the page\n\nRead `references/scoring-rubric.md` and score each dimension 0-100 with evidence. The dimension scores are real measurements (PageSpeed Insights numbers, word-for-word copy comparison, form field counts, etc.) — they're not artificial ratings, they're observations.\n\nCompute the weighted composite only as an **internal reference number** for the dollar-lift formula below. Do not surface it as a letter grade. The user sees the dimension-level measurements and the estimated dollar lift — the composite is plumbing.\n\n```\ninternal_composite = 0.25 * Message Match\n                   + 0.25 * Page Speed\n                   + 0.20 * Mobile Experience\n                   + 0.15 * Trust Signals\n                   + 0.15 * Form & CTA\n```\n\n**Dollar lift is the headline.** If `business-context.json.unit_economics` has `aov_usd` + `profit_margin`, compute the estimated monthly lift from raising the composite by 15 points (see `../shared/ppc-math.md`):\n\n```\nTarget lift           = min(+15, 90 - internal_composite)    # cap at 90 internal\nAssumed CVR lift      = target_lift / 100 * 0.5              # cap at 50% relative lift\nCurrent conversions   = ad group conversions from last 30d\nAdditional conversions = current_conversions * assumed_CVR_lift\nAdditional revenue    = additional_conversions * AOV\nAdditional profit     = additional_conversions * AOV * profit_margin\n```\n\nPresent the lift as `fixing this page is worth ~$X/mo in profit` — never as a guarantee. The 50% cap on CVR lift and the 15-point cap on score improvement keep estimates out of fantasy territory. If `unit_economics` isn't available, skip the dollar line entirely rather than making up a number — the dimension measurements still stand on their own.\n\n## Phase 4: Deliver the report\n\nMax 60 lines. Lead with the dollar lift (when available) and the single biggest fix. No letter grade.\n\n```\n# Landing Page — [URL]\nAds sending traffic here: [N ad groups] · [X clicks/mo] · [$Y spent/mo] · CVR [Z%]\n[If unit_economics available] **Estimated lift from top 3 fixes: ~$X/mo in profit**\n[If unit_economics is missing] _(Dollar lift unavailable — no verified AOV/margin. Confirm unit economics in business-context.json for sharper estimates.)_\n\n**Biggest leak:** [one sentence naming the dimension and the specific observation, e.g. \"LCP is 5.8s on mobile — 2.8s slower than the 3s threshold that kills conversion rate.\"]\n\n## Measurements\n| Dimension | Measurement | Top Finding |\n|-----------|-------------|-------------|\n| Message Match | [word-for-word verdict: Match / Drift / Broken] | [one line citing ad H1 vs page H1] |\n| Page Speed | LCP Xs · INP Xms · CLS X · PSI perf score X | [top blocking audit from Lighthouse] |\n| Mobile Experience | PSI accessibility X · [mobile-specific issue count] | [one line: e.g. \"No click-to-call, form below fold\"] |\n| Trust Signals | [review count, years in business, cert count] | [one line: e.g. \"Zero named testimonials, copyright 2023\"] |\n| Form & CTA | [field count] fields · CTA text: \"[button]\" · [above/below fold] | [one line: e.g. \"11 fields for a free quote\"] |\n\n## Fix First (top 3, ranked by estimated $ lift)\n1. **[Action]** — est. +$X/mo · `<time_to_fix>`\n   Evidence: [the actual text/number from the page or PSI audit]\n2. **[Action]** — est. +$X/mo · `<time_to_fix>`\n   Evidence: [...]\n3. **[Action]** — est. +$X/mo · `<time_to_fix>`\n   Evidence: [...]\n\n## Message Match Detail\nAd headline: \"[actual headline from top-spending ad]\"\nPage H1:    \"[actual H1 from landing page]\"\nObservation: [Match / Drift / Broken] — [one-line rationale citing the specific words that match or don't]\n\n## Handoff\n[Pick one:]\n- Page speed dominates the problem → \"Share these fixes with your developer: [list]\"\n- Message mismatch dominates → \"Run /google-ads-copy to rewrite ads to match the page, or update the page to match the ads\"\n- Form friction dominates → \"Reduce form to [specific fields]. Every removed field is ~10% more conversions\"\n```\n\n## Writing back to history\n\nAppend the score to `{data_dir}/landing-page-history.json` so re-audits can show deltas:\n\n```json\n{\n  \"pages\": {\n    \"https://example.com/services/roofing\": {\n      \"history\": [\n        {\n          \"date\": \"2026-04-14\",\n          \"internal_composite\": 67,\n          \"dimensions\": {\n            \"message_match\": 72,\n            \"page_speed\": 45,\n            \"mobile\": 80,\n            \"trust\": 70,\n            \"form_cta\": 65\n          },\n          \"psi_mobile_lcp_s\": 4.2,\n          \"psi_mobile_cls\": 0.15,\n          \"psi_mobile_inp_ms\": 320,\n          \"estimated_lift_usd_per_month\": 380,\n          \"ad_groups\": [\"Example City Search - Roofing\"],\n          \"monthly_spend\": 1240.50,\n          \"monthly_cvr\": 2.1,\n          \"biggest_leak\": \"Page Speed — LCP 4.2s on mobile\"\n        }\n      ]\n    }\n  }\n}\n```\n\n`internal_composite` is stored for trend tracking only — it's the internal reference number used by the dollar-lift formula, never shown to the user as a letter grade. On subsequent runs against the same URL, diff the raw dimension measurements and the dollar lift: `LCP 4.2s → 2.1s · Page Speed 45 → 78 · estimated lift $380/mo → $120/mo remaining`. Three measurements moved, no artificial grade flip.\n\n## Rules\n\n1. **Never score a page without WebFetch'ing it.** The rubric demands evidence. No WebFetch = no score. Ask the user to help if the page is gated or requires auth.\n2. **Never report a PSI number you didn't measure.** If PSI failed, say \"PSI unavailable\" — don't estimate.\n3. **One page at a time unless the user asks for multiple.** Scoring three pages in one turn creates unreadable reports. Batch only when explicitly requested.\n4. **Don't rewrite copy here.** This skill diagnoses the page. Handoff to `/google-ads-copy` for new headlines or `/google-ads` for bid/negative/budget moves.\n5. **Margin-aware dollar impact requires verified unit economics.** If `unit_economics.source == \"inferred_from_template\"`, append `_(using industry defaults — confirm your AOV/margin for sharper estimates)_` to the lift line.\n6. **Always persist.** Every scored page goes into `landing-page-history.json`, even if the user doesn't ask — future audits depend on the baseline.","author":"@nowork-studio","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/nowork-studio/notfair-plugin/tree/main/google-ads/landing","license":"MIT","category":"writing","lang":"en","tokens":2475,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"evals/evals.json","size":848,"sha256":"12239360d0cfccea194f7eaa6d9ba8fbf223e33fa5db03204657e9e5cda6583e"},{"path":"references/message-chain-testing.md","size":3937,"sha256":"1dea38352d20aae31594f333618b3907f0f8dc5f94226cf86ce938036cbfd716"},{"path":"references/scoring-rubric.md","size":10633,"sha256":"5b1674345ff13023f458d0a6300644975746f21e6dc962dab0a424f7e7fdd84c"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":["www.googleapis.com"]}}