Relatórios de custos no link de atribuição para ad networks

Resumo: Ad networks podem relatar o custo toda vez que um anúncio recebe um clique.

Os anunciantes usam o dashboard da AppsFlyer como fonte confiável para todas as decisões de distribuição de orçamento, agilizando a tomada de decisões sobre onde investir. Para ad networks que desejam ser incluídas nesse processo, o compartilhamento de dados de custo com a AppsFlyer é fundamental.

Os anunciantes geralmente verificam seus parceiros com melhor performance usando a classificação por ROI. Aqueles que não mostram dados de custo sempre aparecem no final da lista.

Como compartilhar o custo

Há duas maneiras de enviar dados de custo a nível de usuário através de URLs de atribuição da AppsFlyer: de forma não criptografada e de forma criptografada. O envio de dados criptografados de custo permite que os parceiros enviem o valor de custo na URL de atribuição de cliques.

Dados de custo não criptografados podem ser enviados através dos seguintes 3 parâmetros para a URL de clique:

  • af_cost_model=CPI (atualmente, o CPI é o único modelo que pode ser visualizado nos relatórios da AppsFlyer)
  • af_cost_ value={insira o valor de CPI, por exemplo: 1,00}
    Atenção: Valores menores que 1 exigem um 0 antes do decimal, por exemplo: 0,05.
  • af_cost_currency={insira o código de 3 letras da moeda. Se estiver em branco, assumiremos que o valor é USD}

ATENÇÃO: Embora qualquer modelo de custo possa ser enviado por meio do link de atribuição, atualmente apenas o CPI é compatível para a exibição de dados de custo no dashboard. Outros modelos de custo estão disponíveis nos relatórios brutos.

Um exemplo de um link de atribuição com dados de custo não criptografados:

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

Custos criptografados

Se você preferir não revelar o valor de custo real na URL de atribuição, você pode criptografar os parâmetros de custo. Dados de custo criptografados podem ser enviados seguindo um método de criptografia baseado em AES. Além do modelo de custo, valor e moeda, os parceiros precisarão de uma chave específica da ad network para gerar o valor de custo criptografado.

Passos para criptografia:

  1. Solicite sua chave de criptografia de ad network à sua equipe de PSE usando o widget de assistente do parceiro.
  2. Use o método de criptografia AES (mostrado abaixo) para criptografar os 4 valores necessários (chave da ad network, valor de custo, modelo de custo e moeda de custo)
  3. Adicione o valor de criptografia gerado à sua URL de atribuição da AppsFlyer no parâmetro af_enc_data=.

Exemplo de links de atribuição com transferência de valores criptografados:

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

Atenção: Somente as ad networks que realizam a integração de custos criptografados com a AppsFlyer podem enviar dados de custos criptografados nos links de atribuição de seus clientes.

Processo de criptografia AES

Para realizar a criptografia, os parceiros devem usar o algoritmo AES, com um ECB block mode, usando PKCS5 padding. Em seguida, eles devem usar Base-64 encode nos dados criptografados e, por fim, usar URL-encode no resultado.

As ad networks podem usar qualquer tech stack para realizar esse processo. Veja exemplos abaixo para PHP, Java e 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)))

Quais ad networks oferecem suporte aos relatórios de custos?

Para ver uma lista completa das ad networks que oferecem suporte aos relatórios de custos no link de atribuição, clique aqui.

Para ver uma lista completa das ad networks que oferecem suporte aos relatórios de custos via API, clique aqui.