クリックでのコスト計測:アドネットワーク向け

概要: アドネットワークは広告のクリック毎(=計測URLの発火毎)にコスト情報をAppsFlyerへ共有することが可能です。

広告主は、AppsFlyerの管理画面をすべての予算配分の決定における信頼できる情報源として利用し、投資すべき配信先を簡単に確認することが可能です。このプロセスにおいてより可視化されたい場合に、連携済みパートナーはAppsFlyerに対してコストデータを共有することが必要不可欠です。

多くの場合、広告主はROIでソートして優れたパフォーマンスを発揮しているパートナーはどこなのかを確認しています。このとき、コストデータがないパートナーは常にリストの一番下の表示されてしまいます。

コスト情報の共有方法

AppsFlyerの計測URLを介してユーザーレベルのコストデータを渡すには、非暗号化 / 暗号化の2つがあります。暗号化したコスト情報の受け渡しの場合、パートナーはインプレション / クリックURLにおいて、プレーンテキストで表示した形でコスト情報を送信することが可能です。

暗号化していないコスト情報の場合、以下3つのパラメータをクリックURLにハードコーディングする形で渡すことが可能です:

  • af_cost_model=CPI ( AppsFlyerでは、現状CPIモデルのみが計測可能です。 )
  • af_cost_ value={CPI単価 / たとえば1.00}
    注意: 1未満の値の場合、小数点の前に0が必要です。(例:0.05)
  • af_cost_currency={3文字の通貨コードを入力してください / 空欄の場合USDが適用されます}

: 計測URLを介して任意のコストモデルを送信できますが、管理画面上でのコストデータの表示は現状CPIのみ対応しています。それ以外のコストモデルは、ローデータレポートでのみ確認可能ですので注意してください。

暗号化していないコスト情報がある計測URLのサンプル:

https://app.appsflyer.com/id554782625?pid=mediasource_int&c=campaignName&idfa=ABCDEFGH-ABCD-ABCD-ABCD- 
A12345678910&af_siteid=12345&af_cost_model=CPI&af_cost_value=1.00&af_cost_currency=USD

暗号化したコスト情報

計測URL上に実際のコストの値を表示したくない場合には、コストに関するパラメータを暗号化できます。暗号化したコスト情報は、AES基準の暗号化方式に従って渡すことが可能です。コストモデル、コスト値、通貨単位に加え、パートナーは暗号化したコスト値を解読するためのネットワーク固有のキーが必要になります。

暗号化の手順:

  1. 担当PDMへ、ネットワーク暗号化キー問い合わせてください。
  2. AES暗号化方式(以下参照)を使用して、必要な4つの値(ネットワークキー、コスト値、コストモデル、および通貨単位)を暗号化してください。
  3. af_enc_data=のパラメータで、生成した暗号化値をAppsFlyerの計測URLに追加してください

暗号化した値を持つ計測URLのサンプル:

https://app.appsflyer.com/id554782625?pid=mediasource_int&c=campaignName&idfa=ABCDEFGH-ABCD-ABCD-ABCD-A12345678910&af_siteid=12345&af_enc_data=DvVvQRow%2F2N0LiQGZh0wvwucFygbll9IwAMSN%2B%2BDQxo%3D

注意:AppsFlyerとコストの暗号化連携を実行したアドネットワークのみが、暗号化したコスト情報を広告主の計測URLと共に実際に送信できます。サポート済みのアドネットワークは、以下のコスト計測をサポートしているアドネットワーク一覧の中に、"暗号化クリック(encrypted click)"というラベルがついています。

AESの暗号化プロセス

暗号化を成功させるには、ECB block modeと一緒に、PKCS5 paddhingを使いながら、AESアルゴリズムを使用する必要があります。そして、暗号化されたデータをBase 64でエンコードし、最後に結果をURLエンコードする必要があります。

各パートナーは、これを克服するために任意の方法を利用可能です。PHP、Java、Python向けのサンプルをご確認ください。

PHP

<?php
$f = fopen( 'php://stdin', 'r' );
echo "Enter private key: ";
$private_key = trim(fgets($f));
echo "Enter cost model: ";
$cost_model = trim(fgets($f));
echo "Enter cost value : ";
$cost_value = trim(fgets($f));
echo "Enter cost currency : ";
$cost_currency = trim(fgets($f));
$params = array(
	'af_cost_model' => $cost_model,
	'af_cost_value' => $cost_value,
	'af_cost_currency' => $cost_currency
);
$query_str = http_build_query($params);
$block_size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$padding_size = $block_size - (strlen($query_str) % $block_size);
$padded_query_str = $query_str . str_repeat(chr($padding_size), $padding_size);
$enc_raw = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $private_key, $padded_query_str, "ecb");
$enc_b64 = base64_encode($enc_raw);
$enc_url_encoded = urlencode($enc_b64);
echo "\n\n\r";
echo "Private key: " . $private_key . "\r\n";
echo "Query string: " . $query_str . "\r\n";
echo "\n\r";
echo "Encrypted query string: " . $enc_url_encoded . "\r\n";
fclose( $f );
?>

Java

private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
private static final String encryptionKey = "XXXXXXXXXXXXXXXX"; // secret key provided by appsflyer
private static final SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes(), "AES");
public static void main(String[] args) throws Exception {
  String queryParams = "bid_value=0.01&bid_type=cpc";
  String cipher = encrypt(queryParams);
  System.out.println(cipher);
}
public static String encrypt(String str) throws Exception {
  Cipher cipherEncrypt = Cipher.getInstance(CIPHER_ALGORITHM);
  cipherEncrypt.init(Cipher.ENCRYPT_MODE, key);
  byte[] cipher = cipherEncrypt.doFinal(str.getBytes("UTF-8"));
  String b64 = encode64(cipher);
  String result = urlencode(b64);
  return result;
}

Python

import sys
import base64
import urllib
from Crypto.Cipher import AES
def read_number(t):
  try:
    start = input("enter " + t + ": ")
    start = float(start)
    return start
  except ValueError:
    print("\n\r" + t + " must be a number")
    exit()
def encrypt (secret_key, msg):
  cipher = AES.new(secret_key, AES.MODE_ECB)
  ciphertext = cipher.encrypt(msg)
  return ciphertext
def padding (data):
  length = 16 - (len(data) % 16)
  data += chr(length)*length
  return data

secret_key = input("enter secret key: ").strip()
currency = input("enter cost currency: ").strip()
model = "CPI"
if len(currency) == 3:
  currency = currency.upper()
else:
  print("currency must have 3 character (e.g. USD)")
  exit()
start = read_number("starting value")
end = read_number("final value")
step = read_number("step")
if end >= start:
  while start <= end:
    msg = "af_cost_currency=%s&af_cost_model=%s&af_cost_value=%.2f" % (currency, model, start)
    msg = padding(msg)
    enc = encrypt(secret_key, msg)
    start += step
print(msg)
print(urllib.quote_plus(base64.b64encode(enc)))

コスト計測をサポートしているアドネットワーク

クリックでのコスト計測をサポートしている全媒体を確認するには、こちらを参照してください。