---
title: "Plausible Analytics para Astro con Cloudflare Workers"
description: "Haz proxy de Plausible Analytics a través de Cloudflare Workers en tu sitio Astro. Configuración gratuita con 100.000 solicitudes/día que evita los bloqueadores de anuncios para obtener estadísticas de visitantes reales y precisas."
date: 2023-12-07
categories: ["web-development"]
tags: ["astro","plausible","cloudflare-workers"]
---

import { Picture } from "astro:assets";
import Notice from "@components/widgets/Notice.astro";
import ListCheck from "@components/widgets/ListCheck.astro";
import Tabs from "@components/widgets/Tabs.astro";
import Tab from "@components/widgets/Tab.astro";
import Accordion from "@components/widgets/Accordion.astro";
import Button from "@components/widgets/Button.astro";
import imag1 from "@assets/images/23/12/create-worker.png";
import imag2 from "@assets/images/23/12/deploy-worker.png";
import imag3 from "@assets/images/23/12/cf-worker-edit-code.png";
import imag4 from "@assets/images/23/12/worker-code.png";
import imag5 from "@assets/images/23/12/worker-routes.png";

import YouTubeEmbed from "@components/widgets/YouTubeEmbed.astro";

[Plausible Analytics](https://plausible.io/) es una alternativa a Google Analytics de código abierto y centrada en la privacidad. Es ligera (script de menos de 1 KB), no usa cookies y no rastrea datos personales. Con más de 19.000 suscriptores de pago y 260.000 millones de páginas vistas registradas, es la herramienta de analítica centrada en la privacidad más popular entre los desarrolladores.

Puedes autoalojar Plausible en tus propios servidores. Consulta [Instalar Plausible con un clic](/es/instalar-plausible-analytics/) para una configuración rápida, o usa uno de los [mejores paneles de servidores autoalojados](/es/mejores-paneles-autoalojados/) para un despliegue sencillo.

[Astro](https://astro.build/) es un framework web construido para la velocidad, y ahora se ejecuta de forma nativa en Cloudflare. Tras la [adquisición de Astro por Cloudflare en enero de 2026](https://blog.cloudflare.com/astro-joins-cloudflare/), el adaptador `@astrojs/cloudflare` eliminó por completo el soporte para Pages. Desde la v13, los despliegues se hacen exclusivamente en Cloudflare Workers. Puedes [desplegar tu sitio Astro en Cloudflare](/es/desplegar-astrojs-cloudflare/) o [crear un blog gratis con Astro y Cloudflare](/es/crear-blog-astro-gratis/) para empezar. Para un análisis más profundo de los frameworks disponibles, consulta la [comparativa Astro vs Next.js vs TanStack Start](/es/astro-vs-nextjs-vs-tanstack-start-cual-gana/).

En esta guía vas a configurar Plausible Analytics para tu sitio Astro usando Cloudflare Workers como proxy. El resultado: analítica precisa que evita los bloqueadores de anuncios, servida desde tu propio dominio y con un plan gratuito.

<ListCheck>
  <ul>
    <li>Registra datos reales de visitantes sin interferencia de bloqueadores de anuncios</li>
    <li>Sirve los scripts de Plausible a través de tu propio dominio mediante Cloudflare Workers</li>
    <li>Configuración gratuita (100.000 solicitudes/día en el plan gratis de Cloudflare)</li>
    <li>Funciona con Plausible Cloud o con Plausible Community Edition autoalojado</li>
  </ul>
</ListCheck>

## ¿Por qué hacer proxy de Plausible Analytics a través de Cloudflare Workers?

Los bloqueadores de anuncios y los navegadores centrados en la privacidad bloquean habitualmente las solicitudes a `plausible.io`. Esto puede hacerte perder entre el 20 y el 30 % de tus datos de analítica. Si usas herramientas como [NextDNS](https://go.bitdoze.com/nextdns) o bloqueadores de anuncios en el navegador en tus propios dispositivos, ya sabes lo agresivos que son bloqueando scripts de analítica.



<YouTubeEmbed
  url="https://www.youtube.com/embed/EJtSVbqyXWU"
  label="Hacer proxy de Plausible a través de Cloudflare Workers"
/>
Un proxy resuelve esto enrutando las solicitudes de Plausible a través de tu propio dominio. Para los navegadores de tus visitantes, el script de analítica parece parte de tu sitio, no un rastreador de terceros. Los bloqueadores de anuncios no pueden distinguirlo del tráfico normal del sitio.

<Notice type="info" title="Funciona con cualquier sitio estático">
Este enfoque de proxy funciona con cualquier generador de sitios estáticos o framework, no solo con Astro. Hugo, Next.js, Eleventy, HTML puro. Si puedes añadir una etiqueta script en el head, puedes usar esta configuración. El Cloudflare Worker se encarga del proxy independientemente de tu herramienta de build.
</Notice>

Para más información sobre cómo bloquear anuncios y rastreadores a nivel de DNS, consulta [cómo bloquear anuncios y rastreo con protección DNS](/es/bloquear-anuncios-malware-dns/).

## ¿Por qué usar Cloudflare Workers en lugar de redirecciones?

Si despliegas en Cloudflare Pages, podrías pensar que puedes usar el archivo `_redirects` para hacer proxy de las solicitudes de Plausible. No puedes. Cloudflare Pages solo admite redirecciones a rutas relativas. No puede hacer proxy hacia URLs externas.

Intentar añadir una redirección de proxy como esta fallará:

```sh
Found invalid redirect lines:
09:59:12.187	  - #1: /js/script.js https://domain.com/js/plausible.outbound-links.js 200
09:59:12.187	    Proxy (200) redirects can only point to relative paths. Got https://domain.com/js/plausible.outbound-links.js
09:59:12.187	  - #2: /api/event https://domain.com/api/event 200
09:59:12.187	    Proxy (200) redirects can only point to relative paths. Got https://domain.com/api/event
```

Los Cloudflare Workers no tienen esta limitación. Pueden hacer fetch a cualquier URL externa y devolver la respuesta, lo que los convierte en la herramienta adecuada para hacer proxy de Plausible en Cloudflare.

## Hacer proxy de Plausible a través de Cloudflare Workers (paso a paso)

Cloudflare Workers ofrece un plan gratuito con 100.000 solicitudes al día. Es más que suficiente para la mayoría de los sitios. Todo lo que necesitas es una cuenta gratuita de Cloudflare.

<Notice type="success" title="El plan gratuito es suficiente">
El plan gratuito de Cloudflare Workers incluye 100.000 solicitudes/día. Un sitio típico que carga el script de Plausible una vez por página vista se mantendrá cómodamente dentro de este límite.
</Notice>

### Paso 1: Crea un Worker

Ve a la sección **Workers & Pages** de tu panel de Cloudflare y haz clic en **Create application**. Luego haz clic en **Create Worker** en la pestaña Workers. Dale a tu worker un nombre que no sugiera analítica. Algo como `theme-assets` o `cdn-helper` funciona bien. Haz clic en **Deploy**.

**Crear Cloudflare Worker:**

<Picture formats={["webp"]} fallbackFormat="webp"
  src={imag1}
  alt="Crear Cloudflare Worker"
/>

**Desplegar Cloudflare Worker:**

<Picture formats={["webp"]} fallbackFormat="webp"
  src={imag2}
  alt="Desplegar Cloudflare Worker"
/>

### Paso 2: Añade el código del Worker (ES Modules)

Haz clic en **Edit Code**, borra el código por defecto y sustitúyelo por el código de abajo.

<Notice type="info" title="La sintaxis de Service Worker está obsoleta">
Cloudflare ha marcado como obsoleta la sintaxis antigua `addEventListener('fetch', ...)`. El código de abajo usa el formato recomendado de ES Modules. Si actualizas desde una configuración anterior, reemplaza todo el script del worker.
</Notice>

<Tabs>
  <Tab name="Proxy en la nube (Plausible.io)">
    Usa esta versión si estás en el servicio cloud alojado de Plausible.

```js
// Sustituye 'pa-XXXXX.js' por el ID de script específico de tu sitio
// Lo encuentras en Plausible: Site Settings → General → Data Snippets
const ProxyScript = 'https://plausible.io/js/pa-XXXXX.js';
const ScriptPath = '/theone/script';
const Endpoint = '/theone/event';

export default {
  async fetch(request, env, ctx) {
    ctx.passThroughOnException();
    const url = new URL(request.url);
    const pathname = url.pathname;

    if (pathname.startsWith(ScriptPath)) {
      return getScript(request, ctx);
    } else if (pathname === Endpoint) {
      return postData(request);
    }

    return new Response(null, { status: 404 });
  }
}

async function getScript(request, ctx) {
  let response = await caches.default.match(request);
  if (!response) {
    response = await fetch(ProxyScript);
    ctx.waitUntil(caches.default.put(request, response.clone()));
  }
  return response;
}

async function postData(request) {
  const req = new Request(request);
  req.headers.delete('cookie');
  return await fetch('https://plausible.io/api/event', req);
}
```

Sustituye `pa-XXXXX.js` por el ID de script específico de tu sitio. Lo encuentras en tu panel de Plausible en **Site Settings → General → Data Snippets**. El segmento de ruta `theone` puede ser lo que quieras. Solo mantenlo igual en `ScriptPath` y `Endpoint`.

  </Tab>
  <Tab name="Autoalojado (Plausible CE)">
    Usa esta versión si ejecutas Plausible Community Edition en tu propio servidor.

```js
// Sustituye por tu dominio de Plausible autoalojado
const ProxyScript = 'https://plausible.yourdomain.com/js/pa-XXXXX.js';
const ScriptPath = '/theone/script';
const Endpoint = '/theone/event';

export default {
  async fetch(request, env, ctx) {
    ctx.passThroughOnException();
    const url = new URL(request.url);
    const pathname = url.pathname;

    if (pathname.startsWith(ScriptPath)) {
      return getScript(request, ctx);
    } else if (pathname === Endpoint) {
      return postData(request);
    }

    return new Response(null, { status: 404 });
  }
}

async function getScript(request, ctx) {
  let response = await caches.default.match(request);
  if (!response) {
    response = await fetch(ProxyScript);
    ctx.waitUntil(caches.default.put(request, response.clone()));
  }
  return response;
}

async function postData(request) {
  const req = new Request(request);
  req.headers.delete('cookie');
  return await fetch('https://plausible.yourdomain.com/api/event', req);
}
```

Sustituye `plausible.yourdomain.com` por tu dominio real de Plausible autoalojado, y `pa-XXXXX.js` por el ID de script específico de tu sitio.

  </Tab>
</Tabs>

<Notice type="info" title="Optimización de rendimiento (opcional)">
Puedes reducir la latencia del proxy de ~140 ms a ~9 ms devolviendo una respuesta 202 inmediata y reenviando el evento de forma asíncrona. En la función `postData`, sustituye el `return` final por `ctx.waitUntil(fetch(...))` y devuelve un `new Response('OK', { status: 202 })`. Nota: algunos usuarios han reportado problemas con el acceso al stream de la solicitud después de enviar la respuesta, así que pruébalo con cuidado.
</Notice>

**Editar Worker:**

<Picture formats={["webp"]} fallbackFormat="webp"
  src={imag3}
  alt="Editar Cloudflare Worker"
/>

**Añadir código:**

<Picture formats={["webp"]} fallbackFormat="webp"
  src={imag4}
  alt="Añadir código al Cloudflare Worker"
/>

Una vez añadido el código, haz clic en **Save and Deploy** arriba a la derecha.

### Paso 3: Verifica que el Worker funciona

Prueba tu worker accediendo a él directamente:

```sh
https://your-worker-name.your-cloudflare-username.workers.dev/theone/script
```

Deberías ver código JavaScript como respuesta (el script de Plausible). Si obtienes un 404, comprueba que la variable `ScriptPath` de tu worker coincide con la ruta de URL que estás probando.

### Paso 4: Ejecuta el proxy como un subdirectorio

Ejecutar el proxy bajo un subdirectorio de tu dominio principal (p. ej., `example.com/theone/`) es mejor que usar un subdominio separado. Mantiene las solicitudes como first-party, lo que evita restricciones de cookies y se ve más limpio en los logs de red.

Para configurarlo, añade una ruta de Worker en la sección **Routes** de los ajustes de tu Worker:

**Route**: `*example.com/theone/*`

Sustituye `theone` por el segmento de ruta que elegiste en el código del worker. Selecciona tu dominio en el desplegable de zona.

<Picture formats={["webp"]} fallbackFormat="webp"
  src={imag5}
  alt="Añadir ruta al Cloudflare Worker"
/>

### Paso 5: Añade el snippet de Plausible a tu sitio Astro

<Notice type="warning" title="El formato del snippet ha cambiado">
El antiguo formato `data-domain` / `data-api` está obsoleto. Plausible ahora usa un script específico por sitio (`pa-XXXXX.js`) con una llamada `plausible.init()` para el endpoint. Usa el formato de abajo.
</Notice>

Añade este snippet al `<head>` de tu sitio Astro. En Astro, puedes colocarlo en tu archivo de layout principal (p. ej., `src/layouts/Layout.astro`):

```html
<script async src="https://yourdomain.com/theone/pa-XXXXX.js"></script>
<script>
  window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)};
  plausible.init=plausible.init||function(i){plausible.o=i||{}};
  plausible.init({
    endpoint: "https://yourdomain.com/theone/event"
  })
</script>
```

Sustituye lo siguiente:
- **`yourdomain.com`**: el dominio real de tu sitio
- **`theone`**: la ruta del subdirectorio que configuraste en los pasos 2 y 4
- **`pa-XXXXX.js`**: el ID de script específico de tu sitio en Plausible (Site Settings → General → Data Snippets)

La URL de `endpoint` debe coincidir con la variable `Endpoint` de tu Worker, y el `src` del script debe coincidir con `ScriptPath`. La URL del script pasa por tu Worker (que sirve el script de Plausible en caché), y la URL del endpoint enruta los eventos de analítica a través de tu Worker hacia la API de Plausible.

Ya deberías tener Plausible Analytics funcionando a través de Cloudflare Workers, servido desde tu propio dominio.

## Precios de Plausible (2025)

Plausible ofrece varios niveles en la nube. Todos los planes incluyen las funciones de analítica principales: páginas vistas, visitantes, tasa de rebote, duración de la visita, fuentes de referencia y más.

| Plan | Precio | Páginas vistas | Sitios | Funciones destacadas |
|------|--------|----------------|--------|----------------------|
| Starter | $9/mes | 10.000 | 1 | Analítica básica |
| Growth | $14/mes | 10.000 | 3 | 3 miembros de equipo |
| Business | $19/mes | 10.000 | 10 | Embudos, objetivos de ingresos, Stats API |
| Enterprise | Personalizado | Personalizado | Personalizado | SSO, Sites API, Managed Proxy |

Hay niveles de páginas vistas superiores disponibles en cada plan. El plan **Enterprise** incluye un [Managed Proxy](https://plausible.io/docs/proxy/guides/cloudflare) donde Plausible gestiona el proxy por ti mediante un registro CNAME. No necesitas Worker.

Si quieres evitar por completo los precios de la nube, la Community Edition es gratuita.

## Plausible Community Edition vs Cloud

Plausible Community Edition (CE) es una versión gratuita y autoalojada bajo licencia AGPL. Sigue un modelo open-core. CE incluye el motor de analítica principal, pero algunas funciones avanzadas son exclusivas de los planes Business y Enterprise de la nube.

<Tabs>
  <Tab name="Plausible Cloud">
    **Ventajas:**
    - Totalmente gestionado, sin servidor que mantener
    - Todas las funciones, incluidos embudos, objetivos de ingresos y SSO
    - Opción de Managed Proxy (plan Enterprise)
    - Actualizaciones y parches de seguridad automáticos
    - Stats API V2 para integraciones personalizadas

    **Desventajas:**
    - Coste mensual desde $9/mes
    - Datos almacenados en la infraestructura de Plausible
  </Tab>
  <Tab name="Plausible Community Edition">
    **Ventajas:**
    - Completamente gratis, autoalojado
    - Control total sobre tus datos
    - Licencia AGPL, código abierto
    - Funciones de analítica principales incluidas

    **Desventajas:**
    - Sin embudos, objetivos de ingresos ni SSO
    - Requiere un servidor autogestionado
    - Actualizaciones y mantenimiento manuales
    - Sin opción de Managed Proxy

    Si autoalojas Plausible CE, proveedores de VPS asequibles como [Hetzner Cloud](https://go.bitdoze.com/hetzner) o [Hostinger VPS](https://go.bitdoze.com/hostinger-vps) ofrecen un rendimiento sólido para ejecutar tu instancia. Consulta [Instalar Plausible con un clic](/es/instalar-plausible-analytics/) para las instrucciones de despliegue.
  </Tab>
</Tabs>

_Los precios de los VPS subieron en general en 2026: si estás reconsiderando un servidor alquilado, mira [qué cambió y cuándo gana un mini PC](/es/subidas-precios-vps/)._

<Accordion label="¿Puedo usar este proxy de Cloudflare Worker con Plausible CE?" group="faq" expanded="true">
Sí. El código del Worker es el mismo. Solo cambias la URL de `ProxyScript` y la URL del fetch en `postData` para que apunten a tu dominio de Plausible autoalojado en lugar de `plausible.io`. Usa la pestaña "Autoalojado (Plausible CE)" del paso 2 para el código correcto.
</Accordion>

## Solución de problemas comunes

<Accordion label="Los datos de analítica no aparecen" group="faq" expanded="true">
Abre las herramientas de desarrollo de tu navegador (pestaña Red) y recarga tu sitio. Busca solicitudes a tu ruta de subdirectorio (p. ej., `/theone/script` y `/theone/event`). Si la solicitud del script devuelve 200 pero la del evento falla, comprueba que la URL de `endpoint` de tu snippet coincide exactamente con la variable `Endpoint` del Worker. Si no aparece ninguna de las dos solicitudes, verifica que el snippet está en el `<head>` y que no lo bloquean las cabeceras Content-Security-Policy.
</Accordion>

<Accordion label="El Worker devuelve 404" group="faq">
Verifica que el patrón de ruta del Worker coincide con tu subdirectorio. La ruta debe ser `*example.com/theone/*` (fíjate en el `/*` final). Comprueba también que las variables `ScriptPath` y `Endpoint` del código del Worker coinciden con las rutas de tu snippet. Asegúrate de que el Worker está desplegado (no solo guardado como borrador).
</Accordion>

<Accordion label="Errores de CORS en la consola" group="faq">
Como el proxy se ejecuta en tu propio dominio, las solicitudes deberían ser same-origin y CORS no debería activarse. Si ves errores de CORS, lo más probable es que la ruta del Worker esté mal configurada. Puede que las solicitudes lleguen a Plausible directamente en lugar de pasar por el Worker. Revisa el patrón de ruta y asegúrate de que las URLs del snippet apuntan a tu dominio, no a `plausible.io`.
</Accordion>

<Accordion label="El panel de Plausible muestra 0 visitantes" group="faq">
Primero, verifica que estás mirando el sitio correcto en tu panel de Plausible. Si cambiaste recientemente al nuevo formato de snippet, asegúrate de que el antiguo snippet `data-domain` está completamente eliminado. Tener ambos puede causar conflictos. Comprueba también que tu propio navegador no esté bloqueando las solicitudes durante las pruebas (desactiva el bloqueador de anuncios para tu propio dominio).
</Accordion>

## Novedades de Plausible desde 2023

Plausible ha lanzado muchas funciones desde que se publicó este artículo. Estas son las más destacadas:

<ListCheck>
  <ul>
    <li>Seguimiento automático de la profundidad de scroll (sin configuración)</li>
    <li>Canal de tráfico de asistentes de IA: registra visitas desde ChatGPT, Claude, Gemini y Perplexity</li>
    <li>User Journeys: visualiza cómo navegan los visitantes por tu sitio</li>
    <li>Seguimiento automático de envíos de formularios (activable)</li>
    <li>Objetivos de ingresos y atribución de ecommerce (plan Business)</li>
    <li>Embudos para análisis de conversión de varios pasos (plan Business)</li>
    <li>Stats API V2 con consultas más sencillas y soporte multidimensional</li>
    <li>Integración con Search Console: datos de palabras clave en tu panel</li>
    <li>Importación desde Google Analytics (tanto UA como GA4)</li>
    <li>Alertas de caída de tráfico por email o Slack</li>
    <li>Mejoras de seguridad con 2FA y SSO</li>
    <li>Métrica "Tiempo en la página" mejorada, basada en señales de interacción</li>
    <li>Formato de script específico por sitio (`pa-XXXXX.js`) que reemplaza al genérico `script.js`</li>
  </ul>
</ListCheck>

Si también estás trabajando en el rendimiento de tu sitio Astro, consulta [cómo optimizar la velocidad de build de Astro](/es/astro-ssg-optimizacion-build/) o [migra Astro a Bun en Cloudflare](/es/migrar-astro-bun/) para builds más rápidos.

<Button text="Ver el changelog completo de Plausible" link="https://plausible.io/changelog" variant="outline" color="blue" size="md" />

## Preguntas frecuentes

<Accordion label="¿Funciona esto con frameworks distintos de Astro?" group="faq" expanded="true">
Sí. El proxy con Cloudflare Worker es completamente agnóstico al framework. Funciona con cualquier generador de sitios estáticos (Hugo, Eleventy, Next.js, Gatsby) o incluso con HTML puro. El único requisito es poder añadir una etiqueta script en el `<head>` de tu sitio. El Worker se encarga de todo el proxy independientemente de lo que haya generado el HTML.
</Accordion>

<Accordion label="¿Qué es el Managed Proxy de Plausible?" group="faq">
El Managed Proxy de Plausible es una función exclusiva del plan Enterprise. En lugar de configurar y mantener tu propio Cloudflare Worker, añades un registro CNAME que apunta a la infraestructura de proxy de Plausible. Ellos se encargan del resto. Es una buena opción para equipos que quieren la ventaja del proxy sin gestionar Workers, pero requiere un plan Enterprise.
</Accordion>

<Accordion label="¿Cuánto tráfico admite el plan gratuito de Workers?" group="faq">
El plan gratuito de Cloudflare Workers permite 100.000 solicitudes al día. Como el script de Plausible queda en caché en el Worker, la mayoría de las páginas vistas solo cuentan como una solicitud (el POST del evento). Para un sitio con tráfico medio, 100.000 solicitudes se traducen en unas 80.000 a 100.000 páginas vistas al día. Eso cubre a la gran mayoría de los sitios. Si necesitas más, el plan de pago de Cloudflare ($5/mes) incluye 10 millones de solicitudes al mes.
</Accordion>

<Accordion label="¿Puedo usar Cloudflare Zaraz en su lugar?" group="faq">
Cloudflare Zaraz es un gestor de etiquetas que carga scripts de terceros a través de la infraestructura de Cloudflare. De momento, Plausible no está soportado oficialmente como integración de Zaraz. El enfoque de proxy con Worker descrito en este artículo sigue siendo la forma recomendada de hacer proxy de Plausible en Cloudflare. Si Zaraz añade soporte para Plausible en el futuro, podría simplificar la configuración.
</Accordion>