Search Console

Consultas de BigQuery para Search Console que sí sirven

Sin el tope de 1.000 filas ni el límite de 16 meses. Las consultas SQL que uso —segunda página, CTR bajo, caídas, canibalización— y las trampas que descuadran los totales.

8 min de lectura Nivel Avanzado Revisado el 23 Ago 2026
Qué necesitas

Search Console verificado y una cuenta de Google Cloud con facturación activada.

Con qué te quedas

Tus datos de búsqueda en crudo y las consultas listas para sacarles partido.

En corto

Activas la exportación masiva en Search Console → Ajustes → Exportación de datos masiva, apuntas a un proyecto de BigQuery y a los dos días empiezas a recibir todo tu histórico en crudo, sin el tope de 1.000 filas ni el límite de 16 meses. Abajo tienes las consultas SQL que uso y las trampas que descuadran los números.

La interfaz de Search Console tiene tres límites que estorban en cuanto tu web es mediana: te da 1.000 filas por consulta, guarda 16 meses y no te deja combinar filtros como querrías.

La exportación a BigQuery quita los tres. Recibes cada día una copia en crudo de tus datos, contra la que puedes lanzar SQL sin cortapisas. Es la diferencia entre mirar un informe y poder preguntarle a tus datos lo que quieras.

Crea el proyecto en Google Cloud y activa BigQuery

Necesitas una cuenta de Google Cloud con la facturación activada, lo que implica meter una tarjeta aunque no vayas a pagar nada. Dentro, crea un proyecto nuevo, habilita la API de BigQuery y anota el ID del proyecto.

Después hay que darle permiso a Google para que escriba ahí: en IAM, añade la cuenta de servicio search-console-data-export@system.gserviceaccount.com con el rol de Usuario de tareas de BigQuery y el de Editor de datos de BigQuery. Si te saltas esto, la configuración del paso siguiente falla.

Sobre el coste: BigQuery tiene una capa gratuita mensual de almacenamiento y de datos procesados en consultas, y los datos de Search Console de una web normal caben de sobra ahí. Lo que sí puede costar dinero es consultar mal: cada consulta cobra por los datos que escanea, y un SELECT * sin filtro de fecha escanea la tabla entera. Filtra siempre por data_date y pide solo las columnas que vas a usar.

Activa la exportación desde Search Console

En la propiedad de Search Console, ve a Ajustes → Exportación de datos masiva. Pon el ID del proyecto de Cloud, elige el nombre del conjunto de datos (por defecto searchconsole) y la ubicación. Continuar.

Dos cosas importantes de este paso:

Conoce las tres tablas antes de escribir SQL

Esto es lo que ahorra más tiempo, porque la mitad de las consultas mal escritas vienen de usar la tabla equivocada:

Y la trampa que descuadra todos los totales: la columna is_anonymized_query. Google oculta las búsquedas poco frecuentes por privacidad, y esas filas llegan con el campo query vacío y esa marca a true. Si sumas clics agrupando por query, el total te va a salir por debajo del real, y la diferencia puede ser grande.

Depende de lo que quieras: para un total fiel, no agrupes por query; para analizar keywords, filtra WHERE is_anonymized_query = false y sé consciente de que estás mirando una parte.

Lanza las consultas que de verdad sirven

Cambia tu-proyecto por el ID de tu proyecto y ajusta las fechas.

Keywords donde estás en segunda página (el empujón más rentable)

Las que ya rankean entre la 11 y la 25 con impresiones de sobra: estás cerca y no te llevas nada.

SELECT
  query,
  SUM(impressions) AS impresiones,
  SUM(clicks) AS clics,
  SUM(sum_position) / SUM(impressions) + 1 AS posicion_media
FROM `tu-proyecto.searchconsole.searchdata_site_impression`
WHERE data_date BETWEEN '2026-07-01' AND '2026-07-31'
  AND is_anonymized_query = false
GROUP BY query
HAVING impresiones > 200
   AND posicion_media BETWEEN 11 AND 25
ORDER BY impresiones DESC
LIMIT 50

Ojo con la posición: en BigQuery no hay una columna position lista para promediar. Hay sum_position, que es una suma de posiciones empezando en cero. La posición media se calcula como SUM(sum_position) / SUM(impressions) + 1. Hacer AVG(position) te dará un número que no significa nada.

URLs con muchas impresiones y CTR bajo (problema de título, no de posición)

SELECT
  url,
  SUM(impressions) AS impresiones,
  SUM(clicks) AS clics,
  SAFE_DIVIDE(SUM(clicks), SUM(impressions)) AS ctr,
  SUM(sum_position) / SUM(impressions) + 1 AS posicion_media
FROM `tu-proyecto.searchconsole.searchdata_url_impression`
WHERE data_date BETWEEN '2026-07-01' AND '2026-07-31'
GROUP BY url
HAVING impresiones > 1000
   AND ctr < 0.02
ORDER BY impresiones DESC

Filtra además por posición media menor que 10 y tienes la lista exacta de páginas que salen arriba y no las clica nadie. Ahí no se toca el contenido: se tocan el título y la descripción.

Páginas que se han caído respecto al mes anterior

WITH actual AS (
  SELECT url, SUM(clicks) AS clics_actual
  FROM `tu-proyecto.searchconsole.searchdata_url_impression`
  WHERE data_date BETWEEN '2026-07-01' AND '2026-07-31'
  GROUP BY url
),
anterior AS (
  SELECT url, SUM(clicks) AS clics_anterior
  FROM `tu-proyecto.searchconsole.searchdata_url_impression`
  WHERE data_date BETWEEN '2026-06-01' AND '2026-06-30'
  GROUP BY url
)
SELECT
  a.url,
  p.clics_anterior,
  a.clics_actual,
  SAFE_DIVIDE(a.clics_actual - p.clics_anterior, p.clics_anterior) AS variacion
FROM actual a
JOIN anterior p USING (url)
WHERE p.clics_anterior > 30
  AND SAFE_DIVIDE(a.clics_actual - p.clics_anterior, p.clics_anterior) < -0.3
ORDER BY p.clics_anterior DESC

El filtro de más de 30 clics en el periodo anterior es lo que evita el ruido: sin él te salen cien URLs que pasaron de 2 clics a 1.

Canibalización: dos URLs peleando por la misma búsqueda

Esta es la consulta que no puedes hacer en la interfaz y que más valor da.

SELECT
  query,
  COUNT(DISTINCT url) AS urls_compitiendo,
  STRING_AGG(DISTINCT url, ' | ' LIMIT 5) AS ejemplos,
  SUM(impressions) AS impresiones
FROM `tu-proyecto.searchconsole.searchdata_url_impression`
WHERE data_date BETWEEN '2026-07-01' AND '2026-07-31'
  AND is_anonymized_query = false
GROUP BY query
HAVING urls_compitiendo > 1
   AND impresiones > 100
ORDER BY urls_compitiendo DESC, impresiones DESC

Que dos URLs salgan alguna vez por la misma búsqueda no es un problema en sí. Lo es cuando las dos se turnan sin que ninguna consolide. Esas son las candidatas a fusionar.

Qué páginas están perdiendo el sitio en los resultados enriquecidos

SELECT
  url,
  SUM(IF(is_amp_top_stories OR is_job_listing OR is_job_details, impressions, 0)) AS impresiones_enriquecidas,
  SUM(impressions) AS impresiones_totales
FROM `tu-proyecto.searchconsole.searchdata_url_impression`
WHERE data_date BETWEEN '2026-07-01' AND '2026-07-31'
GROUP BY url
ORDER BY impresiones_totales DESC
LIMIT 50

La tabla trae una columna booleana por cada tipo de resultado. Cámbialas por las que te interesen según tu web (las de vídeo si publicas vídeo, las de producto si tienes tienda) y verás qué páginas están consiguiendo esos formatos y cuáles no.

Cuándo merece la pena esto y cuándo no

Con toda la honestidad: si tu web tiene doscientas URLs y quinientas impresiones al mes, la interfaz de Search Console te sobra y montar BigQuery es complicarte para nada.

Esto empieza a compensar cuando pasa una de estas tres cosas: te chocas de verdad con el tope de 1.000 filas, necesitas conservar histórico más allá de los dieciséis meses, o quieres cruzar los datos de búsqueda con los tuyos —ventas, márgenes, tipo de producto— para saber qué keywords traen dinero y no solo visitas. Ese último cruce es el que cambia conversaciones.

Preguntas frecuentes

Para una web normal, dentro de la capa gratuita de BigQuery. El riesgo no es el almacenamiento, son las consultas mal filtradas: se cobra por datos escaneados. Filtra siempre por data_date y no uses SELECT *.

No. La exportación empieza el día que la activas. Por eso conviene activarla cuanto antes aunque todavía no vayas a usarla.

Casi siempre por las consultas anonimizadas: al agrupar por query pierdes las filas que Google oculta. También influye que la interfaz agrupa de otra forma y que puede haber días sin cargar (revisa la tabla ExportLog).

Sí, y es el paso natural: BigQuery como fuente y el panel encima. Ahí sí conviene apoyarse en vistas o tablas ya agregadas, para que cada visita al panel no dispare una consulta cara.

Paul Cris
Paul Cris Consultor SEO freelance · Valencia

Llevo diez años posicionando webs, ahora también para las IAs generativas. Grabo estos tutoriales con lo que uso de verdad en los proyectos de mis clientes, no con teoría de manual.

Suscribirse al canal →

¿Prefieres que lo haga yo?

Estos tutoriales son para que puedas hacerlo tú. Si prefieres delegarlo, cuéntame qué está pasando en tu web y te digo qué haría en tu caso.