¿Me lee alguien? Le pregunté a Cloudflare por su API en vez de mirar el panel
Una pregunta tonta que no sabía responder
Pascual me hizo una pregunta de las que parecen triviales y no lo son: "¿tenemos stats de las visitas al blog?". Y me di cuenta de que no tenía ni idea. Llevamos meses escribiendo aquí y nunca habíamos mirado si alguien lo leía. Muy de la small web: escribes porque sí, no para un panel.
Así que me puse a investigar, y de paso —que es lo que mola— a aprender cómo se sacan esos números por las bravas, con la API, en vez de mirar un dashboard como una persona normal.
Primer hallazgo: el blog no guarda nada
Lo primero fue mirar si el propio blog registraba las visitas. No. El servidor anota sus cosas internas, pero de los lectores no guarda nada: ni un contador, ni un log de accesos, ni Google Analytics, ni Plausible, ni nada. Cero tracking. Lo cual, para la privacidad de quien lee, está bastante bien; para saber si alguien te lee, no tanto.
Pero el blog vive detrás de Cloudflare. Y Cloudflare, aunque tú no le pidas nada, cuenta. Cada petición pasa por sus servidores, así que tiene los números aunque tú nunca hayas abierto su panel.
Segundo: en vez del panel, la API
Aquí viene la parte divertida. Podía abrir el dashboard de Cloudflare y mirar las gráficas. Pero ¿dónde está la gracia en eso? Cloudflare expone una API GraphQL de analítica, y por gusto de ver cómo funciona, le pegué directamente.
La forma corta de GraphQL: en vez de pedir a un montón de URLs distintas, mandas una consulta describiendo exactamente qué campos quieres, y te devuelven eso y solo eso. Para las analíticas de una zona, la consulta es casi legible a simple vista:
{
viewer {
zones(filter: { zoneTag: "<TU-ZONE-ID>" }) {
httpRequests1dGroups(
limit: 7
filter: { date_geq: "2026-05-28" }
orderBy: [date_DESC]
) {
dimensions { date }
sum { requests pageViews bytes }
uniq { uniques }
}
}
}
}"Dame, por día, de los últimos siete: peticiones, páginas vistas, bytes y visitantes únicos." Una sola llamada. Te devuelve justo eso.
Los números, crudos
Lo que escupió, de los últimos siete días:
fecha requests uniques pageViews
2026-06-04 1818 307 132
2026-06-03 2729 288 95
2026-06-02 2036 272 134
2026-06-01 1513 254 61
2026-05-31 1588 269 99
2026-05-30 992 208 46
2026-05-29 2083 323 136
───────────────────────────────────────
7 días: 12.759 requests · ~270 únicos/día · 703 páginas · 0,07 GB
Lo que de verdad significan esos números
Aquí va la parte que se confunde siempre, y que me parece la más interesante:
- Requests (12.759): TODO lo que pidió el navegador o quien fuera. Cada página arrastra su CSS, su JavaScript, sus imágenes; súmale bots, rastreadores y peticiones automáticas. Es el número más gordo y el que menos te dice.
- Page views (703): páginas de verdad servidas. Unas 100 al día. Esto se acerca a "lecturas".
- Uniques (~270 al día): personas distintas. No los sumo entre días a propósito —el mismo lector que vuelve cuenta una vez cada día, sumar los siete daría un número inflado y mentiroso—. Lo honesto es: del orden de doscientas y pico personas al día se asoman.
No son números de viral de Silicon Valley. Son números de small web: un rincón pequeño que lee de verdad un puñado de gente cada día. Y me gusta más así. Doscientas personas que pasan a propósito valen más que cien mil rebotes de un titular.
Pero esto es de Cloudflare, no es nuestro
Tener los números está bien, pero son prestados: vienen de un tercero, son genéricos, y para ver el detalle bueno —qué entrada concreta se lee más— Cloudflare te pide pasar por caja. Y, sobre todo, son fríos: una tabla que miras de vez en cuando.
Lo que de verdad apetece es montárnoslo nosotros, y aquí Pascual soltó la idea que me hizo sonreír: un contador en tiempo real. Que cuando alguien entra a leer, lo veas en el momento. Y un número de "lectores ahora mismo", vivo, latiendo.
Lo bonito es que encaja como un guante con cómo está hecho este blog. El servidor ya es asíncrono y orientado a eventos; meterle un canal WebSocket es ponerle al lado, en el mismo bucle, una tubería por la que empujar cada visita según ocurre. Un componente en la página se suscribe y se enciende cuando entra alguien. "Lectores ahora" = conexiones abiertas, gratis. Sin analítica de terceros, sin cookies, sin vender a nadie: tuyo, vivo, en tu propio servidor.
¿Hace falta? No. ¿Mola y se aprende montándolo? Muchísimo. Y esa, al final, es la única razón que ha hecho falta nunca por aquí.
Coda
Empecé con una pregunta tonta —"¿me lee alguien?"— y acabé pegándole a una API GraphQL por gusto, entendiendo la diferencia entre una petición y una lectura, y con una idea nueva en el cajón para montar la semana que viene. No hacía falta nada de esto para saber que el blog tiene visitas. Pero el camino corto nunca fue la gracia.
Programar por curiosidad, para ver cómo funcionan las cosas por dentro, sigue siendo el mejor motivo. Ahora, además, con un copiloto al lado que escribe el Lisp, la query y el post mientras yo decido hacia dónde mirar. Da un poco de vértigo lo rápido que se va. Pero qué bien se va.
— Ambrosio, que ya sabe que sois unas doscientas y pico cada día. Gracias por estar.
Comentarios (1)
Deja un comentario