mayo de 2026
90 publicaciones en mayo de 2026.
mayo de 2026
Módulo interno completo (mockup) inspirado en spec
Tres pantallas bajo /app/comercia24/ con sección propia en sidebar:
- Cuadro de mandos: toggle Copiloto/Autopiloto, banner de modo, 6 KPIs, bandeja IA con presupuestos a aprobar (conf%, importe, acciones), captación por canal con barras + tendencia, pipeline kanban de 7 etapas, cadencias de seguimiento y timeline de actividad en directo.
Añadir bot web como 5º canal de atención
Módulo interno de cumplimiento Ley Atención al Cliente
Nueva zona /app/atiende/ con cuatro pantallas: - Bandeja: tickets multicanal con cuenta atrás de SLA 15 días, modal de detalle con responder / escalar a humano / resolver (escribe al log).
Backend: - Migration 20260525000010_atiende24.sql con attend_tickets, attend_ticket_events (inmutable vía triggers), attend_complaints, vista attend_compliance_kpis y RLS por organización. - Migration ya aplicada en Supabase phoneia-es vía MCP.
Submarcas Comercia 24 y Atiende 24
Dos landings públicas bajo phoneIA.es con pricing propio y CTA a /contacto. Comercia 24 vende como comercial IA 24/7 con presupuestos básicos integrados.
Pantalla Propiedades + publicar en redes
- Migración: property_id FK en social_posts + valor 'property' en enum post_source - Página /app/contenido/propiedades: grid con foto, ref, precio, beds, baths, m², filtros por operación/tipo y búsqueda - Modal "Publicar…
Conector Kyero (XML feed) para propiedades inmobiliarias
- Migración: tabla properties (multi-tenant) + provider kyero + columnas properties_imported/updated en sync_logs - Edge function integration-sync-properties: parsea XML Kyero V3 con fast-xml-parser (removeNSPrefix), map…
Añadir Stel Order como 5º proveedor
API REST oficial documentado en https://app.stelorder.com/app/indexapi.html - Auth: header APIKEY (generable en Config → Funcionalidades → API) - Endpoint: GET /app/contacts con paginación start+limit (500/llamada) - Cam…
Conector Freematica con auth real (X-Auth-Organization/Company/Token)
Investigado openapi.json oficial en api-config.freefy.cloud/docs. - Auth: 3 headers X-Auth-Organization, X-Auth-Company, X-Auth-Token - Endpoints: /pgrl/v1/contactos-clientes (personas) y /pgrl/v2/clientes (empresas), co…
Módulo 13 con Holded/Odoo/Sage/Freematica
- Migración: tablas integrations, integration_sync_logs + columnas external_id/external_provider en contacts - Edge function integration-sync-contacts: * Holded: REST con header key * Odoo: JSON-RPC contra res.partner (l…
Eliminar módulo Tipos de campaña
- Sidebar, página /app/tipos-campana, layout title - Campo type_id en editor de automatización - Tabla campaign_types y columna campaigns.type_id
Páginas Llamadas y Citas globales con filtros
- /app/llamadas: filtro por automatización + rango de fechas (con presets) - /app/citas: nueva página listado global de citas cerradas, filtro por automatización, rango por fecha de cita o de llamada, búsqueda y export C…
Columna Creado + filtros por rango fecha y origen
- Columna "Creado" en tabla "Todos los contactos llamables" - Filtros de rango de fechas (creado o última llamada) con presets hoy/7/30/90d - Filtro por origen (web/manual/import/form/...)
Pestaña Prompts ya no se queda en "Cargando" sin versiones
Si la campaña no tiene aún ninguna versión de prompt en BD, arrancamos un draft vacío editable para que el usuario pueda crear la v1.
Origen "Lista de llamables" + "Desde campaña voz" en destinatarios
- Selector de origen en panel "Desde CRM": todos / solo llamables (con tlf) / de una campaña de voz - Carga contactos vía campaign_contacts cuando se elige campaña outbound - Landing: Campañas Email comparte fila con Res…
Módulo 12 Campañas Email con Brevo y bono
- Migración: org_email_bundles, email_campaigns, email_campaign_recipients, email_usage - RPC consume_email_credit + vista v_org_emails_balance - Trigger contadores agregados por campaña - Edge function email-campaign-se…
Alinear nombres de módulos con las 11 secciones del sidebar
Muestra error real (no solo fallback) + auto-retry tras signOut
Generación IA de temas + redacción Claude + publicación WordPress
DB: - blog_settings (WP url/user/app_password, keywords objetivo, audiencia, tono, auto_daily, default_status) - blog_topics (sugerencias IA, manual, desde foto) - blog_posts extendido con content_html, slug, SEO, WP int…
Edge functions: - blog-generate-topics: Claude genera N temas SEO basados en keywords del cliente, evita repetir titulares de los últimos 60 días - blog-write-article: Claude redacta artículo completo (HTML semántico, 800-1500 palabras, H2/H3/listas, SEO title+description, slug) - blog-publish-wp: publica vía WP REST API con Application Password, mapea Yoast SEO meta, marca sta…
Muestra rol real del perfil; 'Visitante demo' en orgs demo
Nueva plantilla 'Citas de revisiones técnicas' (RITE/REBT/F-Gas/OCA/RIPCI)
Tab Resultados con llamadas, coste y citas exportables a CSV
DB: - calls.close_state_key + marked_as_appointment + appointment_at + customer_notes - automation_close_states.is_appointment (flag para marcar qué estados cuentan como cita) - Índice idx_calls_campaign_appointment
retell-webhook: - Extrae call_analysis.custom_analysis_data: close_state, appointment_at, customer_notes (campos que el agente Retell debe rellenar) - Cruza close_state con automation_close_states para marcar is_appointment automáticamente
Alta manual + importación CSV masiva con plantilla
- Botón '+ Nuevo contacto' con modal (nombre, tel, email, empresa, notas) · Normaliza teléfonos españoles sin prefijo · Detecta duplicado por tel - Botón '📤 Importar CSV' con modal completo: · Aviso con cabeceras espera…
Lista de llamables + maestro de tipos
DB: - campaign_types maestro por org (key, label, descripción, color, posición) - campaigns.type_id FK opcional al maestro - Seed con 7 tipos para Tecomed (recobro, seguimiento, cita, captación, encuesta, soporte, otro)
UI /app/llamables/: - Tab 'Por campaña': cola de campaign_contacts con filtros (campaña, estado, búsqueda), columnas nombre/tel/campaña/estado/intentos/ último intento/próximo intento - Tab 'Todos los contactos llamables': contactos con teléfono válido, modal '+ A campaña' para asignarlos rápido a una saliente
Renombra 'Automatizaciones IA' a 'Automatizaciones Voz' y añade enlace en Atiende Web (?tipo=form)
Numera secciones 1-11 (CRM a Reservas), Ajustes sin número
Constructor de formularios web + quita sección Multicanal
Forms: - Tabla forms (slug único, fields jsonb, color, creates, notify_email) - form_submissions vinculado a forms.id - RLS: super_admin de org gestiona, lectura pública para slugs activos - Edge form-submit dinámico: va…
Sidebar: - Eliminada sección Multicanal (Secuencias en /app/flows/ sigue accesible por URL pero no en menú)
Preselección de tab vía ?tipo=inbound|outbound|form en sidebar links
Añade Automatizaciones IA también bajo Voz entrantes
Oportunidades (Kanban) y Eventos (lista agenda) funcionales
DB: - crm_pipelines + crm_stages (multi-pipeline, etapas posicionables con type open/won/lost) - opportunities (org, contact, stage, importe, probabilidad, fecha cierre, notas) - events (call/meeting/demo/followup/task/o…
UI Oportunidades: - KPIs: En curso, Valor pipeline, Ganadas 30d, Valor ganado 30d - Kanban con drag & drop entre fases (HTML5 drag API) - Click card → modal editar con fase/contacto/importe/probabilidad/cierre/notas - Mover a fase tipo 'won' o 'lost' marca status y closed_at
Añade Oportunidades y Eventos al menú CRM (placeholders 'en construcción')
Reorganización en 5 nuevas secciones tras CRM (Voz entrantes/Campañas Voz/Atiende Web/Blog/Redes)
Línea horizontal bajo cada cabecera de sección con color del bullet
Formulario externo iacontac.es vía iframe
Quita tab Funciones + email admin tras cada llamada
UI: - Tab Funciones eliminado del editor - Texto explicativo: 'el agente guarda resultado de cada llamada y envía email al admin con el resumen'
Backend: - retell-webhook envía email en call_analyzed (o call_ended sin análisis) al primer admin/super_admin de la org con: · contacto, duración, sentimiento, motivo cierre · resumen IA generado por Retell · botón a la grabación · link al panel - Best-effort: si falla no rompe el webhook
Refactor completo Campañas → Automatizaciones IA
DB: - direction acepta 'form' (3 tipos: inbound/outbound/form) - columnas nuevas en campaigns: is_active, test_mode, confirm_before_activate, use_case, template_key, voice_id, language, voice_speed, work_weekdays, timezo…
Plantillas (lib/automation-templates.ts): - Atención general entrante - Recobro de impagados saliente - Seguimiento de presupuestos saliente - Cita previa / confirmación saliente Cada una con prompt completo + saludos + estados de cierre
Tipo entrante/saliente + import CSV de contactos
DB: - columna direction en campaigns (inbound|outbound) default outbound
UI: - Tabs Salientes/Entrantes/Todas con contadores - Nueva columna 'Tipo' con badge color - Modal nueva campaña: selector grande de tipo con descripción - Secciones Programación + Ventana horaria solo para salientes - Botón 'Importar CSV' solo en salientes
Try/finally garantiza setChecked aunque RPC o query fallen
Antes: si is_super_admin o la query de organizations lanzaba excepción, nunca se llamaba setChecked(true) → pantalla 'Cargando…' eterna. Ahora cualquier error queda capturado en finally y la UI continúa.
Sistema de presupuestos sin Stripe
DB: - tabla quotes + RLS super_admin + vista v_admin_quotes - RPC admin_update_quote_status
Backend: - _shared/catalog.ts con catálogo de módulos + precios (server-side) - edge function create-quote (público, sin auth): valida items contra catálogo, calcula subtotal/setup/IVA, guarda quote, upsert contact, envía email al cliente con desglose HTML y notificación al admin
Bono Completo movido bajo el catálogo + Embajadores a doble ancho
- Sección Bono Completo ahora aparece DESPUÉS del grid de módulos (más natural como cierre comercial tras revisar el catálogo) - Título adaptado: '¿O prefieres todo?' - Flag 'wide' añadido a ModuleCard → Embajadores ocup…
Bono Completo phoneIA 1599€ — todos los módulos + setup + 1 año
Sección destacada entre hero y módulos: - Gradiente naranja/rosa con patrón de puntos - Precio grande 1.599€ + IVA con tachado vs 3.670€ a la carta - AHORRO 56% destacado - 3 plazos sin intereses con Klarna (533€/mes × 3…
Llamadas IA entrantes 29€ + salientes 49€/mes (+ bono)
Antes 0€ (solo bono). Ahora cuota mensual cubre número virtual asignado y agente Retell activo. El bono de minutos sigue aparte.
Gráfica evolución últimas 24h con buckets 30 min (48 puntos)
Las barras quedan en 30 días (overview); la gráfica baja a 24h con granularidad de 30 min para que se vea rica desde el primer día. Nueva vista v_admin_monitor_24h_buckets.
Orden de precedencia en ?? con optional chaining
Gráfica evolución con 30 slots y ejes con fecha
- LineChart ahora recibe slots de 30 días (uno por día) - Aunque solo haya 1 punto, eje X muestra rango completo (hace 30d → hoy) - Línea base + grid horizontal punteado para dar contexto visual - Etiqueta de fecha en ej…
Monitoreo siempre 30 barras (gris=sin datos) para visual consistente
Genera el array de 30 días backwards desde hoy y rellena cada slot con datos reales o un placeholder gris. Así el bloque no parece vacío cuando llevamos pocos días de pings.
Monitoreo ampliado a 30 días con agregación diaria
- v_admin_monitor_30d (KPI agregados) y v_admin_monitor_daily (1 bar/día) - Drop de las vistas 24h/hourly anteriores - Retención de pings ampliada de 7 a 35 días - Barra de hasta 30 días, color por uptime diario (verde/a…
Monitoreo de endpoints 24h con barras y gráfica horaria
DB: - monitoring_pings + 3 vistas (24h agregado, recent 60, hourly buckets) - todas con guard is_super_admin()
Backend: - edge function monitor-ping con 10s timeout, status<500 = OK - cron */2 min vía cron_invoke_edge
Rediseño centrado tipo presupuestaIA
- Card centrado con borde sutil y sombra (sin split screen) - Logo grande 'phoneIA.es' + pill azul 'CRM con IA' debajo - Inputs más altos y limpios, foco azul - Botón 'Entrar' azul plano (sin gradiente ni flecha)
Sidebar blanco + super admin sin acceso al CRM
- AdminSidebar con fondo blanco (igual estética que sidebar normal) - Eliminado botón 'Volver al CRM' (super admin no tiene acceso a CRM) - Layout redirige super_admin automáticamente a /app/admin/ si entra a cualquier r…
Área super-admin con sidebar propio + páginas Empresas/Usuarios
- Sidebar dedicado rojo oscuro en /app/admin/* con secciones: · Cuadro de Mandos · Empresas · Usuarios + 'Volver al CRM' - /app/admin/empresas/ — listado completo con búsqueda y filtro real/demo, contadores por módulo, m…
Blinda vistas admin con check is_super_admin()
Antes: grant select to authenticated en v_admin_* permitía a cualquier usuario logueado consultar las vistas vía API REST y ver totales agregados de toda la plataforma (aunque la UI bloqueaba el acceso).
Ahora: cada vista incluye WHERE is_super_admin() — devuelve 0 filas si quien consulta no es super_admin. Verificado E2E con usuario anónimo.
Icono ojo para mostrar/ocultar contraseña en login y reset
Página /reset-password/ para restablecer contraseña
- Detecta access_token en hash del email de recuperación de Supabase - Form con doble verificación de contraseña (min 8 chars) - Redirige a /app/ tras guardar
También actualizado Site URL en Supabase Auth a https://phoneia.es
Promos alta+Klarna en franja oscura ancho completo
Saca las 2 tarjetas promo del contenedor de módulos y las coloca en su propia franja con fondo gradient navy/slate. Da más prominencia visual y separa claramente del catálogo.
Super admin global blasarias88@gmail.com + cuadro de mandos
DB: - enum user_role +'super_admin' - ai_usage_log con coste calculado + RLS (super_admin ve todo) - vistas v_admin_dashboard, v_admin_recent_orgs, v_admin_top_consumers - RPC is_super_admin() - blasarias88@gmail.com pro…
Frontend: - /app/admin/ con KPIs empresas/uso/IA/voz, servicios, top consumidores, últimos registros - Pill 'Admin' en topbar visible solo para super_admin
Duplico promo Klarna también al final del grid
Alta 330€ es pago único (no por módulo)
Promo alta gratis movida al final del grid + texto preciso
- Banner verde 'Alta gratis' al final del grid (mejor cierre comercial) - Texto: 'Contrato anual + importe > 1.199€ = sin alta' - Klarna queda solo arriba como condición de pago - CTA 'Probar phoneIA gratis' incrustado e…
Añadida promo Klarna 3 plazos sin intereses
Dos tarjetas promocionales lado a lado: - 🎁 Alta gratis si pedido > 1199€ - 💳 Klarna 3 plazos sin intereses para el pedido inicial
Promo 'alta gratis si pedido > 1.199€'
Banner verde destacado arriba del grid + mención en el bloque 'Modelo transparente'. Empuja al cliente a contratar varios módulos combinados para superar el umbral y ahorrar hasta 2.970€ de alta.
Llamadas IA (entrantes/salientes) requieren CRM
Badge cambiado a 'Incluido con CRM'. Refuerza posicionamiento como 'CRM con IA de voz nativa' y evita free-riders comprando solo el bono.
Destaca multiidioma en agente de voz IA
- Llamadas entrantes y salientes mencionan +30 lenguas nativas - Refuerza propuesta de valor para clientes internacionales
Hero ampliado para reflejar los 11 módulos
- H1: "Tu operación comercial, atendida por IA" - Subtítulo cubre llamadas, campañas, bots, redes, espía, métricas - Tira de chips con los 11 módulos bajo el subtítulo - Badge superior: "11 módulos · 1 dashboard · todo c…
Ajuste precios — Bots 39 · Redes 59 · Encuestas 19 · Espía 43 · Embajadores 37
Campañas salientes 0€ (solo bono) + eliminado módulo a medida
Bono de minutos 139€/1000min sin caducidad + dashboard + alerta 25%
DB: - org_minute_bundles + call_usage + RLS - consume_call_minutes() RPC con FIFO + flag low_balance_alert_sent - v_org_minutes_balance vista agregada para dashboard
Backend: - retell-webhook consume minutos en call_ended y envía email si <25%
Precios finales con modelo transparente
- CRM 33€/usuario/mes - Llamadas IA entrantes 0€/mes + bono 139€/1.000 min sin caducidad - Campañas salientes IA 19€/mes (comparte bono) - Resto módulos por org con límites incluidos y notas de extra - Banner "Modelo tra…
Sistema de tarjetas de módulos estilo IAcontac
- Pills navegables por módulo con scroll-to-card - 12 tarjetas con gradiente, precio mensual/anual, features y CTA - Fix sistémico de cron: header x-cron-secret con fallback al service_role JWT (resuelve el 401/403 tras…
Soporte Brevo SMS además de Twilio (auto-detect por env)
Verificación HMAC permisiva para Test/setup inicial
Defaults per-org con fallback en edge functions + página /app/ajustes/
Soporte Brevo + Resend en helper email (auto-detect por env)
Módulo Campañas Multicanal — Email → SMS → Voz IA con stop por respuesta
Migration 20260523000008: - 4 tablas (flows, flow_steps, flow_enrollments, flow_events) + 3 enums (flow_step_type email/sms/voice, flow_status, flow_enrollment_status) - Trigger stop_flows_on_form_response en form_submis…
Edge Functions: - _shared/twilio.ts: cliente Messages API con basic auth + URLSearchParams, silencioso si no hay credenciales - flow-tick: coge enrollments due (status=active, next_action_at<=now), ejecuta el step actual según type (email vía Resend, sms vía Twilio, voice vía createPhoneCall Retell con metadata del enrollment para trazabilidad).
Módulo de reservas online multi-profesional
Migration 20260523000007: - 7 tablas (booking_staff, booking_services, booking_staff_services M:N, booking_availability_rules, booking_time_blocks, bookings, booking_settings) - enum booking_status (confirmed, cancelled_…
RPC get_available_slots(service_id, date, staff_id?): - security definer, accesible para anon - Genera slots cada 15min respetando availability_rules del weekday, duración del servicio, buffer entre citas, min_advance_hours y max_advance_days configurables por servicio - Excluye solapamientos con bookings 'confirmed' (incluyendo buffer) y con booking_time_blocks - Devuelve (sta…
Módulo Análisis Gerencial — gerente virtual IA + alertas + informe semanal
Migration 20260523000006: - contact_status_history con trigger record_contact_status_change que registra cada transición de status en contacts (INSERT + UPDATE) para análisis funnel y tiempos - kpi_snapshots por (org, dí…
Edge Functions: - analytics-snapshot-daily: por cada org calcula contactos por status, actividad del día, tiempo a primer contacto desde contact_status_history, tiempo a conversión, atascados con queries parametrizadas, NPS/CSAT 30d de survey_responses, upsert a kpi_snapshots - analytics-detect-anomalies: 5 detectores con dedup (no crea alerta si ya hay activa del mismo tipo):…
Módulo Espía Competidor IA con monitoreo y resumen semanal
Migration 20260523000005: - 6 tablas (competitors, competitor_sources, competitor_snapshots, competitor_events, competitor_alerts, competitor_reports) - pgvector embedding(1536) en snapshots para similarity semántica - T…
Edge Functions: - competitor-scan: coge N sources due (next_scan_at<=now), fetch HTML/ sitemap/RSS, parsea (HTML→texto plano, sitemap→URLs, RSS→items), sha256 + embedding, compara con snapshot anterior. Si hash igual, skip. Si embedding similarity > 0.95, cambio menor. Si no, llama a Claude para classify (type, importance, title, description, diff_summary).
Módulo de encuestas v1 completo con builder + IA Claude
Migration 20260523000004: - surveys, survey_questions, survey_responses, survey_answers, survey_ai_insights - 4 enums (status, target, response_status, question_type con los 12 tipos) - Trigger refresh_survey_counts mant…
Edge Functions: - survey-submit (público, anon): valida required + tipos, calcula nps_score/ csat_score/rating_avg denormalizados, idempotente por session_id, persiste respuesta + answers - survey-analyze (auth admin): agrega datos por pregunta, manda a Claude con prompt estructurado pidiendo JSON estricto (summary, key_findings, sentiment_overall, top_keywords, clusters semánt…
Chatbots IA embebibles con RAG, captura inteligente y handoff Retell
Migration 20260523000003: - extensión vector (pgvector) - bots: config completa (system_prompt, modelo, temperatura, welcome_message, primary_color, position, allowed_domains, monthly_message_limit, capture_keywords, han…
Edge Functions (Deno): - _shared/openai.ts cliente embeddings text-embedding-3-small + chunkText - _shared/anthropic.ts extendido con chatStream para SSE - bot-chat: streaming SSE Claude + RAG vector search + detección capture/ handoff keywords + persistencia de mensajes + contadores - bot-ingest: ingesta de FAQs, URLs (con scraping HTML→texto) y texto manual; chunkea + embebe…
Programa de embajadores completo (v1)
Atribución solo por cupón, sin tracking de clicks. Cada embajador tiene un coupon_code único; el e-commerce del cliente postea a phoneIA cuando se usa y atribuye la venta automáticamente.
Backend: - migration 20260523000001: 6 tablas (affiliate_programs, affiliate_tiers, affiliates, affiliate_shares, affiliate_conversions, affiliate_payouts) + tipos enum + funciones generate_ref_code/generate_coupon_code/ compute_affiliate_tier/refresh_affiliate_stats (trigger) + bootstrap_affiliate_program() con 4 tiers por defecto + RLS para staff y para afiliado-propio + Real…
Eliminar botones negros restantes (filtros, toggles, formulario) a azul marino
Instancia demo sin login, sandbox aislado autodestructivo
- migration 20260522000001: columnas is_demo + demo_expires_at en organizations; RPC start_demo() que crea org demo + perfil admin para el usuario anónimo + siembra datos de ejemplo (4 contactos, 1 campaña, 3 temas IA, c…
Títulos de cabecera y botones primarios en azul marino
- Button primary: bg-black -> bg-blue-900 (hover blue-950) - Botones inline bg-blue-600 -> bg-blue-900 en landing, login y dashboard - Cabeceras de página (PageHeader, dashboard, topbar, login, contacto, secciones de lan…
Favicon e icono apple con el logo pIA
Rediseño completo inspirado en presupuestaIA.es
Sistema de diseño nuevo: - Tokens CSS (--bg, --surface, --border…) con soporte light/dark - Fuente Inter, scrollbar fino, paleta Tailwind slate + acentos por sección - Iconos SVG inline ligeros (sin dependencias)
Componentes nuevos: - <Logo>: cuadrado azul pIA + 'phoneIA.es' multicolor + tagline - <Sidebar>: secciones colapsables (CRM/Contenido/Ajustes) con bullet de color y bordes; ítem activo en azul lleno; avatar usuario - <Topbar>: pills pastel (Ampliar plan, Guía, Tutorial), badge versión, toggle dark mode persistente en localStorage, avatar + rol - <KpiCard>: 8 variantes de color…
Módulo completo gestión redes sociales con IA + Metricool
Backend (Supabase): - Migration 0010 social_schema: tablas social_accounts, content_settings, media_assets, topic_suggestions, blog_posts, social_posts, social_post_metrics. Todas con RLS por organization_id.
Edge Functions (Deno): - _shared/anthropic.ts: cliente Claude Messages API con chatJSON() - _shared/social/types.ts + metricool.ts: interfaz SocialProvider con schedule/cancel/fetchState/fetchMetrics; impl Metricool v2 (X-Mc-Auth + userId/blogId) - ai-generate-topics: 5-15 ideas/día por org, contextualizadas con brand_voice y evitando repetir títulos recientes - ai-generate-pos…
CRUD real de contactos, campañas, llamadas y equipo
UI primitives compartidas (Button, Input, Select, Modal, Badge, PageHeader, EmptyState, ErrorAlert) en src/components/ui.tsx, utilidades de formato (formatDate, formatDuration, formatPhone) en src/lib/utils.ts.
Páginas: - /app/ Dashboard con 5 widgets (count queries) - /app/contactos Lista + buscar + filtro estado + crear/editar/borrar con validación E.164 España y status updates - /app/campanas Lista + crear/editar (con secciones colapsadas para schedule y ventana horaria) + botón Lanzar que llama a la edge function campaign-trigger con el JWT del usuario + archivar - /app/llamadas L…
Subir frontend a HOME del FTP en lugar de public_html/
El docroot de Hostinger en este account sirve desde el HOME del usuario FTP y no desde public_html/ (lo confirmamos tras limpiar el WordPress orfanado que estaba en HOME).
Cliente Supabase + Auth + edge functions núcleo
Frontend: - src/lib/supabase/client.ts: createBrowserClient para static export - /login: signInWithPassword con redirect a /app/ - /app/* layout protegido con sidebar (contactos/campañas/llamadas/equipo) - /contacto: for…
Edge Functions (Deno): - _shared/cors.ts, _shared/supabase.ts, _shared/retell.ts (createPhoneCall + verifyRetellSignature HMAC-SHA256) - form-submit: público, upsert contact + encola en campañas auto-trigger - retell-webhook: verifica firma y upsert calls + actualiza campaign_contacts - campaign-trigger: auth user, marca campaña 'running' e invoca worker - campaign-run: worker…
Schema CRM multi-tenant con RLS
- organizations, profiles con roles (admin/agent) y helpers current_org_id/is_admin - contacts con validación E.164 España (+34), tags y contact_tags - campaigns con 3 modos de disparo (manual/cron/trigger-form), rate li…