Verificando acceso interno...
Voice v2 — La voz de tu empresa, en cualquier canal
Reposicionamos voice.cadences.app: deja de ser "asistente telefónico"
y pasa a ser la voz unificada de la marca — teléfono, WhatsApp,
email y chat web — con la misma personalidad, la misma memoria y las mismas
conexiones a Shopify, calendario y transportistas.
1. Por qué seguimos llamándolo Voice
"Voice" no se refiere al canal telefónico, sino a la voz de marca: el tono, la personalidad y el conocimiento que cualquier negocio tiene cuando atiende a un cliente. Esa voz hoy se reparte entre quien coge el teléfono, quien contesta el email y quien gestiona el WhatsApp — y nunca es la misma. Cadences Voice unifica esa voz en un único asistente.
Ventajas de mantener el nombre:
- Dominio
voice.cadences.appya posicionado y comprado. - Toda la base de datos (
voice_*) y endpoints (/api/voice/*) se reutilizan sin migración masiva. - Comercialmente "voz" es más evocador y diferenciador que "agentes" o "inbox" (mercado saturado).
- El canal voz sigue siendo el más complejo y el que justifica el ticket alto.
2. Concepto de producto
Un asistente Voice se define una vez y se "encarna" en cada canal:
Asistente "Recepción Vila Sen Vento"
├── Personalidad (system prompt + tono)
├── Voz clonada (ElevenLabs PVC) — solo canal teléfono
├── Knowledge base (productos, alérgenos, FAQs, políticas)
├── Tools / conectores (Shopify, SEUR, Calendar...)
├── Memoria cross-canal (voice_customer_facts)
└── Workflows post-interacción
Canales activos:
☎ +34 988 ... (teléfono Twilio)
💬 +34 600 ... (WhatsApp Cloud API)
✉ [email protected] (Gmail/IMAP — modo borrador)
🌐 widget en vilasenvento.com (web chat) 3. Arquitectura técnica
3.1 Capas
| Capa | Responsabilidad | Estado |
|---|---|---|
| Channels | Adaptadores por canal (Twilio, Meta, IMAP, WS chat) | Parcial (voz) |
| Conversations | Hilo unificado por contacto + canal | Nuevo |
| Brain | LLM + tools + RAG sobre knowledge | Existe |
| Memory | voice_customer_facts + voice_contacts | Existe |
| Connectors | Shopify, transportistas, calendario, CRM... | Stub |
| Workflows | Post-interacción (whatsapp, email, CRM, notify) | v1 |
| Inbox UI | Bandeja humana con aprobación de borradores | Nuevo |
3.2 Migration nueva propuesta
migrations/0157_voice_channels_and_inbox.sql
-- canales por organización (más allá de voz)
CREATE TABLE voice_channels (
id TEXT PRIMARY KEY,
organizationId TEXT NOT NULL,
assistantId TEXT NOT NULL,
type TEXT NOT NULL, -- voice | whatsapp | email | webchat | sms
identifier TEXT NOT NULL, -- número, email, slug widget
config TEXT, -- JSON específico del canal
status TEXT DEFAULT 'active',
createdAt INTEGER NOT NULL,
UNIQUE (type, identifier)
);
-- conversaciones unificadas (el hilo del cliente, sea cual sea el canal)
CREATE TABLE voice_conversations (
id TEXT PRIMARY KEY,
organizationId TEXT NOT NULL,
contactId TEXT,
channelId TEXT NOT NULL,
assistantId TEXT NOT NULL,
subject TEXT,
status TEXT DEFAULT 'open', -- open | snoozed | closed | escalated
intent TEXT,
sentiment REAL,
summary TEXT,
assignedTo TEXT, -- user humano si está escalada
lastMessageAt INTEGER,
createdAt INTEGER NOT NULL
);
-- mensajes (mezcla turnos voz transcritos, mensajes whatsapp, emails...)
CREATE TABLE voice_messages (
id TEXT PRIMARY KEY,
conversationId TEXT NOT NULL,
direction TEXT NOT NULL, -- in | out
role TEXT NOT NULL, -- user | assistant | human | system
body TEXT,
attachments TEXT, -- JSON array
providerMsgId TEXT,
ts INTEGER NOT NULL
);
-- borradores pendientes de aprobación humana (email, sobre todo)
CREATE TABLE voice_drafts (
id TEXT PRIMARY KEY,
conversationId TEXT NOT NULL,
body TEXT NOT NULL,
confidence REAL,
requiresApproval INTEGER DEFAULT 1,
approvedBy TEXT,
approvedAt INTEGER,
sentAt INTEGER,
createdAt INTEGER NOT NULL
);
-- enlazar voice_calls a su conversación (no rompe nada existente)
ALTER TABLE voice_calls ADD COLUMN conversationId TEXT; 3.3 Endpoints nuevos
GET /api/voice/channels
POST /api/voice/channels (crear canal whatsapp/email/webchat)
PATCH /api/voice/channels/:id
DELETE /api/voice/channels/:id
GET /api/voice/conversations?status=&channel=&q=
GET /api/voice/conversations/:id (incluye messages + contact + facts)
PATCH /api/voice/conversations/:id (status, assignedTo)
POST /api/voice/conversations/:id/messages (humano envía manualmente)
POST /api/voice/drafts/:id/approve
POST /api/voice/drafts/:id/reject
PATCH /api/voice/drafts/:id (editar antes de aprobar)
# Webhooks entrantes (uno por canal)
POST /api/voice/inbound/whatsapp (Meta Cloud API)
POST /api/voice/inbound/email (IMAP poller o SES/Mailgun inbound)
POST /api/voice/inbound/webchat (WS o REST desde widget) 4. Memoria cross-canal
La promesa estrella de la reunión: "que la IA sepa que ya he llamado, que mi
hija es celíaca, que prefiero contrareembolso". Hoy ya existe la tabla
voice_customer_facts alimentada por el analizador de llamadas.
El cambio es:
- Cualquier canal escribe
facts, no solo voz. - El system prompt del LLM siempre incluye los facts del contacto antes de generar respuesta.
- Política de extracción explícita: alergias, preferencias de pago, eventos personales, productos favoritos, puntos de venta, horario preferido.
- UI en
/admin/contacts/:idpermite editar/eliminar facts (RGPD: derecho de rectificación).
<memory> al inicio del prompt, con timestamp y fuente. El LLM
debe citarlos solo si el contexto lo justifica (evitar "ya sé que tu hija es
celíaca" cuando llama por otra cosa — feo y un poco escalofriante).
5. Conectores y orden de implementación
| # | Conector | Por qué | Esfuerzo |
|---|---|---|---|
| 1 | Shopify | Pedidos, productos, alérgenos, estados, contrareembolso. Sin esto Voice es un FAQ caro. | Medio |
| 2 | WhatsApp Cloud API (Meta) | 2º canal por volumen. Donde más se atascan los pedidos. | Medio |
| 3 | Email IMAP / Gmail OAuth | Canal #1 para Vila Sen Vento. Modo borrador obligatorio. | Medio |
| 4 | Web chat widget | Snippet JS embebible. Conversión pre-compra. | Bajo |
| 5 | Tracking transportistas | SEUR / Tipsa / Correos por tracking ID. Scraping si no hay API. | Bajo-Medio |
| 6 | Calendar (Google/Outlook) | Reservas, citas, eventos especiales (cumples, bodas de oro). | Bajo |
| 7 | CRM externo (HubSpot, Pipedrive) | Solo cuando lo pida el cliente. Webhook genérico. | Bajo |
| 8 | Stripe | Cobros sin redirect, links de pago — útil cuando se atasca el checkout. | Bajo |
6. Inbox unificado
Pantalla nueva /admin/inbox estilo Front / Missive:
Columna izquierda
Conversaciones abiertas mezclando canales. Icono de canal (☎ 💬 ✉ 🌐), mood ring (ya tenemos el componente), contador de mensajes sin leer, filtros rápidos (sin asignar / míos / urgentes / VIP).
Columna central
Hilo cronológico mezclando turnos de voz transcritos, emails, mensajes WA y chat web. Cada burbuja indica autor (cliente / IA / humano) y timestamp. Botón "Aprobar y enviar" cuando hay un borrador pendiente.
Columna derecha
Ficha del contacto + facts + últimos pedidos Shopify + tracking activo + acciones rápidas: crear pedido manual, marcar contrareembolso, generar link de pago, escalar a humano, archivar.
7. Workflows v2
El motor actual ya soporta steps whatsapp | sms | email | crm | calendar | notify_team.
Añadimos triggers de canal y de Shopify:
email_received/whatsapp_received/webchat_startedshopify_order_created/shopify_order_paid/shopify_order_fulfilledshipment_delayed(tracking sin movimiento >48h)cod_order_unconfirmed(contrareembolso sin confirmar >6h) — caso real Vila Sen Ventovip_detected(cliente con >N pedidos o ticket alto)
Plantillas nuevas a crear:
- cod-confirma-pedido: WhatsApp automático tras pedido contrareembolso pidiendo confirmación.
- checkout-atascado: si se inicia checkout y no se completa en 30 min, llama el asistente o manda WA.
- tracking-retraso: si SEUR no mueve el envío en 48h, email proactivo + crear ticket.
- cliente-recurrente-evento: detectar palabras "boda", "cumpleaños", "comunión" → crear lead en CRM con etiqueta "evento especial".
8. Empaquetado comercial
| Plan | Setup (una vez) | Mensual base | Incluye |
|---|---|---|---|
| Voice | 3.500 € | 79 €+ consumo | Asistente de voz · 1 número · knowledge base · workflows básicos · panel admin |
| Voice Inbox ⭐ | 7.500 € | 149 €+ consumo | Todo lo anterior + WhatsApp + Email (modo borrador) + 1 conector e-commerce (Shopify) + memoria cross-canal + 1 web chat |
| Voice Inbox Pro | 12.000 € | 299 €+ consumo | Todo + voz clonada PVC + tracking transportistas + calendario + workflows ilimitados + onboarding 1:1 + soporte prioritario |
Consumo (pass-through con markup x1.3)
- Voz: minutos Twilio + minutos ElevenLabs Conversational
- WhatsApp: por conversación facturable Meta (24h)
- IA: tokens input/output Gemini Flash / DeepSeek según asistente
- Almacenamiento R2: incluido hasta 10 GB / asistente
Visible en /admin/billing con desglose mensual transparente.
9. Roadmap de ejecución
- Migration 0157 (channels + conversations + messages + drafts) y endpoints CRUD básicos.
- Conector Shopify read-only de pedidos/productos + tool
lookup_orderylookup_productya disponible para voz hoy. - Memoria cross-canal: extracción unificada de facts, inyección en system prompt.
- WhatsApp Cloud API + UI inbox v0 (solo voz + WA, para validar el modelo).
- Email IMAP/Gmail OAuth con borradores aprobables.
- Web chat widget embebible (JS estático + WS al mismo Worker).
- Tracking transportistas (
lookup_shipment) + workflowshipment_delayed. - Página pública de
voice.cadences.appreescrita con narrativa multi-canal + 3 planes. - Billing real con consumo medido por canal.
- Voz clonada PVC (ya soportado técnicamente, falta proceso comercial + consentimiento RGPD).
10. Riesgos & cumplimiento
subtle. Documento de cesión de derechos de imagen sonora estándar.
organizationId
en JWT, todos los queries lo aplican. Mantener al añadir canales nuevos
(validar webhooks Meta/IMAP contra el canal correcto).