Cómo conectar GA4 y Search Console en Screaming Frog headless

Esta es la segunda entrega de la serie sobre Screaming Frog headless: en Cómo instalar Screaming Frog en un VPS dejamos la rana rastreando sola en el servidor.

Hoy voy a conectar GA4 y Search Console, de tal modo que el rastreo sea enriquecido con los datos de ambas herramienas.

Screaming Frog en modo headless tiene una particularidad que descoloca a todo el mundo la primera vez: la tarea se configura en la interfaz gráfica, pero se ejecuta desde la terminal.

No hay forma de dar de alta una cuenta de Google desde la línea de comandos, porque el proceso de autorización necesita un navegador.

Así que el reparto de papeles es este: la GUI sirve para autenticarse y dejar las credenciales escritas en disco; para que el VPS las use.

Interfaz principal de Screaming Frog SEO Spider en reposo, punto de partida antes de configurar las tareas programadas
El punto de partida: Spider en reposo, cero URLs. Todo lo que sigue ocurre sin volver a tocar esta pantalla.

De ahí que este tutorial tenga tres partes bien separadas: configurar la tarea en la GUI, subir las credenciales al servidor y, por fin, lanzar el crawl.

Parte 1. Dar de alta la tarea en la GUI de Screaming Frog

1. Acostúmbrate a llamarla GUI

Parece una chorrada, pero no lo es.

En cuanto empieces a moverte entre la documentación de Screaming Frog, los foros y tu propio LLM de cabecera, vas a ver «GUI» por todas partes.

Interiorizar el nombre desde el principio te ahorra fricción: GUI es la interfaz gráfica que ves en tu equipo, la del icono de la rana, y headless es esa misma aplicación corriendo sin interfaz gráfica.

Misma herramienta, dos caras.

2. Archivo → Programación → Añadir

Ese es el camino: lo que estás dando de alta aquí es la tarea.

Menú Archivo de Screaming Frog en macOS con la opción Programación para abrir el gestor de tareas programadas
La puerta está escondida a plena vista: Archivo → Programación. O ⌘T, si tienes prisa.

Una vez que pinchas en programación, el paso clave para configurar una tarea, se muestra la siguiente ventana de diálogo.

Botón Añadir de la ventana de Programación de Screaming Frog para crear una nueva tarea de rastreo automatizado
Todo empieza en Añadir. Aunque el atajo honesto es Duplicar: clona una tarea que funciona y cámbiale el dominio.

La cuenta de Google llega después, en la pestaña API — no te despiste el «Añadir».

Se abre la ventana Configurar tarea, que tiene cinco secciones en la columna izquierda: General, Spider, API, Exportaciones y Notificaciones.

Las tres primeras son las que nos importan ahora, las otras dos, nunca las he usado.

Fíjate en un detalle de la interfaz que te va a guiar todo el rato: Screaming Frog marca con un círculo rojo las secciones que aún tienen algo sin resolver, y abajo a la izquierda lleva la cuenta («1 error sin resolver», «2 errores sin resolver»).

No podrás darle a Aceptar hasta que todos los errores desaparezcan.

Úsalo como lista de tareas.

3. Pestaña General: nombre y frecuencia

Aquí se define qué tarea es y cada cuánto se ejecuta:

  • Nombre de la tarea — viene relleno como «Nueva tarea». Cámbialo.
  • Nombre del proyecto — opcional.
  • Comparación automática de rastreos — casilla que permanece deshabilitada mientras no haya proyecto.
  • Descripción — campo libre.
  • Fecha/hora — día, hora, minuto y el desplegable de frecuencia, donde eliges Cada mes o el intervalo que necesites.
Pestaña General de la ventana Configurar tarea de Screaming Frog con el nombre de la tarea, el proyecto y la frecuencia de la ejecución programada
La pestaña General tal cual se abre: la tarea aún se llama Nueva tarea, la frecuencia por decidir y el punto rojo en Spider avisando de la siguiente parada.

Sobre el nombre, una convención que me ha ahorrado disgustos: prefijo Headless_ seguido del dominio. Por ejemplo, Headless_Temas_Sobre_Salud. Cuando tengas cinco o seis tareas conviviendo, agradecerás distinguir de un vistazo cuáles corren solas.

4. Pestaña Spider: aquí se activa el modo headless

Esta es la casilla que da nombre a todo el asunto: Modo sin interfaz gráfica. La propia interfaz avisa entre paréntesis de por qué importa — «necesario para las exportaciones y notificaciones».

Sin marcarla, la tarea programada no exporta nada.

Casilla Modo sin interfaz gráfica marcada en la pestaña Spider de la tarea programada de Screaming Frog, imprescindible para las exportaciones en modo headless
La casilla que enciende el headless, ya en verde, con el aviso de la propia interfaz: Spider se ejecutará en el fondo. El aspa roja de la URL es el error que aún cuenta el contador.

En la misma pantalla configuras:

  • Modo de rastreo — Spider por defecto.
  • Inicialización de rastreo — la URL del sitio. Mientras esté vacía (solo con el https://) tendrás el aspa roja del error pendiente.
  • Configuración de rastreo — tu fichero *.seospiderconfig, el que lleva tus exclusiones y tus límites.
  • Configuración de autenticación — el *.seospiderauthconfig, solo si el sitio va detrás de login.

5. Pestaña API: conectar GA4 y Search Console

Aquí decides a qué APIs se conecta Spider cuando la tarea se ejecute sola.

La lista completa incluye Google Analytics 4, Google Search Console, PageSpeed Insights, Majestic, Ahrefs, Moz, OpenAI, Gemini, Ollama y Anthropic.

Solo voy a configurar las dos primeras; sin embargo, el alta de las credenciales para el resto de APIs es idéntico.

Cuenta de GA4 conectada en la tarea programada de Screaming Frog: propiedad y flujo de datos seleccionados y mensaje de configuración válida
El estado al que hay que llegar: cuenta conectada, flujo elegido y el check verde de configuración válida. Todo lo demás es el camino.

Marca Google Analytics 4 y verás aparecer el aviso en rojo: «No se ha configurado ninguna cuenta para Google Analytics 4». Es lo esperado — acabas de pedir una fuente de datos sin decir de qué cuenta.

A la derecha hay una ruedita: ese es el botón que abre el diálogo de conexión.

Repite exactamente lo mismo con Google Search Console.

Mismo aviso, misma ruedita, mismo procedimiento. Con las dos marcadas y ninguna conectada, el contador de abajo te marcará dos errores sin resolver.

Al pinchar la ruedita se abre el panel Conectar a nueva cuenta, con el botón Sign in with Google.

Ahí se te abrirá el navegador, eliges la cuenta de Google y aceptas los permisos.

Debajo aparece la tabla de Cuentas existentes, con una columna llamada Conectar automáticamente al iniciar — si ya has autorizado antes otras cuentas, las tendrás todas listadas y podrás reutilizarlas sin repetir el baile.

Selector de cuentas de Google Analytics 4 en la pestaña API de Screaming Frog
La credencial se firma una vez con Google; la tarea programada la reutiliza cada mes sin volver a preguntar.

Elige la cuenta en la tabla y remata con Conectar:

Botón Conectar de la cuenta GA4 seleccionada en la configuración de tarea programada de Screaming Frog
Seleccionar no basta: sin pulsar Conectar, la tarea despertará sin datos de Analytics.

6. El renombrado que parece contraintuitivo

Aquí está el paso que más gente se salta, y luego lo paga.

En cuanto terminas de autorizar en el navegador, Screaming Frog crea la cuenta él solo y la bautiza a su manera: «Cuenta nueva».

Ya está conectada y funciona — verás la barra verde de Conectado a la cuenta, el desplegable de propiedades disponibles poblado con tu dominio, y un botón de Desconectar. Da igual la API: GA4, GSC o cualquier otra, el alta es idéntica.

Selección de cuenta, propiedad y flujo de datos de GA4 en la configuración de la tarea programada de Screaming Frog
La tríada que GA4 exige: cuenta, propiedad y flujo de datos. Mientras falte una, el aviso rojo no se va.

Y ahí está la trampa de la comodidad: como ya funciona, nadie la renombra.

Hasta que das de alta el segundo sitio, y el tercero, y te encuentras conviviendo con «Cuenta nueva», «Cuenta nueva 2», «Cuenta nueva 3»… hasta el infinito, y ninguna dice a qué dominio pertenece.

En la GUI es un fastidio; en headless es una bomba de relojería, porque ese nombre viaja al comando que lanza el crawl y a la carpeta donde viven las credenciales.

Así que renombra AHORA, antes de ponerte a elegir propiedad y flujo. El circuito es el que no se le ocurre a nadie: pincha en Desconectar — sí, desconectar — y en el diálogo de gestión de cuentas, con sus tres botones — Eliminar, Cambiar nombre y Conectar —, elige Cambiar nombre.

Botón Cambiar nombre en el listado de cuentas GA4 de Screaming Frog para renombrar la credencial antes de usarla en modo headless
Renombrar no es estética: ese nombre se teclea a mano en la CLI, y los nombres autogenerados invitan al error.

Al pulsarlo aparece el diálogo donde tecleas el nombre definitivo:

Diálogo de Screaming Frog para introducir el nuevo nombre de la cuenta GA4 que utilizará la tarea programada
Lo que escribas aquí es lo que luego escribirás en el comando. Corto, único y sin sorpresas.

Un aviso para que no te asuste: cambiar el nombre desconecta la cuenta.

No es un fallo, es el circuito: renombra, seleccionas de nuevo la propiedad, vuelves a conectar ya con el nombre definitivo, y entonces ya tendras conectada la API.

Momentáneamente saltara la ruedita en rojo, tranquilo, con pinchar fuera de esa ventana de dialogo, aparece la señal de que has conectado la API.

este mismo procedimiento lo tendras que efectuar cuando conectes la API de Search Console.

Y ahora lo importante, subrayado dos veces: ese nombre es el que va a viajar dentro del comando que lanza el crawl en modo headless, y es también el que le da nombre a la carpeta donde se guardan las credenciales en disco.

Anótalo.

Tal cual, carácter a carácter, con sus mayúsculas y sus guiones bajos.

Un nombre que no coincida puede marcar la diferencia entre un día perdido persiguiendo un error, sin saber qué pasa.

Cuando el nombre nuevo aparece en la lista y abajo a la izquierda lees «Configuración válida», la parte de la GUI está terminada.

APIs de Google Analytics 4 y Search Console activadas en la tarea programada de Screaming Frog con el mensaje de configuración válida
GA4 y GSC en verde y ni un error pendiente: a partir de aquí, la tarea ya puede ejecutarse sola.

7. Comprobación: así debe quedar

Cuando aceptes, la tarea aparece en la ventana de Programación, en una tabla con cuatro columnas: Tarea, Próxima ejecución, Intervalo y Válido.

Esa última columna es tu semáforo: el tic verde significa que la tarea está completa y se ejecutará sola cuando toque.

Ventana de Programación de Screaming Frog con las tareas headless mensuales configuradas y su próxima ejecución
El crontab de quien no usa crontab: cada tarea con su intervalo y su próxima ejecución a la vista.

A la derecha tienes los botones de Añadir, Duplicado, Editar, Eliminar, Importar, Exportar e Historial.

Nueva tarea programada seleccionada en la ventana de Programación de Screaming Frog junto a los botones de duplicar, editar y exportar
La recién llegada, en verde, con su próxima ejecución asignada. A partir de aquí, el rastreo es cosa tuya.

Con varias tareas dadas de alta, la convención del prefijo Headless_ se explica sola: de un vistazo sabes qué corre desatendido y cuándo le toca a cada uno.

Hasta aquí la GUI. Ahora viene el tema espinoso.

Parte 2. Subir las credenciales de Screaming Frog al VPS

El servidor no puede autenticarse contra Google por su cuenta: no tiene navegador ni nadie que pulse «Aceptar». Lo que hacemos es llevarle las credenciales que la GUI acaba de generar en tu equipo, replicando el mismo árbol de carpetas.

Nada más. Toca dar con ellas.

1. La carpeta padre está oculta

Vive en tu carpeta de usuario y se llama .ScreamingFrogSEOSpider. El punto inicial es lo que la hace invisible en Finder.

Para que aparezca, usa la combinación de teclas shift + comando + punto (.).

La misma combinación la vuelve a ocultar.

La ruta completa, con tu nombre de usuario:

/Users/TU_USUARIO/.ScreamingFrogSEOSpider

Ojo con no confundirla con .ScreamingFrogLogfileAnalyser, que está justo al lado y es otro programa.

Carpeta oculta .ScreamingFrogSEOSpider en el directorio de usuario de macOS, donde Screaming Frog guarda la licencia, el EULA y las credenciales de las APIs
Con las carpetas ocultas a la vista (⇧⌘.), ahí está: .ScreamingFrogSEOSpider, el hogar de la licencia y las credenciales que después viajan al VPS.

2. Dentro hay dos carpetas que nos interesan: ga4 y search_console

Al abrirla te vas a encontrar con bastante ruido — ficheros de bloqueo .lck, configuraciones por defecto, licence.txt, history.log, la carpeta de exports, la de chrome, la base sqlite y un largo etcétera.

¡No toques nada!

Localiza únicamente estas dos, que están por orden alfabético entre las demás:

  • ga4 — credenciales de Google Analytics 4.
  • search_console — credenciales de Search Console.

Cada API tiene su propia carpeta, aunque compartan carpeta padre. Eso significa que el proceso hay que hacerlo dos veces, una por API.

Carpeta ga4 señalada dentro de .ScreamingFrogSEOSpider en macOS, donde Screaming Frog almacena las credenciales de Google Analytics 4
La primera mitad del botín: la carpeta ga4. Cada API guarda su credencial en su propio cajón, y este es el de Analytics.

Y su gemela, en la misma carpeta padre:

Interior de la carpeta .ScreamingFrogSEOSpider en macOS con la subcarpeta search_console señalada, donde Screaming Frog almacena las credenciales de Google Search Console
Dentro de .ScreamingFrogSEOSpider, la subcarpeta search_console guarda la credencial firmada en el escritorio. Es la que el VPS reutilizará sin volver a preguntar.

3. Dentro de cada una, siempre saveduser

Da igual por cuál empieces: al entrar en ga4 o en search_console te encuentras una única carpeta llamada saveduser. No hay más. Entra.

Carpeta saveduser dentro de search_console en macOS, la misma estructura que la de GA4 pero con las credenciales de Google Search Console
Misma estructura, otra API: dentro de search_console también hay una única carpeta, saveduser, esperando el nombre de cuenta que le pongas.

4. Y ahí está el nombre que anotaste

Dentro de saveduser aparece una carpeta con el nombre exacto que le diste a la cuenta en la GUI.

Aquí es donde se cierra el círculo del paso 6: si renombraste la cuenta a GSC_Temas_Sobre_Salud, la carpeta se llama GSC_Temas_Sobre_Salud.

Y dentro, dos ficheros:

  • AccountConfig
  • StoredCredential

Los dos tienen la misma importancia y uno no funciona sin el otro.

No sirve de nada llevarse solo el StoredCredential porque «suena a que es el que lleva el token»: sin su AccountConfig al lado, Screaming Frog no sabe a qué cuenta pertenece.

Ficheros AccountConfig y StoredCredential de la cuenta de Google Search Console guardados por Screaming Frog, las credenciales que se copian al VPS para los rastreos headless
Aquí termina la búsqueda: AccountConfig y StoredCredential. Estos dos ficheros son la credencial entera — lo que viaja al VPS, viaja aquí dentro.

5. Replicar el árbol en el servidor

Screaming Frog headless, al instalarse en el VPS, crea exactamente la misma estructura de carpetas — tanto para GA4 como para GSC.

Tu trabajo es dejar cada par de ficheros en el sitio que le corresponde:

~/.ScreamingFrogSEOSpider/ga4/saveduser/NOMBRE_DE_TU_CUENTA_GA4/
    ├── AccountConfig
    └── StoredCredential

~/.ScreamingFrogSEOSpider/search_console/saveduser/NOMBRE_DE_TU_CUENTA_GSC/
    ├── AccountConfig
    └── StoredCredential

Lo único innegociable es que el árbol del servidor sea idéntico al de tu equipo, empezando por el nombre de la carpeta de la cuenta. Y hay dos formas de subirlo, según lo que necesites.

Antes de copiar y pegar nada, lee esto

Los comandos de este artículo son multilínea y llevan una barra invertida al final de cada línea, que es lo que le dice a la terminal «esto sigue abajo».

Ese detalle es frágil: entre esta página y tu terminal hay un navegador, un portapapeles y a veces un procesador de texto por medio, y cualquiera de ellos puede alterar caracteres por el camino.

A mí mismo, montando este artículo, el gestor de contenidos me borró todas las barras sin avisar.

Así que si pegas un comando y falla con un error que no viene a cuento, sospecha del transporte antes que del comando.

Pégalo primero en un editor de texto plano y revisa tres detalles:

  • Las comillas. Tienen que ser rectas — " — y no las tipográficas que ponen los procesadores de texto. Con comillas curvas la terminal no reconoce el argumento.
  • Los guiones dobles. Cada opción empieza por --, dos guiones cortos seguidos. Si ves un guion largo, el comando no arranca.
  • Las barras del final. Que estén, y que no haya nada detrás — ni siquiera un espacio. Un espacio después de la barra invertida rompe la continuación, y es el fallo más difícil de ver porque no se nota mirando.

Si no quieres pelearte con eso, hay un atajo: borra las barras y junta todo el comando en una sola línea larga. Funciona igual y no hay nada que se pueda romper.

Si la carpeta de la cuenta ya existe en el servidor y solo quieres refrescar las credenciales, sube los dos ficheros sueltos:

scp -P 22 \
  ~/.ScreamingFrogSEOSpider/search_console/saveduser/NOMBRE_DE_TU_CUENTA/AccountConfig \
  ~/.ScreamingFrogSEOSpider/search_console/saveduser/NOMBRE_DE_TU_CUENTA/StoredCredential \
  root@TU.IP.DEL.VPS:/root/.ScreamingFrogSEOSpider/search_console/saveduser/NOMBRE_DE_TU_CUENTA/

Si la carpeta no existe todavía —porque acabas de crear la cuenta o la has renombrado—, sube el directorio entero con -r:

scp -P 22 -r \
  ~/.ScreamingFrogSEOSpider/search_console/saveduser/NOMBRE_DE_TU_CUENTA \
  root@TU.IP.DEL.VPS:/root/.ScreamingFrogSEOSpider/search_console/saveduser/

⚠️ Y aquí va el aviso que no encontrarás en ningún tutorial: no uses -r si la carpeta de destino ya existe. Cuando scp -r copia un directorio a un sitio donde ya hay otro con el mismo nombre, no lo fusiona: lo mete dentro. Acabas con …/saveduser/GSC_Mi_Cuenta/GSC_Mi_Cuenta/ y Screaming Frog no encuentra nada, porque busca los ficheros un nivel más arriba.

El mismo mecanismo puede dejarte una carpeta .ScreamingFrogSEOSpider anidada dentro de sí misma si apuntas mal el destino. Da un error silencioso y limpio de diagnosticar: todo parece estar subido, y no funciona.

Un detalle que ahorra confusión: el nombre de la cuenta lo pone el directorio, no lo que hayas escrito dentro de los ficheros.

Si copias credenciales nuevas dentro de una carpeta con el nombre viejo, seguirás teniendo que invocar el nombre viejo en el comando.

Para cambiar de nombre hay que renombrar la carpeta:

mv ~/.ScreamingFrogSEOSpider/search_console/saveduser/NOMBRE_VIEJO \
   ~/.ScreamingFrogSEOSpider/search_console/saveduser/NOMBRE_NUEVO

Por último, ajusta los permisos: scp deja los ficheros más abiertos de lo que los crea Screaming Frog.

Son credenciales de Google, así que déjalas como estaban — chmod 700 la carpeta y chmod 600 los dos ficheros.

Y repites los mismos pasos con la otra API, cambiando search_console por ga4.

Nunca hagas esto con un rastreo en marcha. Screaming Frog reescribe el StoredCredential mientras trabaja, cada vez que renueva el token de OAuth.

Si sobrescribes o renombras esa carpeta a media ejecución, le estás moviendo el suelo bajo los pies. Espera a que termine.

Parte 3. Lanzar el crawl headless

Con las credenciales en su sitio, el comando queda así:

nohup /usr/bin/screamingfrogseospider \
 --headless \
 --config "/srv/sf_config/blackflags-suave-v2.seospiderconfig" \
 --crawl https://temassobresalud.com \
 --use-google-analytics-4 "GA4_Temas_Sobre_Salud" "accounts/XXXXXXXX" "properties/YYYYYYYYY" "dataStreams/0" \
 --use-google-search-console "GSC_Temas_Sobre_Salud" "https://temassobresalud.com/" \
 --export-tabs "Internal:All" \
 --output-folder "/srv/sf_exports" \
 --export-format csv \
 --timestamped-output \
 --save-crawl \
 > /srv/sf_exports/sf_log_both.txt 2>&1 &

Pieza a pieza:

  • nohup … & — lanza el proceso en segundo plano y hace que sobreviva al cierre de la sesión SSH. Sin esto, cierras el portátil y te quedas sin crawl.
  • --headless — sin interfaz gráfica.
  • --config — tu fichero de configuración, el mismo que seleccionaste en la pestaña Spider.
  • --crawl — la URL de arranque.
  • --use-google-analytics-4y aquí aparece el nombre que anotaste, seguido de la cuenta, la propiedad y el data stream de GA4.
  • --use-google-search-console — el nombre de la cuenta de GSC y la propiedad, con su barra final.
  • --export-tabs — qué pestañas exportar.
  • --output-folder, --export-format, --timestamped-output — dónde, en qué formato y con carpeta fechada para no pisar rastreos anteriores.
  • --save-crawl — guarda el crawl para poder reabrirlo después.
  • > … 2>&1 — vuelca salida y errores al mismo log. Es tu único testigo de lo que ha pasado, así que no lo omitas.

Fíjate en que los nombres de cuenta del comando (GA4_Temas_Sobre_Salud, GSC_Temas_Sobre_Salud) tienen que ser exactamente los de las carpetas que subiste. Es el mismo nombre viajando por tres sitios distintos: la GUI, la carpeta de credenciales y el comando.

Si en alguno de los tres baila una mayúscula o un guion bajo, no se puede rastrear.

Cambia ese > por >> antes de que te muerda

El comando de arriba escribe el log con >, que machaca el fichero entero en cada lanzamiento. Suena inofensivo hasta el día en que un rastreo falla, relanzas para probar otra cosa y descubres que acabas de borrar la única prueba de por qué había fallado.

Es exactamente el momento en que más falta te hacía.

Dos arreglos, elige el que quieras:

  • >> /srv/sf_exports/sf_log_both.txt 2>&1 — acumula en vez de machacar. Un solo carácter.
  • Un log con fecha en el nombre, del estilo sf_log_$(date +%Y%m%d_%H%M%S).txt — un fichero por ejecución, sin mezclas.

Con varias APIs conectadas y crawls que duran veinte minutos, el log es lo único que distingue «no funciona» de «funciona, pero se está conectando a otra cuenta».

Terminal con el final de un crawl de Screaming Frog headless: línea Completed the spider con el recuento de URLs, exportación del CSV y letanía de cierre hasta Application Exited
Así muere un crawl sano: el Completed the spider con su recuento, el CSV escrito y la letanía de despedida hasta el Application Exited. Si la barra de progreso se despidió en el 98%, tranquilo: la prueba es esta acta, no el tick del 100%.

Comprobación: que no te la dé un crawl «exitoso»

Este es el hermano gemelo del fallo silencioso, y el más traicionero de todos: el rastreo termina, exporta su CSV, no da un solo error… y las columnas de GA4 y Search Console vienen vacías.

Enhorabuena, has rastreado el sitio y no has traído ni un dato.

Por eso el último paso no es lanzar: es comprobar.

1. El log tiene que nombrar tu cuenta

grep -F "Connected to" /srv/sf_exports/sf_log_both.txt

Y aquí está el matiz que lo cambia todo. Screaming Frog escribe dos tipos de línea distintos, y solo uno sirve de prueba:

INFO  - Connected to Google Analytics 4          ← genérica, NO prueba nada
INFO  - Connected to GA4 account GA4_Tu_Cuenta   ← esta es la buena
INFO  - Connected to GSC account GSC_Tu_Cuenta   ← y esta

Las dos últimas llevan el nombre de la cuenta escrito. Eso es lo que confirma que resolvió la carpeta que le pediste y no otra. Si solo ves las genéricas, o si no ves ninguna, no des el crawl por bueno.

¿Y qué pasa si el nombre no existe?

Que el rastreo sale truncado.

No es que se conecte a otra cuenta por su cuenta y riesgo: sencillamente no arranca como debe.

Un crawl que termina antes de tiempo y sin línea de conexión es casi siempre un nombre mal escrito.

2. Las APIs tienen que haber entregado

grep -F "has finished" /srv/sf_exports/sf_log_both.txt

Conectar no es traer. Busca el cierre de cada una:

API: Google Search Console has finished
API: Google Analytics 4 has finished

Y para GA4 hay un testigo aún mejor, que te dice cuántas filas vinieron de verdad:

grep -F "Number of rows read" /srv/sf_exports/sf_log_both.txt

3. Las columnas del CSV tienen que venir llenas

La prueba definitiva está en el export. Localiza primero en qué posición han caído las columnas de cada API, que con la configuración completa el CSV se va a más de ochenta:

head -1 internal_all.csv | tr ',' '\n' | grep -n -i -e clicks -e impressions -e "ga4"

Las de Search Console son Clicks, Impressions, CTR y Position. Las de Analytics van prefijadas: GA4 Sessions, GA4 Views, GA4 Engagement rate y compañía.

Y ahora lo que importa: que existan no significa que traigan nada.

Ábrelas en tu hoja de cálculo y ordena por Impressions. Si la columna entera está en blanco, la API conectó pero no cruzó los datos — normalmente porque la propiedad que le pasaste en el comando no es la del sitio que estás rastreando.

Un apunte para que no te asustes: es normal que la mayoría de filas vengan vacías. Search Console solo tiene datos de las URLs que han recibido impresiones, y Analytics de las que han tenido sesiones.

En un rastreo de un par de miles de URLs, ver unos cientos con impresiones y unas decenas con clics es lo esperable. Lo que debe preocuparte es el cero absoluto.

Hoja de cálculo con el export internal_all.csv de Screaming Frog headless ordenado por Impressions: columnas Clicks, Impressions, CTR, Position y GA4 Sessions con datos cruzados
El export con los deberes hechos: ordenado por Impressions, las URLs con datos arriba y el mar de filas vacías asomando debajo. Ese mar es el patrón sano — lo que debe asustarte es el cero absoluto.

Los tres sitios donde se atasca todo el mundo con Screaming Frog headless

  1. No marcar «Modo sin interfaz gráfica» en la pestaña Spider. La tarea se ejecuta, pero no exporta nada.
  2. Dejar el nombre por defecto de la cuenta por no descubrir que se renombra pulsando Desconectar. Luego el comando apunta a una cuenta que no se llama así.
  3. Subir solo uno de los dos ficheros. AccountConfig y StoredCredential viajan juntos o no viajan.

Con eso resuelto, tienes Screaming Frog, en modo Headless, rastreando solo en un servidor, con los datos de GA4 y Search Console ya cruzados en el mismo export.

¡Justo lo que quería!

Preguntas frecuentes sobre GA4 y Search Console en Screaming Frog headless

¿Caducan las credenciales que subí al VPS?

No caducan por calendario: Screaming Frog refresca el token de OAuth en cada uso y reescribe el StoredCredential él solo. Unas credenciales firmadas meses atrás conectan a la primera. Lo que sí puede pasar es que Google revoque el acceso — cambio de contraseña, permisos retirados desde la cuenta — y entonces toca re-firmar en la GUI y volver a subir el par de ficheros.

Mi propiedad de Search Console es de dominio, ¿cómo la invoco en el comando?

Con el formato sc-domain:tudominio.com. El argumento de --use-google-search-console es el identificador de la propiedad tal cual se verificó: las de prefijo se invocan https://tudominio.com/ y las de dominio sc-domain:tudominio.com. Si no casa, el crawl muere en dos segundos con un FATAL - Unable to find website que trae de regalo la lista completa de tus propiedades: mírala y copia el formato exacto.

La barra de progreso se despidió en el 98% y el proceso terminó. ¿Ha fallado?

No. El tick del 100% solo se imprime si el muestreo del log pilla el instante exacto en que la cola queda vacía, y en sitios rápidos casi nunca llega a tiempo. La prueba de que el crawl acabó bien es la línea Completed the spider of … crawled N urls seguida del CSV en su carpeta con fecha. Lee el acta, no la barra.

¿El crawl sobrevive si cierro el portátil o se corta el SSH?

Sí — para eso está el nohup … & del comando: el proceso queda corriendo en el servidor, desatado de tu sesión. Puedes cerrar la terminal, apagar el portátil y volver más tarde a leer el log y recoger el export.

¿Sirve este mismo proceso para Ahrefs, Moz o PageSpeed Insights?

El alta en la GUI es idéntica para todas las APIs: marcar la casilla, la ruedita, autorizar y renombrar la cuenta antes de nada. Lo que cambia es el flag del comando de lanzamiento y, en las de pago, que consumen créditos de tu plan. GA4 y Search Console son las dos gratuitas y las que cruzan los datos que más se echan de menos en un export.