Conversions#
Conversion link#
A crucial part of conversion is passing information that the conversion took place. This can be achieved by making a HTTP request to the adserver. The common way to do it is to create an image element on a site. This image is usually a 1x1 px gif, which points to an adserver resource. The other option is to make a direct API call.
Each conversion has a unique conversion link.
In the basic mode, the link has only one (optional) parameter value. Such a link could be used as an src attribute of a HTML element. It could be used only once per impression.
Here are sample links.
https://example.com/kw/6d0bd92b28aa4deb811d6f9cf8aff96b.gif
https://example.com/kw/6d0bd92b28aa4deb811d6f9cf8aff96b.gif?value=1.2
In the advanced mode, the link has placeholders that should be filled.
Here’s a sample link.
https://example.com/kw/6d0bd92b28aa4deb811d6f9cf8aff96b.gif?value=value&nonce=nonce&ts=timestamp&sig=signature
Parameters:
value - how much the conversion is worth in US Dollars. This parameter is optional if the value was defined during the conversion
nonce - unique random value, which is used to distinguish two conversions of the same type
ts – the timestamp of the conversion creation
sig – the signature of passed parameters
Preparation of the conversion link in the advanced mode#
Helper methods#
The urlSafeBase64Encode
function encodes data to base64 format and replaces characters that are not allowed in the URL.
public static function urlSafeBase64Encode($string): string
{
return str_replace(
[
'/',
'+',
'=',
],
[
'_',
'-',
'',
],
base64_encode($string)
);
}
The urlSafeBase64Decode
function is a reverse function to the urlSafeBase64Encode
. It replaces non-standard base64 characters and decodes base64 string.
public static function urlSafeBase64Decode(string $string): string
{
return base64_decode(
str_replace(
[
'_',
'-',
],
[
'/',
'+',
],
$string
)
);
}
Generating the conversion link#
Here’s a piece of code that generates the conversion link. This link must be generated for each conversion event.
private const CONVERSION_LINK_TEMPLATE = 'https://example.com/kw/6d0bd92b28aa4deb811d6f9cf8aff96b.gif?value=value&nonce=nonce&ts=timestamp&sig=signature';
private const CONVERSION_SECRET = 'gKH9a3UDEGn7F71NOWfuvw';
/**
* @param string $value conversion value in US Dollars. If decimal part is needed, it should be separated with a dot
*
* @return string conversion link
* @throws \Exception when function random_bytes is not available
*/
private function generateLink(string $value = ''): string
{
$uuidStart = strrpos(self::CONVERSION_LINK_TEMPLATE, '/') + 1;
$uuid = substr(self::CONVERSION_LINK_TEMPLATE, $uuidStart, 32);
$nonce = Utils::urlSafeBase64Encode(random_bytes(16));
$timestamp = time();
$signature = Utils::urlSafeBase64Encode(
hash('sha256', $uuid.Utils::urlSafeBase64Decode($nonce).$timestamp.$value.self::CONVERSION_SECRET, true)
);
return str_replace(
[
$value ? '=value' : 'value=value&',
'=nonce',
'=timestamp',
'=signature',
],
[
$value ? '='.$value : '',
'='.$nonce,
'='.$timestamp,
'='.$signature,
],
self::CONVERSION_LINK_TEMPLATE
);
}
The CONVERSION_LINK_TEMPLATE
and CONVERSION_SECRET
constants should be read from the conversion definition.
They are unique for each conversion.
The $value
parameter is optional, in case it was defined in the conversion.
Direct API call#
The direct API call from the advertiser’s backend to the adserver needs another parameter: cid
.
The cid
parameter can be obtained during the first user visit on the advertiser’s site.
It is the advertiser’s responsibility to store cid
and connect it with a proper user.
The cid
parameter should be attached to other GET parameters of the advanced conversion link.