Criteo FAQs | Comparably
Criteo Claimed Company
Criteo is a global technology company that powers the world’s marketers and media owners with trusted and impactful advertising through our world-leading Commerce Media Platform, a suite of products that activates the world’s largest set of commerce data to drive better commerce outcomes. We help thousands of brands, publishers, and retailers reach and monetize audiences and are committed to supporting a fair and open internet that enables discovery, innovation, and choice. Criteo is headquartered in Paris, France, and has offices around the world where our incredible team collaborates to create an open and inclusive environment. We build together, accomplish together, celebrate together—and we do the right thing to create a sustainable impact for our customers, our industry, and the people we serve read more
EMPLOYEE
PARTICIPANTS
82
TOTAL
RATINGS
713

Criteo FAQs

Criteo's Frequently Asked Questions page is a central hub where its customers can always go to with their most common questions. These are the 262 most popular questions Criteo receives.

Frequently Asked Questions About Criteo

  • Ourmanagement center provides you with an efficient way to monitor the performance of your Criteo campaigns, while providing youwith control over your campaign bids and budgets with ease.

    The step-by-stepvideo guides below will walk you through our new intuitive design and help you understand how our interface allows you to take fullcontrol over your campaigns.

    Reporting

    In this video, we'll walk through Criteo'scustomizable reporting capabilitiesand show you how to analyze your campaign performance across different channels, including your Dynamic Ads campaigns on Facebook, using differentviews and parameters.

    Campaign Management

    In this management centervideo, we'll work through how you can take control of your campaign bids through a simpler, faster, more reliable interface. Edit your bids manually, in bulk or pre-authorise your Account Strategist to take actions on your behalf.

    Budget Management

    In this management centervideo, we'll work through how you can efficiently manage yourcampaign budgets, add newinsertion orders and approve existingbudgetrequests. This videoaddressesfinancialmanagersandaccount admins only.

    User Management

    In this management centervideo, we'll work through how you can efficiently manage yourcampaign budgets, add newinsertion orders and approve existingbudgetrequests. This videoaddressesfinancialmanagersandaccount admins only.

    View Article
  • You canfind your unique API key in Setup->Users -> API Information

    View Article
  • If you are not a programmer, please refrain fromsetting this up onyour own.To getstartedwith the Criteo API, a programmer's expertise is required in order to use web APIs.

    Please contact your technical support team who will be able tosupport you throughout the course ofthe setup.

    Criteo API

    An example of the Criteo API code can be found below.You mayalso download the source file from here.

    <

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using CPOP_API_Test.CriteoServiceReferencev201305;

    namespace CPOP_API_Test{ class Program { static void Main(string[] args) { CSharpAPIExample api = new CSharpAPIExample("foo_api", "foo_api0", "foo-criteoapi-01", 123456789); api.Login(); string reportURL = api.GetStatisticsReportURL(new DateTime(2014, 1, 23), new DateTime(2014, 1, 24)); string transIDURL = api.GetTransactionIDReportURL(new DateTime(2014, 1, 23), new DateTime(2014, 1, 24)); campaign[] activeCampaigns = api.GetAllActiveCampaigns(); category[] categories = api.GetAllCategories(); } }

    class CSharpAPIExample { private CriteoAdvertiserAPIv201305 c;

    public CSharpAPIExample() { }

    public CSharpAPIExample(string username, string password, string source, long token) { this.username = username; this.password = password; this.source = source; this.token = token; }

    private string username { get; set; } private string password { get; set; } private string source { get; set; } private long token { get; set; }

    public void Login() { c = new CriteoAdvertiserAPIv201305(); long authToken = c.clientLogin(username, password, source);

    // Use the authToken with the app apiHeader header = new apiHeader(); header.appToken = token; header.authToken = authToken; header.clientVersion = "1.0"; c.apiHeaderValue = header; }

    public string GetStatisticsReportURL(DateTime start, DateTime end) { ReportJob job = new ReportJob(); job.startDate = start.ToString("yyyy-MM-dd"); job.endDate = end.ToString("yyyy-MM-dd"); job.aggregationType = AggregationType.Daily; job.reportType = ReportType.Campaign; job.selectedColumns = new ReportColumn[] { ReportColumn.clicks, ReportColumn.convRate, ReportColumn.cost, ReportColumn.costOfSale, ReportColumn.ctr, ReportColumn.impressions, ReportColumn.orderValue, ReportColumn.sales, };

    ReportJobResponse response = c.scheduleReportJob(job); return getJobResponse(response); }

    public string GetTransactionIDReportURL(DateTime start, DateTime end) { TransactionReportJob j = new TransactionReportJob(); j.selectedColumns = new TransactionReportColumn[] { TransactionReportColumn.clickDateTime, TransactionReportColumn.displayDateTime, TransactionReportColumn.duplicateStatus, TransactionReportColumn.orderValue }; j.startDate = start.ToString("yyyy-MM-dd"); j.endDate = end.ToString("yyyy-MM-dd");

    TransactionReportJobResponse tResponse = c.scheduleTransactionReportJob(j); return getJobResponse(tResponse); }

    private string getJobResponse(JobResponse response) { while (true) { JobStatus status = c.getJobStatus(response.jobID); if (status == JobStatus.Completed) break; else if (status == JobStatus.Failed) throw new Exception(string.Format("{0} - ({1}) {2}", response.jobStatus, response.apiException.errorCode, response.apiException.message)); } return c.getReportDownloadUrl(response.jobID); }

    // Retrieves all active campaigns public campaign[] GetAllActiveCampaigns() { CampaignSelectors selector = new CampaignSelectors(); selector.campaignStatus = new CampaignStatus[] { CampaignStatus.RUNNING }; return c.getCampaigns(selector); }

    // Retrieves all categories public category[] GetAllCategories() { CategorySelectors selector = new CategorySelectors(); return c.getCategories(selector); } }}

    Criteo Advertiser API

    An example of the Criteo Advertiser API code can be found below. You may also download the source file from here.

    <

    <?phpclass clientLogin { public $username; // string public $password; // string public $source; // string}

    class clientLoginResponse { public $clientLoginResult; // long}

    class partnerLogin { public $appToken; // long public $username; // string public $password; // string public $source; // string}

    class partnerLoginResponse { public $partnerLoginResult; // long}

    class getAccount {}

    class getAccountResponse { public $getAccountResult; // AdvertiserAccount}

    class AdvertiserAccount { public $advertiserName; // string public $email; // string public $currency; // string public $timezone; // string public $country; // string}

    class apiHeader { public $authToken; // long public $appToken; // long public $clientVersion; // string}

    class getCampaigns { public $campaignSelector; // CampaignSelectors}

    class CampaignSelectors { public $campaignIDs; // ArrayOfInt public $budgetIDs; // ArrayOfInt public $campaignStatus; // ArrayOfCampaignStatus public $biddingStrategy; // ArrayOfBiddingStrategy}

    class CampaignStatus { const RUNNING = 'RUNNING'; const DEAD = 'DEAD'; const NOT_RUNNING = 'NOT_RUNNING';}

    class biddingStrategy { const Cpm = 'Cpm'; const Cpc = 'Cpc'; const Cpa = 'Cpa'; const Cpo = 'Cpo';}

    class getCampaignsResponse { public $getCampaignsResult; // ArrayOfCampaign}

    class campaign { public $campaignID; // int public $campaignName; // string public $endDate; // string public $campaignBid; // bidInformation public $budgetID; // int public $remainingDays; // int public $status; // CampaignStatus public $categoryBids; // ArrayOfCategoryBid}

    class bidInformation { public $biddingStrategy; // biddingStrategy public $cpcBid; // CPCBid public $cpaBid; // CPABid}

    class CPCBid { public $cpc; // double}

    class CPABid { public $postClick; // int public $postView; // int public $commission; // double public $percent; // double}

    class categoryBid { public $campaignCategoryUID; // int public $campaignID; // int public $categoryID; // int public $selected; // boolean public $bidInformation; // bidInformation}

    class mutateCampaigns { public $listOfCampaignMutates; // ArrayOfCampaignMutate}

    class campaignMutate { public $campaign; // campaign}

    class mutate { public $operationMutate; // OperationMutate}

    class OperationMutate { const ADD = 'ADD'; const RESET = 'RESET'; const SET = 'SET';}

    class mutateCampaignsResponse { public $listOfJobResponse; // ArrayOfCampaignMutateJobResponse}

    class campaignMutateJobResponse { public $campaignMutate; // campaignMutate}

    class JobResponse { public $jobID; // long public $jobStatus; // JobStatus public $apiException; // ApiExceptionData}

    class JobStatus { const Pending = 'Pending'; const InProgress = 'InProgress'; const Completed = 'Completed'; const Failed = 'Failed';}

    class ApiExceptionData { public $errorCode; // ApiExceptionErrorCode public $errors; // ArrayOfApiError public $message; // string public $trigger; // string}

    class ApiExceptionErrorCode { const NoError = 'NoError'; const BadAuthentification = 'BadAuthentification'; const AuthTokenExpired = 'AuthTokenExpired'; const InvalidAppTokenAuthToken = 'InvalidAppTokenAuthToken'; const AuthentificationNotExist = 'AuthentificationNotExist'; const UserAccessDisabled = 'UserAccessDisabled'; const UserAccessNotAllowed = 'UserAccessNotAllowed'; const MissingData = 'MissingData'; const OperationNotSupported = 'OperationNotSupported'; const InvalidID = 'InvalidID'; const AccessToThisJobNotAllowed = 'AccessToThisJobNotAllowed'; const InvalidFieldValue = 'InvalidFieldValue'; const UnexpectedError = 'UnexpectedError'; const AppTokenNotSupportedForPartnerLogin = 'AppTokenNotSupportedForPartnerLogin';}

    class apiError { public $code; // ApiErrorCode public $detail; // string public $field; // string public $index; // int public $isExemptable; // boolean public $textIndex; // int public $textLength; // int public $trigger; // string}

    class ApiErrorCode { const NoError = 'NoError'; const MissingMutateStructure = 'MissingMutateStructure'; const MissingMutateObject = 'MissingMutateObject'; const MissingJobReportStructure = 'MissingJobReportStructure'; const UnexpectedError = 'UnexpectedError';}

    class getCategories { public $categorySelector; // CategorySelectors}

    class CategorySelectors { public $categoryIDs; // ArrayOfInt public $selected; // boolean}

    class getCategoriesResponse { public $getCategoriesResult; // ArrayOfCategory}

    class category { public $avgPrice; // double public $categoryID; // int public $categoryName; // string public $numberOfProducts; // int public $selected; // boolean}

    class mutateCategories { public $listofCategoryMutates; // ArrayOfCategoryMutate}

    class categoryMutate { public $category; // category}

    class mutateCategoriesResponse { public $listOfJobResponse; // ArrayOfCategoryMutateJobResponse}

    class categoryMutateJobResponse { public $categoryMutate; // categoryMutate}

    class getBudgets { public $budgetSelector; // BudgetSelectors}

    class BudgetSelectors { public $budgetIDs; // ArrayOfInt}

    class getBudgetsResponse { public $getBudgetsResult; // ArrayOfBudget}

    class budget { public $budgetID; // int public $budgetName; // string public $totalAmount; // int public $remainingBudget; // double public $remainingBudgetUpdated; // string}

    class scheduleReportJob { public $reportJob; // ReportJob}

    class ReportJob { public $reportSelector; // ReportSelector public $reportType; // ReportType public $aggregationType; // AggregationType public $startDate; // string public $endDate; // string public $selectedColumns; // ArrayOfReportColumn public $isResultGzipped; // boolean}

    class ReportSelector { public $CategoryIDs; // ArrayOfInt public $CampaignIDs; // ArrayOfInt public $BannerIDs; // ArrayOfInt}

    class ReportType { const Campaign = 'Campaign'; const Banner = 'Banner'; const Category = 'Category';}

    class AggregationType { const Hourly = 'Hourly'; const Daily = 'Daily';}

    class ReportColumn { const clicks = 'clicks'; const impressions = 'impressions'; const ctr = 'ctr'; const revcpc = 'revcpc'; const ecpm = 'ecpm'; const cost = 'cost'; const sales = 'sales'; const convRate = 'convRate'; const orderValue = 'orderValue'; const salesPostView = 'salesPostView'; const convRatePostView = 'convRatePostView'; const orderValuePostView = 'orderValuePostView'; const costOfSale = 'costOfSale'; const impressionWin = 'impressionWin'; const costPerOrder = 'costPerOrder';}

    class scheduleReportJobResponse { public $jobResponse; // ReportJobResponse}

    class ReportJobResponse { public $reportJob; // ReportJob}

    class getJobStatus { public $jobID; // long}

    class getJobStatusResponse { public $getJobStatusResult; // JobStatus}

    class getReportDownloadUrl { public $jobID; // long}

    class getReportDownloadUrlResponse { public $jobURL; // string}

    class getStatisticsLastUpdate {}

    class getStatisticsLastUpdateResponse { public $getStatisticsLastUpdateResult; // ArrayOfStatUpdate}

    class StatUpdate { public $Type; // StatType public $Date; // dateTime}

    class StatType { const ClicksAndImpressions = 'ClicksAndImpressions'; const Sales = 'Sales';}

    /** * CriteoAdvertiserAPI class * * * * @author {author} * @copyright {copyright} * @package {package} */class CriteoAdvertiserAPI extends SoapClient {

    private static $classmap = array( 'clientLogin' => 'clientLogin', 'clientLoginResponse' => 'clientLoginResponse', 'partnerLogin' => 'partnerLogin', 'partnerLoginResponse' => 'partnerLoginResponse', 'getAccount' => 'getAccount', 'getAccountResponse' => 'getAccountResponse', 'AdvertiserAccount' => 'AdvertiserAccount', 'apiHeader' => 'apiHeader', 'getCampaigns' => 'getCampaigns', 'CampaignSelectors' => 'CampaignSelectors', 'CampaignStatus' => 'CampaignStatus', 'biddingStrategy' => 'biddingStrategy', 'getCampaignsResponse' => 'getCampaignsResponse', 'campaign' => 'campaign', 'bidInformation' => 'bidInformation', 'CPCBid' => 'CPCBid', 'CPABid' => 'CPABid', 'categoryBid' => 'categoryBid', 'mutateCampaigns' => 'mutateCampaigns', 'campaignMutate' => 'campaignMutate', 'mutate' => 'mutate', 'OperationMutate' => 'OperationMutate', 'mutateCampaignsResponse' => 'mutateCampaignsResponse', 'campaignMutateJobResponse' => 'campaignMutateJobResponse', 'JobResponse' => 'JobResponse', 'JobStatus' => 'JobStatus', 'ApiExceptionData' => 'ApiExceptionData', 'ApiExceptionErrorCode' => 'ApiExceptionErrorCode', 'apiError' => 'apiError', 'ApiErrorCode' => 'ApiErrorCode', 'getCategories' => 'getCategories', 'CategorySelectors' => 'CategorySelectors', 'getCategoriesResponse' => 'getCategoriesResponse', 'category' => 'category', 'mutateCategories' => 'mutateCategories', 'categoryMutate' => 'categoryMutate', 'mutateCategoriesResponse' => 'mutateCategoriesResponse', 'categoryMutateJobResponse' => 'categoryMutateJobResponse', 'getBudgets' => 'getBudgets', 'BudgetSelectors' => 'BudgetSelectors', 'getBudgetsResponse' => 'getBudgetsResponse', 'budget' => 'budget', 'scheduleReportJob' => 'scheduleReportJob', 'ReportJob' => 'ReportJob', 'ReportSelector' => 'ReportSelector', 'ReportType' => 'ReportType', 'AggregationType' => 'AggregationType', 'ReportColumn' => 'ReportColumn', 'scheduleReportJobResponse' => 'scheduleReportJobResponse', 'ReportJobResponse' => 'ReportJobResponse', 'getJobStatus' => 'getJobStatus', 'getJobStatusResponse' => 'getJobStatusResponse', 'getReportDownloadUrl' => 'getReportDownloadUrl', 'getReportDownloadUrlResponse' => 'getReportDownloadUrlResponse', 'getStatisticsLastUpdate' => 'getStatisticsLastUpdate', 'getStatisticsLastUpdateResponse' => 'getStatisticsLastUpdateResponse', 'StatUpdate' => 'StatUpdate', 'StatType' => 'StatType', );

    public function CriteoAdvertiserAPI($wsdl = "https://advertising.criteo.com/api/v201010/advertiserservice.asmx?wsdl", $options = array()) { foreach(self::$classmap as $key => $value) { if(!isset($options['classmap'][$key])) { $options['classmap'][$key] = $value; } } parent::__construct($wsdl, $options); }

    /** * Client login is secured by using an application token, along with username and password. * * * @param clientLogin $parameters * @return clientLoginResponse */ public function clientLogin(clientLogin $parameters) { return $this->__soapCall('clientLogin', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Partner login is secured by using an application token, along with username and password. * * * @param partnerLogin $parameters * @return partnerLoginResponse */ public function partnerLogin(partnerLogin $parameters) { return $this->__soapCall('partnerLogin', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Returns advertiser account information * * @param getAccount $parameters * @return getAccountResponse */ public function getAccount(getAccount $parameters) { return $this->__soapCall('getAccount', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Returns campaign information, including all CPC bids per category for each campaign. * * @param getCampaigns $parameters * @return getCampaignsResponse */ public function getCampaigns(getCampaigns $parameters) { return $this->__soapCall('getCampaigns', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Mutate campaign information. Global CPC per campaign and specific Category Bids can be * set. * * @param mutateCampaigns $parameters * @return mutateCampaignsResponse */ public function mutateCampaigns(mutateCampaigns $parameters) { return $this->__soapCall('mutateCampaigns', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Returns category information. All categories linked to that account are returned. * * @param getCategories $parameters * @return getCategoriesResponse */ public function getCategories(getCategories $parameters) { return $this->__soapCall('getCategories', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Mutate category information. Can only be used to define which categories will be selected * for Bidding and Reporting. * * @param mutateCategories $parameters * @return mutateCategoriesResponse */ public function mutateCategories(mutateCategories $parameters) { return $this->__soapCall('mutateCategories', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Returns buget information. * * @param getBudgets $parameters * @return getBudgetsResponse */ public function getBudgets(getBudgets $parameters) { return $this->__soapCall('getBudgets', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Schedules a statistic report Job. * * @param scheduleReportJob $parameters * @return scheduleReportJobResponse */ public function scheduleReportJob(scheduleReportJob $parameters) { return $this->__soapCall('scheduleReportJob', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Returns status of a asynchronous job (report or mutate). Currently applies to jobs created * for mutateCampaign and scheduleReportJob. * * @param getJobStatus $parameters * @return getJobStatusResponse */ public function getJobStatus(getJobStatus $parameters) { return $this->__soapCall('getJobStatus', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Retrieve reportURL. * * @param getReportDownloadUrl $parameters * @return getReportDownloadUrlResponse */ public function getReportDownloadUrl(getReportDownloadUrl $parameters) { return $this->__soapCall('getReportDownloadUrl', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    /** * Get statistics last update. * * @param getStatisticsLastUpdate $parameters * @return getStatisticsLastUpdateResponse */ public function getStatisticsLastUpdate(getStatisticsLastUpdate $parameters) { return $this->__soapCall('getStatisticsLastUpdate', array($parameters), array( 'uri' => 'https://advertising.criteo.com/API/v201010', 'soapaction' => '' ) ); }

    }

    ?>

    Criteo TestConnect API

    An example of the Criteo TestConnectAPI code can be found below. You may also download the source file from here.

    <<?php //echo phpinfo(); include('./CriteoAdvertiserAPI.php'); ini_set('display_errors', 'On'); //turn off WSDP caching if not in a production environment $ini = ini_set("soap.wsdl_cache_enabled","0"); define('APP_TOKEN',454561231); define('USERNAME', 'fdsfds'); define('PASSWORD', 'fdsfdsds'); define('WSNAMESPANCE', 'https://advertising.criteo.com/API/v201010'); define('WSURL','https://advertising.criteo.com/api/v201010/advertiserservice.asmx?WSDL'); //instantiate the SOAP client $options = array( 'soap_version'=>SOAP_1_2,'exceptions'=>true //true,'trace'=>0,'cache_wsdl'=>WSDL_CACHE_NONE //,'proxy_host' => "localhost" //,'proxy_port' => 8888 ); try { $soap_client = new CriteoAdvertiserAPI(WSURL,$options); // CLIENTLOGIN echo '<br/><b>clientLogin...</b><br/>'; $clientLogin = new clientLogin(); $clientLogin->username = USERNAME; $clientLogin->password = PASSWORD; $clientLogin->source = 'test'; $loginResponse = $soap_client->clientLogin($clientLogin); $apiHeader = new apiHeader(); $apiHeader->appToken = APP_TOKEN; $apiHeader->authToken = $loginResponse->clientLoginResult; $apiHeader->clientVersion = 'test'; // PARTNERLOGIN //$loginResponse = $soap_client->partnerLogin(array('appToken'=>APP_TOKEN,'username'=>USERNAME, 'password'=>PASSWORD, 'source'=>'test')); //$apiHeader = new apiHeader($loginResponse->partnerLoginResult); echo '<b>->apiHeader:</b>'; print_r($apiHeader); echo "<br/>"; //Create Soap Header, then set the Headers of Soap Client. $soapHeader = new SOAPHeader(WSNAMESPANCE, 'apiHeader', $apiHeader, false); $soap_client->__setSoapHeaders(array($soapHeader)); // GETCAMPAIGN echo '<br/><b>getCampaigns...</b><br/>'; $getCampaignsParameters = new getCampaigns(); $getCampaignsParameters->campaignSelector = new CampaignSelectors(); $getCampaignsParameters->campaignSelector->campaignStatus = array(CampaignStatus::RUNNING,CampaignStatus::NOT_RUNNING); $result = $soap_client->getCampaigns($getCampaignsParameters); if($result->getCampaignsResult->campaign != null) $campaignId = $result->getCampaignsResult->campaign->campaignID; else $campaignId = $result->getCampaignsResult->campaign[0]->campaignID; echo '-><b>first campaignId:</b>'.$campaignId."<br/>"; //MUTATECAMPAIGNS echo '<br/><b>mutateCampaigns...</b><br/>'; $campaign = new campaign(); $campaign->campaignID = $campaignId; //$campaign->status = CampaignStatus::RUNNING; $categoryBid = new categoryBid(); $categoryBid->campaignCategoryUID = 29729; $categoryBid->campaignID = $campaignId; $categoryBid->categoryID = 87865678; $categoryBid->selected = true; $categoryBid->bidInformation = new bidInformation(); $categoryBid->bidInformation->biddingStrategy = biddingStrategy::Cpc; $categoryBid->bidInformation->cpcBid = new CPCBid(); $categoryBid->bidInformation->cpcBid->cpc = 0.40; $campaign->categoryBids = array($categoryBid); $campaignMutate = new campaignMutate(); $campaignMutate->campaign = $campaign; $campaignMutate->operationMutate = OperationMutate::SET; //$campaignMutate = array('campaign' => $campaign, 'operationMutate' => OperationMutate::SET); $mutateCampaignsParameters = new mutateCampaigns(); $mutateCampaignsParameters->listOfCampaignMutates = array($campaignMutate); $result = $soap_client->mutateCampaigns($mutateCampaignsParameters); echo '-><b>mutateCampaigns response:</b><br/>'; print_r($result); echo "<br/>"; echo '<br/><b>scheduleReportJob...</b><br/>'; $scheduleReportJobParameters = new scheduleReportJob(); $scheduleReportJobParameters->reportJob = new ReportJob(); $scheduleReportJobParameters->reportJob->reportSelector = new ReportSelector(); $scheduleReportJobParameters->reportJob->reportSelector->CampaignIDs = array($campaignId); $scheduleReportJobParameters->reportJob->reportType = ReportType::Campaign; $scheduleReportJobParameters->reportJob->aggregationType = AggregationType::Daily; $scheduleReportJobParameters->reportJob->startDate = '2012-07-01'; $scheduleReportJobParameters->reportJob->endDate = '2012-09-01'; $scheduleReportJobParameters->reportJob->selectedColumns = array(); $scheduleReportJobParameters->reportJob->isResultGzipped = false; //print_r($scheduleReportJobParameters); $result = $soap_client->scheduleReportJob($scheduleReportJobParameters); echo '-><b>scheduleReportJob response:</b><br/>'; print_r($result); $jobID = $result->jobResponse->jobID; $jobIsPending = true; while($jobIsPending == true) { echo '<br/><b>getJobStatus...</b><br/>'; $getJobStatus = new getJobStatus(); $getJobStatus->jobID = $jobID; $result = $soap_client->getJobStatus($getJobStatus); echo '-><b>getJobStatus response:</b><br/>'; print_r($result); if($result->getJobStatusResult == 'Completed') $jobIsPending = false; else sleep(30); } echo '<br/><b>getReportDownloadUrl...</b><br/>'; $getReportDownloadUrl = new getReportDownloadUrl(); $getReportDownloadUrl->jobID = $jobID; $result = $soap_client->getReportDownloadUrl($getReportDownloadUrl); echo '-><b>getReportDownloadUrl response:</b><br/>'; print_r($result); echo "<br/><a href='".$result->jobURL."'>".$result->jobURL."</a>"; } catch (SoapFault $fault) { echo $fault->faultcode."-".$fault->faultstring; } catch (Exception $e) { echo "<h2>Exception Error!</h2>"; echo $e->getMessage(); echo $soap_client->__getLastResponse(); }?>

    View Article
  • Overview

    If all events are showing the same Product ID, you are probably not populating the Criteo OneTag parameterdynamically. It is likely that the value of the product ID is being hard coded directlyon the Criteo OneTag.

    The Product ID passed on the Criteo OneTag must be exactly the same as the Product ID used inyour product data feed.

    Solution

    Please ensure that theProduct ID passed on the Criteo OneTag exactly matches the Product ID that is used inyour product data feed.

    ExampleIf a user is on a Product page and the Product ID for the product displayed on that particular page is A123, the viewItem event in the Criteo OneTag should look like this:

    { event: "viewItem", item: "A123" }

    However, if the user is ona different Product page and the Product ID for this other product is B456, the viewItem event in the Criteo OneTag should look like this:

    { event: "viewItem", item: "B456" }

    If you are implementing the Criteo OneTag via Google Tag Manager, please ensure your variables are correctly defined and that the Google Tag Manager dataLayer contains the required information used in those variables.

    View Article
  • Overview

    Youll see this warning message if youdon'timplementthe Criteo OneTag Quantity parameter to dynamically pass the quantity when the tag fires. Its likely that the value ofthe quantity is beinghard codedon the Criteo OneTag exactly as it appears in the Integrate Platform.

    Example

    { event:"viewBasket", item:[{id:"A123", price: 29.95, quantity: "quantity_1" }]}

    The quantity parameter is required for both theviewBasketandtrackTransactionevents. Find more information on events here.

    Solution

    Make sure the quantity has been dynamically implemented on the Criteo OneTagfor basket and confirmation pages.

    This is correct: If a user is on a basket page and the user has 4 units of item A123 in their cart, theviewBasketevent in the Criteo OneTag should look like this:

    { event:"viewBasket", item:

    [{id:"A123", price: 29.95, quantity: 4 }]

    }

    If you implement the Criteo OneTag via Google Tag Manager, please make sure your variables are correctly defined and the Google Tag Manager dataLayer contains the data used in those variables.

    View Article
  • Overview

    Each time the Criteo OneTag is fired, Criteo receives an event with all the parameters passed in the tag; this is called a hit. If no hits are received by Criteo, it means there is an issue with the implementation of the Criteo OneTag.

    The number of hits per page recorded by theCriteo OneTag on your site (Homepage, Search Listing, Product, Basket and Sales Confirmation pages) must matchthe number of hits/page views as recorded by Google Analytics or similar. If there is a discrepancy it means not all page views are being recorded correctly and you will need to perform the followingtroubleshooting steps.

    Troubleshooting

    Ensure that the Criteo OneTag is implemented in a live environment because test environments do not generate enough hits for accurate analysis.

    Browse your site's pages where the Criteo OneTag has been implemented (Homepage, Search Listing, Product, Basket and Sales Confirmation pages), particularly those where no, oralow number of hits are reported, thendo the followingchecks:

    Is the Criteo loader being executed?

    Without the loader Criteo OneTag cannot be fired, so you mustcheck that the loader is executed correctly:

    1. Open the Network panel. If you are using Google Chrome, Mozilla Firefox or Internet Explorer, press F12 on the keyboard, reload the page (F5), and then click on Network on the pop-up as shown inthe image below.

    2. Look for Criteo related network activity. Click on the Network panel and press Ctrl+F to open the search bar

    here

    3.Search "criteo" and try to find a network activity entry like the one below showing ld.js

    4. If you don't find this entry, reload the page and try again.

    5. If you still do not see the ld.js entry you must double check:

    If you are implementing the Criteo OneTag directly into the source code of your website. You must check that the JavaScript loader (see the below code) is included at the beginning of the Criteo OneTag and that it's not being blocked by any other element of the code.Criteo Loader:

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>

    If you are implementing the Criteo OneTag via Google Tag Manager, please ensure your triggers are correctly defined and the Google Tag Manager dataLayer contains the required information used in those Triggers.

    Is the Criteo OneTag being fired correctly?

    After verifying that the loader is executingcorrectly, you will need to perform a similar check to confirm that there is an event call being made to Criteo.

    1.Using the network panel, search for an entry starting with "event?a=" as shown in the image below.

    2. If you don't find this entry, reload the page and repeat the search.

    3. If you still can't find the entry starting with "event?a=" it means that the Criteo OneTag is not being executed and you will need to review the implementation of the Criteo OneTag. Detailed information on how toset-up theCriteo OneTag correctly can be found .

    Common issues when implementing the Criteo OneTag:

    Account parameter has been modifiedDouble check that the account parameter is exactly the same as the one you get from the Integrate platform.Account ID declaration:

    { event: "setAccount", account: YOUR UNIQUE ACCOUND ID },

    Missing brackets, parentheses, square brackets or quotesIf brackets, parentheses, square brackets or quotes are not opened or closed correctly,the Criteo OneTag code will be broken, generating JavaScripterrors. Please ensure that all parentheses "(", brackets "{" and square brackets "[" and quotes are entered exactly as shown in the Criteo OneTag code that you get from Integrate platform.

    View Article
  • Overview

    This warning message appears when you hardcode the product ID from the example in the guide.

    This isincorrect:

    { event:"viewItem", item:"product_id"}

    This isincorrect:

    { event:"viewList", item:["product_id_1","product_id_2","product_id_3"]}

    Remember, the Product ID passed on the Criteo OneTag must exactly match the one used inyour product data feed.

    We need the Product ID to track:

    viewItem,viewList,viewBasketandtrackTransactionevents. Find information on events here.

    Solution

    Make sure theProduct ID is dynamicallyimplementedin the Criteo OneTag for the listing, product, basket and confirmation pages. The Product ID passed through these tags should exactly match the Product ID used inyour product data feed.

    This iscorrect: If a user is on a product page and the Product ID for the product displayed on that particular page isA123, theviewItemevent in the Criteo OneTag should look like this:

    { event:"viewItem", item:"A123"}

    This iscorrect:

    If the user is ona listing page and the first three Product IDs for the products listed on the page areB456,C789,D101,theviewListevent in the Criteo OneTag should look like this:

    { event:"viewList", item: ["B456","C789","D101"] }

    If you implement Criteo OneTag via Google Tag Manager, please make sure your variables are correctly defined and the Google Tag Manager dataLayer contains the data used in those variables.

    View Article
  • Overview

    This warning message occurs when the prices implementedin the Criteo OneTag differ from the prices of the corresponding products in your product feed.

    The product price passed on the Criteo OneTag must exactly match the product price used inyour product feedand displayed on your website.

    The product price is required for theviewBasketandtrackTransactionevents. Find more information on events here.

    Solution

    Check that the product price implemented in the Criteo OneTagis the price in your product feed.

    This is correct: If a user is on the basket page and the product price for A123is 101.99 in your product data feed, theviewBasketevent in the Criteo OneTag should look like this:

    { event: "viewBasket",item: [{ id: "A123", price: "101.99", quantity:"1" } ]}

    If you implement the Criteo OneTag via Google Tag Manager, please make sure your variables are correctly defined and the Google Tag Manager dataLayer contains the dataused in those variables.

    View Article
  • Overview

    This warning message appears when you arenot implementingthe Criteo OneTag Price parameterdynamically. The value ofthe price could behard codedon the Criteo OneTag exactly as it appears in the Integrate Platform.

    Remember, the price passed on the Criteo OneTag must be the unit price of the product on your site.

    The price parameter is required for theviewBasketandtrackTransactionevents. Find more info on events here.

    Example

    { event:"viewBasket", item:[{id:"A123", price: price_1, quantity: "quantity_1" }]}

    Solution

    Check theprice that is dynamically implemented on the Criteo OneTagfor basket and confirmation pagesand make sure the price is the unit price of the product on your site.

    This is correct: If a user is on a basket page and the price for the product displayed on that particular page is29.95, theviewBasketevent in the Criteo OneTag should look like this:

    { event:"viewBasket", item:

    [{id:"A123", price: 29.95, quantity: 1 }]

    }

    However, if the user selects a different product with a different price - for example, product isB456with unit price45.99 -theviewBasketevent in the Criteo OneTag should look like this:

    { event:"viewBasket", item:

    [{id:"B456", price: 45.99, quantity: 1 }]

    }

    If you implement the Criteo OneTag via Google Tag Manager, please make sure your variables are correctly defined and the Google Tag Manager dataLayer contains the information used in those variables.

    View Article
  • Overview

    Managing different traffic analyses and marketing optimization services can often become tedious, especially when you have to modify your website's source code for every modification or new implementation. Google Tag Manager helps you easily create and manageall of those tags from the same place.

    To implement the Criteo OneTag via Google Tag Manager, complete the following five steps (you can skip step one if you already have a dataLayer implemented on all required pages ).

    Implementation instructions

    1. Set up the dataLayer

    The dataLayer is a variable declared in the source code on every page of your website that features the Criteo OneTag. It is not implemented through the Google Tag Manager website. The content of the dataLayer will determine what information is transmitted to us through the Criteo OneTag.

    2. Define the variables

    In this step you teach Google Tag Manager how to retrieve the information contained in your dataLayer. After the variablesare set up, the information available in the dataLayer will be fed automatically into the Criteo OneTag.

    3. Set up the triggers

    Triggers determine when Google Tag Manager should fire the tags. Setting up the triggers ensures that the Criteo OneTag only activates when necessary.

    4. Create the tags

    The Criteo OneTag can be set up in an instantusing the variables defined on the previous step.

    5. Publish

    In this last step you will be able to review the configuration, make sure it is workingas expected, and putit live on your website.

    View Article
  • Overview

    This guide will explain how to generate a product feed and how to install the Criteo OneTag on your 3D Cart site.

    Note: By downloading and using a plug-in, extension, or code snippet provided by Criteo in order to assist in the implementation of software code and/or tags on Clients Sites, the Client acknowledges that it is solely responsible for reviewing and testing the implementation on its sites and agrees that Criteo shall have no liability to Client for any errors in the implementation. The tags are mostly copy+paste ready, but some modifications may be needed depending on your sites customization.

    How to generate a product feed

    3D Cart has a parent-child structure, so we recommend you use 3D Cart's internal product ID rather than a product ID generated elsewhere. Simply follow these six steps to generate a product feed:

    Step 1: Export/Import

    Criteo Accurate chrome extension

    Step 2: Go to Products > Manage

    Step 3: Create a new export by clicking "Add New"

    Step 4: Match the fields using Criteo Product Feed Specification.These are the default column titles. If required, you can add additional columns to the export:

    name (alias: title)

    url_link (alias: link)

    image1/thumbnail (alias: image_link) NOTE: please make sure you insert the site's home URL as Prefix.

    description (alias: description)

    price (alias: price)

    catalogid (alias: id)

    saleprice (alias: sale_price)

    instock_message (alias: availability)

    categories (alias: product_type)

    constant for static value (optional)

    Step 5: Schedule your export

    Go to Products > Choose your export under Custom Export Sets > Schedule

    Step 6: Generate feed link http://www.domain.com/assets/exports/filename.csvUnder Scheduled Exports, choose checkbox Enable and enter the file name. Under Action choose the first option Save File.

    How to install the Criteo OneTag

    First, youll need to access the website's theme. Go to Settings > Design > Themes & Styles. Then click Edit Template (HTML).

    The individual templates are:

    Homepage: home.html

    Listing pages: category_0.html. You may have more than 1 template for category pages.

    Product pages: listing_0.html. You may have more than 1 template for product pages.

    Product pages (quick view): quickview.html

    Cart/Basket pages: view_cart.html

    Cart/Basket pages (quick view popup): view_cart_quick.html

    Order Confirmation page: checkout-step4.html if it's a 4-step checkout system.

    If you are combining all the tags into one conditional statement, you can add your script to frame.html.

    To integrate the Criteo OneTag, follow these five simple steps:

    Note:In the below code the variable PARTNER_ID is your own Criteo unique identifier. Please request it from your Criteo contact.

    Step 1: Homepage Template >home.html

    <!-- Criteo Homepage Tag -->

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>

    <script type="text/javascript">

    var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";

    window.criteo_q = window.criteo_q || [];

    window.criteo_q.push(

    { event: "setAccount", account: PARTNER_ID},

    { event: "setSiteType", type: deviceType },

    { event: "setEmail", email: "" },

    { event: "viewHome", ecpplugin: "3dcart" }

    );

    </script>

    <!-- END Criteo Home Page Tag -->

    Step 2: Listing Template >category_0.htmlYou need to populate the product IDs on the page as either HTML or a JavaScript variable utilizing the macro[catalogid].

    The listing loop is generally sitting within the section with the following START and END comments.

    You can add the following code within the listing loop to build an array of product IDs in JavaScript:

    <!--START: CATEGORY_ITEMS-->

    <!--START: ITEM_TEMPLATE_0->

    <script> var prodlist = prodlist||[]; prodlist.push("[catalogid]"); </script>

    <!--END: ITEM_TEMPLATE_0-->

    <!--END: CATEGORY_ITEMS>

    Then copy the following tags:

    <!-- Criteo Listing Page Tag -->

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>

    <script type="text/javascript">

    var prodlist = prodlist||[]; prodlist.push("[catalogid]");

    var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";

    window.criteo_q = window.criteo_q || [];

    window.criteo_q.push(

    { event: "setAccount", account: PARTNER_ID},

    { event: "setSiteType", type: deviceType },

    { event: "setEmail", email: "" },

    { event: "viewList", ecpplugin: "3dcart", item: prodlist }

    );

    </script>

    <!-- END Criteo Listing Page Tag -->

    Step 3:Product/Quick-view Template >listing_0.html or quickview.html

    <!-- Criteo Product Page Tag -->

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>

    <script type="text/javascript">

    var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";

    window.criteo_q = window.criteo_q || [];

    window.criteo_q.push(

    { event: "setAccount", account: PARTNER_ID},

    { event: "setSiteType", type: deviceType },

    { event: "setEmail", email: "" },

    { event: "viewItem", ecpplugin: "3dcart", item: "[catalogid]" }

    );

    </script>

    <!-- END Criteo Product Page Tag -->

    Step 4: Cart/Quick-view Template >view_cart.html or view_cart_quick.html

    Similar to listing tag, you need to build the product array within the cart item loop of the HTML, which is within the section of the following START and END comment:

    <!--START: SHOPPING_CART_ITEM-->

    <script> var cartData = cartData||[]; cartData.push({id: "[catalogid]", price: ("[ITEM_PRICE]").replace('$',''), quantity: [ITEM_QUANTITY] }); </script>

    <!--END: SHOPPING_CART_ITEM-->

    Then copy the following tags:

    <!-- Criteo Product Basket Tag -->

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>

    <script type="text/javascript">

    var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";

    var cartData = [];

    jQuery( document ).ready(function() {

    window.criteo_q = window.criteo_q || [];

    window.criteo_q.push(

    { event: "setAccount", account: PARTNER_ID},

    { event: "setSiteType", type: deviceType },

    { event: "viewBasket", ecpplugin: "3dcart", item: cartData });

    });

    </script>

    <!-- END Criteo Basket Page Tag -->

    Step 5: Order Confirmation Template > checkout-step4.html

    Similar to listing and cart tags, you need to build the product array within the following START and END comment:

    <!--START: items-->

    <script> var orderData=orderData||[]; orderData.push({ id: "[catalogid]", price: ("[unitprice]").replace('$',''), quantity: "[numitems]" }); </script>

    <!--END: items-->

    The copy the following tags:

    <!-- Criteo Sales Page Tag -->

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>

    <script type="text/javascript">

    var deviceType = /iPad/.test(navigator.userAgent) ? "t" : /Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";

    window.criteo_q = window.criteo_q || [];

    window.criteo_q.push(

    { event: "setAccount", account: PARTNER_ID},

    { event: "setSiteType", type: deviceType },

    { event: "setEmail", email: "[oemail]"},

    { event: "trackTransaction", ecpplugin: "3dcart", id: "[invoicenum]", item: orderData });

    </script>

    <!-- END Criteo Sales Page Tag -->

    Verification

    If you have access to the Criteo Integrate Platform, please login and test using the Tags Validation Dashboard

    You can also download theto test your tags.

    It is important to note that we collect theunit pricefor your products in the Criteo OneTag. We multiply the unit price with the product quantity to calculate theTotal Order Valuedisplayed in reporting. If you apply anyshipping, taxes, vouchers, discounts, or promo codes, it is your responsibility to verify they are applied to the Total Order Value correctly.

    View Article
  • Your coupons can be set up in two different formats. One format can be chosen per campaign.

    Logo zone coupons

    These coupons take up the space within the ad creative which is normally allocated to your logo. Using a logo zone coupon means your ad creative can still be optimized for shopper and context via real-time creative optimization, and will incorporate highly performing dynamic elements such as product recommendations. Here's an example of a logo-zone coupon*:

    Full frame coupons

    These coupons take up the full size of the ad. This provides more space for promotions but disables real-time creative optimization, plus highly performing dynamic elements such as product recommendations, for shoppers and contexts on any slides that utilize the coupons.

    Criteo recommends avoiding the use of full frame coupons wherever possible as they may negatively impact the performance of your campaign.Here's an example of a full frame coupon*:

    *this example simply shows the area that the coupon is displayed in, and the animation can vary based on your settings when uploading your coupons.

    View Article
  • Yes, you can toggle on or off a number of parameters shown under your default reports, or any report with a graph, enabling you to take control of the way you analyse your campaigns. These parameters include any that are available in the dashboard, for example:

    Revenue;

    Sales;

    Cost;

    COS;

    CPO;

    CVR.

    To activate any of the parameters above, simply select them from the top bar.

    You can also select the time period of your reports by selecting between day view, week view, month view, quarter view and year view. In addition, you can specify an exact date range.

    You can also choose to analyse your data per individual campaign or on a daily basis across all campaigns. To access your daily stats across all your campaigns, select the Daily Overview option under the Campaign Overview drop down menu.

    View Article
  • Criteo has partnered with Facebook to deliver Dynamic Product Ads over mobile and desktop. The Criteo Performance Platform enables you to access and analyze your Criteo campaigns on Facebook through a separated section under Reports -> Display.

    To access your Criteo campaign reports on Facebook, simply select the Facebook Reports at the bottom right of your reporting page. You are then redirected to the Facebook Dynamic Adsreporting page where you can retrieve detailed information for your Criteo campaigns on Facebook and Instagram across mobile and desktop.

    Through Criteos Reporting, you are able to analyse the number of the impressions served, the click-through rate (CTR), your total cost and CPM and your revenues.

    Similar to your Criteo reports, you are able to analyse your Facebook and Instagram campaigns during specific time periods by selecting between day view, week view, month view, quarter view and year view, or you can specify an exact date range.

    Please note: The Facebook Dynamic Adsreport is only visible when you look at a single account. It is not available under aggregated view as not all of the campaigns are integrated with Facebook DPA. Please select your Facebook Dynamic Adsenabled campaign to access the Facebook and Instagram reports.

    View Article
  • Overview

    What is Feed Quality?

    Feed Quality is defined as the number of Product IDs fed into the Criteo OneTag that match with the Product IDs from your feed. This calculation relies on having the Criteo OneTag implemented correctly on all your Product pages.

    Example:If there are 10,000 Criteo OneTag viewItem event hits, and 9,500 product IDs in those product events hits match a Product ID in the feed, then the Feed Quality is 95%.

    Why would Feed Quality be low?

    Usually, low Feed Quality is caused by Product IDs being passed in Criteo OneTag viewItem events that do not match the Product IDs from your feed

    If you are missing products displayable on your website in the product feed, feed quality will be low. Please ensure that all displayable products on your website are provided in the product feed.

    If the IDof a product isB789465in the feed, then the ID passed into the Criteo OneTag viewItem event must also beB789465.

    This is acorrectmatch:

    This is an incorrect match:

    If the Product IDs passed in the Criteo OneTag do not match the Product IDs provided in the Product Feed, then the Feed & Tracker Quality will be low.

    View Article
  • You may download your reports by simply clicking on the Download option at the bottom of the page.

    All reports are exported in CVS format, allowing you to view and analyze them using your preferred spreadsheet software.

    View Article
  • You can upload and manage your coupons from Management Center by visiting the 'Creatives' tab. This tool allows you to quickly see each of your campaigns live, upcoming, and previous coupons. You can also create and edit live and upcoming coupons.

    In this article, you'll learn how to:

    View your live coupons in the 'live tab'. Here, you may have multiple coupons running if you have multiple campaigns that are live.

    Manage your existing coupon projects in the 'Coupon Projects' tab. Here, you can view all scheduled coupons or come back to projects that you started but havent yet scheduled.

    Upload new coupons in the 'Coupon Projects' tab where you can upload creative for an upcoming promotion and schedule it. Make sure you know what you need before you upload a coupon.

    View your coupon history in the 'History' tab to view previously scheduled coupons that are no longer live, and duplicate them with a click of a button.

    View live Coupons

    In the 'Live' tab you can see all creative that is live across all of your campaigns, along with coupons. If youre about to create a new coupon, make sure you check to see what coupons are live first.

    Upload a new coupon

    In the 'Creatives' tab, go to 'Coupon Projects' and click on 'Add a Coupon' button at the bottom of the page. From here, follow these 5 steps:

    Step 1: Provide coupon Info

    Coupon name. This is to help you identify which coupon is which within Management Center.

    Choose a campaign to run your coupon in. If you want to run the coupon across multiple campaigns, you can duplicate this coupon and link it to additional campaigns after creation and deployment.

    Description. This is only for you to know which coupon this is, so it won't be shown in your ads.

    Landing page URL where shoppers will be directed to when they click on the coupon. This may be the homepage or a designated landing page for this promotion. If you use Google Analytics or another analytics partner, make sure you add the tracking URL here.

    Coupon format. Learn the difference between logo zone' and full frame' coupons here.

    Whats the difference between logo zone and full frame coupons?

    Step 2: Upload Creative

    Upload your coupon files in the recommended sizes and format. You have the option to add multiple coupons to the same ad, which will rotate as "slides. You may want to use multiple slides if you are trying to tell a story or deliver a longer message without having to fit your message in one slide.

    Step 3: Settings

    Determine animation settings, including how often you want to show your coupon, the duration of time that your coupon will show for, and how many times your coupon will rotate before it stops. The settings default to the recommended animation settings.

    Step 4: Preview

    Preview and validate your coupons before you schedule them to go live. Make sure you test the URLs to ensure that they redirect to the correct page.

    Step 5: Schedule & Launch

    Choose the start and end date of your coupon, or set as permanent for coupons thatdon'thave an end date. A permanent coupon will stay live until you manually delete it or schedule a coupon that will replace it. Once a scheduled coupon ends, your ads will go back to the permanent coupon (if you have one live). Learn more about coupon priorities.

    Manage existing coupon projects

    The Coupon Projects tab is where you can find your upcoming scheduled coupons and those thatyou'vestarted but have not yet scheduled. Here you can add new coupons, edit existing ones, delete projects, or duplicate coupons so you can run across multiple campaigns. Once your coupon goes live, you will find it on the Live tab, where it will remain until the coupon ends. Once a coupon ends, you can view it on the 'History' tab. (even if it is overridden by a higher priority coupon.)

    View coupon history

    View all coupons that are no longer running in the 'History' tab. Here you can duplicate coupons that you'd like to use again.

    Frequently asked questions about coupons

    Can i run coupons across multiple campaigns?

    Where can I find the coupons I'm working on that aren't yet deployed?

    Can I duplicate a previously used coupon?

    What do I need to have before I upload a coupon to my Criteo ads?

    View Article
  • To access your account and start managing and analyzing your campaigns and budgets, visit https://marketing.criteo.com and select Management Center from the drop-downmenu at the top left of the page.

    Under Management Centeryou can analyze the performance of your campaigns, manage your CPC, CPO and CPM targets, update or create new budgets, and manage your ad creatives.

    View Article
  • To help us collecttheusers browsing intent and then build relevant product recommendations to display on the Criteo creatives (banners), we need specific dynamic and static parameters to be implementedinto the Criteo OneTag.

    Your Account ID is your unique implemented inCriteo OneTag. Youll find it within the individual tracker examples on the platform.

    If you see the error message Account ID missing or Account ID is empty, you have to verify the corresponding line in the Criteo OneTag and ensure that you have accurately implemented the Account ID we provided.

    This error message could result from the following issues:

    The setAccount parameter is missing from Criteo OneTag

    The setAccount parameter is misspelled eg. { event:setAccont, account: 5854 }

    If your Account ID is1234, the Criteo OneTag should look like this:

    { event: "setAccount", account: 1234 }

    View Article
  • Overview

    The Criteo OneTag is a JavaScript tag that allows Criteo to collect your users' intentions as they navigate your website.

    The Criteo OneTag is made up of two elements:

    The Criteo loaderisa JavaScript library that must be declared on every page you implementthe Criteo OneTag. The Criteo loader is in charge of building and firing calls to Criteo's servers.

    The trackerallows usto collect your visitors browsing events (such as products browsed and bought), which wethen use to compute relevant and personalized recommendations for yourad banners.

    Implementing thetracker is quick, easy, and invisible to your users. The quality of recommendations depends directly on the quality of the tracker implementation, including tags installed on all or most pages, right parameters being passed, and so on.

    The Criteo OneTag:

    Does not alter your site visually and is completely invisible to your users.

    Is asynchronous and does not slow the loading of your pages.

    Should be implemented in the header code of each page on your site.

    Where should you implementthe Criteo OneTag?

    You'll need to implement the Criteo OneTag across five page different types:

    Homepage.

    Search / category listing pages.

    Product pages.

    Basket or cart page.

    Sales confirmation page.

    Homepage

    Implementing the Criteo OneTag on your homepage allows usto track bouncers (users wholand on your homepage and leave your site without making a purchase). We willautomatically evaluate the value of these users and maydisplay banners with best-seller products.

    Search listing page

    A search listing page shows multiple products. It can be a category page or a search result page. With aCriteo OneTag on these pages, we cantrack a user's interest in a certain kind of product orcategory.

    Many users just browse your search listing and category pages and don't click through to aproduct detailpage, so implementing the Criteo OneTag on these higher-level pages is key to tracking these users.

    Product page

    A product page shows details about a specific product. Installing the Criteo OneTag on product pages is key because this is where user intent is expressed most strongly. There are many users that land directly on your product pages without first visitingyour search listing pages.

    Basket

    With theCriteo OneTag on your basket/cart page, we can track those users close to conversion on your site but who exit the process before final checkout.

    Sales confirmation page

    When a user completes a purchase on your site, they'll see a sales confirmation page containing an order ID and summary. By installing theCriteo OneTag on this page, we can track the product(s) your customersbought.

    Tracking specific purchases enables usto optimize the banner display, so that we don't display products the customer already bought in the banners again. This parameter also allows you to accurately measure Criteo ROI.

    View Article
  • Overview

    If users are able to purchase products in different currencies on your website - for example a travel website where users are booking from all over the world - you may want to define the currency of the product purchased.

    Defining the currency will help Criteo display the correct campaign currency in Criteo reporting to align with your own reporting.

    As product prices are only passed in Basket and Transaction events, this feature should only be used for these two events in the Criteo OneTag. If you are only selling products in one currency, this feature should not be used.

    The feature only accepts valid ISO currency codes (see http://www.iso.org/iso/fr/home/standards/currency_codes.htm for more information).

    The input must thus be a valid 3-letter string corresponding to a currency code (e.g. 'EUR', 'USD', 'JPY'...).

    ISO currency code

    3-letter string

    valid currency code (e.g. "EUR", "USD", "BRL"...)

    uppercase characters

    "JPY" is a valid input, while "jpy" is not.

    How to use

    Populate the 3-letter string of the currency that the user has selected on your site. The price value needs to be the exact number that appears on the site. If the user selects USD and the price is $100 USD, then the price in the Criteo OneTag needs to be 100, and the currency 'USD'.

    Syntax

    The parameter is called currency and looks like this:

    currency: "JPY"

    This is an example of the parameterin theBasket tag:

    { event: "viewBasket",currency : "JPY", item: [

    { id: "1234", price: 10.2, quantity: 1 },

    { id: "2345", price: 11.2, quantity: 2 }

    ]}

    And on the Sales tag:

    { event: "trackTransaction", id: "12345",currency : "JPY", item: [

    { id: "1234", price: 10.2, quantity: 1 },

    { id: "2345", price: 11.2, quantity: 2 }

    ]}

    How to test

    Open your browser debug tool by pressing F12. Search for 'criteo' in the Network tab, then navigate to the Basket or Sales Confirmation page (wherever you implemented the currency feature). This is what you will see in the query string parameters:

    View Article
  • Create new audiences and manage existing ones right in Management Center. In this article, youll learn how to create new audiences, edit and delete existing ones, and helpful tips for managing your audiences. You can also find information on how to troubleshoot errors you might be seeing. Ifyou'vealready created an audience and want to create a campaign to target this audience, read this article.

    Create a new audience

    Once you select a name for your campaign, you will then need to create your audienceto start targeting customers. Using your existing CRM data, you can create audiences to accurately target and re-engage your customers with dynamic paid display ads across web, mobile browsers, and apps.

    Two simple steps for creating your audience:

    Provide a name for your audience segment. Make sure you name it around the characteristics of that audience segment so you can easily identify it later on. Note: Already created an audience that you want to use? Select the Use a saved audience option under the main navigation bar and choose your preferred audience segment from the list provided

    Build an audience using either:

    An email CRM file containing plain email addresses, MD5 hash of emails,or SHA256 hash of emails.

    OR

    Mobile Advertising IDs containing User Identifiers such as IDFA, AAID, or Criteo Cookie ID.

    Following a successful on-boarding and automatic hashing of your audience, youll receive an instant match rate indicating how much of your audience was found inside Criteos powerful Shopper Graph, which consists of more than 74% of the worlds online shoppers.

    Tip: when you upload a new audience, Criteo will calculate the match rate. Your match rate is the number of emails in the file that we can match with a user profile in our network. Finding these users in our network allows us to accurately target them with relevant ads based on their browsing behavior.

    Want to submit a different file? Simply delete the previously used and upload a new one. The previous information uploaded will no longer be stored by Criteo.

    Tip: when you upload a new audience, Criteo will calculate the match rate. Your match rate is the number of emails in the file that we can match with a user profile in our network. Finding these users in our network allows us to accurately target them with relevant ads based on their browsing behavior.

    Manage your existing audiences

    You can update your existing audiences by clicking on the pencil icon under Actions. Here, you can update the name of this audience, and evaluate match rates, number of valid lines, and matched emails. When you replace a file, you can compare the previous file to your new one. Check for change in match rate, as this will impact the performance of your associated audience campaigns. If the match rate is higher, then you will be able to reach more of your audience. Once you upload the new audience file that you want to use, make sure you click on "update audience" and see this message:

    You can also delete an audience that youdon'twant to use anymore by clicking on the trash icon under Actions. Before you delete an audience, make sure its not in use. If it is, you can replace this audience with a new audience.

    Note on PrivacyCriteo does not store any directly identifying information and uses state of the art data hashing algorithms to ensure that no directly identifying information is stored in plain form, such as name, surname, or email address. Independently of how we receive emails, the hashing process is automatically completed within our application. Criteo only stores SHA256 hash, or MD5 hash of emails.

    View Article
  • Price information can be imported from your product feed data and dynamically displayed in your ads.Ads can display Recommended Retail Price and/or Sale Price, if this information is included in your feed.Criteo can also automatically calculate the discount percentage between the two prices and display that in the ad too.

    View Article
  • Overview

    The Criteo OneTag includes a set of safety and quality mechanisms to ensure that there will not be a negative impact on the users browsing behavior and that user's privacy is protected.

    This article explains how Criteo ensures that the OneTag is not affecting website performance and load time.

    We'll explain how Criteo ensures privacy and anonymity of the advertiser and customer.

    Read more about the generic behavior of OneTag at Criteo OneTag HTTP/HTTPS calls explained

    Cached Resources

    The Criteo loader is a JavaScript library that will be cached by the user's browsers. This happens automatically as soon as the user interacts with the Criteo retargeting services on any website globally.

    Compressed calls via HTTP-GZIP

    All calls made to Criteo are HTTP-GZIP compressed to ensure a quick interaction between the user and Criteos data centers.

    Asynchronous Requests

    The OneTag has been designed to work in an asynchronous way to avoid any WAIT states which might interfere and slow down the users browsing experience.

    OnLoad-Event

    The initial tracking-request will be made as soon as the Criteo request has been fulfilled. All possible further requests triggered by the OneTag will only be made after the Browser has successfully downloaded all primary resources including images, script files, CSS files, etc. from your website.

    Example Criteo Calls Inventory selection and Publisher calls are made after LOAD (red line)

    Encapsulated Calls

    All potential publisher calls are triggered as an image-request within an iFrame. This ensures that 3rd parties cannot place or read data on your website.

    Loading Time Thresholds

    Time limitations are put in place to make sure the entire loading time does not exceed a certain threshold. All requests triggered by Criteo will immediately stop once the threshold has been reached.

    Smart Inventory Selection

    We do identify the most-relevant publisher-networks for the current users and also keep records of which publishers have already been informed of the current user. This way we make sure there are no redundant requests.

    A user who interacted with Criteo in the past will see much less publisher tagging calls.

    New users will see the maximum number of calls. Most Monitoring and Performance systems fall into the new user category and because of thatdon'treflect a realistic user browsing experience.

    Publisher Service Monitoring

    All publisher services are tested periodically and monitored 24/7 by Criteo around the globe. Loading times, response types, certificates, etc. are being monitored and checked constantly. Publishers are automatically removed from inventory selection if tests are not passed completely.

    Device / Bandwidth Detection

    The Criteo OneTag considers the current device of the user and the latency and bandwidth of the users connection. Depending on that, the thresholds and the potential number of requests will be more strict.

    Loading & Uptime of Datacenters

    Loader:

    This request (down)loads a file hosted in our data centers, there is no processing time between the request and the response. We have 5 data centers worldwide with exceptional availability (up time). In 2012, our availability average was 99.97% in the United States of America.

    Event:

    This request will be processed by our servers before they respond but the request is asynchronous so the content of your website will continue to load as the browser waits for the response. Regardless, our average response time is only 25 milliseconds and our infrastructure team monitors latency 24/7 so that incidents are resolved within minutes.

    Inventory Selection:

    Similarly to the Event, this request is asynchronous and our average response time is only 50 milliseconds. Our servers latency is also monitored 24/7. Most importantly, we only begin to tag users for publishers once the onLoad event has been reached and the page is fully usable for your visitors. This means that our tags will not affect the perceived load time of pages on your site.

    Can certain publisher calls be removed?

    It is not possible to remove specific publisher calls - except if there are technical issues. This case will result in a global deactivation as explained above. In case of issue related to that please get in touch with your Criteo Account Strategist.

    View Article
  • The Account tab under Account Settings provides information on your product catalog and enables you to manage the categories under your campaigns. Through the Account Settings feature, you can choose the product catalog you wish to change. For each selected catalog, you can view the total number of products, the total number of categories, and the last import date.

    Account allows you to edit and manage the categories included in your campaigns. To add a category under your active campaign, simply turn the switch to On. If you wish to turn a category off, simply turn the switch back to Off.

    View Article
  • Our management portalallows you to easily generate an API and manage your campaigns using a third party platform. To generate your own API, select Account Settings from the Criteo Apps-> Users,and scroll down to theAPI Informationand complete the required information.

    Generating an API is very similar to adding a new user. To generate your API you need to provide a name and an email address.

    Once you complete all required information and request yourAPI, your request status is set to pending. To complete your APIactivation, click on theactivation link in the email sent to your registeredaddress.

    Please note: To generate your API you must register using a different email address from the oneused to registeryour user profile.We recommend adding an email address that is managed by more than one user as youcan only generatea single API.

    View Article
  • Yes. To create your own report, select the Create New Report option under the Campaign Overview drop down menu. You are now able to name your report and select the various metrics and dimensions. The options for formulating your report include:

    Accessibility Turn metrics and dimensions On/Off based on whether you want to use them or not;

    Graph Metrics - Select the metrics you would like to show in your graph. You may delete or add up to 6 metrics. You can also customize the order by simply dragging and dropping them to match your preferences;

    Table Dimensions Select up to three dimensions and analyze yourdata at a more granular level.

    Table Metrics Select the metrics you wish to see under your table or add more by selecting add metrics. You may also customize the order by simply dragging and dropping them to match your preferences.

    View Article
  • If youre already integrated with Criteo and have successfully set up your account, you can access your campaigns by selecting the Applications icon at the top left of the page.

    You are provided with three options:

    Management Center: Management Center is our transparent, real-time reporting and campaign management interface that provides granular insights on the performance of your campaigns and efficient campaign, banner, budget, and user controls. Through Management Center, you can easily manage your campaign budgets across all your campaigns and categories using real-time insights.

    Technical Set-Up: Through the Technical Set-Up application, you will be able to easily test the Criteo OneTag across all pages of your site. The Criteo OneTagallows Criteo to collect user browsing intent on your site and its implementation is fundamental to the success of your campaigns. Technical Set-Up will not be available to you unlessyou'veintegrated through our Integrate program.

    Account Settings: Account Settings is your dedicated application for all things related to your account. Through Account Settings you can access your account information, manage your alerts, accounts and user settings, and add new users:

    Accounts Manage and edit settings tied to each of your accounts, such as which campaign categories are shown on your reports.

    Users Manage, add, edit or delete users.

    Alerts Manage your existing alerts or set up new ones.

    View Article
  • Yes. You can schedule weekly recurring reports. To schedule a recurring report, simply select or create the report you wish to receive over email and click the share button at the bottom of your Reportstab.

    You can set up scheduled email reports to go out to as many users as you'd like. Simply add the recipients email addresses in the To field. Use a semicolon to separate email addresses.

    You can also select the frequency of your report. Select between a single occurrence or a recurring daily, weekly, or monthly email.

    Single occurrence To send a report over email simply generate your desired report, add your recipients email addresses and select Once under the frequency option.

    Recurring report To receive your campaign performance on a regular basis directly into your inbox, simply add your email to the recipient list and select "Daily", Weekly, or "Monthly" under the frequency. You can select the day of week and time of day you'd like the recurring report be delivered.

    The email will include a link to the dedicated report in our Management Center and a spreadsheet in .xls format.

    To unsubscribe or delete a scheduled email report, please follow the unsubscribe link directly from the email report.

    View Article
  • When you initially set up a monthly or auto-renew, capped IO both the IO total and your remainingamounts are equal. In case you add an additionalIO, your remaining budget will increase. However, your total budget will remain the same as it indicates the total amount of the monthly recurring capped IO. i.e. when you initially set up an auto-renew or monthly, capped IO of 500,000 your budget total will be 500,000, whilst your remaining amountwill start decreasingbased on your campaign activity as seen in figure 1 below:

    If however, you choose to add 60,000 more to your existing capped IO before its end date, your available budget will increase leaving the IOs total recurring budget unchanged. Figure 2 shows changes to your monthly recurring IO after adding an additional 60,000.

    View Article
  • Overview

    The cross-device parameter in a nutshell

    Implementing the cross device parameter within the Criteo OneTag enables you to take advantage of our powerful Shopper Graph. The benefits of the Criteo Shopper Shopper Graph:

    Unify the omnichannel shopping journey for new and existing customers as they shop your store and browse tens of thousands of premium publishers

    Identify shopper interest in your catalog, driven by a massive amount of granular shopper data from over 120 shopping signals

    Securely access your shoppers deterministic identity data for use across marketing and measurement activities at no additional cost

    Ensure robust levels of data transparency, privacy, and security

    Heres an example of the Criteo Shopper Graph in action: Let's assume your customer is browsing products on your website from his mobile device. Thanks to the Criteo Shopper Graph, it will be possible to later show this customer relevant ads on his desktop device.

    How it works

    The users email address will be passed within the cross-device parameter. To facilitate the protection of Personally Identifiable Information (PII), all email addresses will be hashed (using an SHA-256algorithm) before being stored on Criteo's servers. Criteo will then use the hash value to match users across each of their devices.

    How to implement the cross device parameter

    The cross device parameter is a small snippet of code that allows you to pass the anonymized email address of visitors to your website. To provide the most flexibility possible to our clients, Criteo acceptsusers email addresses, hashed or plain text. If sent through plain text, we can has the emails on our end.

    Please use thesetEmailevent if you are passing the plain text email or theMD5 hashed email.

    Before hashing or when passing plain text, all users email addresses need to be:

    Trimmed (removing all spaces before and after the user's email address).

    Converted to lowercase.

    Encoded in UTF-8.

    Cross Device parameters

    We recommend you send an email address that has already been hashed via a dedicated function (using an MD5 algorithm). Here is an example of the MD5 hashed email sent in thesetEmailevent:

    { event: "setEmail", email: "b58996c504c5638798eb6b511e6f49af" },

    In the event that an unhashed email address is sent, Criteo will then encrypt the user's email address automatically before it is saved in our database. Here is an example of the plain-text email sent in thesetEmailevent:

    { event: "setEmail", email: "[email protected]" },

    In the event that you are unable to pass either an unhashed or hashed email address, please simply pass us an empty string:

    { event: "setEmail", email: "" },

    Hashing functions

    If you are hashing the user's email addresses before it is passed to Criteo, you can use one of the following functions to ensure proper encryption.

    Hashing function using PHP

    $source_address = "[email protected] ";$processed_address = strtolower($source_address); //convert address to lower case$processed_address = trim($processed_address); //trimming leading and trailing spaces$processed_address = mb_convert_encoding($processed_address, "UTF-8", "ISO-8859-1"); //conversion from ISO-8859-1 to UTF-8 (replace "ISO-8859-1" with the source encoding of your string)$processed_address = md5($processed_address); //hash address with MD5 algorithm echo "Source e-mail: ".$source_address." | Hashed e-mail: ".$processed_address;

    Hashing function usingC#

    using System; using System.Collections.Generic; using System.Linq;using System.Text;using System.Security.Cryptography;namespace Sample_EmailHashing_code{ public class CriteoHashedEmailFormatter { private static MD5 _md5; private static MD5 Md5 { get { return _md5 ?? (_md5 = MD5.Create()); } } private static string Md5Encode(string sourceString) { byte[] inputBytes = Encoding.UTF8.GetBytes(sourceString); byte[] hash = Md5.ComputeHash(inputBytes); var sb = new StringBuilder(32); foreach (byte b in hash) sb.Append(b.ToString("x2")); return sb.ToString(); } public static string HashEmail(string sourceEmail) { String processedEmail; processedEmail = sourceEmail.ToLowerInvariant(); //conversion to lower case processedEmail = processedEmail.Trim(); //trimming leading and trailing spaces //conversion to UTF-8 and hashing with MD5 processedEmail = Md5Encode(processedEmail); return processedEmail; } } class SampleEmailHashing { static void Main(string[] args) { String sourceEmail = " [email protected] "; String processedEmail = CriteoHashedEmailFormatter.HashEmail(sourceEmail); Console.WriteLine(processedEmail); Console.ReadKey(); } }}

    Hashing function using PHP

    import java.io.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class SampleEmailHashing { public static void main(String[] args) { String sourceEmail = new String(" [email protected] "); String processedEmail = FormatMail(sourceEmail); System.out.println(processedEmail); } //Method to format the source Email, converting to lower case and removing spaces private static String FormatMail(String mail) { String newMail = new String(mail); // conversion to lower case characters newMail = newMail.toLowerCase(); //remove empty spaces newMail = newMail.trim(); newMail = md5Java(newMail); return newMail; } //Method to encrypt email address using MD5 public static String md5Java(String message) { String digest = null; try { //conversion to UTF-8 and hashing with MD5 MessageDigest md = MessageDigest.getInstance("MD5"); byte[] hash = md.digest(message.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(2 * hash.length); for (byte b : hash) { sb.append(String.format("%02x", b & 0xff)); } digest = sb.toString(); } catch (UnsupportedEncodingException ex) { ex.printStackTrace(); } catch (NoSuchAlgorithmException ex) { ex.printStackTrace(); } return digest; } }

    Hashing function using Perl

    #!/usr/bin/perl use strict; use warnings; use Digest::MD5 qw(md5 md5_hex); use Encode; my $original_email = qw/ [email protected] /; my $processed_email = lc($original_email); $processed_email =~ s/^\s+//; $processed_email =~ s/\s+$//; $processed_email = encode_utf8($processed_email); $processed_email = md5_hex($processed_email); print "Original email:\t$original_email\n"; print "Hashed email:\t$processed_email \n";

    Hashing function usingJavaScript

    function utf8_encode(argString) {

    if (argString === null || typeof argString === 'undefined') {

    return '';

    }

    var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");

    var utftext = '',

    start, end, stringl = 0;

    start = end = 0;

    stringl = string.length;

    for (var n = 0; n < stringl; n++) {

    var c1 = string.charCodeAt(n);

    var enc = null;

    if (c1 < 128) {

    end++;

    } else if (c1 > 127 && c1 < 2048) {

    enc = String.fromCharCode(

    (c1 >> 6) | 192, (c1 & 63) | 128

    );

    } else if ((c1 & 0xF800) != 0xD800) {

    enc = String.fromCharCode(

    (c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128

    );

    } else { // surrogate pairs

    if ((c1 & 0xFC00) != 0xD800) {

    throw new RangeError('Unmatched trail surrogate at ' + n);

    }

    var c2 = string.charCodeAt(++n);

    if ((c2 & 0xFC00) != 0xDC00) {

    throw new RangeError('Unmatched lead surrogate at ' + (n - 1));

    }

    c1 = ((c1 & 0x3FF) << 10) + (c2 & 0x3FF) + 0x10000;

    enc = String.fromCharCode(

    (c1 >> 18) | 240, ((c1 >> 12) & 63) | 128, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128

    );

    }

    if (enc !== null) {

    if (end > start) {

    utftext += string.slice(start, end);

    }

    utftext += enc;

    start = end = n + 1;

    }

    }

    if (end > start) {

    utftext += string.slice(start, stringl);

    }

    return utftext;

    }

    function md5(str) {

    var str = str.toLowerCase();

    var xl;

    var rotateLeft = function(lValue, iShiftBits) {

    return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));

    };

    var addUnsigned = function(lX, lY) {

    var lX4, lY4, lX8, lY8, lResult;

    lX8 = (lX & 0x80000000);

    lY8 = (lY & 0x80000000);

    lX4 = (lX & 0x40000000);

    lY4 = (lY & 0x40000000);

    lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);

    if (lX4 & lY4) {

    return (lResult ^ 0x80000000 ^ lX8 ^ lY8);

    }

    if (lX4 | lY4) {

    if (lResult & 0x40000000) {

    return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);

    } else {

    return (lResult ^ 0x40000000 ^ lX8 ^ lY8);

    }

    } else {

    return (lResult ^ lX8 ^ lY8);

    }

    };

    var _F = function(x, y, z) {

    return (x & y) | ((~x) & z);

    };

    var _G = function(x, y, z) {

    return (x & z) | (y & (~z));

    };

    var _H = function(x, y, z) {

    return (x ^ y ^ z);

    };

    var _I = function(x, y, z) {

    return (y ^ (x | (~z)));

    };

    var _FF = function(a, b, c, d, x, s, ac) {

    a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac));

    return addUnsigned(rotateLeft(a, s), b);

    };

    var _GG = function(a, b, c, d, x, s, ac) {

    a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac));

    return addUnsigned(rotateLeft(a, s), b);

    };

    var _HH = function(a, b, c, d, x, s, ac) {

    a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac));

    return addUnsigned(rotateLeft(a, s), b);

    };

    var _II = function(a, b, c, d, x, s, ac) {

    a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac));

    return addUnsigned(rotateLeft(a, s), b);

    };

    var convertToWordArray = function(str) {

    var lWordCount;

    var lMessageLength = str.length;

    var lNumberOfWords_temp1 = lMessageLength + 8;

    var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;

    var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;

    var lWordArray = new Array(lNumberOfWords - 1);

    var lBytePosition = 0;

    var lByteCount = 0;

    while (lByteCount < lMessageLength) {

    lWordCount = (lByteCount - (lByteCount % 4)) / 4;

    lBytePosition = (lByteCount % 4) * 8;

    lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount) << lBytePosition));

    lByteCount++;

    }

    lWordCount = (lByteCount - (lByteCount % 4)) / 4;

    lBytePosition = (lByteCount % 4) * 8;

    lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);

    lWordArray[lNumberOfWords - 2] = lMessageLength << 3;

    lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;

    return lWordArray;

    };

    var wordToHex = function(lValue) {

    var wordToHexValue = '',

    wordToHexValue_temp = '',

    lByte, lCount;

    for (lCount = 0; lCount <= 3; lCount++) {

    lByte = (lValue >>> (lCount * 8)) & 255;

    wordToHexValue_temp = '0' + lByte.toString(16);

    wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length - 2, 2);

    }

    return wordToHexValue;

    };

    var x = [],

    k, AA, BB, CC, DD, a, b, c, d, S11 = 7,

    S12 = 12,

    S13 = 17,

    S14 = 22,

    S21 = 5,

    S22 = 9,

    S23 = 14,

    S24 = 20,

    S31 = 4,

    S32 = 11,

    S33 = 16,

    S34 = 23,

    S41 = 6,

    S42 = 10,

    S43 = 15,

    S44 = 21;

    str = utf8_encode(str);

    x = convertToWordArray(str);

    a = 0x67452301;

    b = 0xEFCDAB89;

    c = 0x98BADCFE;

    d = 0x10325476;

    xl = x.length;

    for (k = 0; k < xl; k += 16) {

    AA = a;

    BB = b;

    CC = c;

    DD = d;

    a = _FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);

    d = _FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);

    c = _FF(c, d, a, b, x[k + 2], S13, 0x242070DB);

    b = _FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);

    a = _FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);

    d = _FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);

    c = _FF(c, d, a, b, x[k + 6], S13, 0xA8304613);

    b = _FF(b, c, d, a, x[k + 7], S14, 0xFD469501);

    a = _FF(a, b, c, d, x[k + 8], S11, 0x698098D8);

    d = _FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);

    c = _FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);

    b = _FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);

    a = _FF(a, b, c, d, x[k + 12], S11, 0x6B901122);

    d = _FF(d, a, b, c, x[k + 13], S12, 0xFD987193);

    c = _FF(c, d, a, b, x[k + 14], S13, 0xA679438E);

    b = _FF(b, c, d, a, x[k + 15], S14, 0x49B40821);

    a = _GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);

    d = _GG(d, a, b, c, x[k + 6], S22, 0xC040B340);

    c = _GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);

    b = _GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);

    a = _GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);

    d = _GG(d, a, b, c, x[k + 10], S22, 0x2441453);

    c = _GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);

    b = _GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);

    a = _GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);

    d = _GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);

    c = _GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);

    b = _GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);

    a = _GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);

    d = _GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);

    c = _GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);

    b = _GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);

    a = _HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);

    d = _HH(d, a, b, c, x[k + 8], S32, 0x8771F681);

    c = _HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);

    b = _HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);

    a = _HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);

    d = _HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);

    c = _HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);

    b = _HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);

    a = _HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);

    d = _HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);

    c = _HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);

    b = _HH(b, c, d, a, x[k + 6], S34, 0x4881D05);

    a = _HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);

    d = _HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);

    c = _HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);

    b = _HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);

    a = _II(a, b, c, d, x[k + 0], S41, 0xF4292244);

    d = _II(d, a, b, c, x[k + 7], S42, 0x432AFF97);

    c = _II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);

    b = _II(b, c, d, a, x[k + 5], S44, 0xFC93A039);

    a = _II(a, b, c, d, x[k + 12], S41, 0x655B59C3);

    d = _II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);

    c = _II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);

    b = _II(b, c, d, a, x[k + 1], S44, 0x85845DD1);

    a = _II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);

    d = _II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);

    c = _II(c, d, a, b, x[k + 6], S43, 0xA3014314);

    b = _II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);

    a = _II(a, b, c, d, x[k + 4], S41, 0xF7537E82);

    d = _II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);

    c = _II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);

    b = _II(b, c, d, a, x[k + 9], S44, 0xEB86D391);

    a = addUnsigned(a, AA);

    b = addUnsigned(b, BB);

    c = addUnsigned(c, CC);

    d = addUnsigned(d, DD);

    }

    var temp = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);

    return temp.toLowerCase();

    }

    Privacy

    The protection of a users privacy is one of Criteos top priorities. Criteo does not, nor ever will, store any personal data. To ensure we protect your customers privacy, Criteo will only store the encrypted email addresses of your customers on its servers. The encryption process cannot be reversed, maintaining anonymity at all times.

    Criteo does not collect, nor process any directly Personally Identifiable Information (PII). Instead Criteo uses pseudonymous information to match users with the cross-device parameter.

    To guarantee maximum protection, Criteo usesthe SHA-256hashing method to encrypt the users email addresses. SHA-256email hashing creates a unique, persistent, identifier that allows Criteo to identify users across the different devices and across different client websites (see above), none of which can be used to identify your customers. Criteo will never store an unhashed email address.

    Criteo offers users full transparency through our privacy policy and opt-out solutions. In addition, we ask our partners to be transparent aboutour services and methods in their own privacy policy. This means that users can access information about our services at all stages of their navigation and can opt-out of our services at any time.

    View Article
  • To download an Excel file containing the complete report of errors for each page type, click on the "DOWNLOAD COMPLETE REPORT" button.

    The file contains sheets for each report:

    Last events received- available for every page type.

    Top 300 non-displayable Product IDs- available for Search Listing, Product Listing, Basket and Sales Confirmation pages.

    Duplicated Transactions IDs- available for the Sales Confirmation page only.

    Report on last events received

    In this report we log the details of the last 5,000 events received in the previous24 hours:

    Time of the event.

    Mandatory parameter values received, like product IDs, email address or site type.

    Additional data: other optional parameters.

    Page URL: where the Criteo OneTag was fired.

    User: this specifies whether the Criteo OneTag was fired byyou or someone else.

    Report on top 300 non-displayable Product IDs

    This report logsthe details of the products passed in the Criteo OneTag that were not displayable:

    Product ID received bythe Criteo OneTag.

    Number of events received on this ID (in decreasing order).

    Impact on feed and the implementation quality of Criteo OneTag:

    Possible gain on tracker & feed quality if this product was made displayable

    New feed quality if this product was made displayable (=current feed & tracker quality + gain)

    Reason why the product is not displayable:

    Is in the feed? (yes/no)

    Is blacklisted? (yes/no)

    Is recommendable? (yes/no)

    Is in stock? (yes/no)

    Missing mandatory info?

    Missing mandatory info details?

    Report on duplicated Transaction IDs

    This report logs the details of the transactions with the same ID:

    Transaction ID.

    Number of events received.

    First time we received an event with this Transaction ID.

    Last time we received an event with this Transaction ID.

    View Article
  • To add a new IO under an existing budget, simply select the budget you wish to add additional orders to. Criteo provides you with three types of IOs you can choose from:

    Monthly Selecting the monthly type allows you to have full control of your monthly spend.

    Capped Selecting the capped option allows you to set up new IO without specifying an end date. Once your funds run out the IO becomes inactive. To reactive the IO you need to manually renew it, or select auto-renew when you first create it.

    Uncapped Selecting the uncapped option allows you to set up a new IO without a predefined budget. The budget is limited to the initial budget set when you signed the first budget with Criteo.

    After you select your preferred IO type and add yournew budget, yourbudget will automatically updateto reflect thenew amount of the newIO. To do so, you will need to agree and comply with the automatic IO approval terms and conditions.

    When your Criteo Account Strategistcreates a new IO for your campaign, a new pending order is created under your existing budget. To approve your order, an email will be sent to your account's admin or Financial Manager for their approval. After clicking on the link provided in the email you will be redirected back to the platform where you will be able to approve the insertion order.

    Ifyouhave created a capped IO and your budget is about to run out, a low budget warning icon will be displayed next to the affectedcampaign on your campaign management tab.Once you click on the icon, you can retrieveinformation on the remaining days and/or remaining amount. To renew your budget, you will need to create a new IO by clicking on the "Add Insertion Order" button. Once created, the new IO will be submitted for approval under your budget management tab.

    Please note: If you create a new IO and there is a previously created IO still pending for approval, the new IO will cancel the previous one, regardless of the type, amount or dates.

    View Article
  • Criteo's performance display technology delivers personalized recommendations (via banners) to a user,based on intent data such as products they have previously viewed or purchased.

    Criteo's performance display technology relies on four key elements:

    The Criteo OneTagallows Criteo to collect user browsing intent on your site.

    Criteo Conversion Optimized Enginegenerates product recommendations based on what the user and other users browse and buy on your site.

    Your product data feed -also known as the product catalog - contains all of your products attributes that are displayed on Criteo's creatives (banners).

    Criteo creativesare branded creativesthat display personalizedproduct recommendations.

    To start a campaign, you need your product data feed, and to add the Criteo OneTag to your webpages. Our technical engineers will helpyou during integration, answering any questions and making sure the process is as quick and painless as possible.

    View Article
  • When designing/generating ad creative, Criteo always attempts to display the brand logo in as large and visually pleasing a form as possible depending on the available space and design components within. For this reason, the 'logo zone' within Criteo ad creative can vary in size horizontally and vertically.

    Having a horizontal and a vertical logo available for use will maximize the ways in which your logo can be utilized for best results.

    Example below:

    View Article
  • To prevent against accidental bid changes and ensure your campaigns always deliver against your goals, we have implemented a two-step confirmation process in case when a new bid value is over three times greater or lower than the current one.

    For example:

    When you try to change the CPC value from 0.16 to 0.9 and click on Apply Changes, a warning message will be triggered, since the new value is four times greater than the current one.

    If your change is not an error, you just have to confirm the new CPC value within the warning message. This extra step is a security measure meant to avoid accidental clicks or price inputs that can lead to unintended budget spends.

    View Article
  • The difference between the budget amount you request and your new starting budget reflects any funds already spent on the day you request the change.

    Any time you instruct us to change a budget, we actually terminate the old budget and create a new one. This change is applied retroactively from 00:00am on the day you request the change. As a result, any amount already spent that day is allocated to the new budget instead of your existing I/O. This allocation happens automatically, so your new budget may have a higher starting amount than the one you requested.

    Example use cases:

    1. You request a 1,000 reduction to a capped budgets

    The remaining amount of your capped budget is 7,500

    Your Account Strategist will close your current capped budget and create a new one using the remaining amount, reduced by 1,000

    Since 00:00 on the day you made the request, you had already spent 300

    Your new starting budget will reflect the amount

    New starting budget = 7,500 - 1,000 + 300 = 6,800 (available budget = 6,500)

    2. You request a new budget end date

    The remaining amount of your budget is 7,500

    Your Account Strategist will close your current budget and create a new one with a new end date using the remaining amount of 7,500

    On the day you made the request, you had already spent 300

    New starting budget = 7,500 + 300 = 7,800 (available budget = 7,500)

    3. You request an I/O transfer between existing budgets

    You want to transfer an I/O with 7,500 remaining from budget A to budget B

    Your Account Strategist will close the I/O in budget A and open a new 7,500 I/O under budget B

    On the day you made the request, you had already spent 300

    Your new I/O in budget B will have a starting budget of 7,500 + 300 = 7,800 (available budget = 7,500)

    4.You want to reduce your monthly recurring budget by 1,000

    The remaining amount of your monthly recurring budget is 7,500

    Your Account Strategist will close your current recurring budget and create a temporary capped budget one for the current month using the remaining amount, reduced by 1,000

    On the day you made the request, you had already spent 300.

    Your new capped budget for the current month will have a starting budget of 7,500 - 1,000 + 300 = 6,800 (available budget = 6,500).

    Your Account Strategist will also create a new recurring monthly budget using the reduced amount; it will take effect the following month.

    5. You want to terminate a monthly budget

    The remaining amount of your monthly budget is 7,500

    On the day you made the request, you had already spent 300.

    Your Account Strategist will create a new 300 capped budget for the same day

    For questions about budgets and I/Os, please contact your Account Strategist any time.

    View Article
  • To prevent against accidental bid changes or conflicting bid requests, if your Criteo Account Strategist edits the bid value of one or more campaigns and submits the bid changes for your approval, the bid value field of the corresponding campaigns will temporarily be disabled.

    To see, accept or reject the pending change request, simply mouse over the bid value field of the particular campaign. To reactivate the bid value field, you need to accept, or reject, the pending change request from the management centre notification area.

    The same rule applies when you try to edit your campaign bids in bulk. All values with associated pending changes will not be visible in the bulk edit tool. You will only see the values of the campaigns you are able to edit.

    View Article
  • Criteo OneTag allows usto collect data based on eachusers journey around your website. For example,the user lands on your homepage before moving on to look at some product detail pages. Next, they add a particular product to their basket, but thenabandon thebasket andleave your site without completing the purchase.

    Although the user didn't complete the order, it clearly demonstrates their personal intent - to buy one or more products from your site. We use thisinformation to serve targeted product recommendations to that specific user, encouraging them to complete their order with you.

    Where must I implement the Criteo OneTag?

    The Criteo OneTag should be implemented on the following pages of your site:

    Homepage.

    Search/Category listing pages.

    Product pages.

    Basket.

    Sales Confirmation page.

    User experience and performance

    The Criteo OneTag doesn't alter your site visually and is completely invisible to your customers. What's more, the Criteo OneTag is asynchronous, so it won't affectyour site loading time.

    View Article
  • Overview

    For Criteo OneTag purposes, the Sales Confirmation page is that which is displayed to the user after they have completed a purchase on your site, normally showing them an order ID and a summary of the order. The Criteo OneTag must be installed on the Sales Confirmation page to track the product bought by your users. Tracking what the user buys allows Criteo to optimize banner display so that products already bought by the user won't be shown on any banners that they see in future. Capturing this information will also allow you to measure the ROI on your Criteo banners.

    The Criteo OneTag should be implemented within the header code of every page of your site. The tag loads asynchronously, so it will not interfere with the page loading time or user experience.

    When implementing the Criteo OneTag on your Sales Confirmation page you will have to dynamically pass the IDs, prices and quantities of the products purchased by the user, the transaction/order ID, the siteType and email parameters.

    The Criteo OneTag implemented on a Sales Confirmationpage:

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script> <script type="text/javascript"> window.criteo_q = window.criteo_q || []; window.criteo_q.push( { event: "setAccount", account: YOUR UNIQUE ACCOUNT ID }, { event: "setSiteType", type: "m FOR MOBILE OR t FOR TABLET OR d FOR DESKTOP" }, { event: "setEmail", email: "TRIMMED AND LOWERCASE USER EMAIL ADDRESS" }, { event: "trackTransaction", id: "TRANSACTION ID", item: [ { id: "FIRST PRODUCT ID", price: FIRST PRODUCT UNIT PRICE, quantity: FIRST PRODUCT QUANTITY }, { id: "SECOND PRODUCT ID", price: SECOND PRODUCT UNIT PRICE, quantity: SECOND PRODUCT QUANTITY } /* add a line for each product in the user's basket */ ]}); </script>

    The trackTransaction event

    The trackTransaction event is the Criteo OneTag specific event triggered when the tag is implemented on a Sales Confirmation page.

    The transaction/order IDfor the user's purchase has to be passed dynamically on the parameter ID (where it says TRANSACTION ID in the code example below).

    For each product purchased by the user you have to pass the ID of the product, the product unit price and the quantity of the product; so if the user has purchased two instances of the same product the quantity will be 2.

    trackTransactionevent:

    { event: "trackTransaction", id: "TRANSACTION ID", item: [ { id: "FIRST PRODUCT ID", price: FIRST PRODUCT UNIT PRICE, quantity: FIRST PRODUCT QUANTITY },{ id: "SECOND PRODUCT ID", price: SECOND PRODUCT UNIT PRICE, quantity: SECOND PRODUCT QUANTITY } /* add a line for each product in the user's basket */

    The product IDs passed on the Criteo OneTag tag must be exactly the same IDs as those used in your product data feed.

    For prices with decimal values the decimal separator used must be a dot. Example 44.90.

    Example:

    If the user has purchased:

    Two instances of the product ID A122 with unit price 44.90

    One instance of the product ID F5532 with unit price 85.00

    and the transaction/order ID for the purchase is G555999,the trackTransaction event will look like:

    { event: "trackTransaction", id: "G555999", item: [ { id: "A122", price: 44.90, quantity: 2 }, { id: "F5532", price: 85.00, quantity: 1 }

    setSiteType parameter

    The setSiteType parameter is a dynamic parameter present in CriteoOneTag across all the pages of your site. If your site has different versions to support multiple devices, indicate which version of your site is displayed to the user via the setSiteType parameter:

    d for desktop

    m for mobile

    t for tablet

    setSiteType parameter on the desktop version of a site:

    { event: "setSiteType", type: "d" },

    setSiteType parameter on the mobile version of a site:

    { event: "setSiteType", type: "m" },

    setSiteType parameter on the tablet vesion of a site:

    { event: "setSiteType", type: "t" },

    More information on the site type here

    setEmail parameter

    The setEmail parameter is a dynamic parameter present in the Criteo OneTag across all the pages of your site. This parameter is used by Criteo Cross Device to accurately match users across multiple devices. In the email parameter field, pass the customer email address (trimmed and converted to lowercase) and Criteo will hash it using the MD5 algorithm before being storedon our servers. Hashed emails are irreversible and anonymous, so Criteo will have no access to your users' email addresses.

    setEmail parameter example:

    { event: "setEmail", email: "[email protected]" },

    Please leave it blank if anemail address is unavailable.

    Example setEmail parameter with empty value:

    { event: "setEmail", email: "" },

    Alternatively, you can pass the encrypted email address using an MD5 hash function (here a link to a page with some examples on different programming languages of MD5 hash functions). In this case, you should replace the default "setEmail" with SetHashedEmail as shown below.

    Finally, pass the dynamically encrypted email address(trimmed and converted to lowercase).

    Example of hashed email address [email protected]:

    setHashedEmail parameter

    { event: "setHashedEmail", email: "b58996c504c5638798eb6b511e6f49af" },

    Please leave itblank if the email address is unavailable. Example:

    { event: "setHashedEmail", email: "" },

    View Article
  • The Criteo OneTag mustbe implemented within the header code of your site.The tag loads asynchronously so it won't interfere with the page loading timeor user experience.

    Here's an example of how the Criteo OneTag is implemented on a homepage:

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script> <script type="text/javascript">window.criteo_q = window.criteo_q || [];window.criteo_q.push( { event: "setAccount", account: YOUR UNIQUE ACCOUNT ID }, { event: "setSiteType", type: "m FOR MOBILE OR t FOR TABLET OR d FOR DESKTOP" }, { event: "setEmail", email: "TRIMMED AND LOWERCASE USER EMAIL ADDRESS" }, { event: "viewHome"} ); </script>

    Loader

    The loader will automatically recognize and adapt to the protocol of your site: http or https, so please do not modify the loader.

    Criteo loader:

    <script type="text/javascript" src="//static.criteo.net/js/ld/ld.js" async="true"></script>

    Account ID parameter

    The Criteo Account ID parameter isunique to your Criteo account. Please do not modify this value.

    Account ID parameter:

    { event: "setAccount", account: YOUR UNIQUE ACCOUNT ID },

    setSiteType parameter

    The setSiteType parameter is present in Criteo OneTag across all the pages of your site. If your site has different versions to accommodate mobile devices, indicate which version of your site is displayed to the user via setSiteTypeparameter:

    d for desktop

    m for mobile

    t for tablet

    If you do not have a mobile or tablet-specific site, set the value to d

    setSiteType parameter on the desktop version of a site:

    { event: "setSiteType", type: "d" },

    setSiteType parameter on the mobile version of a site:

    { event: "setSiteType", type: "m" },

    setSiteType parameter on the tablet version of a site:

    { event: "setSiteType", type: "t" },

    Email parameter

    The email parameter is present in everyCriteo OneTag implemented across all the pages of your site. This parameter is used by Criteo Cross Device to accurately match users across multiple devices. In the email parameter field, pass the customer email address (trimmed and converted to lowercase) and wewill hash it automatically using anMD5 algorithm before storing it on our servers. Hashed emails are irreversibly encrypted and anonymous, so Criteo has no access to your users email addresses.

    setEmail parameter:

    { event: "setEmail", email: "[email protected]" },

    Please leave this parameterblank if an email address is unavailable.

    setEmail parameter with empty value:

    { event: "setEmail", email: "" },

    Alternatively, you can pass the encrypted email address using an MD5 hash function (this page givessome examples of calling MD5 hash functions in different programming languages). In this case, you should replace the default "setEmail" with setHashedEmail as shown below.

    The email address will need to be trimmed and converted to lowercase before being encrypted using a MD5 hash function. You can then pass the encrypted string into the setHashedEmail parameter.

    Example of hashed email address [email protected]

    setHashedEmail parameter:

    { event: "setHashedEmail", email: "b58996c504c5638798eb6b511e6f49af" },

    Please leave this parameter blank if an email address is unavailable.

    { event: "setHashedEmail", email: "" },

    Page specific event parameter

    The last event parameter varies depending on the page where the Criteo OneTag is implemented;

    homepage

    search listingpage

    product page

    basket page

    sales confirmation page

    View Article
  • Overview

    The dataLayer is a variable declared in the source code of your website on eachpage where you will implementthe Criteo OneTag. It is not implemented through the Google Tag Manager website. The content of the dataLayer will determine what information is transmitted to us through the Criteo OneTag. Here are a few tips:

    Implementation of the dataLayer is best performed by a developer or someone with suitable technical skills.

    The content of the dataLayer will be used on the next step, through the variableson Google Tag Manager.

    The dataLayer shouldbe declared between <script></script> tags and BEFORE the Google Tag Manager tag is declared.

    If you already have a dataLayer in place, you may need to update itif you don't have all the expected datain place. In this case, please be aware you may need to update your source code.

    All pages

    On the pages that featurethe Criteo OneTag, the emailvariable should be added to the dataLayer. This will enable Criteo's Cross Device solution:

    The users email address should be available when a purchase is made on your website, and if your website provides user accounts.

    The email address must be trimmed of trailing spaces and converted to lowercase.

    Criteo will then use md5-hashing to encrypt the email address on the fly before storing it on our servers. We will never store plain email addresses as this would go against our Privacy policy.

    <script type="text/javascript">

    var dataLayer = dataLayer || [];

    dataLayer.push({'email': 'email address of the user'});</script>

    If the users email address is not available on the current page, the parameter should be left as an empty string.

    <script type="text/javascript">

    var dataLayer = dataLayer || [];

    dataLayer.push({'email': ''});</script>

    Homepage dataLayer

    The dataLayer needs to be implemented on your Homepage.

    The PageTypeparameterwill be used to tell Google Tag Manager what type of page the user is browsing and trigger the Criteo OneTag accordingly.

    The code below shows how to implement the dataLayer on your Homepage:

    <script type="text/javascript">

    var dataLayer = dataLayer || [];

    dataLayer.push({'PageType':'HomePage','email': 'email address of the user'});</script>

    Listing page dataLayer

    The dataLayer needs to be implemented on your Listing pages: category Listings and search Listings.

    ProductID_1, ProductID_2 and ProductID_3 on the example belowneed to be replaceddynamically with three valid product IDs from the Listing.

    Note that we will attempt to match the IDs provided here with the IDs that are contained in your product feed. In case your system has more than one type of ID, you need to ensure that the same ID type is used consistently across all pages.

    The code below shows how to implement the dataLayer on your Listing page:

    <script type="text/javascript">

    var dataLayer = dataLayer || [];

    dataLayer.push({'PageType':'ListingPage','email': 'email address of the user','ProductIDList' : ['ProductID_1', 'ProductID_2', 'ProductID_3']});</script>

    Product page dataLayer

    The dataLayer needs to be implemented on your individual Product pages.

    The ProductID parameter needs to be replaceddynamically with the product ID of the currently browsed product. This ID mustbe the same asthe one contained in your product feed for a given product.

    The code below shows how to implement the dataLayer on your Product page:

    <script type="text/javascript">dataLayer = dataLayer || [];dataLayer.push({'PageType': 'ProductPage','email': 'email address of the user','ProductID': 'ProductID'});</script>

    Basket page dataLayer

    The dataLayer needs to be implemented on your Basket/Cart page.

    For each product contained inthe basket, you must pass the product ID, the quantity (number of units of the corresponding product), and the unit price.

    The code below shows how to implement the dataLayer on your Basket page:

    <script type="text/javascript">var product_list = [];product_list.push( { id: "productID_1", price: price_1, quantity: quantity_1 }, { id: "productID_2", price: price_2, quantity: quantity_2 } /* add a line for each item in the user's cart */);

    var dataLayer = dataLayer || [];

    dataLayer.push({'PageType': 'BasketPage', 'email': 'email address of the user','ProductBasketProducts': product_list});</script>

    Sales Confirmation page dataLayer

    The dataLayer needs to be declared on the Sales Confirmation/Thank You page (shown after the user has placed their order and payment is confirmed).

    The TransactionID parametermust be dynamically replacedwith the corresponding order number. This information will be used to clean possible duplicates we might receive.

    For each product purchased, you must pass the product ID, the quantity (number of units of the corresponding product), and the unit price.

    The code below shows how to implement the dataLayer on your Sales Confirmation page:

    <script type="text/javascript">var product_list = [];product_list.push( { id: "productID_1", price: price_1, quantity: quantity_1 }, { id: "productID_2", price: price_2, quantity: quantity_2 } /* add a line for each item in the user's cart */);

    var dataLayer = dataLayer || [];

    dataLayer.push({'PageType': 'TransactionPage', 'email': 'email address of the user','ProductTransactionProducts': product_list,'TransactionID': 'TransactionID'});</script>

    What's Next?

    Now that the information Criteo needs is available in the dataLayer, Google Tag Manager needs to know how to read the dataLayer and take out the relevant data. This mechanism is called Variables. For more details, see: Step 2: Variables

    View Article
  • Overview

    The Debug Mode console will continue waiting for a OneTag call if thetrackeris missing. It will look like the image below:

    Criteo OneTagshould fire.

    The Debug Mode will not appear on the page if theCriteo loaderis missing or not implemented.

    Solution

    Make sure the Criteo OneTag andCriteo loaderare implemented on all pages required.

    TheCriteo loader looks like this:

    <scripttype="text/javascript"src="//static.criteo.net/js/ld/ld.js"async="true"></script>

    You can check for theCriteo loaderby searching with Crtl+F for "criteo" in the source of your site:

    This is what the body of the Criteo OneTaglooks like:

    <script>window.criteo_q = window.criteo_q ||[];window.criteo_q.push( { event:"setAccount", account: YOUR UNIQUE ACCOUNT ID }, { event:"setSiteType", type:"m FOR MOBILE OR t FOR TABLET OR d FOR DESKTOP"}, { event:"setEmail", email:"TRIMMED AND LOWERCASE USER EMAIL ADDRESS"}, { event:"viewHome"});</script>

    You can check theCriteo OneTagby searching with Crtl+F for "criteo" in the source of your site:

    Read more information on where the

    View Article
  • Description

    The trackerisfiring with an empty value for an optional parameter. Although optional, all data sent in the trackers is used to optimize the performance of the campaign. Optional info: Email

    Solution

    Please ensure that all optionalparameters are sent with a correct value, or simply left as an empty string.

    View Article
  • The Criteo management center enables you to access and analyze your Criteo Dynamic Email campaigns the same way you do for your standard display campaigns underAnalyze -> Email.

    Through Criteos Email reports, you are able to analyse the number of the emails sent, the open rates, click-through rates (CTR), your total cost and CPM and your revenues.

    Similar to your Criteo display reports, you are able to analyse yourCriteo Dynamic Email campaigns during specific time periods by selecting currency, date range, daily view or overview, as well as create personalized reports. In the future, we are working on adding more new functions including cross-channel attribution, graph reports and a mobile-friendly interface.

    View Article
  • Solution

    Please ensure that all optionalparameters are included in the trackers.

    View Article
  • Management Center currently supports multiple languages.

    To change the language of the ManagementCenter:

    Navigate to "User settings"under your username

    Select your preferred language under "Display options" and save your changes.

    View Article
  • Criteo ad creative is displayed in sizes ranging from 120x45 to 980x150 pixels. Within each ad there is a dedicated area for the logo, called the logo zone.We require your logo in a minimum resolution of 600x600 pixels, so that it retains optimal quality. The ad creation process uses both vertical and horizontal versions of a logo to optimize display in the space allotted.For more information please read about different logo versions.Criteo banners are displayed in sizes ranging from 120x45 to 980x150 pixels. Within each banner, there is a dedicated area for the logo, called the logo zone.

    We require a high-quality version of 600x600 pixels, so that the logo retains optimal quality. The banner creation process uses both vertical and horizontal versions of a logo to optimize display in the space allotted.

    For more information please read about different logo versions.

    View Article
  • Overview

    In rare cases, its possible that the full product feed import does not work even though importing the extract of your product feed (test import) was successful.

    What to do if your full product feed import does work

    These errors can occur if the technology we use to import the full product feed is different from the test import. The way we process information also differs.

    If you see this error message, please contact our support team.

    View Article
  • For each of your accounts found under Campaigns we provide three different levels to enable you to easily differentiate and manage them more effectively and efficiently. Such levels are:

    Campaign Types

    Campaigns

    Categories

    Campaign Types Each of your campaigns are grouped under three main campaign types to easily differentiate between them. These types are:

    Mid-funnel campaigns

    Lower-funnel campaigns

    Audience selling

    Each campaign type shows the average bid, reach, CTR and eCPM price for all the campaigns grouped underneath. In addition, each campaign type provides the total number of audience, reach, clicks and sales for all the campaigns grouped underneath.

    Campaigns Your individual campaigns are found under each campaign type as described above. Each campaign displays information on the total and average number/price of the individual categories listed below. To see all your campaigns, you need to expand your preferred campaign type.

    To find out how to edit the bid value of your campaigns, please see How can I edit the bid values of my campaigns/categories?.

    Categories Under your account you may also have individual categories that apply for each campaign. These categories are grouped and displayed under your main campaigns as described above. To see your individual categories, you need to expand your preferred campaign.

    Categories are updated and added automatically based on your catalogue, and can feature up to 25 categories.

    In some occasions, there are items and categories that cannot be linked to a specific catalogue. Those categories are grouped under an individual category called Unknown Categories. These categories cannot be edited individually, and their bid value always matches the value of the campaign they belong to.

    To find out how to edit the bid value of your categories, please see How can I edit the bid values of my campaigns/categories?.

    View Article

Curious about Criteo?

Anonymously Ask Criteo Any Question

Ask Anonymous Question

×
Rate your company