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.
-- 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
| url | sesiones_organicas | clics_gsc | impresiones_gsc | diferencia | pct_no_explicado |
|---|---|---|---|---|---|
| https://ejemplo.com/landing-bing | 456 | 23 | 345 | 433 | 94.96 |
| https://ejemplo.com/app-redirect | 234 | 0 | 0 | 234 | 100.00 |
| https://ejemplo.com/contenido-social | 187 | 45 | 876 | 142 | 75.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.
Queries relacionadas
Keywords que llevan tráfico a URLs sin conversión
Cruce GA4 + GSC
Avanzado
Comparativa de posiciones GSC con tasa de conversión GA4
Cruce GA4 + GSC
Avanzado
Limpiar y normalizar una lista de URLs con SQL
SQL genérico
Principiante
Keywords que generan conversiones reales en GA4
Cruce GA4 + GSC
Avanzado