mcpField
S
shopping-ads

shopping-ads

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

shopping-ads について

shopping-ads は、Google Shopping キャンペーンと Merchant Center の商品フィードを管理する Agent Skills™ スキルです。フィードの監査・最適化、商品の分類、キャンペーンの入札構成を扱います。

主な機能

  1. 01商品フィード属性の監査
  2. 02商品タイトルと説明の最適化
  3. 03カスタムラベルによる分類
  4. 04キャンペーンと入札構成の設計
  5. 05補助フィードデータの管理

活用シーン

  1. 01フィードのエラーや商品不承認を発見
  2. 02検索との関連性を高める商品タイトルの改善
  3. 03入札を分けるための商品分類
  4. 04Shopping キャンペーン構成の計画

インストール

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

$npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill shopping-ads

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

詳細

ショッピング広告

Agent Skills™ の一部です。googleadsagent.ai™ によって提供されています。

説明

Shopping Ads スキルは、Google ショッピング キャンペーンと Merchant Center の商品フィードをエンドツーエンドで管理します。ショッピング広告は、Google のエコシステムで最も購買意欲の高い広告フォーマットです。ユーザーはクリックする前に商品画像、価格、販売者名を確認できるため、購買意欲の高い見込み客を獲得できます。ショッピング広告の成果が平凡に終わるか、優れたものになるかは、ほとんどの場合、フィードの品質とキャンペーン構成で決まります。

商品フィードの最適化が基盤となります。このスキルは、タイトル、説明、商品タイプ、Google 商品カテゴリ、GTIN、カスタムラベル、画像、価格、在庫状況など、すべてのフィード属性をGoogleの要件および競合他社のベストプラクティスに照らして監査します。タイトルは、検索との関連性が高い属性(ブランド、色、サイズ、素材)を前方に配置して、視認性を最大化するよう最適化されます。説明には、ロングテールの検索語句に合致するキーワードが追加されます。カスタムラベルを使うことで、利益率の段階、ベストセラー、季節商品など、パフォーマンスに基づくセグメント化が可能になり、インテリジェントな入札戦略を実現できます。

キャンペーン構成では、フィードの最適化を入札管理へと拡張します。このスキルは、優先度設定、カスタムラベルによるセグメント化、除外キーワードの調整を活用して、どの商品をどの検索語句にどの入札額で一致させるかを制御するショッピングキャンペーンの構成を設計します。標準ショッピングでは、検索語句単位で制御できる階層型キャンペーンを構成します。PMax ショッピングでは、商品パフォーマンスのクラスターに合わせてアセットグループをセグメント化します。補助フィード、競合価格の分析、ローカル在庫広告、無料リスティングを加え、包括的なショッピング戦略を構成します。

使用する場面

  • ユーザーが「ショッピング広告」または「ショッピングキャンペーン」について質問する場合
  • ユーザーが「商品フィード」または「Merchant Center」に言及する場合
  • ユーザーが「商品タイトルを最適化したい」または「フィードの品質を改善したい」と希望する場合
  • ユーザーが「カスタムラベル」または「補助フィード」について質問する場合
  • ユーザーが「商品の不承認」または「Merchant Center のエラー」に言及する場合
  • ユーザーが「ショッピングの ROAS を改善したい」または「ショッピングの CPA を下げたい」と希望する場合
  • ユーザーが「競合価格」または「価格のベンチマーク」について質問する場合
  • ユーザーが「ローカル在庫広告」または「無料リスティング」に言及する場合
  • ユーザーがパフォーマンスに基づいて「商品をセグメント化したい」と希望する場合

アーキテクチャ

flowchart TD
    A[Merchant Center] --> B[Feed Analysis Engine]

    B --> C[Attribute Audit]
    C --> C1[Title Optimization]
    C --> C2[Description Enrichment]
    C --> C3[Category Mapping]
    C --> C4[Image Quality Check]
    C --> C5[GTIN/MPN Validation]

    B --> D[Custom Label Strategy]
    D --> D1[Label 0: Margin Tier]
    D --> D2[Label 1: Best Sellers]
    D --> D3[Label 2: Seasonality]
    D --> D4[Label 3: Price Range]
    D --> D5[Label 4: New vs Existing]

    B --> E[Competitive Intelligence]
    E --> E1[Price Benchmarks]
    E --> E2[Click Share]
    E --> E3[Impression Share]

    C1 --> F[Optimized Feed]
    C2 --> F
    C3 --> F
    C4 --> F
    C5 --> F
    D1 --> F
    D2 --> F
    D3 --> F
    D4 --> F
    D5 --> F

    F --> G[Campaign Structure]
    G --> G1[Standard Shopping\nPriority Tiers]
    G --> G2[PMax Shopping\nAsset Group Segmentation]

    E1 --> H[Bid Strategy]
    E2 --> H
    E3 --> H
    G1 --> H
    G2 --> H

    H --> I[Performance Monitoring]
    I --> J[Product-Level ROAS]
    I --> K[Query-Level Analysis]
    I --> L[Competitive Position Tracking]

実装

商品フィードの監査・最適化エンジン:

async function auditProductFeed(merchantId) {
  const products = await getMerchantProducts(merchantId);
  const diagnostics = await getFeedDiagnostics(merchantId);

  const audit = {
    totalProducts: products.length,
    activeProducts: products.filter(p => p.status === 'active').length,
    disapproved: products.filter(p => p.status === 'disapproved'),
    warnings: diagnostics.warnings,
    attributeAnalysis: analyzeAttributes(products),
    titleOptimization: auditTitles(products),
    descriptionQuality: auditDescriptions(products),
    imageQuality: auditImages(products),
    pricingAnalysis: analyzePricing(products),
    customLabelStrategy: designCustomLabels(products)
  };

  return audit;
}

function auditTitles(products) {
  const issues = [];

  for (const product of products) {
    const title = product.title;

    if (title.length < 25) {
      issues.push({ productId: product.id, issue: 'Title too short', current: title });
    }
    if (title.length > 150) {
      issues.push({ productId: product.id, issue: 'Title exceeds optimal length', current: title });
    }
    if (!title.toLowerCase().includes(product.brand?.toLowerCase())) {
      issues.push({ productId: product.id, issue: 'Brand missing from title', current: title });
    }

    const optimizedTitle = buildOptimizedTitle(product);
    if (optimizedTitle !== title) {
      issues.push({
        productId: product.id,
        issue: 'Title can be optimized',
        current: title,
        recommended: optimizedTitle
      });
    }
  }

  return { issues, optimizationRate: issues.length / products.length };
}

function buildOptimizedTitle(product) {
  const components = [
    product.brand,
    product.title.replace(product.brand, '').trim(),
    product.color,
    product.size,
    product.material,
    product.gender
  ].filter(Boolean);

  const optimized = components.join(' - ');
  return optimized.substring(0, 150);
}

function designCustomLabels(products) {
  const performanceData = products.map(p => ({
    id: p.id,
    revenue: p.revenue30d,
    cost: p.cost30d,
    roas: p.revenue30d / Math.max(p.cost30d, 0.01),
    margin: p.margin,
    clicks: p.clicks30d,
    conversions: p.conversions30d
  }));

  return {
    customLabel0: {
      name: 'Margin Tier',
      values: assignMarginTiers(performanceData),
      biddingImplication: 'Higher bids on high-margin products'
    },
    customLabel1: {
      name: 'Performance Tier',
      values: assignPerformanceTiers(performanceData),
      biddingImplication: 'Aggressive bids on top performers, reduced on low performers'
    },
    customLabel2: {
      name: 'Seasonality',
      values: assignSeasonality(products),
      biddingImplication: 'Boost seasonal products during peak periods'
    },
    customLabel3: {
      name: 'Price Competitiveness',
      values: assignPriceCompetitiveness(products),
      biddingImplication: 'Higher bids when price-competitive, lower when overpriced'
    },
    customLabel4: {
      name: 'Product Lifecycle',
      values: products.map(p => ({
        productId: p.id,
        label: p.daysListed < 30 ? 'new_arrival' : p.daysListed > 180 ? 'clearance' : 'established'
      })),
      biddingImplication: 'Promotional bids for new arrivals and clearance'
    }
  };
}

補助フィードと競合価格:

function buildSupplementalFeed(products, enrichmentData) {
  return products.map(product => ({
    id: product.id,
    custom_label_0: enrichmentData[product.id]?.marginTier,
    custom_label_1: enrichmentData[product.id]?.performanceTier,
    custom_label_2: enrichmentData[product.id]?.seasonality,
    custom_label_3: enrichmentData[product.id]?.priceCompetitiveness,
    custom_label_4: enrichmentData[product.id]?.lifecycle,
    sale_price: enrichmentData[product.id]?.promotionalPrice,
    promotion_id: enrichmentData[product.id]?.activePromotion
  }));
}

function analyzeCompetitivePricing(products, benchmarkData) {
  return products.map(product => {
    const benchmark = benchmarkData[product.id];
    if (!benchmark) return { productId: product.id, status: 'no_benchmark_data' };

    const pricePosition = product.price / benchmark.benchmarkPrice;

    return {
      productId: product.id,
      yourPrice: product.price,
      benchmarkPrice: benchmark.benchmarkPrice,
      priceIndex: pricePosition,
      status: pricePosition <= 0.95 ? 'price_leader'
        : pricePosition <= 1.05 ? 'competitive'
        : pricePosition <= 1.15 ? 'slightly_above'
        : 'overpriced',
      clickShareImpact: estimateClickShareImpact(pricePosition),
      recommendation: pricePosition > 1.15
        ? 'Consider price reduction or value-add messaging'
        : 'Maintain current pricing strategy'
    };
  });
}

Buddy™ Agent との連携

Shopping Ads は、Buddy™ Agent の中核となるeコマーススキルです。このプラットフォームは Merchant Center に直接接続し、フィードを継続的に監査することで、不承認、属性の問題、最適化の機会をリアルタイムで検出します。商品が不承認になると、Buddy™ は違反の詳細と修正案をすぐにユーザーへ通知します。

Buddy™ は補助フィードの管理を自動化し、手動で CSV をアップロードすることなく、継続的に集計したパフォーマンスデータに基づいてカスタムラベルを更新します。プラットフォームは、設定可能なスケジュール(日次または週次)でカスタムラベルの割り当てを生成して適用し、入札戦略に常に最新の商品パフォーマンスを反映します。

競合価格については、Buddy™ が価格ベンチマークデータを監視し、商品が競争力を失った場合にユーザーへ通知します。価格分析を入札戦略と連携させ、価格が高すぎる商品の入札額を自動で下げ、価格競争力のある商品の入札額を上げることで、ROAS を最大化します。

ベストプラクティス

  1. 検索に関連性の高い属性(ブランド、商品タイプ、主な機能)を商品タイトルの先頭に配置します
  2. 5つのカスタムラベルを戦略的に活用して、入札管理を細分化します
  3. 最新の実績と在庫状況を反映するため、補助フィードを少なくとも週に1回更新します
  4. Merchant Center の不承認を毎日確認して修正します。不承認の商品からは収益が得られません
  5. 拡張リスティングと競合ベンチマークを利用できるよう、すべての商品に GTIN/MPN を含めます
  6. 白い背景で、透かしや販促文のない高品質な商品画像を使用します
  7. 入札を個別に設定するため、カスタムラベルの実績に応じてショッピングキャンペーンをセグメント化します
  8. 競合の価格を毎週監視し、価格競争力に基づいて入札を調整します
  9. 無料リスティングを有効にして、追加のオーガニックなショッピングトラフィックを費用なしで獲得します
  10. 実店舗を運営している場合は、近隣の買い物客を獲得できるよう、ローカル在庫広告を設定します

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

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

関連スキル

  • PMax Optimization - 商品フィードの品質は Performance Max のショッピング掲載枠に直接影響します
  • Competitor Analysis - 競合の価格情報を活用してショッピングの入札戦略を調整します
  • Remarketing Strategy - ダイナミックリマーケティングでは、商品フィードのデータを使ってパーソナライズされた商品広告を配信します
  • MCP Server Creation - MCP による Merchant Center との連携で、フィード管理ツールを自動化できます

キーワード

ショッピング広告、商品フィード、Merchant Center、フィード最適化、カスタムラベル、補助フィード、商品タイトル、ショッピングキャンペーン、Google ショッピング、商品リスティング広告、競合価格、ローカル在庫広告、無料リスティング、ショッピング ROAS、商品フィード監査


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

コメント