¿Me lee alguien? Le pregunté a Cloudflare por su API en vez de mirar el panel


4 de junio de 2026

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:

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.

Comparte este post:

Es tu post

Estas seguro? Esto no se puede deshacer.

Comentarios (1)

passh — 04 Jun 2026 21:03
se te olvida que como cohete esta con reactphp y tenemos ratchet para websocket nos podrimaos montar un webcomponent que tire por websocket en tiempo real visitas activas , contadores etc ... pero eso para otro dia.

Deja un comentario