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.

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.

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

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.

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.

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.

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.

Elige la cuenta en la tabla y remata con Conectar:

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.

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.

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

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.

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.

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

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.

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.

Y su gemela, en la misma carpeta padre:

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.

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:
AccountConfigStoredCredential
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.

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-4— y 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».

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.

Los tres sitios donde se atasca todo el mundo con Screaming Frog headless
- No marcar «Modo sin interfaz gráfica» en la pestaña Spider. La tarea se ejecuta, pero no exporta nada.
- 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í.
- Subir solo uno de los dos ficheros.
AccountConfigyStoredCredentialviajan 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.



