Metaのキャンペーン仕様とWebhooksで広告IDが取得できない件について

## 導入
**読了時間**: 約10分  
**対象の読者**:
- Webアプリケーション開発者
- マーケティング担当者
- Metaの広告キャンペーンを運用している方

**どんな記事か**:
Metaの広告キャンペーンの構造と各構成要素をわかりやすく解説した上で、Webhooksで広告IDが取得できない不具合とMetaAPIで不具合が発生した時のことについて解説した記事です！

**読者が得られるベネフィット**:
- Metaの広告キャンペーンの構造を理解できる
- Webhooksで広告IDが取得できない不具合について理解できる
- 不具合が発生した場合の対応方法がわかる

## 目次
- [(3行で)弊社について](#3行で弊社について)
- [キャンペーンの仕様について](#キャンペーンの仕様について)
    - [1. キャンペーン-campaign](#1-キャンペーン-campaign)
    - [2. 広告セット-ad-set](#2-広告セット-ad-set)
    - [3. 広告-ad](#3-広告-ad)
    - [4. 広告クリエイティブ-ad-creative](#4-広告クリエイティブ-ad-creative)
- [webhooksで取得できる広告情報に不具合があった](#webhooksで取得できる広告情報に不具合があった)
    - [背景](#背景)
    - [解決方法](#解決方法)
- [不具合っぽい挙動があった時の対応方法](#不具合っぽい挙動があった時の対応方法)
    - [1. フォーラムを確認・質問する](#1-フォーラムを確認・質問する)
    - [2. meta社に問い合わせる](#2-meta社に問い合わせる)
    - [3. 自社のプロダクトの仕様を変更する](#3-自社のプロダクトの仕様を変更する)
- [snsに興味があるエンジニアを求む！](#snsに興味があるエンジニアを求む！)
- [まとめ](#まとめ)

## (3行で)弊社について
3行で弊社について説明させてください！

株式会社コムニコは、SNSのプロフェッショナル集団が集まったSNSの総合代理店です。
React, Vue, Express(Node.jsベースのバックエンドFW)を利用して開発しています。
でき立てのもの〜10年選手のものまで自社プロダクトの開発に携われます！

## キャンペーンの仕様について
今回のお話は、Metaのキャンペーンの中でも、「広告」についてのお話です。
公式ドキュメントで詳しく記載していますが、ちょっと言い回しが難しいため、Metaのキャンペーンと「広告」について主要部分についてさくっと解説します。

Metaのキャンペーンの仕組みは、下記の上から順の階層構造で表現されます。

1. **キャンペーン (Campaign)**
2. **広告セット (Ad Set)**
3. **広告 (Ad)**
4. **広告クリエイティブ (Ad Creative)**

![adset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952332/49f5fb52-d2cd-f00d-f352-40b9804ec9aa.png)

https://developers.facebook.com/docs/marketing-api/campaign-structure

### 1. キャンペーン (Campaign)
**キャンペーン**は、広告の最上位レベルの構成要素で、広告の全体的な目的を定義します。キャンペーンには以下のような特性があります：

- **エンドポイント**: `/campaigns`
- **目的 (Objective)**: キャンペーンの目的を設定します。例えば、ブランド認知、リード獲得、ウェブサイトのトラフィック増加などです。
- **ステータス (Status)**: キャンペーンの状態を管理します（例：アクティブ、非アクティブ）。
- **version**: `v20.0`
  
キャンペーンの構成は以下のようになります：
```json
{
  "name": "My Campaign",
  "objective": "LINK_CLICKS",
  "status": "PAUSED"
}
```
※ オブジェクト構成は簡単のために簡略化していますが、実際にはもっとパラメータが存在します。

https://developers.facebook.com/docs/marketing-api/reference/ad-account/campaigns/

### 2. 広告セット (Ad Set)
**広告セット**は、キャンペーンの中に複数存在し、特定のターゲティング、予算、スケジュールなどの詳細設定を行います。広告セットには以下のような特性があります：

- **エンドポイント**: `/adsets`
- **ターゲティング (Targeting)**: 広告の対象となるオーディエンスを設定します。年齢、性別、地域、興味などで絞り込みます。
- **予算 (Budget)**: 広告セットごとに設定する予算。日次予算や総予算を設定できます。
- **スケジュール (Schedule)**: 広告の表示期間を設定します。
- **入札戦略 (Bid Strategy)**: 入札の方法を設定します（例：最低コスト、目標CPA）。
- **version**: `v20.0`

広告セットの構成は以下のようになります：
```json
{
  "name": "My Ad Set",
  "campaign_id": "1234567890",
  "daily_budget": "5000",
  "targeting": {
    "geo_locations": {
      "countries": ["US"]
    },
    "age_min": 18,
    "age_max": 35,
    "genders": [1]
  },
  "bid_strategy": "LOWEST_COST_WITHOUT_CAP",
  "status": "PAUSED"
}
```
※ オブジェクト構成は簡単のために簡略化していますが、実際にはもっとパラメータが存在します。

https://developers.facebook.com/docs/marketing-api/reference/ad-account/adsets/

### 3. 広告 (Ad)
**広告**は、広告セットの中に複数存在し、実際にユーザーに表示される広告の単位です。広告には以下のような特性があります：

- **エンドポイント**: `/ads`
- **クリエイティブ (Creative)**: 広告に使用するクリエイティブ（画像、動画、テキストなど）。
- **リンク (Link)**: 広告がクリックされたときに誘導するリンク先。
- **トラッキング (Tracking)**: 広告のパフォーマンスを測定するためのトラッキングパラメータ。
- **version**: `v20.0`

広告の構成は以下のようになります：
```json
{
  "name": "My Ad",
  "adset_id": "1234567890",
  "creative": {
    "creative_id": "0987654321"
  },
  "status": "PAUSED"
}
```
※ オブジェクト構成は簡単のために簡略化していますが、実際にはもっとパラメータが存在します。

https://developers.facebook.com/docs/marketing-api/reference/ad-account/ads/

### 4. 広告クリエイティブ (Ad Creative)
**広告クリエイティブ**は、広告に使用される実際のコンテンツ（画像、動画、テキストなど）を定義します。クリエイティブは以下のような特性があります：

- **エンドポイント**: `/adcreatives`
- **タイトル (Title)**: 広告の見出し。
- **本文 (Body)**: 広告の本文テキスト。
- **画像URL (Image URL)**: 広告に使用する画像のURL。
- **動画URL (Video URL)**: 広告に使用する動画のURL。
- **version**: `v20.0`

広告クリエイティブの構成は以下のようになります：
```json
{
  "name": "My Creative",
  "title": "Check out our product!",
  "body": "Best product ever.",
  "image_url": "http://example.com/image.jpg"
}
```
※ オブジェクト構成は簡単のために簡略化していますが、実際にはもっとパラメータが存在します。

https://developers.facebook.com/docs/marketing-api/reference/ad-creative/

## Webhooksで取得できる広告情報に不具合があった

### 背景
今回、上述のキャンペーン配下の広告IDをコメント時のWebhooksイベントで受信を試したところ、なぜか取得できる時とできない時があるというのが事の発端です。
下記のWebhooksのドキュメントにも記載されている通り、コメントのWebhookイベント受信時に `ad_id` は本来取得できるはずでした。
しかし、不具合によってそれができず、対応に悩みました。

https://developers.facebook.com/docs/graph-api/webhooks/getting-started/webhooks-for-instagram?locale=ja_JP#instagram-----

### 解決方法

Meta社に問い合わせて、一度Webhooksのオン/オフを切り替えたら直る（Webhookの再更新）という回答をいただきました。

ただ、それはWebhooksが一時的に使えなくなる、つまり本番稼働中のアプリを一時的に停止させる必要があるということです。
同じ事象に遭遇した場合、試してみて下さい。


## 不具合っぽい挙動があった時の対応方法
Metaが出しているFacebookもInstagramもまだまだ機能が拡張しているアプリのため、挙動が不安定になる時や不具合が起こることもあります。
この記事で特に伝えたかったのは、そういう時にどのように対応すればいいのかという点です。

つまり、不具合っぽい動きをした場合、下記の3つの順番で対応するといいと思います。

1. フォーラムを確認・質問する
2. Meta社に問い合わせる
3. プロダクトの仕様を変更する 

外部APIや普通のライブラリと変わらない手順ですが、念のためにサクッと解説します！

### 1. フォーラムを確認・質問する
ドキュメントでわからない仕様や期待したレスポンスが得られない時は、まずは下記の開発者コミュニティフォーラムで同じようなことで困っている人がいないか確認することが大切です。

https://developers.facebook.com/community/

OSSのライブラリとかでGitHubのIssueで対応状況を確認するのと同じような感覚ですね。

### 2. Meta社に問い合わせる
某青い鳥が巣立ったSNSもそうですが、問い合わせたら意外とちゃんと対応してくれます。
今回も、フォーラムで確認しても開発者からの回答がなかったため、問い合わせを行うことで解答を得ることができました。

私達はInstagram広告が対象だったため、下記のビジネスマネージャー上のダイレクトサポートを通してMeta社のエンジニアに対応して頂けました。

https://business.facebook.com/direct-support

### 3. プロダクトの仕様を変更する
これは最終手段なので、なるべくは行いたくないところです…
現実との折り合いをつけるためには必要な工程ですね…

### まとめ
本記事では、Metaの広告キャンペーンの構造と各構成要素（キャンペーン、広告セット、広告、広告クリエイティブ）についてざっくり解説しました。
そして、Webhooksを使用した広告情報取得における不具合とその対応方法についても具体的な解決策を示しました。
この記事を通じて、皆様のMetaの広告キャンペーンの運用がよりスムーズに行えるように願っています。

## SNSに興味があるエンジニアを求む！
株式会社コムニコは、SNSのプロフェッショナル集団が集まったSNSの総合代理店です。
エンジニアチームでは、X(旧Twitter)やFacebook, Instagramに関する3つのプロダクトの開発を行っています！

* SNSに興味がある
* 成長フェーズの自社プロダクト開発に興味がある
* 歴史の長い自社プロダクトの開発に興味がある
* フルスタックエンジニアのキャリアを築きたい！

そんなエンジニアを大募集しているので、興味のある方はぜひ下記のリンクをポチッとしていただければ幸いです！！
カジュアル面談でお会いしましょう！

https://hrmos.co/pages/lmg/jobs/1675114439462850596