L’export BigQuery de GA4 contient des données de source de trafic dans quatre emplacements différents. Chacun a une portée et une sémantique différentes. Utiliser le mauvais produit des rapports d’attribution incorrects — et les erreurs sont silencieuses. Vos requêtes retournent des résultats qui semblent raisonnables mais attribuent les conversions aux mauvais canaux.
Comprendre quelle source utiliser pour quelle question est le prérequis pour tout travail d’attribution sur les données GA4.
Les quatre emplacements de source de trafic
traffic_source (Portée utilisateur, Premier contact)
Le struct traffic_source contient l’attribution au premier contact, à portée utilisateur. Il enregistre la source, le medium et la campagne qui ont initialement acquis l’utilisateur, quelle que soit le nombre de sessions ultérieures.
traffic_source.source -- ex. 'google'traffic_source.medium -- ex. 'organic'traffic_source.name -- nom de la campagneÀ utiliser pour : L’analyse d’acquisition des utilisateurs. « Quels canaux nous amènent de nouveaux utilisateurs ? » et « Quel était le premier point de contact de nos clients à plus haute valeur ? »
À ne pas utiliser pour : L’attribution de session. Un utilisateur acquis via la recherche payante il y a six mois qui revient aujourd’hui via email affiche toujours google / cpc dans traffic_source. C’est historiquement exact mais analytiquement trompeur pour le reporting au niveau session.
Ce struct n’apparaît pas dans les tables d’export intraday.
collected_traffic_source (Portée événement, Collecte brute)
Le struct collected_traffic_source contient des données de collecte brutes à portée événement. Il capture les paramètres UTM et les identifiants de clic exactement tels que GA4 les a collectés, sans modèle d’attribution appliqué.
collected_traffic_source.manual_source -- source UTMcollected_traffic_source.manual_medium -- medium UTMcollected_traffic_source.manual_campaign_name -- campagne UTMcollected_traffic_source.gclid -- identifiant de clic Google Adscollected_traffic_source.dclid -- identifiant de clic Display & Video 360collected_traffic_source.srsltid -- identifiant de clic Google Merchant CenterÀ utiliser pour : Construire des modèles d’attribution personnalisés où vous avez besoin de données de point de contact brutes. Également utile pour déboguer les divergences d’attribution — voir exactement ce que GA4 a collecté avant d’appliquer une modélisation.
À ne pas utiliser pour : L’attribution de session standard. Les données brutes nécessitent une logique supplémentaire pour déterminer les valeurs au niveau session (vous devrez appliquer vous-même les patterns FIRST_VALUE).
session_traffic_source_last_click (Portée session, Juillet 2024+)
Le struct session_traffic_source_last_click contient l’attribution à portée session avec le modèle dernier clic non direct de GA4 appliqué. C’est le champ qui correspond à ce que vous voyez dans l’interface GA4.
session_traffic_source_last_click.manual_campaign.source -- ex. 'google'session_traffic_source_last_click.manual_campaign.medium -- ex. 'cpc'session_traffic_source_last_click.manual_campaign.campaign_name -- ex. 'spring_sale'À utiliser pour : L’attribution de session dans toute analyse ou tableau de bord. Il gère automatiquement la logique dernier-clic-non-direct — si une session commence comme trafic direct, GA4 remonte jusqu’à 90 jours en arrière pour trouver une source non directe précédente et la crédite à la place.
Disponibilité : Juillet 2024 et après. Les données antérieures à cette date n’ont pas ce champ renseigné.
Clés legacy event_params (Incohérentes)
Le tableau event_params contient parfois des clés source et medium legacy provenant d’implémentations GA4 antérieures.
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') AS source,(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') AS mediumÀ utiliser pour : Repli uniquement, lorsque les autres champs ne sont pas disponibles. Ces clés sont incohéremment renseignées et ne doivent pas être votre source d’attribution principale.
Attribution de session pratique
Pour les données à partir de juillet 2024, session_traffic_source_last_click est le choix évident pour l’attribution au niveau session. Extrayez-le avec FIRST_VALUE pour le propager à tous les événements de la session :
FIRST_VALUE(session_traffic_source_last_click.manual_campaign.source IGNORE NULLS) OVER (PARTITION BY session_key ORDER BY event_timestamp) AS session_source,FIRST_VALUE(session_traffic_source_last_click.manual_campaign.medium IGNORE NULLS) OVER (PARTITION BY session_key ORDER BY event_timestamp) AS session_medium,FIRST_VALUE(session_traffic_source_last_click.manual_campaign.campaign_name IGNORE NULLS) OVER (PARTITION BY session_key ORDER BY event_timestamp) AS session_campaignLa clause IGNORE NULLS est critique. Tous les événements d’une session ne portent pas de données d’attribution. Sans elle, le premier événement pourrait avoir une source null (si l’événement session_start a été filtré), et ce null se propage à chaque ligne.
Encapsulez les résultats dans un COALESCE pour une sortie propre :
COALESCE( FIRST_VALUE(session_traffic_source_last_click.manual_campaign.source IGNORE NULLS) OVER (PARTITION BY session_key ORDER BY event_timestamp), '(direct)') AS session_sourceLe problème gclid de Google Ads
Un problème connu affecte le trafic Google Ads. Les sessions avec des paramètres gclid apparaissent parfois comme organiques ou directs parce que GA4 ne décode pas toujours l’identifiant de clic en source et medium dans l’export. Si une attribution précise de la recherche payante est importante, ajoutez une correction :
CASE WHEN collected_traffic_source.gclid IS NOT NULL THEN 'google' ELSE session_traffic_source_last_click.manual_campaign.sourceEND AS session_source,CASE WHEN collected_traffic_source.gclid IS NOT NULL THEN 'cpc' ELSE session_traffic_source_last_click.manual_campaign.mediumEND AS session_mediumCe remplacement utilise collected_traffic_source.gclid comme signal que la session provient d’un clic Google payant, quelle que soit ce que disent les champs d’attribution. Pour les données complètes de campagne Google Ads (nom de campagne, groupe d’annonces, mots-clés), envisagez de joindre avec les exports Google Ads Data Transfer en utilisant le champ gclid.
Données historiques avant juillet 2024
Pour les données antérieures à juillet 2024, session_traffic_source_last_click est vide. Deux options :
-
Construire l’attribution de session depuis
collected_traffic_sourceavec le pattern FIRST_VALUE. Cela vous donne les données UTM brutes sans le modèle dernier-clic-non-direct, donc les sessions directes restent directes même si l’utilisateur a précédemment été acquis via un canal non direct. -
Commencer votre analyse à partir de juillet 2024. Cela évite de maintenir deux chemins de code et est souvent le choix pragmatique, sauf si la comparaison historique est une exigence absolue.
Si vous maintenez les deux chemins de code, envisagez d’isoler la logique dans une macro dbt qui change de comportement selon la date d’événement :
{% macro ga4_session_source(session_key, event_timestamp) %} CASE WHEN event_date >= '2024-07-01' THEN FIRST_VALUE(session_traffic_source_last_click.manual_campaign.source IGNORE NULLS) OVER (PARTITION BY {{ session_key }} ORDER BY {{ event_timestamp }}) ELSE FIRST_VALUE(collected_traffic_source.manual_source IGNORE NULLS) OVER (PARTITION BY {{ session_key }} ORDER BY {{ event_timestamp }}) END{% endmacro %}Choisir le bon champ
| Question | Utiliser ce champ |
|---|---|
| Quel canal a initialement acquis cet utilisateur ? | traffic_source |
| Qu’est-ce qui a amené l’utilisateur à cette session spécifique ? | session_traffic_source_last_click |
| Quels paramètres UTM bruts ont été collectés ? | collected_traffic_source |
| Qu’a montré GA4 dans l’interface ? | session_traffic_source_last_click |
| Construction d’un modèle d’attribution personnalisé ? | collected_traffic_source |
| Données avant juillet 2024 ? | collected_traffic_source (avec logique manuelle) |