広告会社が運用する広告主のLPを、エージェントが毎日見回り、リンク切れ・計測タグの欠落・フォームの不具合・掲載終了したキャンペーンの残りを拾って、修正依頼の案を作る
運用している広告の遷移先のLPを毎朝見回り、リンク切れ、計測タグの欠落、フォームの不具合、終了したキャンペーンの表記の残りを拾います。見つかったものには根拠と原因の候補を付け、広告主への修正依頼の案を作ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Python/Zapier
- 対象業界
- EC/不動産/広告/教育
- 対象部門
- マーケティング
- 対象業務
- 内容確認・チェック/書類作成
- 主な課題
- 人手が足りない/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- エージェント
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当者が、LPの台帳から自分の受け持ちのLPを開く
- ページ内のリンクとボタンを押し、遷移先が開くかを確かめる
- ブラウザの拡張機能やページのソースで、入っているはずのタグがあるかを確かめる
- フォームがあれば入力画面まで進み、項目の表示と送信のボタンを確かめる
- キャンペーンの表記を見て、期間がキャンペーンの台帳と合っているかを確かめる
- 問題があれば、広告主のWeb担当へ修正の依頼をメールで書く
- 重大なもの(LPが開かない、フォームが送れない)は、広告の停止を広告主に相談する
- 自動毎朝6時に、ワークフローがLPの台帳の全LPを取得する
- 自動状態コード、リンク先の状態コード、ページに入っているタグのID、フォームの送信先、ページの文字を取り出す
- 自動前日のフォームの送信と計測の数を、Google アナリティクス 4 の API から取る
- 自動規則で不具合を拾う(状態コードの異常、タグのIDの欠落・食い違い、送信の数の急減、終了したキャンペーンの文字の残り)
- 自動不具合1件ごとに、エージェントが道具を選んで事実を集め、原因の候補と修正依頼の案を作る
- 自動担当者ごとの朝の一覧と、社内チャットへの通知を出す。LPが開かないものは最優先で知らせる
- 人担当者が一覧の不具合のLPだけを開き、目で確かめる
- 人修正依頼の案を直して、広告主のWeb担当へ送る。広告の停止が要るかは、担当者と広告主で決める
- 人直ったら一覧に記録する。翌朝の見回りで、直ったことを確かめる
各工程の詳しい説明を読む
- 担当者が、LPの台帳から自分の受け持ちのLPを開く
- ページ内のリンクとボタンを押し、遷移先が開くかを確かめる
- ブラウザの拡張機能やページのソースで、入っているはずのタグがあるかを確かめる
- フォームがあれば入力画面まで進み、項目の表示と送信のボタンを確かめる
- キャンペーンの表記を見て、期間がキャンペーンの台帳と合っているかを確かめる
- 問題があれば、広告主のWeb担当へ修正の依頼をメールで書く
- 重大なもの(LPが開かない、フォームが送れない)は、広告の停止を広告主に相談する
(a)週1回では間に合わない。 LPが壊れるのは、広告主がサイトを更新した日です。点検の翌日に壊れれば、次の点検まで6日間、壊れたLPに広告費を払い続けます。 毎日見たくても、150本を毎日開く時間はありません。
(b)タグの確認が人によって違う。 ある担当者はソースでIDまで確かめ、別の担当者はタグがあるかどうかだけを見ます。IDが別の広告主のものに差し替わっていた、テスト用のコンテナのままだった、という誤りは、IDまで見なければ分かりません。
(c)フォームの不具合は見た目で分からない。 入力画面が表示されても、送信が完了画面に進まない、送信の後のタグが動かない。送信まで試すと広告主の受付に偽の問い合わせが届くので、担当者は手前で止めます。 そのため、送信の不具合は数字が落ちるまで見えません。
(d)終了したキャンペーンの表記は、探さないと見つからない。 台帳の終了日を覚えている担当者でなければ、残っていることに気づきません。
- 【自動】 毎朝6時に、ワークフローがLPの台帳の全LPを取得する
- 【自動】 状態コード、リンク先の状態コード、ページに入っているタグのID、フォームの送信先、ページの文字を取り出す
- 【自動】 前日のフォームの送信と計測の数を、Google アナリティクス 4 の API から取る
- 【自動】 規則で不具合を拾う(状態コードの異常、タグのIDの欠落・食い違い、送信の数の急減、終了したキャンペーンの文字の残り)
- 【自動】 不具合1件ごとに、エージェントが道具を選んで事実を集め、原因の候補と修正依頼の案を作る
- 【自動】 担当者ごとの朝の一覧と、社内チャットへの通知を出す。LPが開かないものは最優先で知らせる
- 【人】 担当者が一覧の不具合のLPだけを開き、目で確かめる
- 【人】 修正依頼の案を直して、広告主のWeb担当へ送る。広告の停止が要るかは、担当者と広告主で決める
- 【人】 直ったら一覧に記録する。翌朝の見回りで、直ったことを確かめる
7番目が、この設計の分かれ目です。 担当者が開くのは、一覧に出たLPだけです。何も無いLPは開きません。 全部を目で確かめ直す運用にすると、毎日の見回りが毎日の点検に変わり、時間は増えます。
4番目を規則で決めているのも、意図してのことです。 エージェントに「おかしいかどうか」を判断させると、日によって拾う・拾わないが揺れます。
02今回想定するシステム構成
LPの台帳/キャンペーンの台帳/広告主のサイト更新の連絡 │ ▼【トリガー】n8n の Schedule Trigger(毎朝6時、Asia/Tokyo) n8n のワークフロー ├──▶ HTTP Request ノードで各LPを取得(状態コードとヘッダーも受け取る) ├──▶ HTML ノード(Extract HTML Content)でリンク・タグ・フォーム・文字を取り出す ├──▶ HTTP Request ノードでリンク先の状態コードを確かめる ├──▶ Google アナリティクス Data API(runReport)で前日の送信の数を取る ├──▶ Code ノードで規則に照らして不具合を拾う ▼ AI Agent ノード(Tools Agent)+ Claude │ 不具合1件ごとに、道具を選んで事実を集める │ ・ページを取り直す ・リンク先を確かめる │ ・解析の数値を引く ・キャンペーンの台帳を引く │ ・サイト更新の連絡を引く ・過去の同じ不具合と対応を引く │ Structured Output Parser で決まった形のJSONを返す ▼ 担当者ごとの朝の一覧(スプレッドシート)+社内チャットへの通知 ▼ 【人】不具合のLPだけを開いて確かめ、修正依頼を送る
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n | Make、Zapier、Power Automate |
| 生成AI | Claude API(n8n の Anthropic Chat Model ノード) | OpenAI API、Gemini API |
| 集計 | JavaScript(n8n の Code ノード) | Python |
| 連携 | Google アナリティクス Data API | 広告主から毎朝届く解析のレポート |
| 保管 | Google スプレッドシート(台帳と朝の一覧) | SharePoint リスト |
| 通知 | 社内チャット | メール |
ページの取得には、HTTP Request ノードを使います。 オプションの「Include Response Headers and Status」を有効にすると、本文だけでなくヘッダーと状態コードを含む応答全体を受け取れます。「Never Error」を有効にすると、状態コードにかかわらず成功として返るので、404や500のLPでワークフローが止まらず、そのまま不具合として記録できます。
「Redirects」で転送をたどるかと上限(Max Redirects)を設定し、最後に着いたURLを記録します。 ページが削除されると、トップページへ転送されることがよくあります。
一度に取りに行かないよう、「Batching」で1回に送る件数(Items per Batch)と間隔(Batch Interval、ミリ秒)を決めます。 待ち時間の上限は「Timeout」で決めます。
ページから要素を取り出すのは、HTML ノードの「Extract HTML Content」です。 CSS セレクターで要素を指定し、取り出す値を「Text」「HTML」「Attribute」「Value」から選べます。a 要素の href、script 要素の src、form 要素の action を Attribute で取り出し、 「Return Array」で複数の値を配列として受け取ります。
フォームの送信の数は、Google アナリティクス Data API の runReport で取ります。 期間(dateRanges)、ディメンション、指標を指定し、yesterday や 7daysAgo のような相対の日付が使えます。dimensionFilter で eventName を指定すれば、送信の完了のイベントだけに絞れます。
03どうやって実装するのか
処理の起点を決める
n8n の Schedule Trigger で、毎朝6時に動かします。 cron 式は (秒) 分 時 日 月 曜日 の欄で書き、秒の欄は省略できるとされています。毎日6時なら 0 6 * * * です。LPは週末にも広告から人を受けるので、土日も動かします。
ワークフローのタイムゾーンを Asia/Tokyo にします。 設定が無いとインスタンスのタイムゾーンが使われ、自分でホストする場合の既定は America/New York とされています。前日の送信の数を取る範囲が、日本の1日とずれます。 Schedule Trigger を使うワークフローは、保存して公開しないと動きません。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| LPの台帳 | URL、広告主、担当、入っているはずのタグのID(タグ管理のコンテナ、解析の測定ID、媒体のタグ)、フォームの有無と完了画面のURL | スプレッドシート |
| キャンペーンの台帳 | キャンペーン名、LPに出る表記の文字列、開始日、終了日 | スプレッドシート |
| ページの取得結果 | 状態コード、最後に着いたURL、HTML | HTTP Request ノード |
| 取り出した要素 | リンクのURL、script の src、フォームの action、ページの文字 | HTML ノード |
| 解析の数値 | ページごとの前日と直近7日の送信の完了の数 | Google アナリティクス Data API |
| サイト更新の連絡 | 広告主から届いた改修・メンテナンスの予定 | 担当者が書き込む予定表 |
| 不具合の台帳 | 過去の不具合、原因、対応、直った日 | スプレッドシート |
質を決めるのは、LPの台帳の「入っているはずのタグのID」と、キャンペーンの台帳の「表記の文字列」です。 IDが台帳に無ければ、タグが入っているかは分かっても、正しいタグかどうかは分かりません。 表記の文字列が無ければ、終了したキャンペーンをページの文字から探せません。
サイト更新の連絡は、担当者に書いてもらいます。 予定されたメンテナンスで一時的に開かないのは、修正依頼を送る話ではありません。予定が書かれていないと、広告主へ同じ連絡を毎回送ることになります。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| ページの状態とHTML | HTTP Request(Include Response Headers and Status、Never Error、Redirects、Batching) | 開くか、どこへ転送されたか |
| リンク・タグ・フォーム | HTML ノードの Extract HTML Content(Attribute、Return Array) | リンク先、タグのID、送信先 |
| リンク先の状態 | HTTP Request(同上) | リンク切れの検出 |
| 送信の完了の数 | runReport(dateRanges に yesterday と 7daysAgo、dimensionFilter で eventName) | フォームの不具合とタグの外れの裏付け |
| 台帳・予定・不具合の履歴 | スプレッドシートの読み取り(道具) | エージェントが必要なときに引く |
取得は、ワークフローの冒頭で全LP分を決まった手順で行います。 ここはエージェントに任せません。キャンペーンの台帳やサイト更新の予定は、冒頭では読みません。 不具合の出たLPについてだけ、エージェントが道具で引きます。
HTMLで見えるタグには限りがあります。 タグ管理の仕組みを使っているサイトでは、解析や媒体のタグはページを開いた後にスクリプトで読み込まれ、取得したHTMLには、タグ管理のコンテナの読み込みの部分しか現れません。 そのため、HTMLで確かめるのはコンテナのIDまでとし、その先のタグが動いているかは、解析の送信の数で裏付けます。
リクエストには、自社の見回りであることが分かる User-Agent を付けます。
AIへ渡す前に整形する
- 状態コードの確認 … 200以外のLPと、トップページなど台帳と違うURLに転送されたLPを拾います
- リンク先の確認 … ページ内のリンクのうち、同じサイトの中と、申込・予約などの主要な遷移先の状態コードを確かめます。外部のSNSの共有ボタンなどは対象から外します
- タグのIDの照合 … 台帳のIDがHTMLの
scriptのsrcや本文に含まれるかを見ます。別のIDが入っているものも拾います - フォームの送信先の確認 …
formのactionが台帳の送信先と違う、またはactionが空のフォームを拾います - 送信の数の変化の計算 … 前日の送信の完了の数を、直近7日の平均と比べます。平均が数件に満たないLPは、急減の判定から外します
- 終了したキャンペーンの表記の検索 … 終了日を過ぎたキャンペーンの表記の文字列が、ページの文字に残っているかを探します
- 台帳との突き合わせ … 同じLP・同じ種類の不具合で、修正を依頼中のものは外し、状態が変わったものだけを残します
3番目で「別のIDが入っている」を拾うのが、目視では難しかった点です。 制作会社が別の広告主のLPを複製して作ると、元の広告主のタグのIDが残ったまま公開されることがあります。タグはあるので、有無だけの確認では通ってしまいます。
5番目の「数件に満たないLPを外す」を省くと、一覧が揺れで埋まります。 送信が1日に1〜2件のLPでは、0件の日は珍しくありません。こうしたLPは、7日続けて0件になったときに拾う規則にします。
AIに処理させる
させるのは、規則で拾った不具合1件ごとに、必要な道具を選んで事実を集め、次の4つを組み立てることです。
| 組み立てるもの | 中身 |
|---|---|
| 何が起きているか | 不具合の種類と、状態コード・ID・数値を担当者が一目で分かる言葉にする |
| 原因の候補 | 1〜3個。それぞれに、根拠にした事実(取り直したページ、解析の数値、更新の予定、過去の不具合)を付ける |
| 修正依頼の案 | 広告主のWeb担当へ送る文面。どのURLの、どの箇所が、どうなっているか |
| 急ぎの度合い | 規則で決めた区分をそのまま使う |
| 道具 | 中身 | 呼ぶ場面 |
|---|---|---|
refetch_page | LPをもう一度取得し、状態コードと最後に着いたURLを返す | 開かない・転送されたとき(一時的な障害かを見る) |
check_links | 指定したリンクの状態コードを返す | リンク切れのとき |
get_ga4_events | ページごと・日ごとの送信の完了の数 | タグの欠落、フォームの不具合のとき |
get_campaign | キャンペーンの台帳の行(表記、終了日) | 終了した表記の残りのとき |
get_site_updates | 広告主のサイト更新・メンテナンスの予定 | すべての不具合 |
get_past_issues | 同じLP・同じ種類の過去の不具合と、当たっていた原因 | すべての不具合 |
どの道具を呼ぶかを決めるのが、エージェントの仕事です。 LPが開かないなら refetch_page で一時的なものかを確かめ、次に get_site_updates で予定を見る。タグのIDが無いなら get_ga4_events で計測が本当に止まっているかを見る。送信の数が普段どおりなら、タグの入れ方が変わっただけかもしれません。
| させないこと | 理由 |
|---|---|
| 不具合かどうかの判定 | 規則で決める。日によって揺れないようにする |
| フォームへの試しの送信 | 広告主の受付に偽の問い合わせが届く。道具に送信の操作を持たせない |
| LPやタグの設定の変更 | 広告主のサイト。この構成から書き込まない |
| 表記が不当表示に当たるかの判断 | 広告主と、必要なら法務が判断する |
| 広告の停止の判断 | 担当者と広告主が決める |
2行目は、指示ではなく道具の作りで守ります。 HTTP Request の道具に POST の操作を持たせなければ、エージェントがフォームを送ることはできません。 フォームの送信の不具合は、解析の送信の完了の数で間接に見ます。広告主がテスト用の送信の仕組みを用意している場合だけ、別の手順として人が試します。
指示内容を固定する
AI Agent ノードの System Message に次を入れます。
あなたは広告会社の運用部で、広告の遷移先のLPの毎朝の見回りを手伝う立場です。
渡された不具合1件について、道具を使って事実を集め、原因の候補と、
広告主のWeb担当へ送る修正依頼の案をまとめてください。
【不具合は判定済みです】
不具合の種類、数値、急ぎの度合いは規則で決まっています。
変えたり、不具合ではないと判断したりしないでください。
【道具の使い方】
- まず get_past_issues と get_site_updates を見てください
- ページが開かない・転送されているときは、refetch_page で取り直してください
- タグのIDが無いときは、get_ga4_events で送信の数が止まっているかを見てください
- 終了した表記が残っているときは、get_campaign で終了日を確かめてください
- 同じ道具を同じ条件で2回呼ばないでください
【原因の候補の書き方】
- 候補は1〜3個までにし、すべてに根拠の事実を evidence として付けてください
- 道具で得た事実に根拠が無い原因は、候補に入れないでください
- 根拠が見つからないときは、候補を空にし、cause_unknown を true にしてください
【修正依頼の案の書き方】
- 宛先は広告主のWeb担当です。丁寧な言葉で、どのURLの、どの箇所が、
どうなっているかを、事実だけで書いてください
- 「直してください」と断定せず、「ご確認をお願いできますでしょうか」の形にしてください
- 終了した表記については、残っている文字列と、台帳の終了日を書き、
法令に違反しているかどうかは書かないでください
- 広告を止める・止めないについては書かないでください
【不具合】{issue_json}
「法令に違反しているかどうかは書かない」を入れないと、修正依頼の案に「景品表示法上問題となるおそれがあります」と書かれます。 判断としてはありえても、運用担当から広告主へ送る文面としては、責任の取れない断定です。 事実と終了日を書けば、広告主の側で判断できます。
「根拠が無ければ空にする」は、エージェントに必ず書かせる一行です。 書かないと、「サイトの改修によるものと考えられます」のような、確かめようのない候補で埋めます。 担当者はそれを読んで調べるのをやめてしまいます。Tools Agent には答えを作るまでの繰り返しの上限(Max Iterations、既定は10)があり、上限に達したものも cause_unknown として一覧に出します。
出力形式を固定する
Tools Agent の「Require Specific Output Format」を有効にし、Structured Output Parser をつなぎます。 次の形のJSONで受け取ります。
{
"lp_id": "",
"url": "",
"issue_type": "page_down | redirected | broken_link | tag_missing | tag_mismatch | form_action | form_drop | expired_campaign",
"severity": "critical | high | normal",
"what_happened": "",
"cause_candidates": [
{ "cause": "", "evidence": "", "source": "refetch | links | ga4 | campaign | site_update | past_issue" }
],
"cause_unknown": false,
"request_draft": "",
"tools_called": [ "" ]
}
1つ目の理由は、severity と issue_type を規則の側から持ち込めることです。 エージェントに渡した値をそのまま返させ、ワークフローの側で、渡した値と返ってきた値が同じかを確かめます。 違っていれば、その行は差し戻します。
2つ目は、source で根拠の種類が分かることです。 担当者は、候補が解析の数値から来たのか、更新の予定から来たのかを見て、どこを確かめればよいかがすぐ分かります。 途中でたどった手順は、Return Intermediate Steps を有効にして受け取ります。
severity | 付けるもの(規則で決める) |
|---|---|
critical | LPが開かない、主要な遷移先がリンク切れ、フォームの送信先が空、送信の数が前日に0件 |
high | タグのIDの欠落・食い違い、終了したキャンペーンの表記の残り |
normal | 補助的なリンクのリンク切れ、トップページへの転送(主要な導線は生きている) |
critical のものは、朝の一覧を待たずに担当者へ直接通知します。 広告は止めていないので、気づくのが1時間遅れれば、その分の広告費が壊れたLPへ流れます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 広告主のLP | HTTP Request ノード(GET のみ) | ページ、状態コード、リンク先 |
| Google アナリティクス 4 | Data API の runReport(閲覧の権限のみ) | ページごとの送信の完了の数 |
| LPの台帳・キャンペーンの台帳・予定・不具合の台帳 | スプレッドシートの読み取り(道具) | エージェントが必要なときに引く |
| 朝の一覧 | スプレッドシートへの書き込み | 担当者ごと・不具合ごとの行 |
| 社内チャット | 通知 | 担当者ごとの一覧の要約と、critical の即時通知 |
広告主のサイトには、取得以外の操作をしません。 HTTP Request の道具は GET だけにし、フォームの送信も、ログインも、設定の変更もできない作りにします。
修正依頼も、自動では送りません。 案は一覧に置き、担当者が直して自分のメールから送ります。広告主のWeb担当とのやり取りは、運用担当の関係そのものです。 誤った依頼が1通届くと、次の依頼から読まれなくなります。
人が確認する
担当者が見るのは、自分の受け持ちの朝の一覧だけです。
criticalを最初に見る … LPを自分のブラウザで開いて確かめます。本当に開かないなら、広告を止めるかを広告主とすぐに相談しますhighの原因の候補を確かめる … タグのIDの食い違いは、ページのソースで目で確かめます。終了した表記は、ページのどこに残っているかを見ますcause_unknownのものを自分で調べる … エージェントが根拠を見つけられなかったもの。担当者の経験の出番はここです- 修正依頼の案を直して送る … 宛先と、指摘の箇所を確かめてから送ります
- 原因の候補が当たっていたかを記録する … 当たった、外れた、別の原因だった、を不具合の台帳に残します
1番目の「自分のブラウザで開く」を省かないでください。 見回りのサーバーからの取得だけが、広告主のサイトの防御の仕組みで拒まれている場合があります。利用者には開けているのに、修正依頼を送ってしまうことを防ぎます。
月に1回は受け持ちの全LPを流し見ます。 見た目の崩れや文章の誤りは、規則では拾えないからです。
例外に対処する
| 起きること | 対応 |
|---|---|
| 見回りの取得だけが403などで拒まれる | 「取得できず」として出す。「異常なし」と区別し、広告主に取得元を伝えて相談する |
| 予定されたメンテナンス中 | 予定表にあれば normal に下げ、修正依頼の案を作らない |
| ページの中身がスクリプトで描かれ、HTMLに文字が無い | 表記の検索とリンクの確認ができないので「要ブラウザ確認」として出す |
| 同じLPでA/Bテストの別の版が返る | 台帳にテスト中であることを書き、どちらの版でもタグのIDを確かめる |
| 年齢確認や地域の選択の画面で止まる | 台帳に印を付け、その先は人が月に1回確かめる |
| 解析の権限が切れて数値が取れない | 送信の数の判定をせず、「解析が取れない」として出す |
| 拾った不具合が普段の数倍ある | エージェントに渡さず担当者へ知らせる。見回りの側の障害を疑う |
| エージェントが上限の回数に達した | cause_unknown として出す |
| 修正を依頼した後も直らない | 台帳で依頼中のものは毎日出さず、3営業日たっても直らなければ再び出す |
1行目がいちばん大事です。 取得に失敗したLPが一覧に何も出ないと、担当者は「異常なし」と読みます。 失敗は、不具合よりも目立つ場所に出します。
記録を残す
- 毎朝の取得の結果(状態コード、最後に着いたURL、取り出したリンク・タグのID・フォームの送信先)
- 取得したHTMLの写し(不具合の出たLPのもの)
- 規則で拾った不具合と、そのとき使った台帳の内容
- エージェントの入力、呼んだ道具とその結果(Return Intermediate Steps で取得)、出力のJSON
- 送った修正依頼の文面と日時、直った日
- 原因の候補が当たっていたか
2つ目の「HTMLの写し」は、直された後でも、どこがどう壊れていたか、表記がいつまで残っていたかを示すために残します。
04実装レベルの3段階
半自動化で、点検の回数を週1回から毎日に上げられます。 何も無いLPを人が開かなくて済むようになるからです。1件6分は3分ほどになります。 残るのは、不具合のLPの原因を調べ、修正依頼を書く作業です。 本格構成で1.5分になり、この段階が本記事の想定です。 差が大きいのは、解析の数値と更新の予定を見に行く調べものが、不具合1件ごとの手作業だからです。 段階を飛ばさないでください。 半自動化を1か月回すと、揺れで拾われるLP、取得を拒まれるLP、スクリプトで描かれるLPが一通り分かります。
05工数削減シミュレーション
導入後 600件 × 1.5分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数の広告主から検索広告やSNS広告の運用を受託し、広告の遷移先のLPが100本を超える広告会社・運用部門。LPの更新は広告主や制作会社が行い、運用担当は変更を知らされないまま広告を出し続けていることがある場合。リンク切れや計測タグの外れに、成果の数字が落ちてから気づいた経験がある場合。LPごとに入っているはずのタグとキャンペーンの期間を表で持てる場合。
- 運用するLPが数本で、毎週目で見れば足りる場合。LPを自社で制作・更新しており、公開の前に点検の手順が組まれている場合。広告主との契約で、LPを自動で定期的に取得することや、解析のデータを外部の生成AIへ渡すことが認められていない場合。なお、終了したキャンペーンの表記が不当表示に当たるかの判断や、広告の停止の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月、実際に不具合があったLPを10本選ぶ(リンク切れ、タグの外れ、フォームの不具合、終了した表記の残りを混ぜる)
- その日のページを、保存しておいたものかウェブの記録から用意する
- LPの台帳の行(入っているはずのタグのID)と、キャンペーンの台帳の行を用意する
- 手元の生成AIの画面に、HTMLと台帳の行を貼り、「入っているはずのタグのIDがあるか、終了日を過ぎたキャンペーンの表記が残っているかを、根拠の箇所付きで答えてください」と指示する
- 出てきた答えを、当時の担当者の見立てと突き合わせる
この段階では、エージェントも道具も使いません。 確かめたいのは、台帳とページを突き合わせれば、不具合の根拠が示せるかです。
| 出てきた内容 | 判断 |
|---|---|
| 当時と同じ不具合が、根拠の箇所付きで出た | 取得と規則の組み立てに進む |
| HTMLにタグが見当たらないが、実際には動いていた | タグ管理のコンテナ経由。解析の数値での裏付けを足す |
| 台帳にタグのIDや表記の文字列が無く、照合できない | 台帳の整備が先。 AIの問題ではない |
3行目は、ほぼ必ず出ます。 10本分の台帳を埋めるところから始めます。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 取得の失敗が「異常なし」に見える | 「取得できず」を不具合より目立つ場所に出す |
| タグ管理経由のタグがHTMLに無く、毎日「欠落」と出る | HTMLで見るのはコンテナのIDまで。その先は解析の数値で裏付ける |
| 別の広告主のタグのIDが入っている | 有無ではなくIDまで台帳と照合する |
| 送信の少ないLPが毎日拾われる | 平均が数件に満たないLPは、7日続けて0件で拾う |
| 404のLPでワークフローが止まる | HTTP Request の「Never Error」を有効にする |
| 一度に取りに行き、広告主のサーバーに負荷をかける | 「Batching」で件数と間隔を決める |
| フォームを試しに送ってしまう | 道具に POST を持たせない |
| 修正依頼の案に法令違反の断定が入る | 指示で禁じ、事実と終了日だけを書かせる |
| 根拠の無い原因の候補で埋まる | 根拠が無ければ空にし、cause_unknown を立てさせる |
| タイムゾーンが違い、送信の数の「前日」がずれる | ワークフローのタイムゾーンを Asia/Tokyo にする |
上の3行が、この構成の失敗のほとんどです。 どれも、取れなかったこと、見えないこと、別のものがあることを区別せずに、取得の結果だけで決めてしまうことから起きます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 広告主のLPのURLとHTML、広告主の解析のデータ(ページごとの送信の数)、キャンペーンの予定、広告主のWeb担当の連絡先です。
- 取得の頻度と取得元を広告主に伝える … 他社のサイトを毎日自動で取得します。了承をもらってから始め、Batching で負荷を抑えます
- 解析の権限を閲覧に絞る … Data API に使う権限は閲覧だけにし、設定の変更ができる権限を見回りに持たせません
- 外部へ渡す範囲を絞る … 生成AIに渡すのは、不具合1件ごとの事実と、道具が返す値までです。解析のデータを全部渡しません。 フォームの入力内容のような個人の情報は、そもそも取得しません
- フォームを送らない … 試しの送信は、広告主の受付に偽の問い合わせを届けます。道具の作りで送れないようにします
- 終了した表記の扱いを判断させない … 消費者庁は、誤って表示してしまった場合でも、有利誤認表示に当たれば景品表示法で規制されるとしています。この構成が出すのは、残っている文字列と終了日という事実までです。どう直すか、いつまでに直すかは広告主が判断します
- 広告の停止を自動にしない … LPが開かないときに広告を止めるかは、担当者と広告主で決めます。 止めること自体が、広告主の売上に関わります
誤りが起きた場合のリスクは、壊れたLPを見逃すことと、壊れていないLPについて修正依頼を送ることの2つです。 前者は取得の失敗を「異常なし」に混ぜると起き、後者はタグ管理経由のタグを「欠落」と読むと起きます。どちらも、取得の結果を区別して扱うことで防ぎます。
10まず何から始めるか
1週目:台帳に2つの列を足す
LPの台帳に「入っているはずのタグのID」の列を、キャンペーンの台帳に「LPに出る表記の文字列」の列を足します。150本を一度に埋める必要はありません。広告費の大きい広告主のLPから埋めます。
2週目:10本で試す
先月不具合があったLPを10本選び、HTMLと台帳を手元の生成AIに貼って照合させます。タグ管理経由のタグを「欠落」と読んでいないか、終了した表記を根拠の箇所付きで出せるかを見ます。
3週目:広告主に伝え、解析の権限をもらう
見回りの頻度、取得元、User-Agent を広告主に伝えます。あわせて、Google アナリティクス 4 の閲覧の権限をもらい、送信の完了のイベント名を確かめます。
4週目:n8n で取得と規則と一覧までをつなぐ
取得から規則、朝の一覧までを作ります。この時点ではエージェントをつながず、原因は担当者が調べます。
2か月目: 揺れで拾われるLPと取得を拒まれるLPの扱いを決め、エージェントと道具をつなぎます。3か月目以降: 1件6分が何分になったかを実測します。cause_unknown が減り、修正依頼の案をほぼそのまま送れるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Schedule Trigger の cron 式が (秒) 分 時 日 月 曜日 で秒は省略できること。タイムゾーンはワークフロー、無ければインスタンスの設定を使い、自分でホストする場合の既定が America/New York であること。保存して公開する必要があること | n8n Docs: Schedule Trigger node | 2026-10-06 |
| HTTP Request の「Include Response Headers and Status」でヘッダーと状態コードを含む応答を受け取れること。「Never Error」で状態コードにかかわらず成功として返ること。「Timeout」「Redirects」「Max Redirects」「Batching(Items per Batch、Batch Interval)」があること | n8n Docs: HTTP Request node | 2026-10-06 |
| HTML ノードの Extract HTML Content が CSS セレクターで要素を指定し、Text・HTML・Attribute・Value を返せること。Return Array で複数の値を配列で返せること | n8n Docs: HTML node | 2026-10-06 |
| Tools Agent に System Message、Max Iterations(既定10)、Return Intermediate Steps、Require Specific Output Format があり、少なくとも1つの道具の接続が必要なこと | n8n Docs: Tools AI Agent node | 2026-10-06 |
runReport が dateRanges・ディメンション・指標を指定して使え、yesterday・7daysAgo などの相対の日付と、eventName を指定する dimensionFilter が使えること | Google Analytics Data API: Basics | 2026-10-06 |
| 景品表示法第5条第2号が、取引条件について実際のものよりも著しく有利であると一般消費者に誤認される表示を禁止していること。誤って表示してしまった場合であっても、有利誤認表示に該当すれば規制されること | 消費者庁: 有利誤認とは | 2026-10-06 |
終了したキャンペーンの表記が不当表示に当たるかの判断は、広告主と、必要に応じて専門家が行ってください。 本記事は上記のページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0489)についてのご相談はこちらから。
