Deux voies, une seule action de conversion
Google Ads mesure les conversions de deux manières :
- Balise Google dans le navigateur —
gtag('event', 'conversion', { send_to: 'AW-XXXX/label', value, currency, transaction_id }), éventuellement avec les Enhanced Conversions (user_dataavec e-mail, téléphone et adresse hachés par la balise). - Imports de conversions via l'API Google Ads —
ConversionUploadService.UploadClickConversions, envoyés depuis votre serveur.
Les deux se réfèrent à la même action de conversion. La voie API est ce qui rend possibles les ventes hors ligne, les leads qualifiés par le CRM et les corrections de remboursement, et c'est celle qui survit aux requêtes navigateur bloquées.
La requête d'import
POST https://googleads.googleapis.com/v25/customers/{customerId}:uploadClickConversions avec les en-têtes Authorization: Bearer <OAuth2>, developer-token et, lorsque vous accédez au compte via un compte administrateur, login-customer-id.
Chaque ClickConversion a besoin de :
conversionAction— le nom de ressourcecustomers/{cid}/conversionActions/{id}conversionDateTime—yyyy-mm-dd hh:mm:ss+|-hh:mm, avec un décalage de fuseau horaire explicite- au moins une clé d'attribution :
gclid,gbraid,wbraidouuserIdentifiers(Enhanced Conversions for Leads) - en option,
conversionValueaveccurrencyCode, etorderIdpour la déduplication consentavecadUserDataetadPersonalizationdéfinis surGRANTEDouDENIED
Définissez partialFailure: true — l'API signale alors les échecs ligne par ligne au lieu de rejeter le lot — et utilisez validateOnly: true pour les tests. Un import en validation seule prouve les identifiants d'accès, le jeton de développeur et l'accès au compte client sans rien enregistrer.
Enhanced Conversions : quoi hacher
Pour userIdentifiers, Google attend le SHA-256 de valeurs normalisées :
- e-mail : sans espaces superflus, en minuscules ; pour les adresses gmail.com et googlemail.com, retirez les points et les suffixes
+avant le hachage - téléphone : format E.164 (
+et indicatif du pays) avant le hachage - prénom, nom, rue : en minuscules, sans espaces superflus, puis hachés
- ville, région, code postal, code pays : en clair
Chaque objet identifiant porte aussi userIdentifierSource: FIRST_PARTY. Une ligne peut combiner plusieurs identifiants ; Google fait correspondre sur n'importe lequel d'entre eux.
Les règles de temporalité qui provoquent des pertes silencieuses
- L'heure de conversion doit être postérieure au clic et comprise dans la fenêtre de conversion après clic de l'action de conversion. Importer un achat avec un horodatage antérieur au clic renvoie
CONVERSION_PRECEDES_CLICK. - Les clics vieux de quelques heures seulement peuvent ne pas encore être appariables (
TOO_RECENT_CLICK). Réessayer plus tard est le bon comportement ; Track traite ces cas comme réessayables. - Les décalages de fuseau horaire sont obligatoires.
2026-09-03 10:15:00sans+02:00est rejeté.
Les champs de consentement ne sont pas optionnels en pratique
Depuis Consent Mode v2, les imports sans consent.adUserData pour le trafic de l'EEE sont signalés. Dérivez les indicateurs des finalités de consentement enregistrées avec l'événement : marketing → adUserData: GRANTED ; marketing + personnalisation → adPersonalization: GRANTED ; tout le reste → DENIED. Ne mettez jamais « granted » par défaut au seul motif que le champ existe.
Dédupliquer avec la balise navigateur
Utilisez le même transaction_id dans la balise Google et orderId dans l'import. Google déduplique les conversions portant le même identifiant de commande pour la même action de conversion, de sorte qu'un achat vu à la fois par la balise et par le serveur ne compte qu'une fois. Pour les leads sans commande, gardez navigateur et serveur sur des actions de conversion différentes (par exemple « Lead (balise) » et « Lead qualifié (CRM) ») plutôt que d'essayer de les dédupliquer.
Un workflow de test qui ne pollue pas les rapports
- Connectez le compte Google via OAuth et validez : Track envoie un import en validation seule et indique si le jeton de développeur et le numéro client sont acceptés.
- Mappez
purchasesur l'identifiant de l'action de conversion. - Envoyez un événement de test dans l'assistant. Tant que la destination est en mode test, chaque import utilise
validateOnly: true; la réponse confirme la structure du payload. - Désactivez le mode test, envoyez un achat réel avec un gclid récent et vérifiez le lendemain Conversions → Diagnostic dans Google Ads.
Erreurs fréquentes, décodées
| Erreur | Signification | Correction |
|---|---|---|
UNAUTHENTICATED | jeton OAuth invalide | reconnecter le compte Google |
PERMISSION_DENIED / USER_PERMISSION_DENIED | pas d'accès au numéro client | vérifier login-customer-id et l'accès au compte |
DEVELOPER_TOKEN_NOT_APPROVED | le jeton n'autorise que les comptes test | demander l'accès de base |
CLICK_NOT_FOUND | gclid inconnu | clic trop ancien, issu d'un autre compte ou mal formé |
INVALID_CONVERSION_ACTION_TYPE | l'action n'est pas de type import | créer une action de conversion avec la source « Importer à partir de clics » |
Chacune de ces erreurs apparaît avec son code dans le débogueur d'événements, à côté du payload masqué qui l'a produite.