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.
Despliegue en VPS Ubuntu 22.04 con dominio analytics.cultivaia.com
# 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:
#!/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"
Script servido desde cultivaia.com para evitar adblockers. Datos 100% first-party.
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; } }
<!-- 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 -->
5 eventos clave para medir el funnel de CULTIVA IA
// 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>
Tracking automático de rutas SPA con next-plausible y eventos tipados con TypeScript
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> ) }
'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> ) }
Script Python para consultar métricas y mostrarlas en el dashboard interno del equipo
# 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}")
./deploy.sh para levantar el stack de Plausible CEhttps://analytics.cultivaia.com/register y añadir site cultivaia.com<PlausibleProvider> en app/layout.tsx de Next.js con proxyScript=truenext-plausible y crear el hook tipado CultivaEvents