URLs con buen CTR en GSC pero bajo engagement en GA4
Identifica URLs que atraen clics desde Google (buen CTR) pero no retienen al usuario (bajo engagement en GA4). Indica problemas de coincidencia entre la promesa del snippet y el contenido real de la página.
-- URLs con buen CTR en GSC pero bajo engagement en GA4
-- Detecta desajuste entre snippet y contenido
WITH gsc_data AS (
SELECT
url,
SUM(clicks) AS clics_gsc,
SUM(impressions) AS impresiones,
ROUND(SAFE_DIVIDE(SUM(clicks), SUM(impressions)) * 100, 2) AS ctr
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
HAVING
clics_gsc >= 20
AND ctr >= 5.0
),
ga4_engagement 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,
COUNTIF(
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'session_engaged') = '1'
) AS sesiones_engaged,
ROUND(AVG(
(SELECT value.int_value FROM UNNEST(event_params)
WHERE key = 'engagement_time_msec')
) / 1000, 2) AS tiempo_medio_seg
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 IN ('session_start', 'user_engagement')
GROUP BY
url_normalizada
)
SELECT
g.url,
g.clics_gsc,
g.ctr AS ctr_gsc,
e.sesiones AS sesiones_ga4,
ROUND(SAFE_DIVIDE(e.sesiones_engaged, e.sesiones) * 100, 2) AS engagement_rate,
e.tiempo_medio_seg
FROM
gsc_data g
INNER JOIN ga4_engagement e ON g.url = e.url_normalizada
WHERE
-- Engagement rate por debajo del 40% indica bajo engagement
SAFE_DIVIDE(e.sesiones_engaged, e.sesiones) < 0.40
ORDER BY
g.clics_gsc DESC
LIMIT 30
Explicación paso a paso
- 3 El CTE gsc_data selecciona URLs con buen CTR (>= 5%) y al menos 20 clics.
- 20 El CTE ga4_engagement calcula métricas de engagement desde GA4 para sesiones orgánicas.
- 22 Normaliza page_location eliminando parámetros para hacer matching con las URLs de GSC.
- 34 Cuenta sesiones engaged (duración > 10s, 2+ page views o conversión).
- 57 Calcula el engagement rate dividiendo sesiones engaged entre totales.
- 63 Filtra URLs con engagement rate menor al 40%, indicando desajuste snippet/contenido.
Ejemplo de resultado esperado
| url | clics_gsc | ctr_gsc | sesiones_ga4 | engagement_rate | tiempo_medio_seg |
|---|---|---|---|---|---|
| https://ejemplo.com/oferta-antigua | 456 | 12.30 | 423 | 18.44 | 4.20 |
| https://ejemplo.com/descarga-pdf | 234 | 8.70 | 210 | 25.71 | 6.80 |
| https://ejemplo.com/evento-pasado | 187 | 6.50 | 165 | 33.94 | 8.30 |
Variaciones y adaptaciones
Para ajustar el umbral de engagement, modificar el valor 0.40 en el WHERE final. Para incluir también el bounce rate estimado, añadir COUNTIF(session_engaged != '1') / sesiones. Para ver las keywords asociadas a cada URL problemática, añadir un tercer CTE que liste las keywords de GSC por URL.
Queries relacionadas
Keywords que generan conversiones reales en GA4
Cruce GA4 + GSC
Avanzado
Search terms internos usados por visitantes orgánicos
GA4 en BigQuery
Intermedio
Tráfico orgánico segmentado por tipo de contenido
GA4 en BigQuery
Avanzado
Keywords que llevan tráfico a URLs sin conversión
Cruce GA4 + GSC
Avanzado