pIA
phoneIA.es
CRM con IA
← Novedades

julio de 2026

194 publicaciones en julio de 2026.

julio de 2026

28
jul · martes
NuevoWeb y marca

El formulario embebido se ajusta a su altura (sin scroll)

El iframe de /contacto tenía altura fija (640px) y el formar phoneia-crm (5 campos) requería scroll interno. Nuevo componente cliente ContactoFormEmbed que, al ser mismo origen, mide el <form> real dentro del iframe y aj…

CorregidoCRM

Texto del formulario invisible (blanco sobre blanco) en /demo

En /inmobiliarias/demo el <main> tiene text-white; los inputs no fijaban color propio, así que (por el preflight de Tailwind, que hace heredar color a los form controls) el texto tecleado salía BLANCO sobre la tarjeta bl…

Fix: text-slate-900 + placeholder:text-slate-400 en los tres campos → texto siempre oscuro y legible, independientemente del color heredado de la página.

CorregidoPlataforma

La maqueta lg:sticky tapaba el formulario de captación en escritorio

La PhoneMock de DemoAgente/DemoAgenteReformas es position:sticky en escritorio (lg:sticky). Al ser un elemento posicionado, se pintaba por encima del <DemoMobileCTA> que va después en el DOM e interceptaba los clics del…

Fix: `isolate` en la rejilla raíz de cada demo → confina la maqueta sticky en su propio contexto de apilado, el formulario vuelve a recibir los clics. Se mantiene el efecto sticky dentro de la demo.

27
jul · lunes
CorregidoCRM

El formulario fallaba con autocompletado del navegador

Los inputs eran controlados y el autofill del navegador los rellenaba sin disparar onChange, dejando el estado de React vacío → al enviar saltaba "Pon tu nombre y tu teléfono" con los campos aparentemente llenos (y el ge…

- submit() lee los valores del DOM vía FormData (fuente de verdad), no solo del estado de React. - Inputs con name + autoComplete correctos (name/tel/email) para que el navegador rellene bien y no confunda el email con una contraseña.

NuevoCRM

Mostrar el nombre del canal junto al icono

La procedencia de cada conversación se leía solo por el emoji (💬/📧/📝). Ahora se añade la etiqueta de texto del canal: - Conversaciones de la IA: chip "WhatsApp/Email/..." junto al estado.

NuevoCRM

Tarjetas KPI clicables a su lista

Las 6 tarjetas del cuadro de Supervisión IA ahora llevan a la lista que representan (antes solo 2 tenían enlace y no se distinguían de las estáticas): - Nuevos contactos → /app/contactos - Conversaciones IA / Auto-respue…

KpiCard: cuando tiene href, da señal visual de ser clicable (cursor, hover con elevación y pista "Ver lista →").

CorregidoAtiende 24

Exigir y guardar el email al agendar citas

La Secretaria IA podía crear reservas sin pedir datos de contacto: la herramienta create_booking solo exigía nombre, y createBooking ni siquiera persistía el email (solo el teléfono del canal).

- create_booking: customer_email pasa a ser OBLIGATORIO en el tool schema (garantía dura), + customer_phone opcional. - createBooking: persiste customer_email y customer_phone en la reserva y completa la ficha del contacto con esos datos.

CorregidoCRM

Captación del portal apunta a la instancia real (phoneia-crm)

Todos los formularios públicos del sitio ahora entran como contacto + oportunidad en la instancia Tecomed, embudo "Ventas Directas":

- DemoMobileCTA (/inmobiliarias, /pymes y sus /demo): slug roto `interesados-phoneia` (404, leads perdidos) -> `phoneia-crm`. - /contacto: iframe de dominio externo iacontac.es -> formulario propio /f/?slug=phoneia-crm. - Política de privacidad: se elimina la referencia a iacontac.es; los leads se trasladan al CRM propio (plataforma phoneIA.es).

22
jul · miércoles
CorregidoCRM

Supervision e Inicio móvil cuentan leads como el tablero

Tras pasar el Pipeline de Leads a contactos, estas dos pantallas seguían contando oportunidades, así que daban cifras distintas para lo mismo.

- Nuevo src/lib/leads.ts: fuente única de la correspondencia estado del CRM <-> etapa del embudo (leadStage) y de la oportunidad vigente de cada contacto (oppByContact). Lo usan las tres pantallas. - Supervision: el enlace "Oportunidad" apunta al contacto.

NuevoCRM

El Pipeline de Leads pasa a ser de contactos, no de oportunidades

El tablero mostraba una tarjeta por oportunidad y arrancaba con el filtro "Solo leads de portal" marcado, así que una org sin portales inmobiliarios veía la pantalla vacía aunque tuviera contactos: en Tecomed, 3 oportuni…

Ahora la base es contacts y la oportunidad queda debajo como motor de la automatizacion:

18
jul · sábado
CorregidoCRM

Aislar la lista por organización y avisar al borrar

La lista hacía select("*") confiando en RLS, pero la política de lectura pública (forms_public_read_active) colaba formularios de otras orgs en el panel.

Ahora la carga filtra por organization_id (como el resto de la app) y el borrado usa count exact para avisar si falla, si no era de tu org, o si se borró correctamente.

CorregidoWeb y marca

Botón Guardar visible en móvil en los modales

El contenido del Modal no se encogía (faltaba flex-1/min-h-0), así que con conversaciones largas empujaba el footer fuera del 90vh y el botón Guardar desaparecía en pantallas pequeñas.

16
jul · jueves
14
jul · martes
13
jul · lunes
CorregidoReservas

Capturar el error de Daily completo + botón Reintentar

Serializa el evento/rechazo de Daily (errorMsg → error.msg → message → JSON) y lo registra en consola, para poder diagnosticar por qué no conecta. Añade botón Reintentar en la pantalla de error.

NuevoReservas

Mensaje claro fuera de la ventana horaria

La página /reunión recibe la hora (?s=) y duración (?d=) en el enlace y distingue tres casos en vez del error genérico: - aún no ha empezado → "podrás entrar a partir de las HH:MM" (+ auto-recarga si falta <1 h) - ya ha…

NuevoCRM

Vista calendario Mes/Semana/Día además de Agenda

Selector arriba (Agenda por defecto) con navegación ‹ Hoy ›. Las vistas de calendario usan todos los items en memoria filtrados por periodo; los eventos abren su modal y las videollamadas abren la sala.

NuevoReservas

Mostrar la ventana horaria de acceso a la sala

Indica desde qué hora y hasta cuándo se puede entrar (10 min antes → fin + 15 min, igual que nbf/exp de la sala): en la tarjeta de la ficha ("Se puede entrar de 16:40 a 17:35") y en la agenda de Eventos ("Entrada 16:40 –…

CorregidoReservas

Enviar el enlace por email desde el CRM, no por mailto

El botón Email de la videollamada abría el programa de correo (mailto) y fallaba. Ahora envía directamente vía attend-compose-email (Brevo), igual que el panel Responder, con estado Enviando/Enviado/error y queda en Conv…

NuevoCRM

Mostrar videollamadas en la agenda con botón Entrar

Las videollamadas agendadas (tabla meetings) ahora aparecen en /app/eventos junto a los eventos comerciales, agrupadas por día, con un botón "Entrar" que abre la sala. Lectura directa de meetings, sin duplicar datos.

CorregidoCRM

Abrir ficha al clicar el nombre + teléfono en una línea

- El botón Editar quedaba cortado fuera de la tabla en pantallas estrechas; ahora el nombre del contacto es clicable y abre la ficha (con Videollamadas). - El teléfono ya no se parte en varias líneas (whitespace-nowrap).

NuevoReservas

Reuniones agendadas con Daily.co embebido

Videollamada cliente↔equipo (sin IA), Opción B embebida con marca: - Tabla meetings (migración) con RLS por organización - Edge function daily-create-room: crea sala en Daily con ventana horaria - MeetingScheduler en la…

12
jul · domingo
NuevoCRM

Líneas de negocio con comportamiento de IA propio por servicio

Capa genérica multi-servicio dentro de UNA instancia: - Tabla crm_services (nombre, instrucciones IA, embudo, autorespuesta) + RLS - forms.service_id y opportunities.service_id - Pantalla /app/servicios (CRUD) + entrada…

Nota: form-submit y secretaria-agent requieren redeploy (workflow).

NuevoWeb y marca

WhatsApp como canal de entrada (flotante + en la tarjeta)

Botón click-to-chat a Tecomed +34622608519 (wa.me con mensaje preescrito) en /inmobiliarias y /inmobiliarias/demo: botón verde flotante siempre visible + opción 'Escríbenos por WhatsApp' en la tarjeta de captación.

NuevoCRM

Plantillas de respuesta CRM (email/WhatsApp) + autorespuesta de formulario

Parte A (UI, sin deploy): - Tabla crm_reply_templates + RLS por org; columna forms.autoresponse_template_id - Pantalla /app/atiende/plantillas (CRUD, variables {{nombre}}/{{empresa}}/{{formulario}}) - Selector de plantil…

Parte B (form-submit, requiere redeploy del workflow): - Al recibir un lead con plantilla asignada y email, envía la autorespuesta

NuevoCRM

Puente al Pipeline + mover 'Supervisión IA' a Atiende 24

- Cada conversación del feed muestra si el contacto tiene oportunidad y su etapa, con enlace directo a su tarjeta del Pipeline (/pipeline-leads/?lead=) - 'Supervisión IA' pasa de item superior a la sección Atiende 24 del…

NuevoCRM

Cuadro de mandos de supervisor IA

Nueva pantalla /app/supervision (Inicio→ menú): - KPIs del día: nuevos contactos, conversaciones IA, auto-respuestas, escalados - Feed de conversaciones IA (cliente↔IA por WhatsApp/email), clic abre el hilo - Nuevos cont…

11
jul · sábado
NuevoCRM

Responder por email/WhatsApp desde la ficha del contacto

Nuevo ContactReply integrado en la ficha (/app/contactos): compone email o WhatsApp usando las mismas edge functions que la Bandeja (attend-compose-email / attend-send-whatsapp), así queda registrado como ticket y se enh…

NuevoMovilidad

Optimizar Leads para móvil (A+B+C)

A) En móvil, chips de etapa (deslizables, con contador) + lista vertical tocable de esa etapa, en vez del kanban horizontal. Kanban intacto en escritorio (hidden lg:flex). El embudo se oculta en móvil.

Deep-links del Inicio (?stage=) preseleccionan el chip de etapa.

NuevoMovilidad

Rediseño móvil de la Bandeja (A+B+C)

A) Todas las listas (Tickets, Enviados, Borrados, Spam) usan tarjetas en móvil y tabla en escritorio (antes solo Recibidos) — adiós scroll horizontal.

NuevoMovilidad

Inicio CRM accionable también en escritorio

El Inicio accionable (Requiere tu atención · agenda · leads · actividad IA) se muestra ahora en móvil Y escritorio, con rejilla de 2 columnas en pantallas grandes.

NuevoMovilidad

'Casos escalados' abre Tickets filtrado a Escalados

El enlace del Inicio lleva ?tab=tickets&status=escalated, y la Bandeja lee ?status= para aplicar el filtro de estado (usa el selector 'Escalados' ya existente). Aterrizas viendo solo los casos escalados por la IA.

NuevoMovilidad

Enlaces enfocados desde 'Requiere tu atención'

Cada fila del triaje del Inicio lleva a lo que dice: - Leads sin contactar → /app/pipeline-leads/?stage=nuevo - Cualificados sin cita → ?stage=cualificado - Leads sin asignar → ?unassigned=1 - Escalados por la IA → /app/…

La pantalla de Leads lee stage/unassigned de la URL, filtra el tablero (y desactiva 'solo portal' para no ocultar), y muestra un chip de filtro con ×. La Bandeja abre en la pestaña indicada por ?tab=.

NuevoMovilidad

Inicio móvil accionable y por rol

Rediseña el Inicio: 'Requiere tu atención' (triaje tocable: leads sin contactar, casos escalados por la IA, cualificados sin cita, y —solo admin— leads sin asignar) + agenda de hoy como lista + leads con Llamar/WhatsApp…

NuevoMovilidad

Cabecera azul en móvil (estilo app)

La Topbar es azul (bg-blue-600) con texto/iconos en blanco por debajo de lg, y blanca en escritorio. Alineado al breakpoint lg (el que usa la app para móvil). Pills y badge de versión pasan a solo escritorio (lg).

NuevoMovilidad

Pasada de usabilidad móvil del panel

Críticos: - Leads: selector de etapa en el detalle (mover leads en táctil; el drag era solo escritorio y no funcionaba en móvil).

Altos/medios: - Bandeja: pestañas con scroll horizontal + nowrap; tablas secundarias (tickets/spam/borrados/enviados) con overflow-x-auto en vez de recortadas; filtros Tipo/búsqueda a ancho completo en móvil. - Topbar: oculta badge de versión en móvil, agranda targets táctiles (44px), menos padding lateral. - NotificationBell: popover con max-w-[92vw] para no desbordar.

NuevoWeb y marca

Menú hamburguesa en móvil para todas las landings

Nuevo componente cliente MobileNav (hamburguesa < md) con panel de enlaces de navegación + CTA destacada. Cableado en home, inmobiliarias, comercia24, secretaria-ia, atiende24 y cita24, donde el <nav> era hidden md:flex…

10
jul · viernes
NuevoInmobiliarias

La IA envía la documentación del inmueble

Real: nueva tool enviar_documentacion_inmueble en secretaria-agent — dado el property_id del lead, recupera documents/document_files y comparte enlaces firmados (mismo mecanismo que la Biblioteca de Documentos).

Demo: demo-agent acepta la lista de documentos por escenario y el agente los 'envía' con un marcador [[DOC:...]]; DemoAgente.tsx lo parsea en tarjetas de documento y lo refleja en el móvil (contador de documentos enviados).

NuevoInmobiliarias

Demo interactiva multicanal de la IA en la landing

Deja al visitante hablar EN DIRECTO con la Secretaria IA (Claude) como si fuera un cliente, por 4 canales escenificados (portal/Idealista, chat web, correo, WhatsApp), y ver el móvil del administrador (réplica de la PWA)…

- Edge function pública demo-agent (verify_jwt=false): streaming SSE + modo extract de ficha de lead. Blindada: jaula de prompt, topes y rate-limit por IP (tabla demo_rate_limit). Sandbox, no toca tablas de negocio. - Componente DemoAgente.tsx (4 escenarios + pantalla partida + prompt editable).

3
jul · viernes
NuevoAtiende 24

Captura y visor de adjuntos de correos recibidos

Hasta ahora los correos entrantes se ingerían sin sus ficheros adjuntos: postal-mime (imap-poll) los parseaba pero se descartaban, y no había ni tabla ni Storage donde guardarlos. Ahora:

- migración: tabla attend_inbound_attachments + bucket privado attend-attachments con RLS por organización (lectura para miembros, escritura vía service_role del webhook). - imap-poll: reenvía p.attachments en base64 al webhook (excluye inline, cap ~10 MB/fichero) con nombres estilo Postmark (Name/Content/ContentType).

8
jul · miércoles
7
jul · martes
NuevoMovilidad

Fase 3 — notificaciones push web

- Tabla push_subscriptions (por usuario) + RLS - Service worker: handlers push + notificationclick (abre el enlace) - EnablePush: activar/desactivar push desde la campana (permiso + suscripción) - Edge function push-send…

NuevoMovilidad

Fase 2 — acciones táctiles móviles

- Contactos: botones 1 toque Llamar / WhatsApp / Email en el modal (tel:, wa.me, mailto:) - Captura rápida: botón flotante (móvil) con alta exprés de contacto y accesos a cita/oportunidad - Mis leads: avanzar etapa + not…

NuevoMovilidad

Fase 1 — app instalable + barra de pestañas móvil

- manifest.webmanifest + iconos (192/512/apple-touch) generados desde icon.svg - service worker (sw.js) mínimo para instalabilidad (push en fase 3) - metadatos PWA en el layout raíz (manifest, theme-color, apple-web-app)…

6
jul · lunes
NuevoCRM

Enrutamiento de oportunidades por canal de origen

Antes, todo lo automático caía en el embudo por defecto. Ahora se define por canal a qué embudo va cada origen (portal, formulario, email, whatsapp), con el por defecto como reserva.

- Tabla crm_source_routing (org, source → pipeline) + RLS por organización - Helper _shared/crm-routing.resolvePipelineStage (regla del canal o default) - email-inbound (portal), form-submit (formulario) y Secretaria IA (upsertOpportunity con el source del canal) usan el resolvedor - UI: panel 'Enrutamiento por canal' en el gestor de Embudos (selector de embudo por canal, guard…

MejoraReservas

Aclarar el campo de email de contacto en ajustes

'Email para responses' (errata) → 'Email de contacto del negocio', con nota: recibe los avisos de reserva nueva y es el reply-to de confirmaciones y recordatorios; si se deja vacío va al email del administrador.

CorregidoAtiende 24

No crear contactos de newsletters/marketing entrante

El gate creaba ficha cuando la IA clasificaba 'comercial', que incluye boletines y campañas de marketing de OTRAS empresas (Samsung, Babolat, Udemy…).

- La IA ahora marca is_lead (¿persona concreta interesada en NOSOTROS?), y el gate crea contacto solo si is_lead (o lead de portal), nunca si el remitente es masivo/no-reply (looksBulkSender: newsletter@, no-reply@, subdominios de envío tipo news./mail./e.). - Limpieza: archivados 6 newsletters que se habían colado (Babolat, Codecademy, Samsung, Udemy, Real Madrid, LBTL).

NuevoReservas

Vistas de agenda Mes / Semana / Día

El calendario solo tenía vista mensual. Añadido selector Mes/Semana/Día: - Semana: 7 columnas con las reservas de cada día (hora + cliente) - Día: lista cronológica del día (hora, servicio, profesional, duración) - Naveg…

NuevoWeb y marca

PromptDialog centrado — elimina los window.prompt() nativos

Faltaban los prompt() del navegador (pedían texto), que seguían saliendo arriba y sin estilo (p. ej. '+ Nuevo embudo' en Oportunidades).

- Nuevo promptDialog(): modal centrado con campo de texto (Promise<string|null>) - Migrados los 8 window.prompt()/prompt() restantes en 6 páginas

NuevoWeb y marca

Mensajes centrados y con estilo — adiós a alert()/confirm() nativos

Los alert()/confirm() del navegador salían arriba y sin estilo. Nuevo sistema único de feedback centrado en pantalla: - toast(msg): notificación centrada, auto-clasifica info/éxito/error por el texto - confirmDialog(msg)…

Migradas 39 páginas: alert() → toast(), confirm() → await confirmDialog(). documentos conserva su toast local (evita colisión de nombre).

CorregidoPlataforma

El nombre de la etapa no se veía (input aplastado por el select)

.input define width:100% fuera de @layer, así que ganaba a w-auto de Tailwind: el <select> de tipo se estiraba al 100% y colapsaba el input del nombre a ~0px.

- select de tipo con ancho fijo (8.5rem, flex 0 0 auto) que gana la cascada - input de nombre con minWidth:0 + placeholder

NuevoCRM

Solo contactos comerciales — gate en correo entrante + archivado

El webhook de correo creaba un contacto por CADA email recibido (proveedores, newsletters, soporte…), ensuciando el CRM: 151 de 178 contactos eran ruido de email-inbound sin teléfono ni oportunidad.

- email-inbound-webhook: crea ficha nueva SOLO si el correo es comercial (lead de portal o IA clasifica 'comercial'); enlaza siempre a un contacto ya conocido; desarchiva si vuelve a ser comercial. Los tickets de Atiende 24 no cambian. - contacts.archived_at (soft-hide reversible) + índice; 151 ruidosos archivados.

CorregidoCRM

Evitar crash con contactos sin teléfono

formatPhone() hacía phone.startsWith() y petaba con phone=null (154 de 178 contactos llegan por email sin teléfono), tumbando toda la página /app/contactos.

- formatPhone acepta null/undefined y devuelve '—' - Contact.phone tipado como string | null (refleja la realidad de la BD) - búsqueda por teléfono en encuestas y mi-secretaria protegida contra null - alta de contacto sigue exigiendo teléfono válido; al editar puede quedar vacío

3
jul · viernes
2
jul · jueves
NuevoAtiende 24

Añadir Mis oportunidades, Mis contactos y Mis eventos

- 3 vistas personales del comercial filtradas por owner_id (opps, contactos, events), con selector de comercial para admin vía _scope. - Agenda pasa a ser solo 'Citas' (las oportunidades tienen página propia).

NuevoAtiende 24

Lectura directa de correo por IMAP, por usuario

- Tabla email_mailboxes (por owner) + columna attend_inbound_emails.mailbox_id - Edge function imap-poll: cliente IMAP STARTTLS + postal-mime; reenvía al webhook, etiqueta origen y asigna ticket al dueño - Ajustes: 'Mis…

NuevoAtiende 24

Autorespuesta IA por tipo de correo + matices

- attend_email_categories.auto_reply + attend_settings.autoreply_instructions - Webhook: autorresponde solo si master ON Y el tipo del correo lo permite; inyecta matices - Ajustes: interruptor 'IA responde sola' por tipo…

1
jul · miércoles
NuevoAtiende 24

Adjuntar archivos al redactar correo

- sendEmail (Brevo/Resend) admite attachments en base64 - attend-compose-email acepta adjuntos con tope ~9.5MB y los registra - Compositor: adjuntar archivos, lista con tamaño y quitar, tope ~7MB

NuevoAtiende 24

Redactar y enviar correos manuales a contactos

- Edge function attend-compose-email: crea ticket email, envía con firma y registra evento - Botón 'Redactar correo' en Correos enviados + 'Enviar correo' desde la ficha de contacto - Modal compositor con buscador de con…

NuevoAtiende 24

Firma del correo editable + firma inicial de Tecomed

- Columna signature_text (texto plano editable); signature_html se genera al guardar - Editor 'Firma del correo' en Ajustes con auto-enlazado de URLs - Firma de Tecomed cargada (se añade a todas las respuestas)

NuevoAtiende 24

5ª pestaña Spam + marcar/desmarcar spam

- Excluye status='spam' de Correos recibidos - Botón 'Marcar como spam' en Recibidos - Pestaña Spam con 'No es spam' y 'Borrar', link a Ajustes → Spam

NuevoAtiende 24

Auto-asignar dirección de correo entrante por empresa

- Trigger attend_default_inbound_address: cada organización nueva recibe <slug>@phoneia.es con recepción activa - Backfill de empresas existentes sin dirección - Botón 'Generar dirección' en Atiende 24 → Ajustes + ayuda…

NuevoPlataforma

Sembrar leads de portal en el Pipeline de Leads

seed_secretaria_demo_extras crea 8 leads con portal + lead_stage por todas las etapas (nuevo → ganado + no contactable). Aplicado a la demo actual y a la persistente; futuras demos salen con el pipeline poblado.

NuevoCRM

Biblioteca de documentos para enviar al cliente

Nuevo módulo /app/documentos/: fichas (nombre, versión, categoría, inmueble opcional, fecha de alta) con varios adjuntos en Storage privado. Enlaces seguros con caducidad (7 días) por archivo o todos a la vez.

NuevoAtiende 24

Traducir a español los mensajes recibidos del cliente

Botón "Traducir" bajo cada mensaje del cliente en la bandeja, vía nueva edge function translate-text (Claude, JWT de usuario). Apoyo de lectura para el comercial cuando el mensaje llega en otro idioma.

CorregidoAtiende 24

Estados reales de attend_tickets en bandeja y KPI

attend_tickets.status es open/in_progress/awaiting_customer/resolved/closed/ escalated (no pending/waiting). Corrige etiquetas, colores y el filtro de abiertos en Mi bandeja y el KPI "requieren tu atención".

NuevoAtiende 24

Espacio personal del comercial para su Secretaria IA

Nuevo menú "Mi Secretaria" (solo para comerciales con asiento; admin con selector de comercial): Resumen+KPIs, Mi bandeja (attend_tickets assigned_to), Citas y oportunidades (bookings.staff_id + opportunities.owner_id) y…

CorregidoWeb y marca

Desambiguar el embed de organizations (FK doble)

Al añadir profiles.home_org_id, el embed organizations(...) quedó ambiguo (dos FKs a organizations) y la consulta del perfil fallaba → topbar sin nombre. Se fija la FK profiles_organization_id_fkey.

NuevoCRM

Cadencia automática (cron) + inbound WhatsApp

- reactivation-tick: cron cada 5 min que procesa reintentos de todas las campañas activas (programado con cron_invoke_edge) - whatsapp-webhook: si un frío responde → estado 'interesado'; si la IA crea/avanza oportunidad…