URLs con mucho tráfico orgánico pero pocas impresiones

Detecta URLs que reciben más tráfico orgánico en GA4 del que las impresiones de GSC explicarían. Puede indicar tráfico desde buscadores no cubiertos por GSC, discrepancias de tracking o problemas de atribución.

trafico-alto-impresiones-bajas.sql
-- URLs con más tráfico orgánico (GA4) que impresiones (GSC)
-- Detecta discrepancias entre ambas fuentes
WITH ga4_trafico AS (
  SELECT
    REGEXP_EXTRACT(
      (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
      r'(https?://[^?#]+)'
    ) AS url_normalizada,
    COUNT(
      DISTINCT CONCAT(
        user_pseudo_id, '.',
        CAST(
          (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id')
        AS STRING)
      )
    ) AS sesiones_organicas
  FROM
    `your-project.analytics_XXXXXXXXX.events_*`
  WHERE
    _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 28 DAY))
      AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
    AND traffic_source.medium = 'organic'
    AND event_name = 'session_start'
  GROUP BY
    url_normalizada
  HAVING
    sesiones_organicas >= 20
),
gsc_data AS (
  SELECT
    url,
    SUM(clicks) AS clics_gsc,
    SUM(impressions) AS impresiones_gsc
  FROM
    `your-project.searchconsole.searchdata_url_impression`
  WHERE
    data_date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 28 DAY) AND CURRENT_DATE()
    AND search_type = 'WEB'
  GROUP BY
    url
)
SELECT
  g.url_normalizada AS url,
  g.sesiones_organicas,
  IFNULL(s.clics_gsc, 0) AS clics_gsc,
  IFNULL(s.impresiones_gsc, 0) AS impresiones_gsc,
  g.sesiones_organicas - IFNULL(s.clics_gsc, 0) AS diferencia,
  ROUND(SAFE_DIVIDE(
    g.sesiones_organicas - IFNULL(s.clics_gsc, 0),
    g.sesiones_organicas
  ) * 100, 2) AS pct_no_explicado
FROM
  ga4_trafico g
  LEFT JOIN gsc_data s ON g.url_normalizada = s.url
WHERE
  -- Sesiones orgánicas superan significativamente los clics de GSC
  g.sesiones_organicas > IFNULL(s.clics_gsc, 0) * 2
ORDER BY
  diferencia DESC
LIMIT 30

Explicación paso a paso

  • 3 El CTE ga4_trafico cuenta sesiones orgánicas por URL normalizada desde GA4.
  • 5 Normaliza page_location eliminando query strings para hacer matching con URLs de GSC.
  • 28 El CTE gsc_data agrega clics e impresiones por URL desde GSC.
  • 44 IFNULL maneja URLs que están en GA4 pero no en GSC (clics_gsc = 0).
  • 46 Calcula la diferencia absoluta y el porcentaje de tráfico no explicado por GSC.
  • 53 LEFT JOIN para incluir URLs que existen en GA4 pero no en GSC.
  • 56 Filtra URLs donde las sesiones GA4 superan al doble de los clics GSC.

Ejemplo de resultado esperado

urlsesiones_organicasclics_gscimpresiones_gscdiferenciapct_no_explicado
https://ejemplo.com/landing-bing4562334543394.96
https://ejemplo.com/app-redirect23400234100.00
https://ejemplo.com/contenido-social1874587614275.94

Variaciones y adaptaciones

Para investigar si el tráfico viene de otros buscadores (Bing, DuckDuckGo), revisar traffic_source.source en GA4 y filtrar por source != 'google'. Para ajustar la tolerancia de discrepancia, modificar el multiplicador * 2 en el WHERE. Para añadir la fuente de tráfico predominante, incluir traffic_source.source en el CTE de GA4.