Open-Source Cold Email & Warmup Platform
Warmbly 是開源的冷郵件平台:溫暖您的收件箱、發送活動、並對每個回覆進行分流。可在我們的雲端運行或自行託管整個系統。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Konnexa AI es una plataforma SaaS diseñada para sellers de e-commerce, dropshipping, tiendas con pago contraentrega (Cash On Delivery - COD) y agencias de marketing en Latinoamérica y España.
Asistente Inteligente Paso a Paso (LandingWizardModal): Convierte una fotografía o URL de producto en una landing page completa en 30 segundos.
Renderizador de Ultra Alto Impacto (HighImpactLandingRenderer):
Editor Visual en Tiempo Real (LandingEditor):
Publicación Real Fuera del Editor: Rutas públicas directas /p/[slug] con metadatos OpenGraph, SEO y captura funcional de pedidos.
Oferta seleccionada por defecto: en el editor (pestaña Ofertas), marca Seleccionada al abrir en la oferta que quieres que aparezca elegida. Es independiente de Destacada (la etiqueta resaltada); si no marcas ninguna, se selecciona la destacada.
Contador de oferta: en Ofertas → Contador de oferta, con dos modos: termina cada día a medianoche (hora del país de la landing) o dura unas horas por visitante (se guarda en su navegador; recargar no lo reinicia y al terminar empieza otra vez). Texto editable; aparece junto a las ofertas y en el formulario de pedido.
Formulario de pedido guiado: celular con el número exacto de cifras del país (10 en Colombia, empezando por 3), con contador y formato automático; dirección por partes en Colombia (tipo de vía —calle, carrera, avenida, transversal, diagonal…—, número, # y placa, más apto/torre y barrio), con opción Rural para veredas y fincas. Nombre y apellido, celular, departamento, ciudad, dirección y barrio son obligatorios; el servidor también lo comprueba.
AutomationBuilder): Nodos de disparadores (Nuevo Pedido, Llamada Confirmada, No Contesta), condiciones y acciones (Disparar llamada IA, Enviar WhatsApp oficial, Crear tarea humana, Webhook logístico).AnalyticsDashboard): Embudo de conversión, tasa de confirmación por IA (84.6%), métricas de call center, mapa de calor y tabla de atribución por campañas UTM (Facebook Ads, TikTok Ads, Google).#0A6CF0, #10C569, #172C8A, #0D1B54)lib/store.ts) con sincronización en tiempo realInstalar dependencias:
npm install
Ejecutar servidor de desarrollo:
npm run dev
O compilar y ejecutar en modo producción:
npm run build
npm run start
Abrir en el navegador:
http://localhost:3000
Sin base de datos, las landings y los pedidos se guardan solo en tu navegador. Para que tus clientes vean las landings y sus pedidos te lleguen, hace falta Supabase.
supabase/schema.sql y pulsa Run.sb_secret_…, o la clave legacy service_role). Es secreta: nunca la compartas ni la subas al código. La clave publishable no sirve.Ponlas en .env.local (en tu ordenador) y en Vercel (Settings → Environment Variables):
| Variable | Para qué |
|---|---|
SUPABASE_URL | URL del proyecto de Supabase |
SUPABASE_SERVICE_ROLE_KEY | Clave secreta de Supabase (sb_secret_…) |
ADMIN_PASSWORD | Contraseña del panel (obligatoria al publicar) |
GEMINI_API_KEY | Textos con IA |
REPLICATE_API_TOKEN | Imágenes con nano-banana |
IMAGE_PROVIDER | replicate, gemini, cloudflare o auto |
META_CAPI_ACCESS_TOKEN | (Opcional) Conversions API de Meta: envía cada pedido desde el servidor |
WHATSAPP_* | (Opcional) Confirmación de pedidos y bandeja de WhatsApp. Ver sección WhatsApp |
VAPI_*, CRON_SECRET | (Opcional) Llamadas de confirmación con IA. Ver sección Llamadas IA (Vapi) |
La primera vez que abras el panel publicado, las landings que tenías en el navegador se suben solas a la base de datos.
El plan gratuito de Vercel (Hobby) es para uso no comercial; para vender con anuncios usa el plan Pro.
Cada persona entra con su correo y contraseña, y cada tienda (cuenta) tiene sus propias landings, pedidos, mensajes, equipo y configuración. Ninguna tienda ve los datos de otra.
supabase/migrations/004_accounts.sql. Todo lo que ya tienes queda en tu tienda (org_main). La versión anterior sigue funcionando después de ejecutarlo, así que hazlo antes de publicar.AUTH_SECRET (texto aleatorio largo) y deja ADMIN_PASSWORD como está. Redeploy.ADMIN_PASSWORD) para confirmar que eres tú.En Configuración → Equipo creas un enlace de invitación (Equipo, Administrador o Dueño) y lo envías por WhatsApp. Vence en 7 días y sirve una vez. Si quitas a alguien, pierde el acceso en segundos. Cambiar la contraseña cierra las otras sesiones abiertas.
PLATFORM_ADMIN_EMAILS, en el menú de tiendas (abajo a la izquierda) aparece Nueva tienda: queda sin costo, con el asistente IA de la plataforma sin límite mensual, y puede copiar respuestas rápidas, etiquetas, respuestas automáticas y asesores de la tienda actual.SIGNUP_OPEN=true cualquiera puede crear su tienda en /registro (por defecto está cerrado).Cada tienda conecta sus propias cuentas en Integraciones; las claves se comprueban con el proveedor y se guardan cifradas (INTEGRATIONS_SECRET, o AUTH_SECRET si falta).
/api/whatsapp/webhook (cada mensaje llega a la tienda dueña de su número, validado con la clave de su app). La URL antigua /api/whatsapp/webhook/<tienda> sigue funcionando y también reparte los otros números de la misma app.META_APP_ID, META_APP_SECRET, META_ES_CONFIG_ID y META_VERIFY_TOKEN (requiere que Meta te apruebe como Tech Provider). En Meta, la URL del webhook de la app de la plataforma es /api/whatsapp/webhook.INTEGRATIONS_ORG_ID, por defecto org_main) sigue usando las claves de Vercel mientras no conecte otras en el panel. Para administrar las plantillas de ese número agrega WHATSAPP_BUSINESS_ACCOUNT_ID./api/cron/run) atiende a todas las tiendas con WhatsApp o Vapi conectados.claude-opus-5-5) mira la foto del producto y escribe la landing completa: textos, estructura, paleta de colores y las instrucciones de cada imagen. Usa la clave de Claude de la tienda (Integraciones), la de Vercel en tu tienda, o las respuestas incluidas en el plan (una landing cuenta como 10 respuestas).ANTHROPIC_LANDING_MODEL para usar otro modelo de Claude solo en las landings.Cada tienda nueva tiene 7 días de prueba gratis del plan Pro, sin tarjeta. Después elige un plan en Plan y pagos:
| Plan | Precio/mes | Landings | Pedidos/mes | Personas | Respuestas IA incluidas |
|---|---|---|---|---|---|
| Básico | $99.000 | 3 | 300 | 2 | — (con su propia clave de Claude) |
| Pro | $199.000 | 15 | 2.000 | 5 | 1.000 |
| Escala | $399.000 | ilimitadas | ilimitados | 15 | 3.000 |
org_main) no paga.SIGNUP_OPEN=true los botones llevan a crear la tienda; si no, a tu WhatsApp (PLATFORM_WHATSAPP) o al inicio de sesión./terminos (Términos del servicio) y /privacidad (política de privacidad de la plataforma, la que va en la app de Meta) muestran quién opera Konnexa. Pon en Vercel los datos idénticos a los del portafolio verificado en Meta: PLATFORM_COMPANY_NAME (nombre legal), PLATFORM_COMPANY_ID (ej. NIT 900126576-7), PLATFORM_COMPANY_ADDRESS y PLATFORM_SUPPORT_EMAIL. Salen también al pie de la página de ventas. Haz que un abogado revise los textos.supabase/migrations/005_billing.sql antes de publicar. Tu tienda queda sin costo y las otras tiendas que ya existan empiezan 7 días de prueba.WOMPI_PUBLIC_KEY, WOMPI_PRIVATE_KEY, WOMPI_INTEGRITY_SECRET, WOMPI_EVENTS_SECRET. Usa primero las de pruebas (pub_test_…): no cobran dinero real.https://<tu-dominio>/api/billing/wompi/webhook.PLATFORM_ADMIN_EMAILS con tu correo: verás Admin plataforma en el menú (todas las tiendas, MRR, activar planes pagados por transferencia, dar días de prueba y editar precios).SIGNUP_OPEN=true./api/cron/run), igual que los reintentos de llamadas.RESEND_API_KEY y EMAIL_FROM (ej. Konnexa <[email protected]>).utm_source=facebook&utm_campaign={{campaign.name}}&utm_content={{ad.id}}
Meta reemplaza {{ad.id}} por el id de cada anuncio y el pedido queda ligado a él.ads_read). El menú Creativos muestra por anuncio: gasto, clics, chats, pedidos, confirmados, ventas, costo por venta y ROAS real, con alertas 🏆 ganadores, 🔥 gastan sin vender y ⚠️ se cancelan mucho.META_APP_ID y META_APP_SECRET. En tu app de Meta agrega el producto Inicio de sesión con Facebook y en URI de redireccionamiento de OAuth válidos pon https://<tu-dominio>/api/integrations/meta-ads/oauth/callback.
Mientras Meta no apruebe el acceso avanzado a ads_read, solo funciona para personas con rol en la app (administradores, desarrolladores o evaluadores).ads_read (por ejemplo de un usuario del sistema en el Business Manager).Cada pedido nuevo recibe un WhatsApp con una plantilla aprobada y dos botones. Si el cliente toca Confirmar pedido, el pedido pasa a Confirmado; si toca Cancelar, a Cancelado, y se le responde con un mensaje corto. Las conversaciones aparecen en Mensajes. Sin las variables WHATSAPP_* todo funciona igual que antes, sin WhatsApp.
Necesitas Supabase configurado (sección anterior) y una cuenta de Meta Business.
En Supabase → SQL Editor → New query, pega supabase/migrations/002_whatsapp.sql y pulsa Run. (Si instalas desde cero, supabase/schema.sql ya lo incluye.)
WHATSAPP_PHONE_NUMBER_ID.WHATSAPP_APP_SECRET.whatsapp_business_messaging y whatsapp_business_management.WHATSAPP_TOKEN. Es secreto: solo en Vercel / .env.local.En WhatsApp Manager → Plantillas de mensajes → Crear plantilla:
Categoría: Utilidad (Utility)
Nombre: confirmacion_pedido → WHATSAPP_CONFIRM_TEMPLATE
Idioma: Español (es) → WHATSAPP_TEMPLATE_LANG (si eliges Español (COL) pon es_CO)
Cuerpo (variables numeradas):
Hola {{1}}, recibimos tu pedido de {{2}} por {{3}}, con pago contraentrega en {{4}}. ¿Confirmas tu pedido para enviarlo?
Ejemplos para la revisión de Meta: {{1}} Laura · {{2}} Faja moldeadora - 2 unidades · {{3}} $129.900 COP · {{4}} Medellín
Botones: Respuesta rápida (Quick reply), en este orden:
Confirmar pedidoCancelarEspera a que el estado sea Aprobada (suele tardar minutos).
En Settings → Environment Variables añade y vuelve a desplegar (Deployments → Redeploy):
| Variable | Valor |
|---|---|
WHATSAPP_TOKEN | Token permanente del paso 3 |
WHATSAPP_PHONE_NUMBER_ID | Identificador del número del paso 2 |
WHATSAPP_VERIFY_TOKEN | Un texto aleatorio que inventes (lo usarás en el paso 6) |
WHATSAPP_APP_SECRET | Clave secreta de la app del paso 2 |
WHATSAPP_CONFIRM_TEMPLATE | confirmacion_pedido |
WHATSAPP_TEMPLATE_LANG | es (o el código del idioma de tu plantilla) |
META_GRAPH_VERSION (opcional, por defecto v26.0) se comparte con la Conversions API.
https://<tu-dominio>/api/whatsapp/webhookWHATSAPP_VERIFY_TOKEN. Pulsa Verificar y guardar.messages.Comprueba el estado en Integraciones del panel: la tarjeta de WhatsApp debe decir Configurado y mostrar el número conectado, su nombre visible y su calidad (datos leídos de Meta).
En Integraciones → WhatsApp, escribe tu celular y:
hello_world de Meta. Si llega, el token y el número funcionan. Si falla, verás el error exacto de Meta.Después haz un pedido de prueba real en una landing.
En Integraciones → WhatsApp → Cómo se confirman los pedidos eliges:
En el modo El cliente me escribe desde la landing puedes elegir "Si el cliente no escribe en X minutos, le envío la plantilla": solo pagas plantilla por los clientes que no escribieron. Esto necesita la tarea programada (CRON_SECRET + un trabajo cada 5 min a /api/cron/run, ver la sección de Llamadas IA). En el detalle de cada pedido (Pedidos) también hay un botón Enviar confirmación por WhatsApp para mandarla a mano, y se ve si ya se envió, si falló o a qué hora está programada.
Si el número de WhatsApp de la landing (editor → campo WhatsApp) es el mismo número conectado a la API, el mensaje que el cliente envía al terminar el pedido ("Quiero confirmar mi pedido… Pedido: LP-12345…") llega a Mensajes, el pedido pasa solo a Confirmado y el cliente recibe una respuesta automática. Si el cliente solo pregunta por su pedido (por ejemplo "¿cuándo llega el LP-12345?"), la conversación se vincula al pedido sin cambiar su estado.
WhatsApp solo permite texto libre dentro de las 24 h siguientes al último mensaje del cliente. Fuera de esa ventana la bandeja lo indica y no envía nada.
En Automatizaciones → Asistente de WhatsApp con IA activas un asistente (Claude, de Anthropic) que responde a los clientes: dudas de productos, precios, envío y pago (con la Información del negocio que escribes y tus landings publicadas) y el estado de sus pedidos y guías. Pasa el chat a una persona cuando hay reclamos, cambios, cancelaciones o algo que no sabe (queda en Sin responder, con nota y etiqueta).
ANTHROPIC_API_KEY. Redeploy.asistente-ia). El precio sale siempre de la oferta de la landing. Si lo apagas, manda al cliente a comprar en la landing.Un agente de voz llama al cliente después del pedido, confirma producto, cantidad, total a pagar y dirección, y deja el pedido en Confirmado, Cancelado, Reintento (pidió que lo llamen después o no contestó) o Revisar (dudas, cambios o una situación poco clara). Todo se ve en Llamadas IA: resumen, transcripción, grabación y costo de cada llamada. Sin las variables VAPI_* no se hace ninguna llamada.
Necesitas Supabase configurado. Vapi cobra por minuto (agente + voz + transcripción) y tu proveedor de telefonía cobra la llamada.
En Supabase → SQL Editor, ejecuta supabase/migrations/003_vapi.sql.
VAPI_PHONE_NUMBER_ID.VAPI_API_KEY.No hace falta crear el asistente en Vapi: la app lo arma en cada llamada con los datos del pedido y la configuración de Llamadas IA, y le indica el webhook https://<tu-dominio>/api/vapi/webhook.
Settings → Environment Variables, y después Redeploy:
| Variable | Valor |
|---|---|
VAPI_API_KEY | Clave privada de Vapi |
VAPI_PHONE_NUMBER_ID | ID del número importado |
VAPI_WEBHOOK_SECRET | Texto aleatorio largo (protege el webhook) |
CRON_SECRET | Otro texto aleatorio largo (protege la tarea programada) |
PUBLIC_BASE_URL | (Opcional) https://tu-dominio.com. Si no la pones se usa el dominio de producción de Vercel |
Las llamadas deben hacerse desde el dominio de producción: las versiones de prueba de Vercel suelen estar protegidas y Vapi no podría avisar del resultado.
Las llamadas inmediatas no la necesitan. Para los reintentos, la espera antes de llamar y los pedidos que llegan fuera de horario, algo debe llamar cada 5–10 minutos a:
GET https://<tu-dominio>/api/cron/run
Authorization: Bearer <CRON_SECRET>
CRON_SECRET en Vercel y haz Redeploy. En el panel → Integraciones → WhatsApp (opción "si el cliente no escribe…") aparece Revisión automática con el botón Copiar código SQL, que ya trae tu dominio y tu clave. Pégalo en Supabase → SQL Editor → Run. Supabase (pg_cron + pg_net) llamará a la tarea cada 5 minutos; el panel muestra cuándo fue la última revisión.Authorization: Bearer <CRON_SECRET>. Si la herramienta no permite cabeceras, usa https://<tu-dominio>/api/cron/run?secret=<CRON_SECRET>.vercel.json con {"crons":[{"path":"/api/cron/run","schedule":"*/5 * * * *"}]}. Vercel envía la cabecera con CRON_SECRET solo. (El plan Hobby solo permite tareas diarias y el despliegue falla con esa frecuencia.)La misma tarea cierra las llamadas cuyo aviso de Vapi no llegó y envía las plantillas de WhatsApp de respaldo.
Como respaldo, las visitas a las landings y el panel también ejecutan estas tareas (como máximo una vez cada 3 minutos), así que siguen funcionando aunque la tarea programada falle; pero si no hay movimiento (por ejemplo de noche) solo la tarea programada las ejecuta.
En el panel, Llamadas IA:
Si también usas la confirmación por WhatsApp, pon unos 15 minutos de espera antes de llamar: si el cliente confirma por WhatsApp antes, no se le llama.