The Criteo OneTag is the foundation of your Criteo implementation. This guide covers multiple deployment methods to suit your technical setup and requirements.
OneTag Overview
The Criteo OneTag is a JavaScript tag that:
- Tracks user interactions across your website
- Builds retargeting audiences
- Captures product views and purchase events
- Enables cross-device tracking
- Powers dynamic product recommendations
OneTag Components
// 1. Load the Criteo library
<script type="text/javascript" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
// 2. Initialize the event queue
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
// 3. Device type detection
var deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
// 4. Push events to the queue
window.criteo_q.push(
{ event: "setAccount", account: YOUR_ACCOUNT_ID },
{ event: "setSiteType", type: deviceType },
{ event: "viewHome" }
);
</script>
Prerequisites
Before installing the OneTag:
Obtain Your Account ID
- Log in to Criteo Management Center
- Navigate to Settings > Account Information
- Copy your Account ID (numeric value)
Plan Your Implementation
Prepare Testing Environment
- Set up staging/development environment
- Install browser developer tools
- Configure analytics for comparison
Implementation Method 1: Direct HTML Implementation
Best for websites with direct HTML/template access and developer resources.
Step 1: Create Base OneTag Template
Create a reusable template for the OneTag:
<!-- Criteo OneTag - Place before closing </body> tag -->
<script type="text/javascript" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
// Device type detection
var deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
// Required: Account configuration
window.criteo_q.push(
{ event: "setAccount", account: 12345 }, // Replace with your account ID
{ event: "setSiteType", type: deviceType }
);
// Page-specific event will be added here
</script>
Step 2: Implement on Homepage
<!DOCTYPE html>
<html>
<head>
<title>Your Website</title>
</head>
<body>
<!-- Your page content -->
<!-- Criteo OneTag -->
<script type="text/javascript" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
window.criteo_q.push(
{ event: "setAccount", account: 12345 },
{ event: "setSiteType", type: deviceType },
{ event: "viewHome" }
);
</script>
</body>
</html>
Step 3: Implement on Product Pages
<!DOCTYPE html>
<html>
<head>
<title>Product Name - Your Website</title>
</head>
<body>
<!-- Product content -->
<div class="product" data-product-id="PROD123">
<!-- Product details -->
</div>
<!-- Criteo OneTag -->
<script type="text/javascript" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
// Get product ID from page
var productId = document.querySelector('.product').getAttribute('data-product-id');
window.criteo_q.push(
{ event: "setAccount", account: 12345 },
{ event: "setSiteType", type: deviceType },
{ event: "viewItem", item: productId }
);
</script>
</body>
</html>
Step 4: Implement on Category Pages
<script type="text/javascript" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
// Get product IDs from category page
var productIds = Array.from(document.querySelectorAll('.product-item'))
.map(el => el.getAttribute('data-product-id'))
.slice(0, 3); // Send up to 3 products
window.criteo_q.push(
{ event: "setAccount", account: 12345 },
{ event: "setSiteType", type: deviceType },
{ event: "viewList", item: productIds }
);
</script>
Step 5: Template-Based Implementation
For sites using template systems (PHP, Ruby, Python, etc.):
PHP Example:
<!-- footer.php -->
<script type="text/javascript" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
window.criteo_q.push(
{ event: "setAccount", account: <?php echo CRITEO_ACCOUNT_ID; ?> },
{ event: "setSiteType", type: deviceType }
);
<?php
// Add page-specific events
if (is_front_page()) {
echo '{ event: "viewHome" }';
} elseif (is_product()) {
echo '{ event: "viewItem", item: "' . get_product_id() . '" }';
} elseif (is_cart()) {
$cart_items = get_cart_items();
echo '{ event: "viewBasket", item: ' . json_encode($cart_items) . ' }';
}
?>
);
</script>
// components/CriteoTag.js
import { useEffect } from 'react';
export default function CriteoTag({ event, data }) {
useEffect(() => {
// Load Criteo script
const script = document.createElement('script');
script.src = '//dynamic.criteo.com/js/ld/ld.js';
script.async = true;
document.head.appendChild(script);
// Initialize OneTag
window.criteo_q = window.criteo_q || [];
const deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
window.criteo_q.push(
{ event: "setAccount", account: process.env.NEXT_PUBLIC_CRITEO_ACCOUNT_ID },
{ event: "setSiteType", type: deviceType },
{ event, ...data }
);
return () => {
// Cleanup if needed
};
}, [event, data]);
return null;
}
// Usage in pages
import CriteoTag from '../components/CriteoTag';
export default function ProductPage({ product }) {
return (
<>
<CriteoTag event="viewItem" data={{ item: product.id }} />
{/* Page content */}
</>
);
}
Implementation Method 2: Google Tag Manager
Recommended for marketing teams and sites already using GTM.
Step 1: Create Criteo Account ID Variable
- In GTM, go to Variables > New
- Name: "Criteo Account ID"
- Type: Constant
- Value: Your Criteo account ID (e.g., 12345)
Step 2: Create Device Type Variable
- Variables > New
- Name: "Criteo Device Type"
- Type: Custom JavaScript
- Code:
function() {
var ua = navigator.userAgent;
if (/iPad/.test(ua)) return 't';
if (/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(ua)) return 'm';
return 'd';
}
Step 3: Create OneTag Base Template
- Tags > New
- Name: "Criteo OneTag - Base"
- Tag Type: Custom HTML
- HTML:
<script type="text/javascript" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script type="text/javascript">
window.criteo_q = window.criteo_q || [];
window.criteo_q.push(
{ event: "setAccount", account: {{Criteo Account ID}} },
{ event: "setSiteType", type: "{{Criteo Device Type}}" }
);
</script>
- Trigger: All Pages
- Advanced Settings > Tag Sequencing: Check "Fire a tag before..." for other Criteo tags
Step 4: Create Homepage Event Tag
- Tags > New
- Name: "Criteo - Homepage"
- Tag Type: Custom HTML
- HTML:
<script>
window.criteo_q = window.criteo_q || [];
window.criteo_q.push({ event: "viewHome" });
</script>
- Trigger: Create trigger for homepage
Step 5: Create Product View Tag
First, create Data Layer variables:
- Variable Name: "DL - Product ID"
- Variable Type: Data Layer Variable
- Data Layer Variable Name:
productId
Tags > New
Name: "Criteo - Product View"
Tag Type: Custom HTML
HTML:
<script>
window.criteo_q = window.criteo_q || [];
window.criteo_q.push({
event: "viewItem",
item: "{{DL - Product ID}}"
});
</script>
- Trigger: Product Page View
- Trigger Type: Page View
- Condition: Page Path contains
/product/OR Data Layer variablepageTypeequalsproduct
Step 6: Use Community Template (Alternative)
GTM Community Template Gallery offers pre-built Criteo templates:
- Tags > New > Discover more tag types in the Community Template Gallery
- Search for "Criteo"
- Select official Criteo OneTag template
- Add to workspace
- Configure:
- Account ID:
{{Criteo Account ID}} - Event Type: Select from dropdown
- Product ID:
{{DL - Product ID}}(for product events)
- Account ID:
Step 7: Set Up Data Layer
Ensure your pages push data to GTM's data layer:
<script>
dataLayer = dataLayer || [];
dataLayer.push({
'pageType': 'product',
'productId': 'PROD123',
'productPrice': 99.99,
'productAvailability': 'in stock'
});
</script>
Implementation Method 3: E-commerce Platform Plugins
Shopify Integration
Install Criteo App:
Connect Criteo Account:
- Enter Criteo account credentials
- Link your advertiser account
- Configure settings
Automatic Configuration:
- OneTag automatically deployed
- Product feed auto-generated
- Events auto-tracked
Customization (Optional):
- Edit theme files to customize implementation
- Add to
theme.liquid:
{% if template == 'product' %}
<script>
window.criteo_q = window.criteo_q || [];
window.criteo_q.push({
event: "viewItem",
item: "{{ product.id }}"
});
</script>
{% endif %}
WooCommerce Integration
Install Plugin:
- Go to WordPress Admin > Plugins > Add New
- Search "Criteo"
- Install and activate
Configure Settings:
- WooCommerce > Settings > Integration > Criteo
- Enter Account ID
- Configure tracking options
Verify Installation:
- Visit product page
- Check browser console for Criteo events
Magento Integration
- Install Extension:
composer require criteo/magento-extension
php bin/magento module:enable Criteo_OneTag
php bin/magento setup:upgrade
php bin/magento cache:flush
Configure:
- Stores > Configuration > Criteo > OneTag
- Enter Account ID
- Enable tracking
Template Customization:
<!-- app/design/frontend/[theme]/Magento_Theme/templates/footer.phtml -->
<?php echo $this->getChildHtml('criteo.onetag'); ?>
BigCommerce Integration
Add Criteo Script:
- Storefront > Script Manager
- Create Script: "Criteo OneTag"
- Location: Footer
- Script Type: Script
Add OneTag Code:
<script src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script>
window.criteo_q = window.criteo_q || [];
var deviceType = /iPad/.test(navigator.userAgent) ? "t" :
/Mobile|iP(hone|od)|Android|BlackBerry|IEMobile|Silk/.test(navigator.userAgent) ? "m" : "d";
window.criteo_q.push(
{ event: "setAccount", account: 12345 },
{ event: "setSiteType", type: deviceType }
);
// Add page-specific events using BigCommerce context
{{#if page_type '===' 'product'}}
window.criteo_q.push({ event: "viewItem", item: "{{product.id}}" });
{{/if}}
</script>
Advanced Deployment Options
Consent Management Integration
Implement with cookie consent platforms:
OneTrust Example:
// Wait for consent before loading
function OptanonWrapper() {
if (window.OnetrustActiveGroups.includes('C0004')) { // Marketing cookies
loadCriteoTag();
}
}
function loadCriteoTag() {
const script = document.createElement('script');
script.src = '//dynamic.criteo.com/js/ld/ld.js';
script.async = true;
document.head.appendChild(script);
window.criteo_q = window.criteo_q || [];
window.criteo_q.push({
event: "setAccount",
account: 12345
});
}
Cookiebot Example:
<script data-cookieconsent="marketing" type="text/plain" src="//dynamic.criteo.com/js/ld/ld.js" async="true"></script>
<script data-cookieconsent="marketing" type="text/plain">
window.criteo_q = window.criteo_q || [];
// OneTag initialization
</script>
Single Page Application (SPA) Implementation
For React, Vue, Angular applications:
// Router-based implementation
router.afterEach((to, from) => {
window.criteo_q = window.criteo_q || [];
if (to.name === 'Home') {
window.criteo_q.push({ event: "viewHome" });
} else if (to.name === 'Product') {
window.criteo_q.push({
event: "viewItem",
item: to.params.productId
});
}
});
Progressive Web App (PWA) Implementation
// service-worker.js
// Allow Criteo domains
const CRITEO_DOMAINS = [
'dynamic.criteo.com',
'gum.criteo.com',
'sslwidget.criteo.com'
];
self.addEventListener('fetch', event => {
const url = new URL(event.request.url);
// Don't cache Criteo requests
if (CRITEO_DOMAINS.some(domain => url.hostname.includes(domain))) {
event.respondWith(fetch(event.request));
return;
}
});
Verification and Testing
Browser Console Verification
// Check if OneTag loaded
console.log('Criteo Queue:', window.criteo_q);
// Monitor events
window.criteo_q.push = new Proxy(Array.prototype.push, {
apply(target, thisArg, args) {
console.log('Criteo Event:', args);
return target.apply(thisArg, args);
}
});
Network Tab Verification
Look for these requests:
https://dynamic.criteo.com/js/ld/ld.js- OneTag scripthttps://gum.criteo.com/syncframe- User synchttps://sslwidget.criteo.com/*- Event beacons
Browser Extension
Use Criteo OneTag Checker extension:
- Install from Chrome Web Store
- Navigate through your site
- Verify events fire correctly
GTM Preview Mode
For GTM implementations:
- Click Preview in GTM
- Navigate to your website
- Check Criteo tags fire in correct sequence
- Verify variables populate correctly
Common Issues and Solutions
Issue: OneTag Not Loading
Check:
// Verify script tag exists
const criteoScript = document.querySelector('script[src*="criteo.com"]');
console.log('Script found:', !!criteoScript);
// Check for blocking
if (!window.criteo_q) {
console.error('OneTag blocked or not loaded');
}
Solutions:
- Verify script URL is correct
- Check Content Security Policy
- Disable ad blockers for testing
- Ensure async attribute doesn't conflict with other scripts
Issue: Account ID Not Set
Verify:
const accountEvent = window.criteo_q.find(e => e.event === 'setAccount');
console.log('Account ID:', accountEvent?.account);
Fix:
- Ensure account ID is a number, not string
- Verify it's the first event in the queue
Issue: Events Not Firing
Debug:
// Log all events
window.criteo_q.forEach((event, index) => {
console.log(`Event ${index}:`, event);
});
Solutions:
- Check event syntax matches documentation
- Verify data layer variables populate
- Ensure events fire on correct pages
Performance Optimization
Lazy Loading
// Load OneTag after page is interactive
if ('requestIdleCallback' in window) {
requestIdleCallback(loadCriteoTag, { timeout: 2000 });
} else {
setTimeout(loadCriteoTag, 1);
}
function loadCriteoTag() {
const script = document.createElement('script');
script.src = '//dynamic.criteo.com/js/ld/ld.js';
script.async = true;
document.head.appendChild(script);
}
Resource Hints
<!-- Preconnect to Criteo domains -->
<link rel="preconnect" href="https://dynamic.criteo.com">
<link rel="preconnect" href="https://gum.criteo.com">
<link rel="dns-prefetch" href="https://sslwidget.criteo.com">
Next Steps
- Event Tracking - Implement specific event types
- Data Layer Setup - Configure product data
- Troubleshooting - Resolve common issues