Open-Source Cold Email & Warmup Platform
Warmbly는 메일함을 예열하고 캠페인 전송·답변 triage를 지원하는 오픈소스 콜드 이메일 플랫폼입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.