C
CULTIVA IA
Guía de Implementación — Plausible Analytics
GDPR Compliant Sin Cookies Self-Hosted Open Source
Analítica web respetuosa con la privacidad

Plausible Analytics
para cultivaia.com

Implementación completa: self-hosted en analytics.cultivaia.com, eventos de conversión personalizados, integración Next.js y API de estadísticas para dashboard interno.

📦 Script <1KB gzip 🍪 Zero cookies 🔒 GDPR/CCPA compliant 🐳 Docker Compose ⚡ Next.js App Router
Impacto en velocidad
<1KB
vs 45KB de Google Analytics
Banners de cookies necesarios
0
Sin consentimiento requerido
Datos enviados a terceros
0%
100% datos propios en VPS
Eventos de conversión
5
CTAs, descargas, precios
0

Arquitectura del sistema

🌐
Visitante
cultivaia.com
script.js
⚙️
Nginx Proxy
cultivaia.com/js/
script.js
eventos
📊
Plausible CE
analytics.cultivaia
.com:8000
pageviews
ClickHouse
Analytics DB
(timeseries)
usuarios
🐘
PostgreSQL
Sites, goals,
API keys
ℹ️ El script se sirve desde cultivaia.com/js/script.js (proxy Nginx), lo que evita que los adblockers lo bloqueen y mantiene todos los datos como first-party.
1

Self-hosting con Docker Compose

Despliegue en VPS Ubuntu 22.04 con dominio analytics.cultivaia.com

docker-compose.yml
# Plausible CE v2 — cultivaia.com self-hosted analytics stack
version: '3.8'

services:
  plausible:
    image: ghcr.io/plausible/community-edition:v2
    command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
    ports:
      - '8000:8000'
    environment:
      BASE_URL: https://analytics.cultivaia.com
      SECRET_KEY_BASE: ${SECRET_KEY_BASE}
      DATABASE_URL: postgres://plausible:${DB_PASS}@db:5432/plausible
      CLICKHOUSE_DATABASE_URL: http://clickhouse:8123/plausible_events
      MAILER_EMAIL: noreply@cultivaia.com
    depends_on:
      - db
      - clickhouse
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: plausible
      POSTGRES_USER: plausible
      POSTGRES_PASSWORD: ${DB_PASS}
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  clickhouse:
    image: clickhouse/clickhouse-server:24.3-alpine
    volumes:
      - clickhouse-data:/var/lib/clickhouse
    ulimits:
      nofile: { soft: 262144, hard: 262144 }
    restart: unless-stopped

volumes:
  postgres-data:
  clickhouse-data:
deploy.sh
#!/bin/bash
# Despliegue inicial de Plausible en analytics.cultivaia.com

# 1. Generar secret key y password de BD
SECRET=$(openssl rand -base64 48)
DB_PASS=$(openssl rand -hex 16)

cat > .env <<EOF
SECRET_KEY_BASE=$SECRET
DB_PASS=$DB_PASS
EOF

# 2. Arrancar stack
docker compose up -d

echo "✓ Plausible corriendo en https://analytics.cultivaia.com"
echo "→ Crear cuenta admin: https://analytics.cultivaia.com/register"
echo "→ Añadir site ID: cultivaia.com"
2

Proxy Nginx + instalación del script

Script servido desde cultivaia.com para evitar adblockers. Datos 100% first-party.

nginx.conf (fragmento)
server {
  listen 443 ssl;
  server_name cultivaia.com;

  # Proxy el script de Plausible
  location = /js/script.js {
    proxy_pass
      https://analytics.cultivaia.com/js/script.tagged-events.js;
    proxy_set_header Host analytics.cultivaia.com;
    proxy_ssl_server_name on;
    proxy_cache_valid 200 6h;
  }

  # Proxy el endpoint de eventos
  location = /api/event {
    proxy_pass
      https://analytics.cultivaia.com/api/event;
    proxy_set_header Host analytics.cultivaia.com;
    proxy_set_header X-Forwarded-For
      $proxy_add_x_forwarded_for;
    proxy_ssl_server_name on;
  }
}
index.html (head)
<!-- Plausible via proxy first-party -->
<script
  defer
  data-domain="cultivaia.com"
  data-api="/api/event"
  src="/js/script.js"
></script>

<!-- Para Astro (Layout.astro) -->
<script
  is:inline
  defer
  data-domain="cultivaia.com"
  data-api="/api/event"
  src="/js/script.js"
></script>

<!-- Script <1KB · Sin cookies
     Sin banner de consentimiento necesario -->
3

Eventos de conversión personalizados

5 eventos clave para medir el funnel de CULTIVA IA

lib/analytics.js
// analytics.js — Eventos de conversión CULTIVA IA
// Requiere script.tagged-events.js (ya incluido en el proxy)

/** 1. CTA principal: "Solicitar propuesta" */
export function trackCTAProposal(location) {
  plausible('Solicitar Propuesta', {
    props: { location, timestamp: new Date().toISOString() }
  })
}

/** 2. Descarga de recurso gratuito (lead magnet) */
export function trackResourceDownload(resourceName) {
  plausible('Descarga Recurso', {
    props: { resource: resourceName, source: document.referrer || 'direct' }
  })
}

/** 3. Visualización página de precios */
export function trackPricingView(plan) {
  plausible('Ver Precios', { props: { plan } })
}

/** 4. Envío de formulario de contacto */
export function trackContactForm(service) {
  plausible('Formulario Contacto', {
    props: { service, source: document.referrer || 'direct' }
  })
}

/** 5. Clic en enlace de LinkedIn / redes sociales */
export function trackSocialCTA(platform) {
  plausible('CTA Social', { props: { platform } })
}

// Uso en componentes React/Astro:
// <button onClick={() => trackCTAProposal('hero')}>Solicitar propuesta</button>
// <a href="/guia.pdf" onClick={() => trackResourceDownload('Guia IA 2025')}>Descargar</a>
Evento Plausible Descripción Props personalizadas Objetivo
Solicitar Propuesta Clic en CTA principal de la web location, timestamp Conversión alta
Descarga Recurso Descarga de PDF / lead magnet resource, source Lead magnet
Ver Precios Visita a la página /precios plan Intención compra
Formulario Contacto Submit del formulario de contacto service, source Conversión media
CTA Social Clic en enlace a redes sociales platform Engagement
4

Integración Next.js (App Router)

Tracking automático de rutas SPA con next-plausible y eventos tipados con TypeScript

app/layout.tsx
import PlausibleProvider from 'next-plausible'

export default function RootLayout({
  children
}: { children: React.ReactNode }) {
  return (
    <html lang="es">
      <head>
        <PlausibleProvider
          domain="cultivaia.com"
          customDomain="https://cultivaia.com"
          proxyScript={true}
          taggedEvents={true}
          selfHosted={true}
        />
      </head>
      <body>{children}</body>
    </html>
  )
}
components/CTAButton.tsx
'use client'
import { usePlausible } from 'next-plausible'

type CultivaEvents = {
  'Solicitar Propuesta': { location: string }
  'Descarga Recurso': { resource: string }
  'Ver Precios': { plan: string }
}

export function CTAButton({ location }: { location: string }) {
  const plausible = usePlausible<CultivaEvents>()

  return (
    <button
      onClick={() =>
        plausible('Solicitar Propuesta', {
          props: { location }
        })
      }
    >
      Solicitar propuesta gratis
    </button>
  )
}
next-plausible detecta automáticamente los cambios de ruta en Next.js App Router y envía pageviews por cada navegación SPA, sin configuración adicional.
5

API de estadísticas — Dashboard interno

Script Python para consultar métricas y mostrarlas en el dashboard interno del equipo

scripts/cultiva_stats.py
# cultiva_stats.py — Dashboard de métricas CULTIVA IA via Plausible API
import requests, json
from datetime import date

HOST = "https://analytics.cultivaia.com"
KEY  = "pljMK9xxxxxxxxxxxxxAPIKEY"  # Obtener en Settings → API Keys
SITE = "cultivaia.com"
HDR  = {"Authorization": f"Bearer {KEY}"}

def resumen_mensual():
    """Métricas globales del último mes."""
    r = requests.get(
        f"{HOST}/api/v1/stats/aggregate", headers=HDR,
        params={"site_id": SITE, "period": "30d",
                "metrics": "visitors,pageviews,bounce_rate,visit_duration"}
    )
    return r.json()["results"]

def fuentes_trafico():
    """De dónde vienen los visitantes."""
    r = requests.get(
        f"{HOST}/api/v1/stats/breakdown", headers=HDR,
        params={"site_id": SITE, "period": "30d",
                "property": "visit:source",
                "metrics": "visitors,bounce_rate"}
    )
    return r.json()["results"]

def conversiones():
    """Eventos de conversión del mes."""
    eventos = ["Solicitar Propuesta", "Descarga Recurso", "Ver Precios"]
    resultados = {}
    for evento in eventos:
        r = requests.get(
            f"{HOST}/api/v1/stats/aggregate", headers=HDR,
            params={"site_id": SITE, "period": "30d",
                    "metrics": "events",
                    "filters": f"event:name=={evento}"}
        )
        resultados[evento] = r.json()["results"]["events"]["value"]
    return resultados

if __name__ == "__main__":
    stats = resumen_mensual()
    print(f"Visitantes: {stats['visitors']['value']:,}")
    print(f"Pageviews:  {stats['pageviews']['value']:,}")
    print(f"Rebote:     {stats['bounce_rate']['value']}%")
    print(f"Duración:   {stats['visit_duration']['value']}s")
    print("\nConversiones del mes:")
    for k, v in conversiones().items():
        print(f"  {k}: {v}")
6

Checklist de puesta en marcha

  • Aprovisionar VPS Ubuntu 22.04 con Docker + Nginx y dominio analytics.cultivaia.com apuntando al VPS
  • Ejecutar ./deploy.sh para levantar el stack de Plausible CE
  • Registrar cuenta admin en https://analytics.cultivaia.com/register y añadir site cultivaia.com
  • Configurar bloque Nginx proxy en el servidor de cultivaia.com (script.js + /api/event)
  • Añadir <PlausibleProvider> en app/layout.tsx de Next.js con proxyScript=true
  • Instalar next-plausible y crear el hook tipado CultivaEvents
  • Añadir los 5 eventos de conversión a los componentes CTA, formulario y descargas
  • Crear Goals en el dashboard de Plausible para cada evento y configurar alertas de conversión
  • Generar API Key y conectar cultiva_stats.py al dashboard interno del equipo
  • Verificar en Plausible Live que llegan pageviews y eventos — sin cookies, sin banner GDPR