mcpField
Q
quality-score-optimization

quality-score-optimization

github.com/itallstartedwithaideaマーケティング・グロース44101 回インストール28 週間前に更新
リポジトリ

quality-score-optimization について

Google Adsのキーワード単位で品質スコアを診断・改善するスキルです。スコアの要素と推移を分析し、費用とCPCへの影響に基づいて改善案を優先順位付けします。

主な機能

  1. 01品質スコアの3要素を分析
  2. 02キーワードスコアの履歴を追跡
  3. 03スコア変化とアカウント変更を関連付け
  4. 04費用への影響で改善案を順位付け
  5. 05CPC削減額を推定

活用シーン

  1. 01高CPCや広告ランク低下の調査
  2. 02キーワードスコア低下の原因特定
  3. 03高支出キーワードの改善優先付け
  4. 04スコア推移の経時的な追跡

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill quality-score-optimization

インストール後、Claude Code で/quality-score-optimizationを入力して読み込まれたか確認します。

詳細

品質スコアの最適化

googleadsagent.ai™によるAgent Skills™の一部

説明

品質スコアの最適化スキルは、Google Ads アカウント内のすべてのキーワードについて、品質スコアを診断、追跡、改善するための体系的なフレームワークを提供します。品質スコアは、キーワード、広告、ランディングページの全体的な関連性と品質を Google が 1~10 で評価したものです。広告ランク、クリック単価、さらには広告が表示されるかどうかに直接影響します。品質スコアが 1 ポイント上がると、CPC を 10~15% 削減できる可能性があります。

このスキルでは、品質スコアを 3 つの構成要素、つまり予測クリック率(eCTR)、広告の関連性、ランディングページの利便性に分解し、それぞれに的を絞った改善策を提供します。現時点のスナップショットを確認するだけでなく、キーワード単位で過去の品質スコアの推移を追跡し、スコア低下のパターンを特定して、アカウントの変更との関連性を分析します。この時系列分析により、スコアの変動の根本原因を明らかにできます。

最適化エンジンは、費用額に応じてキーワードに重み付けし、改善の優先順位を決定します。1 日に 1,000 ドルを消費するキーワードの品質スコアを改善することは、1 日に 5 ドルを消費するキーワードで同じ改善を行うよりも、はるかに大きな効果があります。このスキルは、効果の高い順に並べた改善計画を生成し、CPC 削減額を推定するとともに、業界分野ごとのベンチマークに対する改善の進捗を追跡します。

使用する場面

  • ユーザーが「品質スコア」または「QS の最適化」について尋ねた場合
  • ユーザーが品質に関する問題が原因と思われる「高い CPC」に言及した場合
  • ユーザーが入札額を増やさずに「広告ランクを改善」したい場合
  • ユーザーが「予測 CTR」、「広告の関連性」、または「ランディングページの利便性」について尋ねた場合
  • ユーザーが構成要素の品質が「平均を下回る」と言及した場合
  • ユーザーが品質の改善によって「クリック単価を削減」したい場合
  • ユーザーが「広告が表示されないのはなぜか」と尋ねた場合(QS が原因の可能性があります)
  • ユーザーが「品質スコアの経時変化を追跡」したい場合

アーキテクチャ

flowchart TD
    A[Google Ads API:\nKeyword Quality Data] --> B[QS Data Extraction]

    B --> C[Current QS Snapshot]
    B --> D[Historical QS Tracking]
    B --> E[Sub-Component Breakdown]

    E --> F[Expected CTR Analysis]
    E --> G[Ad Relevance Analysis]
    E --> H[Landing Page Experience Analysis]

    F --> I[CTR Improvement Engine]
    I --> I1[Ad Copy Testing]
    I --> I2[Ad Extension Optimization]
    I --> I3[Audience Refinement]

    G --> J[Relevance Improvement Engine]
    J --> J1[Keyword-Ad Alignment]
    J --> J2[Ad Group Restructuring]
    J --> J3[DKI Opportunities]

    H --> K[Landing Page Improvement Engine]
    K --> K1[Page Speed Optimization]
    K --> K2[Content Relevance Matching]
    K --> K3[Mobile Experience Audit]

    I1 --> L[Spend-Weighted Priority Ranker]
    I2 --> L
    I3 --> L
    J1 --> L
    J2 --> L
    J3 --> L
    K1 --> L
    K2 --> L
    K3 --> L

    L --> M[QS Improvement Plan]
    M --> N[Estimated CPC Savings]
    M --> O[Implementation Roadmap]
    M --> P[Progress Tracking Dashboard]

実装

品質スコアの抽出・分析エンジン:

async function analyzeQualityScores(customerId) {
  const keywordData = await getKeywordQualityData(customerId);

  const analysis = keywordData.map(kw => ({
    keyword: kw.text,
    matchType: kw.matchType,
    qualityScore: kw.qualityScore,
    expectedCtr: kw.expectedCtr,
    adRelevance: kw.adRelevance,
    landingPageExperience: kw.landingPageExperience,
    monthlySpend: kw.costMicros / 1_000_000,
    impressions: kw.impressions,
    weightedImpact: calculateWeightedImpact(kw)
  }));

  return {
    distribution: buildQSDistribution(analysis),
    bottomKeywords: analysis.filter(kw => kw.qualityScore <= 5)
      .sort((a, b) => b.weightedImpact - a.weightedImpact),
    componentBreakdown: analyzeComponents(analysis),
    estimatedSavings: estimateCPCSavings(analysis),
    improvementPlan: generateImprovementPlan(analysis)
  };
}

function calculateWeightedImpact(keyword) {
  const spendWeight = keyword.costMicros / 1_000_000;
  const qsDeficit = 10 - keyword.qualityScore;
  const cpcSavingsPerPoint = keyword.avgCpc * 0.12;
  return spendWeight * qsDeficit * cpcSavingsPerPoint;
}

function analyzeComponents(keywords) {
  const components = { expectedCtr: [], adRelevance: [], landingPageExperience: [] };

  for (const kw of keywords) {
    if (kw.expectedCtr === 'BELOW_AVERAGE') components.expectedCtr.push(kw);
    if (kw.adRelevance === 'BELOW_AVERAGE') components.adRelevance.push(kw);
    if (kw.landingPageExperience === 'BELOW_AVERAGE') components.landingPageExperience.push(kw);
  }

  return {
    expectedCtr: {
      belowAverage: components.expectedCtr,
      totalSpendAffected: sumSpend(components.expectedCtr),
      strategies: [
        'Test new ad copy with stronger CTAs and benefit statements',
        'Add sitelink and callout extensions to increase ad real estate',
        'Refine audience targeting to reach higher-intent users',
        'Use ad customizers for time-sensitive or location-specific messaging'
      ]
    },
    adRelevance: {
      belowAverage: components.adRelevance,
      totalSpendAffected: sumSpend(components.adRelevance),
      strategies: [
        'Restructure ad groups to tighter keyword themes (max 15-20 keywords)',
        'Include exact keyword text in at least 2 headlines per RSA',
        'Use dynamic keyword insertion where natural',
        'Create SKAGs for highest-spend keywords with persistent relevance issues'
      ]
    },
    landingPageExperience: {
      belowAverage: components.landingPageExperience,
      totalSpendAffected: sumSpend(components.landingPageExperience),
      strategies: [
        'Improve page load speed (target under 3 seconds on mobile)',
        'Ensure keyword-relevant content appears above the fold',
        'Add trust signals: reviews, certifications, security badges',
        'Optimize mobile layout with clear CTA and minimal form fields'
      ]
    }
  };
}

過去の品質スコアの追跡:

async function trackQualityScoreHistory(customerId, keyword, days = 180) {
  const snapshots = await getHistoricalQSSnapshots(customerId, keyword, days);

  return {
    trend: calculateTrend(snapshots),
    changePoints: detectChangePoints(snapshots),
    correlations: correlateWithAccountChanges(snapshots, customerId),
    forecast: forecastQS(snapshots, 30)
  };
}

function estimateCPCSavings(keywords) {
  let totalMonthlySavings = 0;

  for (const kw of keywords) {
    if (kw.qualityScore < 7) {
      const targetQS = Math.min(kw.qualityScore + 2, 10);
      const qsImprovement = targetQS - kw.qualityScore;
      const cpcReduction = qsImprovement * 0.12;
      const monthlySavings = kw.monthlySpend * cpcReduction;
      totalMonthlySavings += monthlySavings;
    }
  }

  return { estimatedMonthlySavings: totalMonthlySavings, annualized: totalMonthlySavings * 12 };
}

Buddy™ エージェントとの統合

品質スコアの最適化は、Buddy™ エージェントの常時監視レイヤーとして機能します。このプラットフォームは、有効なすべてのキーワードの品質スコアを毎日スナップショットとして記録し、傾向分析と変化点の検出に必要な時系列データセットを構築します。Buddy™ が費用の大きいキーワードの品質スコア低下を検出すると、直ちに調査ワークフローを開始します。

Buddy™ は品質スコアに関する検出結果を、適切な後続スキルに振り分けます。eCTR の問題には広告コピー生成スキルを、広告の関連性の問題にはキーワードの再構成に関する提案を、ランディングページの問題にはランディングページ監査スキルを適用します。これにより、品質を自動的に改善するループが実現します。

Buddy™ ダッシュボードには、費用に応じて重み付けされたアカウントの品質スコア健全性指標がリアルタイムで表示されます。アカウントレベルの QS の推移と、改善によって長期的に達成された CPC の推定削減額を確認できます。

ベストプラクティス

  1. QS の改善は、費用全体の上位 80% を占めるキーワードに重点を置きます
  2. まず「平均を下回る」構成要素を対象にします。改善効果が最も期待できます
  3. キーワードが 30 個を超える広告グループは、テーマを絞った小規模なグループに再構成します
  4. 各広告グループに少なくとも 3 つの RSA を用意し、見出しに主要キーワードを含めます
  5. Google の短期的な変動の影響を除外するため、QS は毎日ではなく毎週追跡します
  6. 過去の QS データを活用し、スコアの変化と特定のアカウント変更との関連性を分析します
  7. 検索ボリュームの少ないキーワードの QS を追い求めないでください。月間インプレッション数が 100 未満の場合、データの信頼性は低くなります
  8. ランディングページの利便性(サイトの速度、モバイル UX)を全体的に改善し、アカウント全体への効果を目指します
  9. ランディングページへの投資を関係者に説明するため、CPC の推定削減額を算出します
  10. ほとんどのキーワードでは QS 7~8 が現実的な目標だと認識します。QS 10 を目指しても、効果は次第に小さくなります

プラットフォームの互換性

プラットフォーム対応
Claude Code✅
Cursor✅
Codex✅
Gemini✅

関連スキル

  • 広告コピーの生成 - eCTR と広告の関連性を改善するには、最適化された広告コピーが必要です
  • ランディングページの監査 - ランディングページのエクスペリエンスは、QS を構成する 3 つの要素のうちの 1 つです
  • キーワード調査 - キーワードと広告グループの整合性は、広告の関連性スコアに直接影響します
  • メモリの永続化 - セッションをまたいだ QS の履歴追跡により、傾向の分析とリグレッションの検出が可能になります

キーワード

品質スコア、QS の最適化、予測クリック率、広告の関連性、ランディングページのエクスペリエンス、Google 広告の品質スコア、CPC の削減、広告ランクの向上、品質スコアの追跡、キーワードの品質、品質スコアの構成要素、品質スコアの履歴、品質スコアの改善


© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License

コメント