S'intègre à votre stack existante
Nous récupérons les dépenses publicitaires via les API des plateformes, et les conversions depuis votre site, votre boutique et votre CRM. Ainsi, chaque source affiche non seulement le nombre, mais aussi le coût et le revenu généré.
Types de conversion
Tout ce qui génère du chiffre d'affaires compte
Pas seulement le paiement en ligne. Aussi l'appel téléphonique du mardi matin et la transaction qui atterrit dans votre CRM trois semaines plus tard.
Formulaires
Devis, contact, téléchargement
Réservations
Restaurant, rendez-vous, table
Appels téléphoniques
Clic téléphonique ou appel confirmé via le suivi des appels
E-mails
Clic sur un lien e-mail, pas un e-mail reçu
Commandes en ligne
Avec valeur de commande enregistrée
Affaires hors ligne
Import CRM du chiffre d’affaires conclu
Intégrations
Se connecte à votre stack, pas l'inverse
Données de coût issues des plateformes publicitaires, conversions issues de votre site et de votre boutique. Le tout réuni dans un seul rapport avec un vrai ROAS par source.
Sources publicitaires et analytics
- Google Ads
- Meta Ads
- LinkedIn Ads
- TikTok Ads
- Microsoft Ads
- GA4
Plateformes e-commerce et de sites web
- WordPress
- Shopify
- WooCommerce
- Google Tag Manager
- Magento
- Webflow
- Wix
- Squarespace
- Code personnalisé (JS + API)
Installation par plateforme
Placez d’abord le pixel de base. Configurez ensuite les conversions et leurs valeurs, puis vérifiez la réception. Les étapes dépendent de votre plateforme, de vos accès et du parcours de paiement ; l’aide d’un développeur peut être nécessaire.
WordPress
Selon la plateforme et les accèsScript dans le <head> de votre thème, via l’éditeur de thème ou le champ 'header scripts' du thème.
- 1Connectez-vous à votre interface d’administration via jouwdomein.nl/wp-admin.
- 2Dans le menu noir à gauche, cliquez sur Apparence (Appearance) → Éditeur de fichiers des thèmes (Theme File Editor).
- 3Dans la liste 'Fichiers du thème' à droite, sélectionnez En-tête du thème (header.php). Si cette liste n’apparaît pas, passez à l’étape 6.
- 4Recherchez la ligne </head> dans le code, généralement vers les lignes 20 à 40. Astuce : utilisez Ctrl+F (Cmd+F sur Mac) dans l’éditeur.
- 5Placez le curseur sur la ligne vide juste au-dessus de </head>, collez le script et cliquez en bas sur Mettre à jour le fichier (Update File).
- 6Vous utilisez Elementor, Divi, Astra ou un thème enfant ? Accédez à Apparence → Personnaliser → CSS additionnel/Code Head, ou au réglage 'Header scripts' / 'Custom code' du thème, puis collez le script dans le champ HEAD.
- 7Pas d’accès au code ? Installez l’extension 'WPCode' ou 'Insert Headers and Footers', accédez à Code Snippets → Header & Footer, collez le script dans le champ Header et cliquez sur Save.
Vérifier le fonctionnement
- • Ouvrez votre site dans une fenêtre de navigation privée et consultez deux pages.
- • Dans Roots, accédez à Sites web et pixel : vérifiez qu’une visite réelle a été reçue et que le pixel est indiqué comme vérifié.
Attention
- • Ne collez pas le script dans footer.php : les identifiants de clic publicitaire seraient lus trop tard.
- • Les extensions de cache (WP Rocket, LiteSpeed, W3 Total Cache) servent l’ancienne page : videz le cache après l’enregistrement.
Une mise à jour du thème peut écraser header.php. Privilégiez donc un thème enfant ou l’extension WPCode.
Shopify
Selon la plateforme et les accèsPixel de base dans theme.liquid ; achats via un Custom Pixel dans Customer events.
- 1Ouvrez Shopify → Online Store → Themes → thème actif → Edit code → Layout → theme.liquid. Placez le pixel de base avant </head> et enregistrez.
- 2Pour les achats, accédez à Settings → Customer events → Add custom pixel. Nommez le pixel, collez le code Shopify ci-dessous et remplacez sr_xxx par votre clé de pixel.
- 3Configurez le consentement analytique selon vos paramètres de confidentialité Shopify et connectez le Custom Pixel. L’adaptateur utilise checkout_completed et Shopify browser.cookie, pas le window de votre boutique.
- 4L’adaptateur envoie l’identifiant de commande, le montant et la devise. Sans consentement publicitaire Roots enregistré, il n’envoie ni e-mail ni téléphone et n’active aucune transmission aux plateformes.
- 5Utilisez aussi le webhook de commande pour la confirmation serveur. Configurez la clé webhook Roots et la signature HMAC Shopify via une intégration serveur sécurisée.
const ROOTS_KEY = "sr_xxx";
const ROOTS_ENDPOINT = "https://rootsmetrics.com/api/public/collect";
let privacyStatus = init.customerPrivacy;
const privacyApi = typeof api !== "undefined" ? api.customerPrivacy : customerPrivacy;
privacyApi.subscribe("visitorConsentCollected", (event) => {
privacyStatus = event.customerPrivacy;
});
// Self-contained adapter inside Shopify's sandbox, not the storefront window.
const srAttribution = {
async track(name, { value, currency, order_id, email, phone }, event) {
if (!privacyStatus.analyticsProcessingAllowed) return;
const visitor = await browser.cookie.get("sr_vid");
const url = new URL(event.context.document.location.href);
const response = await fetch(ROOTS_ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
key: ROOTS_KEY,
visitor_id: visitor || event.clientId,
event_type: "conversion",
event_name: name,
value_cents: Math.round(Number(value) * 100),
currency,
external_id: "order:" + order_id,
dedup_id: "order:" + order_id,
page_url: url.origin + url.pathname,
consent_state: "unknown",
advertising_consent: false
// Shopify permission is not a recorded Roots advertising consent.
// Email and phone are intentionally not transmitted by this adapter.
})
});
if (!response.ok) throw new Error("Roots purchase was not accepted: " + response.status);
}
};
analytics.subscribe("checkout_completed", async (event) => {
const checkout = event.data.checkout;
if (!checkout.order?.id) return;
await srAttribution.track("purchase", {
value: checkout.totalPrice.amount,
currency: checkout.currencyCode,
order_id: checkout.order.id.split("/").pop(),
email: checkout.email,
phone: checkout.phone
}, event);
});Vérifier le fonctionnement
- • Vérifiez dans Roots une visite sur le domaine publié de votre boutique. Cela seul confirme le pixel de base, pas encore le suivi des achats.
- • Passez une commande test Shopify et comparez l’identifiant, le montant et la devise dans Roots. Vérifiez que le pixel et le webhook ne comptent pas deux fois la même commande.
Attention
- • Les Custom Pixels Shopify s’exécutent dans une sandbox. Le srAttribution de la boutique n’y est pas disponible ; utilisez l’adaptateur complet ci-dessous.
- • Additional scripts a été abandonné. Utilisez-le uniquement pour les anciennes boutiques où Shopify le propose encore, pas pour une nouvelle installation.
- • Un paiement sur un autre domaine nécessite une origine autorisée pour votre site dans Roots. Sans rapprochement avec le visiteur, la source peut rester inconnue.
checkout_completed peut manquer si la page de remerciement ne se charge pas. Un webhook de commande authentifié apporte une confirmation serveur complémentaire, sans remplacer le consentement.
Magento / Adobe Commerce
Selon la plateforme et les accèsScript via Content → Design → Configuration dans le HTML Head de votre vue boutique.
- 1Connectez-vous au panneau d’administration Magento (généralement jouwdomein.nl/admin).
- 2Dans le menu de gauche, cliquez sur Content → Configuration sous 'Design'.
- 3Un tableau affiche Default, Website et Store View. Cliquez sur Edit à droite de la vue boutique à mesurer.
- 4Dépliez la section HTML Head (cliquez sur le titre).
- 5Collez le script dans le champ 'Scripts and Style Sheets', après les lignes existantes, pas entre elles.
- 6Cliquez sur Save Configuration en haut à droite.
- 7Accédez à System → Tools → Cache Management, cochez Page Cache et Configuration, choisissez Refresh et cliquez sur Submit.
Vérifier le fonctionnement
- • Ouvrez votre boutique dans une fenêtre privée et accédez à une page de catégorie.
- • Dans Roots, vérifiez dans Tester votre suivi si des pages vues sont reçues.
Attention
- • Si vous modifiez Default plutôt que la vue boutique, les environnements de test seront aussi mesurés.
- • N’oubliez pas d’actualiser le cache : sinon, l’ancien HTML du head restera servi.
Webflow
Selon la plateforme et les accèsScript dans le code personnalisé du head global de votre projet.
- 1Ouvrez votre projet dans le Webflow Designer.
- 2Cliquez sur le logo Webflow en haut à gauche → Site settings (ou depuis votre tableau de bord, accédez au projet → Settings).
- 3Cliquez sur l’onglet Custom code en haut.
- 4Collez le script dans le champ du haut : 'Head code' (au-dessus de 'Footer code').
- 5Cliquez sur Save changes en haut à droite.
- 6Cliquez ensuite sur Publish en haut à droite → sélectionnez vos domaines → Publish to selected domains.
Vérifier le fonctionnement
- • Ouvrez votre site publié (pas l’aperçu .webflow.io dans le Designer) et passez à une autre page.
- • Envoyez un formulaire test : Roots enregistre automatiquement les envois de formulaire comme conversions.
Attention
- • Le code personnalisé ne fonctionne pas dans l’aperçu du Designer : vous devez publier.
- • Le code head global nécessite un forfait Site payant.
Wix
Selon la plateforme et les accèsScript en code personnalisé sur toutes les pages, chargé dans le head.
- 1Accédez à manage.wix.com et sélectionnez votre site.
- 2Cliquez sur Settings (Paramètres) en bas à gauche.
- 3Faites défiler jusqu’à 'Advanced' et cliquez sur Custom code.
- 4En haut à droite, près de 'Head', cliquez sur + Add Custom Code.
- 5Collez le script dans le grand champ de code et nommez-le 'Roots pixel'.
- 6Sous 'Add Code to Pages', sélectionnez All pages et activez 'Load code on each new page'.
- 7Sous 'Place Code in', sélectionnez Head et cliquez sur Apply.
- 8Cliquez sur Publish en haut à droite de l’éditeur si des modifications restent à publier.
Vérifier le fonctionnement
- • Ouvrez votre site en ligne (jouwdomein.nl, pas l’éditeur) dans une fenêtre privée.
- • Vérifiez dans Roots que 'Script installé' passe au vert.
Attention
- • Le code personnalisé nécessite un forfait Wix premium et un domaine connecté.
- • Wix Studio ? Le code personnalisé se trouve sous Settings → Custom code ; le reste est identique.
Squarespace
Selon la plateforme et les accèsScript via l’injection de code dans l’en-tête de votre site.
- 1Connectez-vous et ouvrez votre site dans l’administration Squarespace.
- 2Dans le menu de gauche, cliquez sur Settings → Developer tools (version 7.1 : Website → Website tools).
- 3Cliquez sur Code injection.
- 4Collez le script dans le champ du haut intitulé Header.
- 5Cliquez sur Save en haut à gauche.
- 6Vous avez une boutique en ligne ? Collez aussi le script dans 'Order confirmation page' avec srAttribution.track("purchase", { value: {orderGrandTotal} }).
Vérifier le fonctionnement
- • Ouvrez votre site dans une fenêtre privée et consultez deux pages.
- • Remplissez un bloc formulaire et vérifiez dans Roots que la conversion apparaît.
Attention
- • L’injection de code est disponible à partir du forfait Business ; elle ne fonctionne pas avec Personal.
- • L’injection de code ne se charge pas dans l’éditeur Squarespace.
WooCommerce
Selon la plateforme et les accèsPixel de base via WPCode ou functions.php ; purchase sur la page de remerciement via woocommerce_thankyou.
- 1Placez le pixel de base via WPCode → Header & Footer → Header, ou utilisez le hook wp_head de l’exemple PHP ci-dessous. Utilisez une seule méthode, pas les deux.
- 2Ajoutez le code PHP pour woocommerce_thankyou via un thème enfant ou un extrait PHP dans WPCode. Utilisez votre propre clé de pixel.
- 3L’événement purchase n’est envoyé que pour une commande payée, avec valeur, devise, identifiant de commande et e-mail de facturation. Roots ne transmet les coordonnées qu’avec un consentement publicitaire enregistré.
- 4Pour la confirmation serveur, créez une intégration de commande sécurisée vers /api/public/order avec x-roots-platform: woocommerce et x-roots-secret. Stockez sr_vid dans les métadonnées de commande pour relier visite et commande.
- 5WooCommerce → Settings → Advanced → Webhooks propose order.created/order.updated. Un relais serveur peut ajouter x-roots-secret et filtrer le statut de paiement ; la signature native WooCommerce ne remplace pas la clé Roots.
// PHP: child theme functions.php or a PHP snippet in WPCode.
add_action('wp_head', function () {
echo '<script async src="https://rootsmetrics.com/sr.js" data-key="sr_xxx"></script>';
});
add_action('woocommerce_thankyou', function ($order_id) {
$order = wc_get_order($order_id);
if (!$order || !$order->is_paid()) return;
$payload = wp_json_encode([
'value' => (float) $order->get_total(),
'currency' => $order->get_currency(),
'orderId' => (string) $order->get_id(),
'email' => $order->get_billing_email(),
'phone' => $order->get_billing_phone()
], JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
echo '<script>window.addEventListener("load", function () {
if (window.srAttribution) srAttribution.track("purchase", ' . $payload . ');
});</script>';
});Vérifier le fonctionnement
- • Passez une commande test payée et vérifiez purchase, l’identifiant, le montant et la devise dans Roots.
- • Rechargez la page de remerciement et vérifiez que la même commande n’est comptée qu’une fois. Testez aussi l’intégration serveur séparément.
Attention
- • En cas de paiement différé, la commande peut ne pas encore être payée sur la page de remerciement. Utilisez alors le webhook de statut de paiement via votre intégration serveur.
- • Ne placez jamais les clés webhook dans le code du navigateur. Coordonnez le cache et le statut de paiement avec votre développeur.
Google Tag Manager
Selon la plateforme et les accèsPixel de base comme balise Custom HTML sur All Pages ; conversions personnalisées via un événement dataLayer.
- 1Dans GTM, créez une balise Custom HTML avec le pixel de base et le déclencheur All Pages. Remplacez sr_xxx par votre clé de pixel.
- 2N’activez pas de déclencheur ni d’exigence de consentement supplémentaire pour cette balise Roots : sr.js gère lui-même le consentement. Cela ne s’applique pas aux autres balises publicitaires. Votre bannière cookies doit toujours se charger avant GTM.
- 3Créez les Data Layer Variables roots_name, roots_value et roots_currency, puis une seconde balise Custom HTML avec le code de conversion ci-dessous. Déclencheur : Custom Event roots_conversion.
- 4Faites envoyer roots_conversion par votre site une fois la réservation ou la conversion réellement confirmée. Un simple clic ne suffit pas. Publiez le conteneur après vérification.
<!-- Custom HTML: All Pages, no additional consent requirement.
sr.js handles consent. Keep your CMP before GTM. -->
<script async src="https://rootsmetrics.com/sr.js" data-key="sr_xxx"></script>
<!-- Push ONLY after a confirmed conversion, not a button click. -->
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({event: "roots_conversion", roots_name: "reservering", roots_value: 84.5, roots_currency: "EUR"});
</script>
<!-- Second Custom HTML tag: Custom Event trigger roots_conversion.
Create Data Layer Variables roots_name, roots_value, roots_currency.
Tag sequencing: load the Roots base tag first. -->
<script>
(function () {
var name = {{roots_name}}, value = {{roots_value}}, currency = {{roots_currency}};
var attempts = 0;
function send() {
if (window.srAttribution) srAttribution.track(name, {value: value, currency: currency});
else if (++attempts < 100) setTimeout(send, 100);
}
send();
})();
</script>Vérifier le fonctionnement
- • Dans GTM Preview, vérifiez que la balise de base se charge une fois et que la balise de conversion ne se déclenche qu’après roots_conversion.
- • Vérifiez l’événement et la valeur dans Roots ; testez aussi le refus du consentement.
Attention
- • N’utilisez pas de seconde balise purchase pour un événement purchase e-commerce standard : sr.js le lit déjà dans le dataLayer et déduplique par identifiant de commande.
- • Une balise GTM déclenchée ne prouve pas que Roots a reçu l’événement.
Site web ou application sur mesure
Selon la plateforme et les accèsScript juste avant la balise fermante </head> dans votre modèle ou layout partagé.
- 1Ouvrez le fichier chargé sur chaque page : index.html, base.html.twig, layout.blade.php, _document.tsx, app.html ou votre composant de layout racine.
- 2Collez le script en dernière ligne avant </head> pour capturer les identifiants de clic dès le premier rendu.
- 3Vous utilisez React, Vue ou Svelte avec SSR ? Placez le script dans le modèle HTML, pas dans un composant, pour qu’il se charge dès la première page vue.
- 4Effectuez un commit et déployez votre site.
- 5Envoyez vos conversions personnalisées avec srAttribution.track("naam", { value: 89.5, currency: "EUR" }) lorsque la conversion réussit.
- 6Envoyez les conversions côté serveur (remboursements, commandes hors ligne, réservations téléphoniques) via l’API de conversion avec la même clé de pixel.
Vérifier le fonctionnement
- • Ouvrez votre site et vérifiez dans l’onglet Réseau du navigateur que sr.js se charge avec le statut 200.
- • Utilisez la page 'Tester votre suivi' dans Roots pour envoyer un événement test et suivre le flux d’événements en direct.
Attention
- • Ne chargez pas le script via un gestionnaire de balises avec délai de consentement si vous voulez conserver les identifiants de clic ; placez-le directement dans le head.
- • Ne placez pas le script dans un composant monté seulement après l’hydratation : vous manqueriez la première page vue.
Webhook de commande et API de conversion
Shopify, WooCommerce et Magento peuvent confirmer les commandes depuis leur serveur via POST /api/public/order?key=sr_xxx. Utilisez x-roots-secret et x-roots-platform. Les clés se trouvent dans votre site après connexion ; conservez-les uniquement sur votre serveur.
Shopify exige aussi X-Shopify-Hmac-SHA256 calculé sur le corps de requête inchangé. Enregistrez le secret Shopify dans Roots et utilisez une intégration serveur qui envoie aussi la clé Roots. Pour WooCommerce et Magento, l’intégration serveur doit contrôler l’authentification et le statut de paiement.
curl -X POST "https://rootsmetrics.com/api/public/order?key=sr_xxx" \
-H "Content-Type: application/json" \
-H "x-roots-secret: YOUR_WEBHOOK_SECRET" \
-H "x-roots-platform: woocommerce" \
-d '{"id":1234,"total":"84.50","currency":"EUR","billing":{"email":"customer@example.com"},"meta_data":[{"key":"sr_vid","value":"VISITOR_ID"}]}'Affaires conclues et prospects qualifiés
L’API de conversion accepte POST /api/public/v1/offline-conversions avec une clé API liée au compte dans l’en-tête Bearer, site_id et jusqu’à 500 conversions par requête. Utilisez un external_id unique, la valeur réelle et l’horodatage occurred_at d’origine. visitor_id relie si possible la conversion à une visite mesurée.
curl -X POST "https://rootsmetrics.com/api/public/v1/offline-conversions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"site_id":"YOUR_SITE_UUID","conversions":[{"external_id":"crm-deal-1234","visitor_id":"VISITOR_ID","event_name":"qualified_lead","value":84.5,"currency":"EUR","occurred_at":"2026-10-29T12:00:00Z"}]}'La réception ne prouve pas le rapprochement avec un visiteur. Un consentement inconnu n’est pas considéré comme accordé ; la transmission exige un consentement enregistré. GET /api/public/v1/conversions est un export, pas un point de réception.
API partenaire Rootboard
Avec une clé partenaire liée au compte, Rootboard peut récupérer les totaux d’attribution par site, période, canal et modèle via GET /api/public/partners/rootboard/attribution. L’échange comprend le crédit de conversion, la valeur en centimes et les coûts associés. Il ne s’agit ni d’un Analytics Hub intégré ni d’un échange de profils clients.
Qu'est-ce qui est mesuré automatiquement ?
Dès que le script est sur votre site, Roots mesure les conversions principales sans aucun réglage. Tout ce qui nécessite une valeur reçoit un attribut supplémentaire sur le bouton, le lien ou le formulaire.
| Event | Quand | Valeur |
|---|---|---|
Page vue pageview | À chaque chargement de page. Les identifiants de clic (gclid, fbclid, ttclid, li_fat_id) et les paramètres utm sont aussi enregistrés. | Aucune valeur |
Formulaire envoyé form_submit | Lorsqu'un visiteur envoie un <form> sur votre site. Fonctionne pour tout formulaire, y compris ceux de votre thème ou page builder. | Aucune valeur, sauf si vous ajoutez data-sr-value au formulaire. |
Clic téléphonique phone_call | Clic sur un lien commençant par tel:, par exemple <a href="tel:+31612345678">. | Aucune valeur. Vous voulez une valeur moyenne par clic téléphonique ? Ajoutez data-sr-value au lien. |
Clic e-mail (mailto) email_click | Clic sur un lien commençant par mailto:. | Aucune valeur, sauf si vous la transmettez vous-même. |
Tout bouton ou lien avec data-sr-event eigen naam | Clic sur un élément portant l'attribut data-sr-event. Sa valeur devient le nom de l'événement, par exemple reservation, whatsapp ou download. | Facultatif via data-sr-value et data-sr-currency. |
Transmettre une valeur avec des attributs data
Pas besoin d'écrire du JavaScript : placez les attributs directement sur l'élément. Roots les lit au clic ou à l'envoi.
data-sr-eventLe nom de la conversion. À placer sur un bouton, un lien ou un formulaire. Sans cet attribut, un formulaire s'appelle form_submit.
data-sr-event="reservering"data-sr-valueLa valeur de la conversion en euros. Utilisez un point comme séparateur décimal, sans signe euro.
data-sr-value="89.95"data-sr-currencyDevise de la valeur. Si elle est omise, Roots utilise EUR.
data-sr-currency="EUR"data-sr-ignoreÀ placer sur un formulaire que vous ne voulez pas mesurer, par exemple un formulaire de recherche ou de filtre.
<form data-sr-ignore> … </form>Une valeur connue seulement au paiement
Dans une boutique en ligne, le montant de la commande n'est pas connu à l'avance. Envoyez-le depuis la page de remerciement pour que Roots compte le chiffre d'affaires réel par source.
<!-- Page de remerciement de votre boutique : envoyer le montant réel -->
<script>
srAttribution.track("purchase", {
value: ORDER_TOTAL, // remplacez par la variable de votre boutique
currency: "EUR"
});
</script>Pas de montant, comme pour une réservation ou une demande ? Définissez une valeur fixe par type de conversion dans Conversions, par exemple la dépense moyenne par couvert.