En producción · 2026

De demos
a plataforma operativa

Lo que ya funciona en producción, lo que está en construcción, y hacia dónde va el desarrollo. Un panorama honesto del estado real del producto.

WhatsApp
Voz Gemini Live
Neon Postgres
polling cada 15 s

01 · Hoy

3 verticales en producción

🔧

Taller de Motos

  • Kanban operacional con status timeline
  • Vehículos con autocomplete (102 marcas seed)
  • Cita rápida walk-in desde search
  • Notify cliente vía WhatsApp por estado
Abrir workshop →
💅

Clínica Estética

  • Calendario per-staff (3 trabajadoras)
  • Servicios con duración variable (20–120 min)
  • Atributos cliente (skin_type, allergies, concerns)
  • Vista día/semana/mes dinámica
Abrir workshop →
🦷

Clínica Dental

  • Voz nativa Gemini Live (24kHz)
  • Reserva conversacional con FC síncrono
  • Recordatorios automáticos 24h antes
  • Lista de citas en tiempo real
Probar demo de voz →

02 · Arquitectura

Multi-tenant y multi-provider desde el día 1

Multi-canal

Voz web
Gemini 3.1 Flash Live (24kHz nativo)
WhatsApp
wacli + Groq Whisper (audio nativo)
SMS / Email
Resend (tx) — en producción para magic links
Voz teléfono
VAPI — backlog (fase 2)

Multi-provider

LLM voz
Gemini Live → OpenAI Realtime → VAPI
LLM texto
Gemini 2.5 Flash → Claude → GPT-4o
STT
Groq Whisper → Deepgram → Azure
Provider cambia vía config en BD — sin reescribir lógica

Multi-tenant

business_id scoping en TODAS las queries
assertCurrentBusinessAccess() en route handlers
Soporte futuro `org_id` para cadenas
RLS evaluada y diferida (documentada — defense-in-depth fase 2)

Stack técnico

Next.js 16
App Router + Server Actions, Vercel
Neon Postgres
serverless HTTP driver + Drizzle ORM
FaroPi
Raspberry Pi 4B 8GB — 4 containers Docker
Cloudflare Tunnel
exposición sin abrir puertos

Topología

Cliente final
   │
   ├── voz ─────┐                       ┌──► Gemini Live 3.1 (audio nativo)
   │            │                       │
   │            ▼                       │
   │     ws-proxy (FaroPi)──── WSS ─────┘
   │     :8080 + /health
   │
   ├── WhatsApp ──► wacli-sync (FaroPi)
   │                    │
   │                    ▼
   │              wacli-poller ──► Vercel /api/whatsapp/inbound
   │                                      │
   │                                      ▼
   └── operador ──► demos.faropixel.com ──► Neon Postgres
                    (Next.js / Vercel)         │
                                               ├── customers
                                               ├── appointments
                                               ├── vehicles
                                               ├── customer_notes
                                               ├── audit_events
                                               └── business_members + sessions

03 · Agente

Conversación natural con anti-alucinación

Voz

Gemini 3.1 Flash Live Preview

  • ·Audio nativo 24kHz, latencia <1s
  • ·Function calling síncrono <2s con filler phrases
  • ·thinkingLevel: minimal para latencia mínima
  • ·VAD con START_SENSITIVITY_LOW (no se interrumpe con eco)
  • ·outputAudioTranscription + inputAudioTranscription
  • ·Ephemeral tokens single-use, 30 min session

WhatsApp

Gemini 2.5 Flash + Groq Whisper Large v3 Turbo

  • ·Texto y audio (.ogg opus) en español
  • ·STT 216× tiempo real (Whisper Large v3 Turbo)
  • ·Una pregunta por turno, sin meta-jokes
  • ·Recordatorios automáticos 24h antes
  • ·Wake-up del wacli en demo start + lean watchdog
  • ·Catch-up poll tras webhook (no perdemos mensajes)

Tooling estructurado

6+ tools per vertical

  • ·checkAvailability(date, service, staffId?)
  • ·bookAppointment(customer, vehicle, datetime, service)
  • ·queryAppointment(plate | phone)
  • ·updateAppointmentStatus(id, status, notes)
  • ·registerCustomer / registerVehicle (motos)
  • ·Plate + phone normalizers (acepta cualquier formato)

Anti-alucinación

Patrón VAPI aplicado

  • ·Precios NUNCA inventados — solo de service_catalog
  • ·Fechas: inyección de fecha actual al system prompt
  • ·Demo-safe: bloqueo de send a is_demo_seed=true
  • ·{clinic_name} y {agent_name} placeholders dinámicos
  • ·Override per-session vía custom_clinic_name
  • ·Guía canónica en docs/VOICE_AGENT_GUIDELINES.md

04 · Operacional

Customer 360 y workshop view por vertical

Customer 360

Identidad, vehículos/atributos, historial de citas, notas (pin/edit), sessions WhatsApp con replay

Kanban motos

Status timeline visible, drag-to-advance, undo etiquetado con destino y origen, drawer detalle. Awaiting states con stale detection (verde→amarillo→naranja). Budget approval por WhatsApp.

Calendar estética

Vista día/semana/mes per-staff, slot conflict por capacity, EXCLUDE constraint en BD

UniversalSearch

Buscador único accent + case-insensitive con resultados agrupados (Kanban / clientes / vehículos / notas)

Walk-in modal

Cita rápida desde header — search-or-create cliente + auto-open NewAppointmentModal

Status timeline

Botones etiquetados con destino ('▶ Pasar a En reparación') + undo con origen ('↶ Volver a Confirmada')

Date picker custom

Reemplaza nativo. Jerarquía visual, 15min intervals, keyboard-first (←→↑↓ PgUp/Dn), Aceptar/Hoy

Reloj España

Visible en header con detección de pausa (—:— si stale). Cards Kanban con hora+fecha relativa

Vehicle autocomplete

102 marcas seed (motos + coches), '+ Crear marca' explícito, campo mileage_km opcional

Status indicators live

WhatsApp + Voz pulse-dot por canal en header. /api/health/{agent,voice} con cache 10s

Onboarding banner

Si operador entra sin token, banner con bootstrap URL. Token via ?op= → sessionStorage → header

Estadísticas

Stats banner en /customers, sesiones activas, citas hoy, citas totales en /admin

Awaiting states · Sprint K

Jobs con awaiting:customer muestran indicador de color (verde/amarillo/naranja) escalando con el tiempo de espera. Request-approval envía presupuesto al cliente por WhatsApp desde el Kanban.

Handoff automático · Sprint K

Agente detecta respuesta a presupuesto e invoca flagForOperator con reason approval_received | customer_declined | customer_question. Contexto inyectado dinámicamente en el system prompt del poller.

Settings admin panel

9 claves editables por vertical: nombre del agente, clínica, mensajes WhatsApp, system prompts, umbrales stale, toggles handoff. Allowlist server-side, sin exponer API keys.

05 · Seguridad

Construido para clientes pagadores

Auth + Multi-tenant

Sprint E.1–E.4 · live
  • Auth.js v5 self-hosted (no lock-in, todo en BD propia)
  • Magic link vía Resend, dominio send.faropixel.com verificado
  • Sesiones en BD (revocables) — NO JWT sin estado
  • Roles owner / operator / viewer en business_members
  • Multi-tenant mixto: 1 business = 1 tenant + org_id futuro
  • Onboarding waitlist con aprobación de admin

API perimeters

Sprint 0 + E.2 · live
  • HMAC fail-closed para wacli-poller → Vercel webhooks
  • api_keys table con scopes per business (Bearer tokens)
  • canSendExternalMessage() en 8+ call sites (policy central)
  • requireSession() obligatorio en mutations admin
  • Service keys plaintext fuera del repo (CLAUDE.local.md gitignored)
  • is_demo_seed flag bloquea send accidental a teléfonos seed

GDPR + Audit

Sprint E.6 + E.7 · live
  • /api/customers/[id]/erase con cascada + audit hasheado
  • audit_events: customer, appointment, vehicle, note, job:status_change
  • Fire-and-forget logging, nunca rompe la request principal
  • /admin/audit con filtros y JSON expandido
  • gdpr_erasures audit table (hashed PII)
  • Trazabilidad completa: actor + IP + user_agent + timestamp

Data integrity

Sprint A.5 · live
  • EXCLUDE constraint con tstzrange para overlap de citas
  • UNIQUE composite (business_id, datetime, status, staff_id)
  • Drizzle migrations en repo, schema.ts == BD real
  • archived_at + attributes_version JSONB CHECK
  • Timezone Europe/Madrid (timestamptz en TODAS las columnas)
  • 21 vitest tests + 7 Codex review rounds clean

06 · Roadmap

Dónde vamos

🟢 Hoy

En producción, demostrable a clientes

  • 3 verticales activas (motos + estética + dental) con demo en vivo
  • Customer 360 + Kanban / Calendar / List per-vertical
  • Voz Gemini Live + WhatsApp wacli + Whisper Groq STT
  • Auth completa con Resend + waitlist + roles + multi-tenant
  • Audit log + GDPR erasure + status indicators live
  • Date picker custom keyboard-first + UniversalSearch unificado
  • Sprint K: awaiting states, aprobación presupuesto WhatsApp, handoff automático, settings panel
🟡 En construcción

Próximas 1–2 semanas

  • Activity feed unificado per-customer (notes + appointments + sessions)
  • Mobile audit deep at 375px
  • Admin UI para scheduling_mode + parallel_capacity per business
  • E2E test con email real (magic link end-to-end)
  • PI redeploy del wacli con session watchdog robusto
  • Sprint H.10 follow-ups (Codex findings restantes)
🔵 Próximo trimestre

Funcionalidad para primer cliente pagador

  • VAPI integration — voz por teléfono con LLM Gemini
  • Outbound campaigns: recordatorios pre-cita por voz (24h, 2h)
  • Vehicle model autocomplete dinámico per-marca
  • RLS en Neon (defense-in-depth, evaluado y documentado)
  • Simulador WhatsApp embebido (sin número personal en demo)
  • Demo controls: reset de conversaciones, regeneración de seeds
⚪ Backlog estratégico

Cuando llegue la señal del mercado

  • Vertical pack declarativo (módulo per-vertical sin if-chain)
  • 4ª vertical: peluquería, veterinario, o restaurante (table booking)
  • Compliance audits: SOC2, ISO27001 — cuando el cliente lo pida
  • Cadenas multi-business con org_id (franquicias, grupos)
  • Sistema de campañas pre/post visita (no-show prevention)
  • Dashboard de revenue por agente / canal / vertical