growth-report について
ライブの DataForSEO データを使い、3か月分の SEO パフォーマンスをまとめた HTML レポートを生成するスキルです。指定した期間と国について、ドメインと競合を分析するマーケティングチーム向けです。
主な機能
- 01自然検索トラフィックとキーワード順位の変化を集計
- 02対象ドメインと競合の実績を比較
- 03競合の過去のトラフィック傾向を追跡
- 04流入の多いコンテンツページを特定
- 05戦略優先カードとエグゼクティブサマリーを作成
- 06Infrasity のブランドデザインで HTML を出力
活用シーン
- 01四半期の SEO パフォーマンスレビュー作成
- 02複数の競合とサイトの検索実績を比較
- 03トラフィック変化とコンテンツ拡充の機会を特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ infrasity-labs/ dev-gtm-claude-skills --skill growth-reportインストール後、Claude Code で/growth-reportを入力して読み込まれたか確認します。
同梱ファイルREADME.mdreferences/html-template.md
詳細
SEO パフォーマンスレポートスキル
DataForSEO のライブデータを使用して、3 か月分の包括的な SEO パフォーマンス HTML レポートを生成します。 レポートでは、トラフィックの推移、キーワードランキング、主要なコンテンツクラスター、競合他社との位置づけ、 戦略的な優先事項、エグゼクティブサマリーを、すべて Infrasity のブランドデザインシステムに沿って取り上げます。
STEP 0 — 何よりも先に、すべての入力を収集する
4 つの入力はすべて必須です。 4 つすべてが確認できるまで、API を呼び出してはいけません。
次の正確な形式を使い、1 回のメッセージでまとめて質問してください。1 つずつ質問せず、 必要な情報を一度にすべて尋ねてください。
ユーザーが 4 つの入力をすべて提供していない場合は、次のように尋ねます。
レポートの生成には、次の 4 つの情報が必要です。
- 対象ドメイン — レポート対象のサイト。例:
firefly.ai- 競合ドメイン — 最大 5~6 社。例:
spacelift.io, env0.com, terraform.io- 日付範囲 — 3 か月間の開始日と終了日(デフォルト:2026 年 2 月 20 日 → 5 月 20 日)
- 地域 — 検索データの国(デフォルト:United States)
デフォルトから変更したい項目はありますか?
ユーザーが対象ドメインと競合他社をすでに提供している場合(例:「firefly.ai と spacelift.io, env0.com の SEO レポートを生成」)は、任意の 2 つの入力を確認します。
承知しました。firefly.ai と spacelift.io, env0.com のレポートを生成します。
デフォルトの設定を確認します。
- 日付範囲: 2026 年 2 月 20 日 → 2026 年 5 月 20 日
- 地域: United States
このまま進めてよろしいですか? 変更したい項目はありますか?
入力の解析ルール:
| 入力 | ルール |
|---|---|
TARGET_DOMAIN | https://、http://、www.、末尾のスラッシュを削除します。ドメイン部分のみを保存します(例:firefly.ai)。 |
COMPETITORS | 各ドメインから同じプレフィックスを削除します。カンマ区切りまたはスペース区切りのリストを受け付けます。競合他社は最低 2 社、最大 6 社です。 |
START_DATE | 人が読み取れる任意の日付形式を解析して → YYYY-MM-DD にします。デフォルト:2026-02-20 |
END_DATE | 人が読み取れる任意の日付形式を解析して → YYYY-MM-DD にします。デフォルト:2026-05-20 |
LOCATION | 国名を受け付けます。デフォルト:United States。有効な DataForSEO の location_name である必要があります(国名全体のみ。都市名や地域名は不可)。 |
確認後、処理を続ける前に、確定した入力を明確にユーザーへ提示します。
✓ 対象: firefly.ai ✓ 競合他社: spacelift.io, env0.com, controlmonkey.io, scalr.com, terraform.io ✓ 日付範囲: 2026 年 2 月 20 日 → 2026 年 5 月 20 日 ✓ 地域: United States
データを取得しています...
CRITICAL API SETTINGS
DataForSEO のすべての呼び出しで、必ず ignore_synonyms: false を使用してください。
デフォルトの ignore_synonyms: true を使うと、トラフィックとキーワード数が 30~50%過少に計上されます。
これは最も重要なパラメーターです。決して省略しないでください。
STEP 1 — ベースライン指標
dataforseo_labs_google_historical_rank_overview を次の内容で呼び出します。
target: TARGET_DOMAIN
location_name: LOCATION
language_code: en
ignore_synonyms: false
返された月次配列から、START_DATE に最も近いスナップショットを見つけます(年と月で照合)。 次の値を抽出して保存します。
baseline_traffic=metrics.organic.etvbaseline_keywords=metrics.organic.countbaseline_top3=metrics.organic.pos_1+metrics.organic.pos_2_3
⚠️ DataForSEO に
pos_1_3フィールドはありません。Top 3 は必ずpos_1 + pos_2_3で計算してください。
レポートのトラフィック推移バーに使用するため、START_DATE から END_DATE までのすべての月次スナップショットも抽出します (通常は 3~4 個のデータポイントです)。
- 各スナップショットについて、
month_label(例:「2026 年 2 月」)、etv、year、monthを保存します。 - 日付の昇順に並べ替えます。
- これらを HTML テンプレート内の
TREND_LABEL_1..4、TREND_ETV_1..4に設定します。
STEP 2 — 現在の指標
dataforseo_labs_google_domain_rank_overview を次の内容で呼び出します:
target: TARGET_DOMAIN
location_name: LOCATION
language_code: en
ignore_synonyms: false
metrics.organic から次の値を抽出します:
current_traffic=etvcurrent_keywords=countcurrent_top3=pos_1+pos_2_3current_pos_1=pos_1current_pos_2_3=pos_2_3current_pos_4_10=pos_4_10current_pos_11_20=pos_11_20current_pos_21_100=pos_21_30+pos_31_40+pos_41_50+pos_51_60+pos_61_70+pos_71_80+pos_81_90+pos_91_100の合計
すべての差分を計算します:
traffic_growth_pct = ((current_traffic - baseline_traffic) / baseline_traffic) * 100
keywords_change = current_keywords - baseline_keywords
keywords_change_pct = (keywords_change / baseline_keywords) * 100
top3_growth_pct = ((current_top3 - baseline_top3) / baseline_top3) * 100
書式ルール:
- 正の値には
+を付けます。負の値には自動的に-が付きます - すべてのパーセンテージを小数点以下1桁に丸めます
- 正の差分には
posCSS クラス、負の差分にはnegを追加します
STEP 3 — 競合状況
3a — 現在のトラフィック概要
dataforseo_labs_bulk_traffic_estimation を次の内容で呼び出します:
targets: [TARGET_DOMAIN, ...COMPETITORS] ← all domains in a single API call
location_name: LOCATION
language_code: en
item_types: ["organic"]
ignore_synonyms: false
返された各ドメインについて、etv と count を抽出します。
すべてのドメインを etv の降順 に並べ替えます。トラフィックが最も多いドメインをランク1とします。 次の値を特定します:
competitive_rank= TARGET_DOMAIN の順位(1 = 1位)total_domains= 表内の全ドメイン数domain_above= TARGET_DOMAIN の1つ上の順位のドメイン(該当する場合)domain_below= TARGET_DOMAIN の1つ下の順位のドメイン(該当する場合)gap_to_next_above= domain_above の etv − current_traffic(TARGET_DOMAIN が1位の場合は0)lead_over_next_below= current_traffic − domain_below の etv(TARGET_DOMAIN が最下位の場合は0)
3b — 競合のトレンドシグナル(過去データ、オプション1)
各競合(ターゲットドメインを除く)について、dataforseo_labs_google_historical_rank_overview を呼び出します:
target: COMPETITOR_DOMAIN
location_name: LOCATION
language_code: en
ignore_synonyms: false
返された月別配列から:
- START_DATE に最も近いスナップショットを見つけ、
comp_baseline_etvを抽出します - END_DATE に最も近いスナップショットを見つけ、
comp_current_etvを抽出します - 次の式で計算します:
comp_trend_pct = ((comp_current_etv - comp_baseline_etv) / comp_baseline_etv) * 100
トレンドバッジの割り当てルール(安定とみなすしきい値は±5%):
| 条件 | バッジ | CSS クラス |
|---|---|---|
comp_trend_pct > +5% | ↑ +X.X% | trend-up(緑) |
comp_trend_pct < -5% | ↓ -X.X% | trend-down(赤) |
-5% ≤ comp_trend_pct ≤ +5% | → Stable (X.X%) | trend-stable(灰色) |
競合比較表の TARGET_DOMAIN のトレンド も、一貫性を保つため、同じ START_DATE → END_DATE の期間を使用する必要があります。この値には、ステップ1で取得した履歴データがすでに含まれています:
target_table_trend_pct = ((end_date_snapshot_etv - baseline_traffic) / baseline_traffic) * 100
ここで、end_date_snapshot_etv は、ステップ1の履歴配列に含まれる END_DATE に最も近いスナップショットの ETV です(ステップ2の current_traffic ではありません。こちらはリアルタイムの値です)。
同じ±5%のしきい値ルールを適用して、ターゲットのトレンドバッジを導出します。
⚠️ ステップ2の
traffic_growth_pct(baseline → live)は、タイムラインカード、差分バッジ、エグゼクティブサマリーに使用します。ただし、競合比較表のトレンド列には使用しません。 競合比較表のトレンド列では、ターゲットを含むすべてのドメインにtarget_table_trend_pct(START_DATE → END_DATE)を使用し、公平に比較できるようにします。
⚠️ この計算を行わずに競合のトレンドを「Stable」としてはいけません。 競合比較表のすべてのトレンドバッジは、実際の過去の ETV データから導出する必要があります。
STEP 4 — 上位コンテンツクラスター
dataforseo_labs_google_relevant_pages を次の内容で呼び出します:
target: TARGET_DOMAIN
location_name: LOCATION
language_code: en
order_by: ["metrics.organic.etv,desc"]
limit: 3
ignore_synonyms: false
上位3ページそれぞれについて、次の値を抽出します:
page_address— 表示 URL を短縮します。https://www.のプレフィックスを削除し、パスは残しますmetrics.organic.etv→ page_etv(カンマ区切りで書式設定し、最も近い整数に丸めます)metrics.organic.count→ page_keywords
ホームページへの集中度チェック:
page_1_etv / current_traffic > 0.80 の場合、homepage_concentration = true と設定します。
これにより、エグゼクティブサマリーに特定の段落が追加されます。
STEP 5 — レポート目標値の導出(Q2カード)
IF traffic_growth_pct >= 0:
traffic_goal = round(current_traffic * (1 + traffic_growth_pct/100))
ELSE:
traffic_goal = round(baseline_traffic * 0.9) ← recovery target
keywords_goal = max(round(current_keywords * 1.2), round(baseline_keywords * 0.95))
top3_goal = round(current_top3 * 1.3)
IF competitive_rank == 1:
target_badge = "Maintain #1"
ELSE:
target_badge = "Challenge #" + str(competitive_rank - 1)
traffic_goal は、例:62,000+ の形式にします。見やすく表示するため、最も近い千の単位に丸めます。
STEP 6 — 戦略的優先事項カードを作成する
必ずカードをちょうど 6 枚作成します。説明にはすべて、実際のデータ値を使用し、一般的なテキストは使わないでください。 該当する場合は、ステップ 3b の競合他社のトレンドデータを参照して、カードの説明を充実させてください。
| # | カードタイトルの形式 | 内容のルール |
|---|---|---|
| 1 | "Close Gap to #[rank_above]" | domain_above を挙げ、gap_to_next_above を ETV として示し、そのトレンドバッジ(増加/減少)を記載します。減少している場合は、機会の窓が狭まっていると表現します。 |
| 2 | "Defend vs. / Watch [domain_below or fastest_growing_competitor]" | 順位が下の競合他社が急成長(>+20%)している場合は、新たな脅威として警告します。それ以外の場合は domain_below を挙げ、lead_over_next_below を示します。 |
| 3 | トラフィック回復、または拡大 | 減少している場合:「[X]%の減少を反転」とし、パイプラインとして pos_4_10 の件数を記載します。増加している場合:「[X]%の成長軌道を維持」とし、市場の状況(例:ほとんどの競合他社が減少しているかどうか)を記載します。 |
| 4 | "Scale Top Content Clusters" | page_1 の URL と ETV を記載し、該当する場合はホームページへの集中を警告します。 |
| 5 | "Recover/Expand Keyword Coverage" | 回復または拡大の具体的な数値として keywords_change を使用します。 |
| 6 | "Convert Pos 4–10 to Top 3" | 現在の current_pos_4_10 件数を使用し、その 20% を転換するとトップ 3 のランキングが約 N 件増えることを記載します。 |
STEP 7 — エグゼクティブサマリーを作成する(4 段落)
自然な文章で記述し、段落内に箇条書きを入れないでください。すべての数値に実際の API 値を使用します。
-
段落 1: 全体の結果。traffic_growth_pct と total_domains における competitive_rank を記載します。競合他社のトレンド分布(ステップ 3b から算出した増加、横ばい、減少の件数)と、対象が最も成長しているかどうかを示します。直上・直下の順位にあるドメイン名と、それぞれの ETV およびトレンドの方向を記載します。
-
段落 2:
homepage_concentration = trueの場合:トラフィックの X% が 1 ページから来ていることを指摘し、リスクであると同時に多様化の機会でもあると説明します。 それ以外の場合:競合他社とのキーワード数の比較を示し、コンテンツの幅広さという優位性を説明します。 -
段落 3: 上位 3 キーワードのトレンド(top3_growth_pct)を記載します。keywords_change に触れ、マイナスの場合は失った具体的な数を示し、早急に取り戻す必要があることを述べます。プラスの場合は勢いがあると表現します。
-
段落 4: 第 2 四半期の戦略。埋めるべき具体的な差(gap_to_next_above)と、追い上げる競合他社(domain_above)、その増減の方向を記載します。domain_above が減少している場合は、機会の窓が狭まっていると表現します。データに基づき、最も効果の大きい回復または拡大施策を記載します。
最も成長しているかどうかの判定 — target_table_trend_pct を、ステップ 3b のすべての競合他社の comp_trend_pct 値と比較します。TARGET_DOMAIN のトレンド率が全体で最も高い場合は、is_fastest_growing = true に設定します。段落 1 とサマリーバッジでこの値を使用します。
サマリーバッジの形式:
Rank #[competitive_rank] | [current_traffic_K]K Traffic | [traffic_growth_pct]% Growth | [current_top3] Top-3 Keywords | [Fastest Growing / Declining / Stable]
最後のラベルは次のとおりです。
- is_fastest_growing = true の場合は Fastest Growing
- 最も成長しているわけではなく、traffic_growth_pct > 5% の場合は Growing
- 最も成長しているわけではなく、traffic_growth_pct < -5% の場合は Declining
- 最も成長しているわけではなく、-5% <= traffic_growth_pct <= +5% の場合は Stable
STEP 8 — HTML レポートを生成する
HTML の構造、CSS、変数マップの全容については、references/html-template.md を読みます。
テンプレートでは、Infrasity ブランドデザインシステムのみを使用します。
- 背景:
#0D0A1A(黒みがかったバイオレット)。白や、その他の暗い色は使用しないでください。 - メインのアクセントカラー:
#8157F2。唯一のアクセントカラーです。青や緑に置き換えないでください。 - フォント:すべての見出し/KPI 値/セクション番号には
Instrument Sans、すべての本文/ラベル/UI テキストにはDM Sans、パス/コード/データ値にはDM Mono - ステータスカラー:
#5DCEA6(プラスの変化)、#F07070(マイナスの変化)
他のカラーパレットやフォントスタックを変更、上書き、混在させないでください。
すべての {{VARIABLE}} に実際のデータを入力します。ファイルを次の場所に出力します。
/mnt/user-data/outputs/{TARGET_DOMAIN}_seo_report.html
続いて present_files を呼び出して、ユーザーにファイルを渡します。
エラー処理
| 状況 | 対応 |
|---|---|
| bulk_traffic_estimation からドメインのデータが返されない | そのドメインを競合比較表から省き、脚注を追加します |
| START_DATE または END_DATE の月の履歴スナップショットがない | 最も近い月を使用し、レポートのフッターに実際に使用した日付を記載します |
baseline_traffic が 0(ゼロ除算) | traffic_growth_pct を「N/A」に設定し、それに依存するすべての差分バッジを省略します。さらに、START_DATE のベースラインデータを利用できなかったことをレポートのフッターに記載します |
baseline_top3 が 0(ゼロ除算) | top3_growth_pct を「N/A」に設定し、差分バッジを省略します |
comp_baseline_etv が 0(競合のトレンドにおけるゼロ除算) | トレンド列で、その競合を「N/A」と表示します |
backlinks_bulk_ranks の 40204 エラー | このエンドポイントは呼び出さないでください。別途サブスクリプションが必要です。完全に省略します。 |
ai_opt_llm_ment_agg_metrics の 40204 エラー | AI 引用セクションを含めないでください。このスキルでは対象外です。 |
含めないもの
- ❌ AI/LLM 引用セクションなし — 設計上対象外です(DataForSEO の有料アドオンが必要です)
- ❌ DFS Rank(0–1000)列なし — 設計上対象外です(別途サブスクリプションが必要です)
- ❌
ignore_synonyms: trueなし — 常にfalseとし、例外はありません - ❌ プレースホルダーテキストなし — HTML 内のすべての数値は、実際の API レスポンスに基づく必要があります
- ❌ 入力を一つずつ尋ねない — 不足している入力はすべて、1 回のメッセージでまとめて収集します
- ❌ 競合のトレンドをデフォルトで「Stable」にしない — 常に過去の ETV 比較からトレンドを導き出します
参照ファイル
references/html-template.md— CSS デザインシステム、各セクションのマークアップ、競合比較表の行パターン、変数の完全な置換マップを含む、Infrasity ブランドの完全な HTML テンプレートです。 HTML を作成する前に、必ずこのファイルを読んでください。Infrasity のデザインのみが許可される出力デザインです。他の配色、フォントスタック、レイアウトは使用しないでください。