Apple Search Ads統合プラン
本記事では、AE管理画面でApple Search Adsのデータを統合する方法を紹介します。現在、AE管理画面で統合に対応しているのは、Apple Search AdsのReporting APIです。
AE 4.2より前のバージョンをご使用の場合は、Apple Search Adsデータ統合ソリューションを参照してデータ統合を行ってください
サードパーティデータ統合によって生成されたデータは、クラスターの消費データ量に含まれますのでご注意ください
概要
インターフェースの概要
| インターフェース名 | タイプ | 粒度 | アトリビューション | コスト | 収益 | 表示 | クリック | コンバージョン |
|---|---|---|---|---|---|---|---|---|
| Reporting API | API | 集計データ | ✅ | ✅ | ✅ | ✅ |
Apple Search AdsのReporting APIは、広告キャンペーン(Campaign-Level)から広告(Ad-Level)まで、複数の階層のデータレポートを提供しています。現在、AEシステムでは次の階層のデータ取得に対応しています:
- Campaign階層のレポート(Campaign-Level Reports)
- Ad Group階層のレポート(Ad Group-Level Reports)
- Keyword階層のレポート(Keyword-Level Reports)
Apple Search Adsの機能変更により、Creative Set階層のレポート(Creative Set-Level Reports)はサポートされなくなりました。過去の設定は無効になる可能性がありますのでご注意ください
統合の流れ
Apple Search Adsデータの統合の流れは次のとおりです:
- Apple Search Ads APIの認証を完了します
- AE管理画面にログインし、サードパーティ統合モジュールでApple Search Ads統合プランを追加して、関連する設定を完了します
- AEシステムがデータを正常に受信しているかを確認し、レポートを作成します
1. Apple Search Ads APIの認証
ASAのデータを統合する前に、まずASAの認証作業を完了する必要があります。全体の流れは次のステップに分かれています:
- APIアクセス権限を持つユーザーを作成します
- 秘密鍵と公開鍵を生成し、公開鍵をASA管理画面にアップロードします
- クライアントシークレット(Client Secret)を作成します
- アクセストークン(Access Token)の取得をリクエストします
Apple Search Adsの公式ドキュメントを直接参照して、認証作業を完了できます。または、本節の流れに従って認証を完了することもできます。以下の内容はすべて、この公式ドキュメントに基づいています。
1.1 APIアクセス権限を持つユーザーの作成
まず、管理者アカウントでログインし、次の手順でAPI権限を持つユーザーを作成する必要があります:
- Apple Search Ads UIにアクセスし、管理者アカウントでログインします
- 「Account Settings」-「User Management」(「アカウント設定」-「ユーザー管理」)に移動します
- 「Invite Users」をクリックして、ASA組織内のユーザーを招待します
- 「User Details」欄に、ユーザーの氏名とApple IDを入力します
- 「User Access and Role」欄で、APIアクセス権限を持つユーザーロールを選択します
- 「Send Invite」をクリックして招待メールを送信します。招待されたユーザーにはsecure codeが記載されたメールが届きます。ユーザーがメール内のAppleのURLをクリックしてsecure codeを入力すると、ユーザーのアカウントが有効になります
1.2 秘密鍵と公開鍵の生成、公開鍵のASA管理画面へのアップロード
次に、コードで秘密鍵と公開鍵を生成する必要があります。本節にはある程度の技術的な知識が必要です。開発者でない場合は、開発者またはThinkingAIの担当者に連絡してこのステップを完了してください
Windowsをご使用の場合は、OpenSSLをダウンロードしてインストールしてください
- コマンドラインで次のコマンドを入力して、秘密鍵ファイルを生成します。ファイル名はprivate-key.pemです
openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem
- 続けて、同じディレクトリで次のコマンドを実行して、公開鍵ファイルを生成します。ファイル名はpublic-key.pemです
openssl ec -in private-key.pem -pubout -out public-key.pem
- Apple Search Ads UIにアクセスし、前のステップで作成したAPI権限を持つユーザーでログインします。「Account Settings」-「API」を選択し、公開鍵を「Public Key」セクションにコピーします。保存をクリックすると、「Public Key」セクションの上に
clientId、teamId、keyIdが表示されます。以下はサンプルデータです:
clientId SEARCHADS.aeb3ef5f-0c5a-4f2a-99c8-fca83f25a9
teamId SEARCHADS.hgw3ef3p-0w7a-8a2n-77c8-scv83f25a7
keyId a273d0d3-4d9e-458c-a173-0db8619ca7d7
1.3 クライアントシークレットの作成
次に、コードでクライアントシークレットも生成する必要があります。本節にはある程度の技術的な知識が必要です。開発者でない場合は、開発者またはThinkingAIの担当者に連絡してこのステップを完了してください。
Apple Search AdsのクライアントシークレットはJSON web token(JWT)です。公式からPython 3のコードサンプルが提供されています。依存ライブラリをインストールした後、次のコードを実行してクライアントシークレットを作成してください:
import os
import datetime as dt
from authlib.jose import jwt
from Crypto.PublicKey import ECC
# 秘密鍵と公開鍵のファイルは、pyファイルと同じディレクトリに置くことをお勧めします
private_key_file = "private-key.pem"
public_key_file = "public-key.pem"
# ここは前のステップで取得したclientId、teamId、keyIdに置き換える必要があります
client_id = "SEARCHADS.9703f56c-10ce-4876-8f59-e78e5e23a152"
team_id = "SEARCHADS.9703f56c-10ce-4876-8f59-e78e5e23a152"
key_id = "d136aa66-0c3b-4bd4-9892-c20e8db024ab"
audience = "https://appleid.apple.com"
alg = "ES256"
# 秘密鍵ファイルが存在しない場合は、秘密鍵ファイルを作成
if os.path.isfile(private_key_file):
with open(private_key_file, "rt") as file:
private_key = ECC.import_key(file.read())
else:
private_key = ECC.generate(curve='P-256')
with open(private_key_file, 'wt') as file:
file.write(private_key.export_key(format='PEM'))
# 公開鍵ファイルが存在しない場合は、公開鍵ファイルを作成
public_key = private_key.public_key()
if not os.path.isfile(public_key_file):
with open(public_key_file, 'wt') as file:
file.write(public_key.export_key(format='PEM'))
# 現在のタイムスタンプを取得
issued_at_timestamp = int(dt.datetime.utcnow().timestamp())
# 有効期限を定義。180日を超えることはできず、超えるとClient Secretが無効になる
expiration_timestamp = issued_at_timestamp + 86400*180
# JWT headersを定義.
headers = dict()
headers['alg'] = alg
headers['kid'] = key_id
# JWT payloadを定義.
payload = dict()
payload['sub'] = client_id
payload['aud'] = audience
payload['iat'] = issued_at_timestamp
payload['exp'] = expiration_timestamp
payload['iss'] = team_id
# 秘密鍵の内容を取得
with open(private_key_file, 'rt') as file:
private_key = ECC.import_key(file.read())
# JWTをエンコードし、秘密鍵で署名
client_secret = jwt.encode(
header=headers,
payload=payload,
key=private_key.export_key(format='PEM')
).decode('UTF-8')
# Client secretをファイルに書き込む
with open('client_secret.txt', 'w') as output:
output.write(client_secret)
上記のコードでは、次の点に注意する必要があります:
- 前のステップで生成した秘密鍵と公開鍵のファイルを.pyファイルと同じディレクトリに置くか、コード内の秘密鍵と公開鍵のファイルのパスを変更します
- 前のステップで取得したclientId、teamId、keyIdで、コード内の該当する箇所を置き換えます
次にこのコードを実行すると、クライアントシークレットがそのディレクトリのclient_secret.txtファイルに記録されます。この情報を控えておいてください。以下はクライアントシークレットのサンプルです:
eyJraWQiOiJiYWNhZWJkYS1lMjE5LTQxZWUtYTkwNy1lMmMyNWIyNGQxYjIiLCJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJEcmVhbWNvbXBhbnkiLCJhdWQiOiJBdXRoZW50aWNhdG9yIiwiZXhwIjoxNTcxNjcwNjIxLCJuYmYiOjE1NzE2NjcwMjEsInN1YiI6Im11c3RlciIsImNsaWVudF9pZCI6ImFiY2QxMjM0IiwiYWRtaW4iOiJ0cnVlIn0.s4C3p9kVNFeRAB5tChatC3ldQX07v9mG7thL7FeEO6cClfNuiaLSgq8f8ymbfO3OQYW_KuwaA1KYRuoy1JmKk 4DBbYLcz6aoABe0pzI5Z_6wgMzAyqz8pQtwDAcd4Idoi8JdRbtzZce9o-0nZiFA4hVAXqYwpEYC4UU8ZmJO_z8tY4juHPTV3nDugdtqyNnmAiBoLryOfGNngQZccdY1_QvkXS1y0bg1a0k8cVVtnq- _93fYJIt9Z64CTvlH3uOeh7uaEv3nIxpXhvhkTySpUmY8e04TO09oTyZijiloByv3KFQ92OOJ8L 5N5_CeEc5p9LWjT1pcX8ATamOycZz2Q
1.4 Org IDの取得
最後に、Org ID、つまりASA管理画面のCampaign Group IDを取得する必要があります。ASA管理画面で確認できます。下図の赤枠で囲まれたIDです:
1.5 必要な情報
最後に、上記の認証の流れで次の内容を取得して記録したことを確認してください:
- client_id
- org_id
- client_secret
2. プランの設定
ASAの認証作業が完了したら、AEシステムにログインし、「サードパーティ統合」モジュールで新しいプランの設定を行います。下図はASAの設定画面です。本章の内容に従ってプランを作成してください:
2.1 認証情報の設定
「認証情報」の下にある「認証情報設定」ボタンをクリックし、ポップアップに認証作業で取得した情報を入力します
このうちOrg IDは、Apple Search Ads管理画面のCampaign Group IDです(取得方法は1.4を参照)
2.2 定期取得
「定期取得」モジュールで、AEシステムがASAのデータを定期的に取得する方法を設定できます。毎日の特定の時刻、または1時間ごとに、一定期間のデータを取得するよう選択できます。取得したデータもデータ量に計上されるため、長すぎる期間のデータを定期取得しないことをお勧めします。Reporting APIで取得できる時間範囲は最大で過去1000日間で、1回あたり最大31日分を取得できます。定期取得の下には「タイムゾーン」という項目もあり、デフォルトはORTZです。
2.3 格納設定
ASAデータをイベントとして書き込むかどうかを制御できます。ASAデータはイベントテーブルにのみ書き込まれるため、この設定はオフにしないでください。
2.4 統合構成
最後に、統合構成モジュールでデータ取得の詳細設定を制御できます。データの時間集計粒度、取得する指標フィールドとディメンション、格納後のイベント名などが含まれます。
統合構成の内容はJSONです。次の内容に従ってカスタム設定できます:
| モジュール | 名前 | 意味 |
|---|---|---|
| sink_event | event_name | 格納後のイベント名。カスタマイズ可能 |
| event_mapping | 階層ごとに格納後のイベント名を指定します。keyはreport_typesの階層名、valueは格納後のイベント名です。使い方は2.4.4を参照してください。プランの新規作成時のデフォルト設定ではevent_mappingを使用しています | |
source | time_granularity | データの時間集計粒度。つまり、取得したデータを日単位と時間単位のどちらで集計するか 選択可能な値: day、hour |
report_types | データを取得する階層。リスト型です。要素は1つだけ入力すること、つまり一度に1つの階層のデータのみを取得することをお勧めします 選択可能な値: campaign、ad_group、keyword | |
| metrics | データ内の指標。リスト型です。階層によって対応するmetricsが異なるため、入力時に注意が必要です | |
| group_by | データ内のグループ化ディメンション。リスト型です。階層によって対応するgroup_byが異なるため、入力時に注意が必要です | |
| transfer | double_columns | 数値型フィールドの定義。リスト型です。ここに記述したフィールドは数値型で格納されます。プランの新規作成時のデフォルト設定には、impressions、taps、installsなどの指標フィールドがあらかじめ列挙されています |
階層によってデータの設定が大きく異なるため、各階層の構成テンプレートをそのまま使用するか、テンプレートを微調整して使用することをお勧めします。
2.4.1 Campaign階層のテンプレート
Campaign階層のレポートのテンプレートは次のとおりです:
{
"sink_event": {
"event_name": "asa_campaign_level_data"
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"campaign"
]
}
}
- テンプレートで使用される時間粒度は時間単位です。システムはデータ内のdateフィールド、つまりデータの日付+時間をデータの時刻として使用します
- テンプレートで使用されるイベント名は -- asa_campaign_level_data
- 以下は、Campaign階層のレポートの格納フィールドです
------------------------ディメンションフィールド------------------------
campaignid
campaignname
deleted
campaignstatus
app_adamid
app_appname
servingstatus
servingstatereasons
countriesorregions
modificationtime
totalbudget_amount
totalbudget_currency
dailybudget_amount
dailybudget_currency
displaystatus
supplysources
adchanneltype
orgid
countryorregionservingstatereasons
countryorregion
billingevent
------------------------指標フィールド------------------------
impressions
taps
installs
newdownloads
redownloads
latoninstalls
latoffinstalls
ttr
avgcpa_amount
avgcpa_currency
avgcpt_amount
avgcpt_currency
avgcpm_amount
avgcpm_currency
localspend_amount
localspend_currency
conversionrate
2.4.2 Ad Group階層のテンプレート
- Ad Group階層のレポートのテンプレートは次のとおりです:
{
"sink_event": {
"event_name": "asa_adgroup_level_data"
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"ad_group"
]
}
}
- テンプレートで使用される時間粒度は時間単位です。システムはデータ内のdateフィールド、つまりデータの日付+時間をデータの時刻として使用します
- テンプレートで使用されるイベント名は -- asa_adgroup_level_data
- 以下は、Ad Group階層のレポートの格納フィールドです
------------------------ディメンションフィールド------------------------
campaignid
adgroupid
adgroupname
adgroupdisplaystatus
adgroupstatus
adgroupservingstatus
adgroupservingstatereasons
deleted
cpagoal
orgid
modificationtime
pricingmodel
defaultbidamount_amount
defaultbidamount_currency
countryorregion
------------------------指標フィールド------------------------
impressions
taps
installs
newdownloads
redownloads
latoninstalls
latoffinstalls
ttr
avgcpa_amount
avgcpa_currency
avgcpt_amount
avgcpt_currency
avgcpm_amount
avgcpm_currency
localspend_amount
localspend_currency
conversionrate
2.4.3 Keyword階層のテンプレート
- Keyword階層のレポートのテンプレートは次のとおりです:
{
"sink_event": {
"event_name": "asa_keyword_level_data"
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"keyword"
]
}
}
- テンプレートで使用される時間粒度は時間単位です。システムはデータ内のdateフィールド、つまりデータの日付+時間をデータの時刻として使用します
- テンプレートで使用されるイベント名は -- asa_keyword_level_data
- 以下は、Keyword階層のレポートの格納フィールドです
------------------------ディメンションフィールド------------------------
keywordid
keyword
keywordstatus
matchtype
bidamount_amount
bidamount_currency
deleted
keyworddisplaystatus
adgroupid
adgroupname
adgroupdeleted
modificationtime
countryorregion
------------------------指標フィールド------------------------
impressions
taps
installs
newdownloads
redownloads
latoninstalls
latoffinstalls
ttr
avgcpa_amount
avgcpa_currency
avgcpt_amount
avgcpt_currency
avgcpm_amount
avgcpm_currency
localspend_amount
localspend_currency
conversionrate
2.4.4 複数階層のテンプレート
一度に複数の階層のデータを取得したい場合は、次のテンプレートを使用することをお勧めします。主な変更点は次のとおりです:
- report_typesに、取得する階層名を書き込みます
- event_mappingを使用して複数の階層のイベント名を管理します。event_mappingの各要素のkeyはreport_typesの階層名に対応し、valueは格納後のイベント名です
- 各階層のデータは同じ設定、つまり同じtime_granularity、group_byでデータを取得します
{
"sink_event": {
"event_mapping":{
"campaign": "asa_campaign_level_data",
"ad_group": "asa_adgroup_level_data",
"keyword": "asa_keyword_level_data"
}
},
"source": {
"time_granularity": "hour",
"group_by": [
"countryOrRegion"
],
"report_types": [
"campaign",
"ad_group",
"keyword"
]
}
}
2.5 標準化フィールド
以下はApple Search Adsの標準化フィールドです:
| 元フィールド | 標準化フィールド | 意味 |
|---|---|---|
| orgid | te_ads_object.ad_account_id | 広告アカウントID |
| campaignname | te_ads_object.campaign_name | 広告キャンペーン名 |
| campaignid | te_ads_object.campaign_id | 広告キャンペーンID |
| adgroupname | te_ads_object.ad_group_name | 広告グループ名、マネタイズ広告のUnit名 |
| adgroupid | te_ads_object.ad_group_id | 広告グループID、マネタイズ広告のUnit ID |
| adname | te_ads_object.ad_name | 広告名 |
| adid | te_ads_object.ad_id | 広告ID |
| app_adamid | te_ads_object.app_id | アプリID |
| app_appname | te_ads_object.app_name | アプリ名 |
| 【iOS】(固定値) | te_ads_object.platform | プラットフォーム(Android、iOSなど) |
| countryorregion | te_ads_object.country | 国・地域コード |
| localspend_currency | te_ads_object.currency | コストまたは収益の通貨 |
| impressions | te_ads_object.impressions | 露出数 |
| taps | te_ads_object.clicks | クリック数 |
| installs | te_ads_object.installs | コンバージョン数(インストール) |
| localspend_amount | te_ads_object.cost | ユーザー獲得コスト |
3. その後の利用
3.1 データ格納の確認
「データ管理」ページで、コールバックイベントが格納されているかどうかを確認できます:
- asa_campaign_level_data:Campaign階層のデータ
- asa_adgroup_level_data:Ad Group階層のデータ
- asa_keyword_level_data:Keyword階層のデータ
3.2 単発のデータ取得
過去の一定期間のデータ(履歴データや、取得に失敗したデータの補完など)を統合したい場合は、プランを保存した後に再度プランページに入り、右上の単発取得ボタンをクリックして、時間範囲を指定したデータ取得を1回実行できます。なお、取得するデータの期間が以前の取得と重複する場合(たとえば2023-08-01のデータを取得し、この日のデータが以前にすでに取得されている場合)は、最新の取得データで以前のデータが上書きされます:

