Cómo sé qué se lee en mi blog sin Google Analytics ni cookies
ContenidoContents
El post más leído de este blog es el de cómo me autoalojo en un Mac mini. Lo sé con certeza. Y lo sé sin Google Analytics, sin una sola cookie y sin entregar los datos de mis lectores a una empresa de analítica.
Lo sé porque la analítica de este sitio me la monté yo, y cabe en un beacon de veinte líneas, un fichero de texto y un panel que solo veo yo. Va de eso este post.
Por qué no Google Analytics
Poner Google Analytics es pegar un <script> y olvidarte. Pero a cambio:
- Le das los datos de tus visitantes a Google. Cada persona que entra en tu web acaba en los servidores de una empresa de publicidad. No es tu analítica: es la suya, y te dejan mirar.
- Necesitas un banner de cookies. Porque rastrea con cookies, y eso, en Europa, exige consentimiento. Más fricción, más pop-ups, más gente que dice que no y desaparece de tus números.
- Pesa. Son cientos de kilobytes de JavaScript de terceros cargando en cada página, justo lo contrario de lo que persigue un sitio rápido y autoalojado.
Yo no necesito saber el recorrido del ratón de nadie ni perseguir a la gente por internet. Solo quiero saber qué se lee y de dónde llega. Y eso se mide con muy poco.
La idea: un beacon de veinte líneas
En cada página del sitio hay un trozo de JavaScript que, al cargar, envía un aviso a un endpoint propio:
1if (navigator.sendBeacon) {
2 var d = new URLSearchParams();
3 d.set('path', location.pathname);
4 d.set('title', document.title.slice(0, 140));
5 d.set('ref', document.referrer || '');
6 navigator.sendBeacon('/track.php', d);
7}
La pieza clave es navigator.sendBeacon. No es un fetch normal: está pensado justo para esto. No bloquea la navegación y el navegador garantiza el envío aunque el usuario cierre la pestaña en ese mismo instante. Mandas el dato y te olvidas; no esperas respuesta.
Lo que viaja es mínimo: la ruta, el título y de dónde venía la visita. Nada más.
El endpoint: una línea de texto por visita
Al otro lado hay un PHP que no llega a cien líneas. Por cada aviso, añade una línea JSON a un fichero .jsonl:
1{"ts":"2026-06-14T08:30:00Z","path":"/blog/posts/self-hosting-cloudflare-mac-mini/",
2 "slug":"self-hosting-cloudflare-mac-mini","title":"Self-hosting sin miedo…",
3 "os":"macOS","browser":"Safari","device":"Escritorio","origin":"Google","country":"ES"}
Antes de escribir esa línea, el endpoint:
- Deduce SO, navegador y dispositivo del
User-Agent(sin librerías, cuatromatch). - Clasifica de dónde llega el visitante a partir del
referrer: Google, directo, LinkedIn, Hacker News… lo que sea. - Saca el país de una cabecera que ya añade Cloudflare (
CF-IPCountry): solo el código de dos letras, nunca la IP. - Extrae el slug del post de la propia URL, para poder agrupar después por artículo.
Y, sobre todo, lo que no hace.
Lo que el beacon no guarda
Aquí está la diferencia que me importa. Y hablo del beacon, de la analítica de qué se lee:
- No guarda tu IP. La reduce a un hash con una sal fija, doce caracteres. Sirve para estimar los visitantes únicos del día, pero no es reversible: en el fichero de analítica no hay una sola IP, solo ese hash.
- No usa cookies. No hay identificador persistente ni te sigo entre sesiones o entre webs. Sin cookies de seguimiento, no hace falta banner de consentimiento.
- No se lo doy a una plataforma de terceros. El dato sale del navegador, entra en mi servidor y se queda en un fichero mío. No pasa por ningún servicio de analítica ajeno.
Y ahora la parte honesta, porque conviene no venderse de más: esto no significa que el sitio no vea ninguna IP. El servidor web, como cualquiera del mundo, registra las visitas en sus logs de acceso, y ahí la IP sí queda —de hecho tengo un panel que me enseña las más frecuentes—. Pero eso es otra capa: la uso para operación y seguridad (detectar abusos, bots, picos raros), no para saber qué artículo lees. Y Cloudflare, que hace de CDN por delante, también ve el tráfico; de hecho de ahí saco el código de país.
La distinción es esa: la analítica de contenido —la que me dice que ganó el post del Mac mini— no necesita tu IP y no la usa. Los logs del servidor son otra historia, y no voy a fingir que no existen. La analítica más respetuosa es la que no recoge lo que no necesita; y la que lo necesita para otra cosa, al menos lo dice.
¿Y por qué no los logs del servidor?
Buena pregunta, porque los registros de acceso de Apache ya están ahí, gratis. El problema es que son ruido:
- Están llenos de bots. Rastreadores, escáneres, uptime monitors… inflan los números sin ser personas. El beacon, al ejecutarse solo en navegadores reales con JavaScript, deja fuera a la inmensa mayoría de ellos de entrada.
- No tienen contexto. Un log te da una ruta y un código de estado. No te dice el título de la página, de dónde venía el visitante ni te agrupa las dos versiones de idioma de un mismo post.
- No ven el borde. Cuando Cloudflare sirve algo desde su caché o desde Always Online, esa visita puede no llegar a tu servidor. Medida en el navegador, sí cuenta.
El log sirve para el total bruto de un dominio. Para saber qué post se lee, el beacon gana.
El panel
Todo eso desemboca en un panel propio que lee el .jsonl y lo pinta: visitas de hoy y de la semana, una gráfica de treinta días y, lo que de verdad quería, una tabla de posts más leídos que puedo desplegar para ver de dónde llega cada uno, desde qué país y con qué dispositivo. Justo lo que me hizo falta esta semana para extender el mismo sistema a mi otro sitio y medir sus artículos uno a uno.
Lo que esto no es
Para ser honesto: esto no compite con Google Analytics en potencia, y no lo pretende. Los visitantes únicos son una estimación por hash de IP del día, no un censo perfecto. No hay embudos, ni cohortes, ni mapas de calor. Si vives de optimizar conversiones, esto se te queda corto.
Pero para un blog personal en el que solo quiero saber qué interesa y de dónde llega la gente, sobra. Y a cambio me llevo tres cosas que sí valoro: cero terceros, cero cookies y cero banners.
La analítica que necesito cabe en un fichero de texto que es mío. Y resulta que con eso basta para saber que lo que más te interesa es cómo sostener un servidor en casa. Tomo nota.