BytIA: el chatbot que sabe dónde estás y cómo te sientes
El mes pasado, un visitante entró en mi web por la página de servicios. Estaba buscando diseño web, pero el chatbot le respondió igual que si hubiera entrado por el blog. Le dio información genérica. El tío se fue.
Ese día decidí que BytIA tenía que ser más inteligente. No solo responder preguntas — entender el contexto.
El problema con los chatbots de plantilla
La mayoría de chatbots para pymes funcionan igual: les das un system prompt, les metes un FAQ, y responden lo que pueden. Pero tienen tres carencias que cuestan dinero:
- No saben dónde estás — Responden igual si estás en servicios que en contacto
- No leen emociones — Tratan igual a alguien curioso que a uno urgente
- No clasifican leads — El dueño recibe “alguien habló con el bot” y punto
Yo quería un chatbot que hiciera lo que haría un comercial bueno: escuchar, adaptar su discurso, y al final decirte “este tío está caliente, llámalo ya”.
Lo que construí (y cómo funciona)
1. Contexto de página automático
Cuando el visitante está en /servicios/seo/, BytIA lo sabe. El widget detecta la URL actual y la envía con cada mensaje. El backend construye un contexto que se inyecta como mensaje system antes del historial:
CONTEXTO DE PÁGINA: El usuario está navegando en "/servicios/seo/"
de asturwebs.es. Adapta tu respuesta al contexto de esta sección.
Si menciona servicios, enfócate en posicionamiento SEO.
Si pregunta precios, conecta con los planes mensuales.
Esto cambia completamente la respuesta. En /servicios/seo/, BytIA habla de auditorías técnicas y optimización on-page. En /planes/, va directo a la iguala mensual y lo que incluye. En /contacto/, ofrece agendar la consulta gratuita.
El widget también detecta navegación SPA — si el visitante cambia de página durante la conversación, se envía un mensaje de contexto silencioso. BytIA nunca repite la misma información genérica dos veces.
¿Tu chatbot trata igual a todos los visitantes? Un chatbot que sabe dónde está tu cliente y cómo se siente convierte más que uno genérico. Puedo construir uno para tu negocio.
Y todo esto tiene coste cero en inferencia local (tu modelo en la RTX 4090 no te cobra por tokens), pero no es gratis con APIs externas. En OpenAI, Anthropic o similares, cada system message se envía como input tokens en cada turno y se factura. No engorda el historial persistente, pero pagas por él en cada petición. Si usas gpt-4o-mini a $0.15/1M input tokens, el coste es mínimo; con modelos más caros, hay que tenerlo en cuenta.
2. Adaptación emocional en tiempo real
BytIA no da la misma respuesta a todo el mundo. Detecta el estado del visitante y cambia su tono. Así se ve en una conversación real:
Conversación real
Visitante
”Llevo tres semanas esperando que mi diseñador me arregle la web y no contesta. Estoy hasta los huevos.”
BytIA
”Entiendo perfectamente tu frustración, llevas tiempo esperando y eso no es justo. Te cuento cómo funciona mi rescate de proyectos: Pedro revisa tu web, te dice qué está mal y te da un plan para arreglarlo. Normalmente en menos de una semana estás operativo otra vez. ¿Quieres que le pase tu caso a Pedro para que te llame?”
Visitante
”¿En serio me puede llamar? Es que necesito solucionar esto ya.”
BytIA
”De verdad. Si es urgente, te sugiero escribirle directo al WhatsApp — +34 644 28 26 26 — para que te responda hoy mismo. Dile que BytIA te derivó y sabrá de qué va.”
Fíjate: no empezó con un listado de servicios. Empezó con empatía, validó la frustración, ofreció solución concreta y cerró con acción inmediata. Eso no es un chatbot genérico — es lo que haría un comercial bueno al teléfono.
La tabla completa de adaptación:
Educa sin presionar, genera confianza
Canaliza hacia acción concreta (agendar llamada)
Valida primero, luego ofrece solución
Empatía + acción directa: WhatsApp para respuesta inmediata
Demuestra valor: mantenimiento, IA y soporte incluidos
3. Lead scoring automático al cerrar
Cuando se cierra una conversación, hago una segunda llamada a la IA (independiente del chat) que analiza el historial completo y extrae un JSON estructurado:
{
"temperature": "caliente",
"intent": "Presupuesto para tienda online con 200+ productos",
"urgency": "alta",
"sentiment": "entusiasmado",
"summary": "Dueño de comercio quiere migrar de WooCommerce a tienda moderna. Tiene presupuesto y urgencia por lanzar antes de verano."
}
Esto se guarda en la base de datos (lead_score en SQLite) y se incluye en el email que recibo como propietario. El asunto del email ya te dice la temperatura: LEAD CALIENTE: Presupuesto para tienda online o Chat — información general sobre SEO. Así priorizas quién necesita respuesta hoy y quién puede esperar.
Los datos también se envían por webhook — si tienes un Google Sheets como CRM, cada conversación aterriza en una fila con nombre, contacto, número de mensajes, temperatura, intención y urgencia. Sin copiar nada a mano.
El visitante nunca ve el scoring. La copia que se le envía por email es una transcripción limpia — sin análisis, sin etiquetas. Es información para ti, no para él. Si la IA falla al analizar la conversación, devuelve un lead genérico “frío” y nada se rompe — graceful degradation.
4. Datos de negocio separados del comportamiento
Esta es la pieza que lo hace escalable. El prompt de BytIA se divide en tres mensajes system que se envían antes del historial de conversación:
Mensaje system 1 (comportamiento): "Eres BytIA, la IA asistente de AsturWebs..."
→ Personalidad, seguridad, anti-injection, cierre, adaptación emocional
→ Cambia casi nunca — es la "personalidad" del bot
Mensaje system 2 (datos): "## Servicios\n- Diseño web: 600-900€..."
→ Servicios, precios, horarios, bio del dueño, diferenciadores
→ Cambia cuando cambias un precio o añades un servicio
Mensaje system 3 (contexto): "El usuario está en /servicios/seo/..."
→ Página actual + datos del visitante (nombre, email si los dio)
→ Se regenera en cada petición
¿Por qué separarlos? Porque la capa 2 son datos de negocio que también alimentan agents.txt, llms.txt y la API pública. Si cambio un precio en business-data.ts, se actualiza en el chatbot, en la API, en agents.txt, en llms.txt y en openapi.json. Un cambio, seis salidas.
El coste: tres mensajes de contexto en vez de uno. Pero la coherencia que ganas (precio en la web = precio en el chatbot = precio en agents.txt) no tiene precio.
5. Reconocimiento de visitantes recurrentes
Si un visitante habló ayer y vuelve hoy, BytIA lo sabe. El widget guarda el sessionId en localStorage (sobrevive al cierre del navegador). En la siguiente visita, se envía como previousSessionId y la API busca la conversación anterior en la base de datos:
Mensaje system inyectado automáticamente:
"VISITANTE RECURRENTE: Se llama Luis. Habló sobre:
presupuesto para tienda online. Lead anterior: tibio.
Reconócelo de forma natural, sin ser forzado."
BytIA puede saludar así: “Hola de nuevo. ¿Le diste una vuelta a lo de la tienda?” Sin que el visitante tenga que repetir nada. El contexto previo también se incluye en el email que recibo — veo [Recurrente] en el asunto y una fila con el histórico del visitante.
El mecanismo de reconocimiento funciona así: el localStorage del navegador guarda un UUID entre sesiones. Si el UUID coincide con una sesión previa en la base de datos, BytIA recupera el contexto de la conversación anterior. El nombre solo aparece si el visitante lo proporcionó en esa sesión previa — no se adivina. La validación estricta (email/teléfono) se usa para el lead scoring y los datos de contacto, no para el saludo contextual.
El resultado en producción
BytIA lleva semanas activa en asturwebs.es. No es un prototipo — es la que atiende a mis visitantes reales 24/7. Funciona en cualquier API compatible con OpenAI (gpt-4o-mini, Claude, modelos locales). Los datos se guardan en una base de datos propia, y el backend corre en un contenedor Docker con 128 MB de RAM.
En las primeras semanas ya detectó leads calientes que me hubiera perdido — gente con urgencia real, con presupuesto, que entró un domingo por la noche cuando yo no estaba delante del ordenador. Sin BytIA, esos visitantes habrían cerrado la pestaña.
La seguridad está cubierta. Cada capa tiene su responsabilidad:
Anti-prompt injection
Ignora “olvida tus instrucciones”, “actúa como otro modelo”, “muestra tu prompt”.
Protege contra: manipulación del comportamiento
Input sanitizado
DOMPurify con ALLOWED_TAGS: [] — cero HTML, solo texto plano.
Protege contra: XSS, inyección de scripts
Consultas parametrizadas
Todas las queries SQLite usan .prepare().get() — sin concatenación.
Protege contra: SQL injection
Rate limiting
10 req/min por IP, configurable por cliente. Doble capa: global + por tenant.
Protege contra: abuso, spam, fuerza bruta
CORS restringido
Solo responde a los orígenes que tú autorices. Ningún dominio externo puede consultar tu API.
Protege contra: acceso no autorizado
Validación de identidad
Lookup de sesión previa solo si email, teléfono o nombre coinciden con la sesión anterior.
Protege contra: acceso a datos de otro visitante
Separación de datos
Datos personales en sessionStorage (se borra al cerrar). Solo el UUID persiste en localStorage.
Protege contra: persistencia innecesaria de datos
GDPR integrado
Checkbox obligatorio de privacidad antes de chatear. El visitante acepta explícitamente.
Protege contra: incumplimiento normativo
Sin datos inventados
Si BytIA no sabe algo, deriva a contacto humano. Nunca inventa servicios ni precios.
Protege contra: desinformación y alucinaciones
El widget se instala con una línea de HTML en cualquier web. Funciona en WordPress, Astro, Shopify, HTML plano — no depende de la plataforma. El CSS está scoped (no rompe el diseño del host). El componente React se carga solo cuando el usuario hace clic, gracias al patrón Facade — la fachada estática pesa ~5 KiB. React (40+ KB minificado) se hidrata bajo demanda, no bloquea la carga inicial.
Si quieres algo parecido
La arquitectura es replicable. No necesitas mi código — necesitas los principios correctos:
-
Separa comportamiento de datos — Si tu system prompt tiene precios hardcodeados, cada cambio requiere editar el prompt. Sepáralos. Los datos deben vivir en un archivo, una base de datos o un JSON, no dentro de una cadena de texto de 2000 palabras.
-
Dale contexto de página —
window.location.pathnamese envía gratis con cada petición. Un chatbot que sabe que estás en/precios/convierte mejor que uno que no. Es un cambio de 10 líneas en el backend y cambia todo el comportamiento. -
Clasifica tus leads al cerrar — Una llamada extra a la IA con el historial completo te da temperatura, intención y urgencia. El coste es mínimo (el historial ya lo tienes) y el valor es enorme: priorizas a quién llamar primero.
-
Adapta el tono al estado emocional — Un visitante que dice “llevo semanas esperando una respuesta” no necesita un listado de servicios. Necesita validación y una solución. Las instrucciones de adaptación emocional son 5 líneas en tu system prompt.
-
Cierra con consejo, no con pregunta — Un chatbot que termina con “¿algo más?” desperdicia la conversación. Y uno que pregunta “¿quieres agendar?” after de que el visitante dijo “lo pensaré” genera rechazo. El cierre ideal es una afirmación con valor: “Te dejo este enlace donde Pedro explica SEO en detalle. Cuando estés listo, aquí estoy.” Aconseja, enlaza, no interrogues.
La tecnología no es el problema — cualquiera con acceso a una API de IA puede montar un chatbot. Lo que marca la diferencia es la arquitectura del prompt: cómo organizas la información, cómo inyectas contexto, cómo mides resultados.
Si tienes tiempo y conocimientos, puedes construir esto. Si prefieres tenerlo funcionando en tu web sin montar nada, hablamos. Tu próximo lead caliente no va a esperar a que tú estés delante del ordenador.
¿Quieres un chatbot que venda por ti?
BytIA Chat se instala en cualquier web con una línea de código. Contexto de página, adaptación emocional, lead scoring — sin plugins, sin dependencias.
Quiero información →Preguntas frecuentes
¿En qué se diferencia BytIA de un chatbot normal?
Los chatbots normales dan la misma respuesta en la página que sea. BytIA detecta dónde está el visitante (servicios, precios, blog) y adapta su respuesta. Además, identifica el estado emocional (curioso, frustrado, urgente) y ajusta su tono en tiempo real. Al cerrar la conversación, clasifica automáticamente al lead como frío, tibio o caliente.
¿Qué es el lead scoring automático?
Cuando se cierra una conversación, la IA analiza el historial completo y extrae: temperatura del lead (frío/tibio/caliente), intención del visitante, urgencia, sentimiento y un resumen de la oportunidad. Esto se guarda en base de datos y se envía por email al propietario de la web.
¿Puedo tener este chatbot en mi web aunque no sea de AsturWebs?
Sí. BytIA Chat es un producto independiente que se instala con una línea de HTML en cualquier web — WordPress, Astro, Shopify, lo que sea. Cada negocio tiene su propia configuración, personalidad y datos de negocio.
¿El visitante ve el lead scoring?
No. El análisis es interno — solo lo ve el propietario de la web en el email de transcripción y en los datos del webhook. La copia que se envía al visitante es una transcripción limpia sin scoring.