seo_gsc: cobertura por delante del CTR, y arreglar el aviso duplicado

Recalibrado contra los datos reales del primer día, que desmintieron dos
supuestos del diseño.

El umbral de 150 impresiones dejaba fuera TODO: el mejor caso de los dos
blogs eran las 125 de Varginha en EN. El vigilante se habría callado para
siempre, la peor avería en algo que solo habla cuando hay noticias. Baja a
40, y entre 40 y 150 las líneas salen marcadas con «~» porque ahí el CTR es
orientativo, no firme.

Y el CTR no es la palanca a este volumen: con ~180 impresiones semanales en
EN, convertir el 10% de todas serían 78 clics al mes. El informe pasa a
liderar con cobertura — impresiones, páginas que reciben alguna, consultas
distintas, posición ponderada, y qué páginas empiezan o dejan de aparecer —
y avisa también cuando eso se mueve (±25% de impresiones o ±3 páginas), no
solo cuando hay CTR desperdiciado.

De propina, un fallo que solo se vio ejecutando el servicio dos veces
seguidas: avisaba las dos. Las listas nuevas ordenan un set de URLs por
impresiones y los empates los desempataba el orden de iteración del
conjunto, que Python aleatoriza por proceso; la huella cambiaba sin que
cambiara un solo dato. Todas las ordenaciones llevan ya desempate por
clave. Verificado: mismo texto con PYTHONHASHSEED 1, 2 y 3, y la segunda
ejecución del servicio se calla.
This commit is contained in:
ChemaVX
2026-07-28 06:12:40 +00:00
parent 33b24f33c7
commit 4609a21f21
2 changed files with 122 additions and 28 deletions
+41 -12
View File
@@ -93,24 +93,53 @@ seo-gsc antes-despues --corte 2026-06-23 --dias 28
## Qué mira el informe
- **Movimiento** de clics, impresiones y CTR contra el periodo anterior.
- **Páginas que posicionan y no se pinchan.** Es la lista que importa: si algo
está en posición 6 con 2.400 impresiones y 0,16% de CTR, no tiene un problema
de posicionamiento, tiene un problema de titular. Cada línea estima los clics
que faltan si el CTR fuese el normal de esa posición.
- **Consultas con impresiones y cero clics**, que son temas donde ya salimos y
no convencemos.
Primero **cobertura**, que es la métrica principal:
- **Impresiones, páginas que reciben alguna y consultas distintas**, contra el
periodo anterior, más la **posición media ponderada** (ojo al signo: subir es
empeorar).
- **Páginas que empiezan a aparecer** y **páginas que han dejado de aparecer**.
En un sitio joven eso *es* la noticia: que un artículo entre en el índice útil
importa más que dos décimas de CTR.
Después **conversión**:
- **Páginas que posicionan y no se pinchan.** Cada línea estima los clics que
faltan si el CTR fuese el normal de esa posición.
- **Consultas donde salimos y no nos pinchan.**
El CTR "normal" sale de una curva de referencia del sector, no de una medición
nuestra: **sirve para ordenar candidatas, no para prometer tráfico**. Solo se
avisa por encima de 150 impresiones, porque por debajo el CTR es ruido.
nuestra: **sirve para ordenar candidatas, no para prometer tráfico**.
### Por qué la cobertura va primero
Al estrenar la herramienta con datos reales (2026-07-28) el suelo, ya sin el
pico de mayo, era de ~180 impresiones semanales en EN y ~40 en ES, con 0-1
clics. Con esas cifras el CTR no es la palanca: **aunque convirtiéramos el 10%
de todas las impresiones de EN serían unos 78 clics al mes**. El techo lo pone
cuánta gente nos ve.
Los datos también dijeron dónde está el problema de verdad — posicionamos en el
top-10 de cadenas hiperespecíficas que no busca nadie (`341.roswell.41`) y en la
página 5-7 de los términos que la gente escribe (`betty and barney` en 55,
`roswell 1947` en 52,8). Eso es autoridad de dominio, no titulares.
### El umbral, y por qué se bajó a 40
El primer intento usaba 150 impresiones, razonable para un sitio con tráfico.
Con datos delante, **nada** lo pasaba: el mejor caso era Varginha en EN con 125.
El vigilante se habría callado para siempre, que es la peor avería posible en
algo que solo habla cuando hay noticias. Ahora el corte está en 40 y las líneas
por debajo de 150 salen marcadas con `~`: orientativas, no firmes.
## Automático
`seo-gsc-watch.timer` — lunes 06:15 UTC: descarga y manda el informe por
Telegram, pero **solo si hay páginas desperdiciadas y el informe ha cambiado**
desde el último aviso. Misma disciplina que `seo-watch`: si no hay nada que
decir, se calla.
Telegram, pero **solo si hay algo que contar y el informe ha cambiado** desde el
último aviso. Misma disciplina que `seo-watch`: si no hay nada que decir, se
calla. Hay algo que contar si aparecen páginas desperdiciadas **o si la
cobertura se ha movido** — un ±25% de impresiones o ±3 páginas que reciben
alguna.
```bash
systemctl status seo-gsc-watch.timer