Real talk · antes de seguir. OpenWA usa una conexión NO oficial de WhatsApp · WhatsApp puede banear tu número si detecta el cliente o si lo usás de forma indebida (spam, mensajes masivos, automatización sin consentimiento del que recibe). Usá uno nuevo siempre · si conectás tu personal, asumí que lo podés perder. Leé las 4 reglas de Seguridad

comunidadbóvedaopenwa whatsapp
OpenWA gratis · 2 caminos para instalar · 1 número conectado · Claude respondiendo solo

OpenWA + Claude — tu propio servidor de WhatsApp corriendo en tu compu con Claude contestando solo

Si pagás SaaS por mensaje de WhatsApp para hablar con tus clientes, OpenWA cambia el modelo · es un gateway MIT self-hosted que corre en tu compu y deja a Claude leer y contestar solo. El reel lo muestra en 30 segundos · acá te lo explicamos paso por paso. Cubre los 2 caminos de instalación oficiales (Docker y Node 22), el flow de QR de 3 endpoints, el bridge Node con webhook + HMAC que el reel omite, 6 prompts copy-paste, y los warnings honestos que el reel comprime · incluido el riesgo real de baneo con clientes no oficiales.

OpenWA · rmyndharis/OpenWA (MIT · ~2.3k stars · v0.1.6)

Gateway WhatsApp self-hosted · 2 caminos para instalarlo · 3 endpoints REST · 3 motores para el bridge (SDK · claude -p · Ollama) · 7 reglas anti-baneo · 7 prompts copy-paste

Esta entrada destila el reel de OpenWA + el README oficial. Cubre la sección de seguridad que el reel comprime (por qué número nuevo, por qué riesgo de baneo, HMAC y .env), los 2 caminos oficiales de instalación (Docker compose recomendado por el README · Node 22 LTS alternativo) con tabla comparativa, el flow de QR con los 3 endpoints REST de OpenWA, el gap más grande del reel (no existe MCP oficial · el bridge se arma) resuelto con 3 motores para elegir (Camino A · SDK con API key · Camino B · claude -p subprocess sin API key · Camino C · Ollama local 100 por ciento offline), cada uno con su propio prompt maestro de 10 requerimientos que Claude Code ejecuta en 5-10 minutos, tabla comparativa de 6 filas (costo · latencia · prereqs · rate limits · ¿es Claude? · cuándo elegirlo), 6 prompts copy-paste en voseo Latam (instalar · conectar QR · armar bridge · definir personalidad · probarlo · iterar cuando no funciona), y cross-links a 6 guías hermanas — whatsapp-agentkit como alternativa SaaS, instalar-claude-code como paso 0, cual-plan-claude, aprende-skill, crea-claude-skills, claude-codex-equipo.

Gateway WhatsApp MIT · ~2.3k starsDocker o Node 22 LTSREST + webhooks + QR3 motores · SDK · claude -p · OllamaTu número conectado en ~1 minuto

Qué es · qué cambia

Gateway en tu compu · número conectado por QR · Claude contestando solo

Si pagás Twilio, un SaaS o una agencia por mensaje de WhatsApp para hablar con tus clientes, OpenWA cambia el modelo: el gateway corre en tu compu, tu número se conecta como WhatsApp Web, y Claude lee y contesta solo. El reel lo muestra en 30 segundos · acá te lo explicamos paso a paso para que lo armes vos mismo.

01

Un gateway corriendo en tu compu

OpenWA es un servidor REST + webhooks construido sobre NestJS que vive en tu máquina. No hay nube intermedia, no hay SaaS de por medio, no hay pago por mensaje. Vos prendés el container o el proceso Node y todo el tráfico de WhatsApp pasa por tu localhost:2785.

02

Tu número se conecta como WhatsApp Web

OpenWA expone 3 endpoints REST para crear una sesión, arrancarla y mostrar el QR. Vos escaneás el QR desde WhatsApp del celular (Configuración → Dispositivos vinculados) y tu número queda emparejado · igual que WhatsApp Web en el navegador.

03

Claude lee los mensajes y responde

Cada mensaje que entra dispara un webhook hacia un puente Node chiquito. Ese puente toma el texto, lo manda a la API de Claude con la personalidad que vos le dictaste (vendedor, soporte, asistente), y la respuesta vuelve por la REST de OpenWA hacia el cliente. Sin que vos toques el celular.

Cuándo OpenWA · cuándo whatsapp-agentkit

OpenWA + Claude (esta guía) es self-hosted MIT gratis · vos controlás todo · requiere correr 2 procesos en tu compu y armarse el bridge. /community/whatsapp-agentkit cubre la alternativa SaaS pagada y hosted donde no escribís código pero pagás mensual. Si te importa el costo cero y aprender cómo funciona el flow por dentro, OpenWA · si querés algo enchufá-y-listo y te alcanza el presupuesto, whatsapp-agentkit.

Antes de empezar · seguridad

4 reglas no negociables · leélas antes de tocar nada

El reel cierra con "usá un número nuevo · porfa" y tiene razón · acá te explico por qué el aviso es serio antes de que toques nada.

01

Número nuevo de SIM o eSIM virtual

No conectes tu WhatsApp personal · no conectes el de tu negocio activo · no conectes el de tu mamá. Sacate una SIM física nueva (en cualquier kiosco de tu país) o una eSIM virtual (Airalo, Numero, Truely, los servicios de números temporales que sirven para WhatsApp). Si después de probar 1-2 semanas todo bien, recién ahí pensás en migrar a un número que te importa.

02

WhatsApp puede banear · el riesgo es real

OpenWA y proyectos como Baileys o whatsapp-web.js usan el protocolo no oficial de WhatsApp (no la Business API de Meta). WhatsApp detecta tráfico anómalo · velocidad de respuesta sobrehumana · patrones de payload · y banea números. No es teórico: hay bans documentados en los issues de todos esos proyectos. Por eso el reel insiste en número nuevo. Asumí que el número que conectás lo podés perder.

03

No expongas tu webhook sin HMAC

OpenWA trae soporte de HMAC para firmar los webhooks · usalo. Si exponés tu localhost via ngrok o cloudflared sin la firma, cualquiera que descubra tu URL puede mandarte payloads falsos y disparar mensajes en nombre de tu número. Cuando le pidas a Claude que arme el bridge, pedile explícitamente que verifique la firma HMAC en cada request entrante.

04

La API key vive en .env · nunca en código

Tanto la API key de OpenWA como la de Claude se guardan en un archivo .env local · nunca las pongas en código que vas a commitear a GitHub. Agregá .env al .gitignore desde el primer commit. Si por error la subís, regenerá ambas claves: si alguien encuentra tu key de OpenWA puede mandar mensajes con tu número · si encuentra tu key de Claude te consume tokens hasta dejarte la cuenta en cero.

Paso 1 · prender OpenWA

Dos caminos · Docker compose o local con Node 22

El README de OpenWA documenta 2 caminos · Docker compose como recomendado oficial y local con Node 22 LTS para quien ya tiene Node instalado. Acá te dejo los dos · al final una tabla rápida para decidir cuál te conviene. Como Camino C alternativo, te dejo un PromptCard para que Claude Code haga todo el setup por vos.

Pre-requisitos · chequeá antes de seguir

Claude Code instalado

Si no tenés Claude Code todavía, arrancá por /community/instalar-claude-code · 5 minutos · sin esto el resto de la guía no aplica.

Docker Desktop o Node 22 LTS

Para el Camino A, instalá Docker Desktop (gratis, mac/win/linux). Para el Camino B, asegurate de tener Node 22 LTS (verificás con node --version, debe decir v22.algo · si no, descargá desde nodejs.org).

Un número de WhatsApp nuevo

Releé la sección de Seguridad de arriba si te la salteaste. SIM física nueva o eSIM virtual. No uses tu personal · es la regla #1.

Camino A · recomendado

Docker compose · el camino oficial del README

El más simple si no tenés Node · Docker te aísla todo en un container.

Vos descargás Docker Desktop una vez, después con 3 comandos clonás OpenWA, te metés a la carpeta y prendés el container. Funciona igual en Mac, Windows y Linux. La desventaja: el primer pull baja ~500MB de imágenes y tarda 2-5 min · cuando dice "menos de un minuto" el reel se refiere al segundo arranque, no al primero.

  1. 01

    Instalá Docker Desktop

    Descargalo desde docker.com/products/docker-desktop · es gratis para uso personal y empresas chicas. Después de instalar, abrílo una vez para que arranque el daemon · vas a ver el iconito de la ballena en la barra de tareas.

  2. 02

    Cloná el repo de OpenWA

    Abrí una terminal · navegá a la carpeta donde guardás tus proyectos (cd ~/Desktop o donde te guste) · corré git clone https://github.com/rmyndharis/OpenWA.git · te crea una carpeta OpenWA con todo el código adentro.

  3. 03

    Metete a la carpeta

    cd OpenWA · todo lo que sigue corré desde adentro de esa carpeta.

  4. 04

    Levantá el container

    docker compose -f docker-compose.dev.yml up -d · esto baja las imágenes la primera vez (2-5 min) y deja todo corriendo en background. Cuando termina, abrí localhost:2785 en tu navegador y ves el dashboard de OpenWA.

Los 3 comandos del Camino A · copy-paste en orden

git clone https://github.com/rmyndharis/OpenWA.git cd OpenWA docker compose -f docker-compose.dev.yml up -d

Honest disclosure · primer arranque vs segundos

El reel dice "menos de un minuto" · cierto solo el segundo arranque. El primer pull de Docker baja unos 500MB · contá 2-5 minutos según tu internet. Después de eso, los arranques siguientes sí son ~10 segundos.

Camino B · alternativo

Local con Node 22 LTS · sin Docker

Más rápido si ya tenés Node 22 · sin Docker corriendo de fondo.

Si ya programás en JavaScript o tenés Node 22 instalado, este camino te ahorra el overhead de Docker. Arrancás OpenWA como un proyecto Node normal · npm install una vez, npm run dev cuando lo querés prender. El precio: si no tenés Node 22 exacto vas a chocar con errores de versión.

  1. 01

    Verificá que tenés Node 22

    Abrí terminal · corré node --version · si te devuelve v22.algo estás listo. Si te devuelve v18 o v20, descargá Node 22 LTS desde nodejs.org · si no tenés nada instalado, también desde nodejs.org · elegí la versión LTS.

  2. 02

    Cloná el repo

    Misma orden que en Camino A · git clone https://github.com/rmyndharis/OpenWA.git en la carpeta de tus proyectos.

  3. 03

    Instalá dependencias

    cd OpenWA && npm install · descarga las dependencias en node_modules · contá 1-2 min según tu internet.

  4. 04

    Arrancá OpenWA en modo dev

    npm run dev · OpenWA prende en localhost:2785 en 10-15 segundos · ves los logs en vivo en la terminal. Para apagarlo, Ctrl+C.

Los 4 comandos del Camino B · copy-paste en orden

node --version git clone https://github.com/rmyndharis/OpenWA.git cd OpenWA && npm install npm run dev

Lo que ganás

Sin Docker corriendo de fondo (menos RAM gastada) · arranque en 10-15 segundos · podés abrir el código en tu editor y debuggear directo. Bueno si querés entender cómo funciona OpenWA por dentro.

Camino C · pedile a Claude Code que te instale todo

Si te perdiste en algún paso o querés que Claude lo haga por vos, pegá este prompt en Claude Code dentro de una carpeta limpia. Claude detecta tu OS, instala Docker si te falta, clona el repo, levanta el container y verifica que el dashboard abre.

Necesito instalar OpenWA (github.com/rmyndharis/OpenWA) en mi compu para correr un servidor WhatsApp local. Hacé esto por mí · paso a paso · pidiéndome confirmación antes de cada acción destructiva:

1. Detectá mi sistema operativo (macOS, Windows o Linux) corriendo uname o equivalente.

2. Verificá si tengo Docker instalado corriendo docker --version · si no lo tengo, decime el comando exacto para instalarlo en mi OS (brew install --cask docker en mac, link a docker.com en win/linux) · esperá que confirme que lo instalé antes de seguir.

3. Verificá si Docker Desktop está corriendo (docker ps debe responder sin error) · si no está corriendo, pedime que lo abra.

4. Cloná el repo en esta carpeta · git clone https://github.com/rmyndharis/OpenWA.git OpenWA.

5. Metete a la carpeta · cd OpenWA.

6. Levantá el container · docker compose -f docker-compose.dev.yml up -d · esto tarda 2-5 min la primera vez · mostrame los logs mientras baja.

7. Verificá que el dashboard responde · curl http://localhost:2785 debe devolver algo (no Connection refused) · si responde, decime "OpenWA está corriendo, abrí localhost:2785 en tu navegador" · si no, mostrame el error y proponé qué revisar.

Importante: si algo falla, parate · explicame el error en español simple · proponé 2 opciones para resolverlo · esperá que elija una antes de seguir. No asumas que "ya va a funcionar".
ComparativaCamino A · DockerCamino B · Local Node
Setup inicialDocker Desktop + 3 comandos · ~5 min primer pullNode 22 + 4 comandos · ~2 min npm install
PrereqSolo Docker · nada másNode 22 LTS exacto · cuidado con versiones
RecursosContainer aislado · ~600MB RAMProceso Node nativo · ~250MB RAM
Cuándo elegirloSi no tenés Node · si querés todo aislado · default del READMESi ya tenés Node 22 · si vas a tocar el código
Arranque siguientedocker compose up -d · ~10 segundosnpm run dev · ~10 segundos

Paso 2 · conectar tu número

3 endpoints REST · escaneás el QR · tu número queda conectado

OpenWA expone 3 endpoints REST para conectar un número · los llamás en orden con curl (o con Claude que te los corre) y al final escaneás el QR desde el WhatsApp del celular. Es el mismo flow que WhatsApp Web · solo que en vez del navegador, el cliente es tu OpenWA.

  1. Paso 01POST /api/sessions

    Crear sesión

    Le decís a OpenWA que vas a crear una sesión nueva con un ID que vos elegís (ej: mi-vendedor, soporte-tienda, asistente). Ese ID lo usás en los siguientes endpoints. OpenWA devuelve un objeto con el sessionId confirmado · si el ID ya existía, te lo dice.

    Crear la sesión · curl

    curl -X POST http://localhost:2785/api/sessions \ -H "Content-Type: application/json" \ -d '{"sessionId": "mi-vendedor"}'
  2. Paso 02POST /api/sessions/{sessionId}/start

    Iniciar la sesión

    Le decís a OpenWA que arranque el cliente de WhatsApp para esa sesión. Internamente OpenWA inicializa Baileys (la librería que habla con WhatsApp), se conecta a los servidores de WhatsApp y queda esperando el escaneo de QR. Este endpoint responde rápido · el QR se genera en el siguiente paso.

    Iniciar la sesión · curl

    curl -X POST http://localhost:2785/api/sessions/mi-vendedor/start
  3. Paso 03GET /api/sessions/{sessionId}/qr

    Obtener el QR · escanear

    Pedís el QR · OpenWA te lo devuelve como string base64 (o como imagen PNG si pedís el header adecuado). Abrís el WhatsApp del celular · Configuración → Dispositivos vinculados → Vincular un dispositivo · escaneás el QR. En 2-3 segundos tu número queda conectado · OpenWA empieza a recibir todos los mensajes que llegan.

    Obtener el QR · curl

    curl http://localhost:2785/api/sessions/mi-vendedor/qr

Pedile a Claude que automatice los 3 endpoints y te muestre el QR en terminal

En vez de copiar y pegar 3 curls, pegale este prompt a Claude Code dentro de la carpeta de OpenWA. Claude orquesta los 3 endpoints en orden, agarra el base64 del QR, lo convierte a QR visual en tu terminal con qrcode-terminal, y se queda esperando hasta que la sesión confirme que está conectada.

OpenWA está corriendo en localhost:2785. Necesito conectar mi número de WhatsApp · armame un script Node chiquito que haga esto:

1. Crear sesión nueva con sessionId "mi-vendedor" via POST a /api/sessions. Si ya existe, OK seguir.

2. Iniciar la sesión via POST a /api/sessions/mi-vendedor/start.

3. Pollear cada 2 segundos GET /api/sessions/mi-vendedor/qr hasta que devuelva el QR base64. Cuando lo tenga, usá la librería qrcode-terminal (npm install qrcode-terminal) y dibujá el QR como ASCII grande en mi terminal · directamente para que lo escanee con el celular.

4. Después de mostrar el QR, pollear cada 3 segundos GET /api/sessions/mi-vendedor/status hasta que devuelva "connected" o equivalente. Cuando confirme, decime "Tu número quedó conectado · podés mandar el primer mensaje de prueba" y termina el script.

5. Si algo falla, mostrame el error completo y proponé qué hacer · no asumas.

Guardá el script como connect.js · agregá las dependencies a package.json · explícame cómo correrlo (node connect.js).

Paso 3 · el bridge · 3 motores para elegir

El gap del reel · cómo armar el puente y qué motor le ponés

Acá está el gap que el reel no menciona · OpenWA no trae integración nativa con Claude · el puente lo escribimos nosotros. Son ~80 líneas de Node, lo arma Claude Code en 5-10 minutos, y queda corriendo al lado de OpenWA. Te explico la arquitectura mental primero · abajo elegís cuál de los 3 motores querés que use el bridge (SDK con API · claude -p subprocess · Ollama local) y pegás el prompt maestro correspondiente.

  1. Bloque 01

    Configurar el webhook de OpenWA

    Le decís a OpenWA que cada vez que llegue un mensaje nuevo, dispare un POST hacia http://localhost:3001/webhook (que va a ser tu bridge). Esto se configura una vez via dashboard de OpenWA o con un PUT al endpoint de settings. Activá la firma HMAC y guardate el secret · el bridge lo va a usar para verificar que el request viene de OpenWA y no de un atacante.

  2. Bloque 02

    El bridge corre en localhost:3001

    Un servidor Express chiquito que escucha POST /webhook. Cuando le llega un payload de OpenWA, primero verifica la firma HMAC · si no coincide, descarta. Si coincide, extrae el texto del mensaje, el sessionId y el chatId del remitente (los 3 campos los manda OpenWA en el body).

  3. Bloque 03

    Cada mensaje entra · llamada al motor

    El bridge toma el texto, lo manda al motor que vos elijas (abajo te muestro los 3 caminos: SDK con API · claude -p subprocess · Ollama local) con un system prompt que define la personalidad: vendedor de tu negocio, asistente de soporte, recepcionista de clínica, lo que vos quieras. El system prompt vive en .env o en un archivo aparte para que puedas editarlo sin tocar código.

  4. Bloque 04

    La respuesta vuelve por la REST de OpenWA

    Cuando Claude devuelve el texto, el bridge hace POST a /api/sessions/mi-vendedor/messages/send-text con el chatId del remitente original y el texto generado. OpenWA lo manda al WhatsApp del cliente · el cliente ve un mensaje normal, no sabe que del otro lado hay un bridge + Claude. Listo · el loop se cierra solo y queda corriendo 24/7 hasta que vos lo apagás.

3 motores · elegí cómo el bridge llama al modelo

El bridge es el mismo en los 3 caminos · lo único que cambia es la línea 4 (cómo llamás al modelo). Camino A usa la SDK de Anthropic con API key y pagás por token. Camino B spawnea Claude Code como subprocess (claude -p) sin API key · consume tu cuota de Pro/Max. Camino C llama a un modelo open-source corriendo en Ollama local · ya no es Claude pero nada sale de tu compu. Cada uno tiene su propio prompt maestro listo para pegarle a Claude Code abajo.

ComparativaCamino A · SDKCamino B · claude -pCamino C · Ollama
Costo por respuesta~$0.0003 (Haiku) · ~$0.003 (Sonnet) · pay-per-token$0 dentro de tu cuota Pro/Max · sin sumas por token$0 forever · sin API ni suscripción
Latencia típica~500ms-1s · directo a Anthropic~2-3s · overhead del subprocess~3-10s sin GPU · ~1-2s con GPU
Pre-requisitosANTHROPIC_API_KEY (console.anthropic.com)Claude Code instalado y logueado (claude login)Ollama + modelo descargado (5-9 GB · una vez)
Rate limitsPrácticamente ilimitado · pagás más si saturásTope cada 5 horas + semanal de Pro/MaxSolo tu RAM/GPU · sin tope externo
¿Es Claude?Sí · Sonnet 4.6 o Haiku 4.5 según elijasSí · mismo modelo que usás en Claude CodeNo · Qwen 2.5 / Llama / Mistral · open-source
Cuándo elegirloProducción seria · volumen alto · ya facturás APIYa pagás Pro/Max · volumen bajo-medio · sin API keyPrivacidad total · cero costo recurrente · acepto modelo no-Claude
Camino A · SDK con API key

Anthropic SDK directo · el camino del prompt maestro original

Producción de verdad · latencia mínima · pagás por uso real.

Cuándo elegirlo

Si vas a producción seria con volumen variable, querés latencia más baja, o ya facturás la API de Anthropic por separado. Es el default si no tenés Pro/Max y querés algo robusto.

Cómo funciona

El bridge llama a @anthropic-ai/sdk con tu ANTHROPIC_API_KEY · cada mensaje gasta tokens (Haiku ~$0.0003 · Sonnet ~$0.003) · Anthropic te factura mensual contra la API. Es la ruta más rápida y la menos sensible a rate limits.

Lo que ganás

  • · Latencia más baja (~500ms-1s) que los otros 2 caminos
  • · Sin tope rígido de mensajes por hora · escala con tu wallet
  • · Modelo configurable por mensaje · Haiku para mensajes simples · Sonnet para los difíciles

Lo que perdés

  • · Pagás por token · centavos pero suma con volumen alto
  • · Requiere tarjeta vinculada a console.anthropic.com y crear una API key
  • · Si leakeás la key, te pueden vaciar la cuenta · cuidado con .env y .gitignore

Camino A · prompt maestro · bridge con SDK + API key

Pegale esto a Claude Code dentro de una carpeta limpia (puede ser hermana de OpenWA). En 5-10 min Claude te deja bridge.js funcionando con SDK, HMAC, retry y .env. Reemplazá las 3 variables al inicio antes de pegarlo.

Armá bridge.js que conecte OpenWA (localhost:2785) con la API de Claude para responder mensajes de WhatsApp automáticamente. Camino A · SDK con API key. Variables al inicio:

- NOMBRE-NEGOCIO: [poné el nombre o "asistente personal"]
- QUE-VENDÉS: [una línea explicando]
- TONO: [ej: cálido voseo Latam mensajes cortos sin emojis]

Construí bridge.js con estos 10 requisitos:

1. Express en localhost:3001. Endpoint POST /webhook que reciba los mensajes de OpenWA.

2. Verificá la firma HMAC en cada request entrante con OPENWA_WEBHOOK_SECRET · si no coincide, devolvé 401 y no proceses · loggealo.

3. Extraé del payload de OpenWA: text, sessionId, chatId. Si falta alguno, 400 y loggea qué faltó.

4. Llamá a la API de Claude con @anthropic-ai/sdk (npm install @anthropic-ai/sdk · clave en ANTHROPIC_API_KEY). Modelo: claude-haiku-4-5-20251001 por default, configurable via CLAUDE_MODEL. Max tokens 500. System prompt:

   "Sos el asistente de WhatsApp de [NOMBRE-NEGOCIO]. Vendemos [QUE-VENDÉS]. Tono: [TONO]. Reglas: 1) si no sabés algo, decí 'dejame consultar y te confirmo, dame unos minutos' · 2) si piden precios y no los tenés, decí 'te paso el catálogo por acá ahora mismo' (no inventes) · 3) si la pregunta es para humano, decí 'te paso con [TU-NOMBRE], él te contesta en breve' · 4) mensajes cortos, máximo 3 líneas, sin saludos largos."

5. Mandá la respuesta de Claude a OpenWA · POST a http://localhost:2785/api/sessions/{sessionId}/messages/send-text con body { chatId, text } y header X-API-Key: OPENWA_API_KEY.

6. Logging estructurado [webhook] [claude] [openwa] [error] con prefijos en cada paso.

7. Retry exponencial 3 intentos (500ms · 1500ms · 4000ms) para errores 5xx de Anthropic o de OpenWA. Si después de 3 intentos falla, [error] log y fallback al cliente: "Estamos con un problema técnico · ya alguien te contesta en breve."

8. .env.example con OPENWA_WEBHOOK_SECRET, OPENWA_API_KEY, OPENWA_BASE_URL (default http://localhost:2785), ANTHROPIC_API_KEY, CLAUDE_MODEL. Agregá .env al .gitignore.

9. package.json con dev (node --watch) y start. Dependencies: express, @anthropic-ai/sdk, dotenv.

10. README.md de 10 líneas explicando setup .env, arranque, test y logs esperados.

Después de armarlo, mostrame el comando exacto para configurar el webhook de OpenWA apuntando a http://localhost:3001/webhook con el HMAC.

Importante: si OPENWA_WEBHOOK_SECRET o ANTHROPIC_API_KEY están vacíos, abortá el arranque con error claro · no corras sin firma ni sin auth.
Camino B · Claude Code subprocess

claude -p · sin API key · consume tu cuota de Pro/Max

Si ya pagás Pro o Max · cero costo extra dentro de tu cuota.

Cuándo elegirlo

Si ya pagás Claude Pro o Max ($20-200/mes flat) y tu volumen de WhatsApp es bajo-medio (menos de ~200 mensajes en 5 horas). Las respuestas salen contra tu cuota mensual fija · sin sumas por token.

Cómo funciona

En vez de llamar a la SDK, el bridge spawnea claude -p "<prompt>" como subprocess y lee stdout. Usa la sesión logueada de Claude Code en tu compu · mismo modelo, misma calidad. Tu CLAUDE.md, skills y hooks aplican automáticamente.

Lo que ganás

  • · Sin ANTHROPIC_API_KEY · una variable menos en .env · un paso menos en el setup
  • · Cuota plana · si ya pagás Pro/Max, las respuestas salen gratis dentro del límite
  • · Tu CLAUDE.md y skills locales aplican · si Claude Code está tuneado para tu negocio, el bridge lo hereda

Lo que perdés

  • · Latencia ~2-3x más alta · overhead del subprocess (~2-3s vs ~500ms-1s)
  • · Rate limits de la suscripción (cada 5h y semanal) · si saturás, Claude se para hasta que reabra la ventana
  • · Concurrencia cara · cada mensaje arranca un proceso · 5 mensajes en paralelo ≈ ~2GB RAM

Honest disclosure · sigue hablando con Anthropic

Claude Code no es un modelo que corre en tu CPU · es un cliente CLI que envía el prompt a los servidores de Anthropic igual que la SDK. Lo único que cambia es cómo te facturan (cuota plana vs pay-per-token) y cómo autenticás (sesión logueada vs API key).

Camino B · prompt maestro · bridge con claude -p subprocess

Pegale esto a Claude Code dentro de una carpeta limpia. Requiere que Claude Code esté instalado y logueado en tu compu (corré 'claude login' una vez antes). El bridge no usa @anthropic-ai/sdk · spawnea claude como subprocess.

Armá bridge.js que conecte OpenWA (localhost:2785) con Claude Code corriendo en mi propia compu como subprocess · cero ANTHROPIC_API_KEY · consume mi cuota de Pro o Max. Camino B · claude -p. Variables al inicio:

- NOMBRE-NEGOCIO: [poné el nombre]
- QUE-VENDÉS: [una línea]
- TONO: [ej: cálido voseo Latam mensajes cortos]

Pre-req crítico antes de todo: verificá que Claude Code está instalado · corré "claude --version" · si no responde, parate y decime "primero instalá Claude Code y corré claude login". No sigas hasta que el comando funcione.

Construí bridge.js con estos 10 requisitos:

1. Express en localhost:3001 · endpoint POST /webhook.

2. Verificá HMAC con OPENWA_WEBHOOK_SECRET · 401 si no coincide.

3. Extraé text, sessionId, chatId del payload · 400 si falta alguno.

4. En vez de llamar a la SDK, spawneá Claude Code como subprocess:
   - Usá child_process.spawn (NO exec · evita buffer overflows con respuestas largas).
   - Comando: spawn("claude", ["-p", "--append-system-prompt", SYSTEM_PROMPT, "--output-format", "json", text]).
   - SYSTEM_PROMPT idéntico al de Camino A: "Sos el asistente de WhatsApp de [NOMBRE-NEGOCIO]. Vendemos [QUE-VENDÉS]. Tono: [TONO]. Reglas: 1) si no sabés, decí 'dejame consultar' · 2) no inventes precios, decí 'te paso el catálogo' · 3) si la pregunta es para humano, decí 'te paso con [TU-NOMBRE]' · 4) mensajes de máximo 3 líneas."
   - Capturá stdout · parsealo como JSON · extraé el campo .result (el texto de la respuesta).
   - Timeout de 30 segundos · si Claude tarda más, mata el proceso y respondé con fallback.

5. POST la respuesta a /api/sessions/{sessionId}/messages/send-text con X-API-Key: OPENWA_API_KEY.

6. Logging estructurado [webhook] [claude-cli] [openwa] [error] con prefijos.

7. Retry exponencial 3 intentos SOLO para errores de red al hablar con OpenWA. NO retry el subprocess de Claude Code · si Claude no respondió, ya hubo timeout y reintento no ayuda.

8. .env.example con OPENWA_WEBHOOK_SECRET, OPENWA_API_KEY, OPENWA_BASE_URL · NO incluye ANTHROPIC_API_KEY · agregá comentario "Camino B no usa API key · Claude Code está logueado por separado con 'claude login'".

9. package.json sin @anthropic-ai/sdk · dependencies solo express y dotenv. Scripts dev (node --watch) y start.

10. README.md de 10 líneas explicando: requiere claude login una vez · cómo arrancar · cómo testear · y un warning prominente: "Rate limits de Pro/Max te frenan si recibís más de ~200 mensajes en 5 horas. Si esperás más volumen, migrá a Camino A."

Después de armarlo, mostrame el comando para configurar el webhook de OpenWA apuntando a http://localhost:3001/webhook.

Importante: si claude --version falla al arranque, abortá con error claro · mejor parar temprano que correr sin Claude.
Camino C · Ollama · modelo local

Ollama + Qwen 2.5 · 100% offline · nada sale de tu compu

Privacidad total · cero costo recurrente · ya no es Claude.

Cuándo elegirlo

Si la privacidad importa más que la calidad (mensajes confidenciales, industria sensible) o querés cero dependencia de Anthropic. Aceptás que el modelo no es Claude · sino Qwen 2.5 (7B o 14B) corriendo en tu CPU/GPU.

Cómo funciona

Instalás Ollama (one-line desde ollama.com), corrés ollama pull qwen2.5:7b una vez para bajar el modelo (~5GB), y el bridge llama a http://localhost:11434/api/chat en vez de Anthropic. Todo el tráfico se queda en tu compu · sin internet necesario una vez descargado.

Lo que ganás

  • · Gratis 100 por ciento real · sin API ni suscripción · ni siquiera necesitás internet después del setup
  • · Privacidad total · cero datos a Anthropic ni a nadie · cumple con compliance estricto
  • · Sin rate limits externos · solo límite tu RAM/GPU

Lo que perdés

  • · No es Claude · Qwen/Llama/Mistral tienen otro tono · español Latam y matices de ventas bajan notable
  • · Hardware · mínimo 16GB RAM para Qwen 7B · ideal GPU · sin GPU latencia 5-10s por respuesta
  • · Descarga inicial 5-9 GB según modelo · y una vez al mes refrescar el modelo si querés mejoras

Honest disclosure · ya no es Claude

El reel dice "que Claude conteste solo" · con Ollama es otro modelo (Qwen, Llama, Mistral). Si tu negocio se vende sobre "usamos Claude", este camino rompe esa premisa. Probá 10-20 mensajes reales antes de poner en producción · vas a sentir la diferencia en tono.

Camino C · prompt maestro · bridge con Ollama local

Pegale esto a Claude Code · Claude se encarga de instalar Ollama si te falta, pullear el modelo (qwen2.5:7b por default), y armar bridge.js apuntando a localhost:11434 en vez de a Anthropic. Cero llamadas a Anthropic en este camino.

Armá bridge.js que conecte OpenWA (localhost:2785) con un modelo local corriendo en Ollama · cero llamadas a Anthropic · nada sale de mi compu. Camino C · Ollama. Variables al inicio:

- NOMBRE-NEGOCIO: [poné el nombre]
- QUE-VENDÉS: [una línea]
- TONO: [ej: cálido voseo Latam mensajes cortos]
- OLLAMA_MODEL: [default qwen2.5:7b · para mejor calidad qwen2.5:14b si tu compu aguanta · llama3.3:8b también funciona]

Pre-req crítico antes de todo · hacé estos 3 chequeos:

a) Verificá si Ollama está instalado · corré "ollama --version" · si no, decime el comando para instalarlo en mi OS (curl -fsSL https://ollama.com/install.sh | sh en mac/linux · descargá .exe desde ollama.com en windows) y esperá que confirme antes de seguir.

b) Pulleá el modelo · "ollama pull qwen2.5:7b" · esto baja ~5GB la primera vez · mostrame el progreso · esperá hasta que termine.

c) Verificá que Ollama está corriendo · "curl http://localhost:11434/api/tags" debe responder JSON · si no responde, pedime que abra Ollama Desktop o que corra "ollama serve" en otra terminal.

Construí bridge.js con estos 10 requisitos:

1. Express en localhost:3001 · endpoint POST /webhook.

2. Verificá HMAC con OPENWA_WEBHOOK_SECRET · 401 si no coincide.

3. Extraé text, sessionId, chatId del payload · 400 si falta alguno.

4. En vez de llamar a Anthropic, llamá a Ollama:
   - fetch a http://localhost:11434/api/chat con método POST.
   - Body: { model: OLLAMA_MODEL del env, messages: [{role:"system", content: SYSTEM_PROMPT}, {role:"user", content: text}], stream: false }.
   - SYSTEM_PROMPT idéntico al de Caminos A y B (asistente del negocio · 4 reglas · máximo 3 líneas).
   - Capturá response.message.content como la respuesta del modelo.
   - Timeout de 60 segundos · modelos locales son más lentos · sin GPU pueden tardar 5-10s.

5. POST la respuesta a /api/sessions/{sessionId}/messages/send-text con X-API-Key: OPENWA_API_KEY.

6. Logging estructurado [webhook] [ollama] [openwa] [error] con prefijos.

7. Retry exponencial 3 intentos SOLO para errores de red de OpenWA · si Ollama falla, mostrá el error y respondé fallback "Estamos con un problema técnico · ya alguien te contesta en breve."

8. .env.example sin ANTHROPIC_API_KEY · solo OPENWA_WEBHOOK_SECRET, OPENWA_API_KEY, OPENWA_BASE_URL, OLLAMA_MODEL, OLLAMA_BASE_URL (default http://localhost:11434). Comentario "Camino C es 100 por ciento local · zero dependency Anthropic".

9. package.json sin @anthropic-ai/sdk · dependencies solo express y dotenv. Scripts dev y start.

10. README.md explicando: cómo instalar Ollama · cómo pullear el modelo · cómo arrancar el bridge · y un warning amber prominente: "Este camino usa Qwen 2.5 (no Claude). La calidad de respuestas en español Latam es decente pero no igual a Claude. Probá 10-20 mensajes reales antes de poner en producción para clientes."

Después de armarlo, mostrame el comando para arrancar (npm run dev) y sugerime un mensaje de prueba.

Importante: si Ollama no responde al arranque del bridge, abortá con error claro · no asumas.

Lo que ganás cuando Claude termina de armarlo

Un proceso chiquito (node bridge.js) corriendo al lado de OpenWA. Cada mensaje entrante se contesta automáticamente con la personalidad que vos dictaste en el system prompt. Para cambiar el tono o las reglas, editás el system prompt en el bridge (o en .env) y reiniciás · sin tocar OpenWA. Para apagarlo, Ctrl+C en ambas terminales.

Anti-baneo · evitar perder tu número aunque sea nuevo

7 reglas que tu agente tiene que respetar

El warning del Header dice que WhatsApp puede banear tu número si la conexión se detecta o si lo usás de forma indebida · estas 7 reglas son el piso de protección. Las primeras 4 van en el system prompt (Claude las aplica al responder) · las 5 y 6 van en el bridge.js (código las enforcea) · la 7 es operativa, vos la respetás. Al final de la sección tenés un prompt copy-paste (#07 en la sección de abajo) que le pide a Claude Code que aplique las 6 reglas técnicas en una sola pegada.

01system prompt

Variá saludos, cierres y formulaciones

WhatsApp hashea el texto de los mensajes que mandás · si las primeras 5-10 respuestas usan exactamente la misma apertura ("Hola, ¿en qué puedo ayudarte?"), es la firma de bot más fácil de detectar. Pedile a Claude que rote · "¡Buenas! contame" la 2da · "Holaa, decime" la 3ra · "Hola, ¿qué necesitás?" la 4ta · etc. Lo mismo con los cierres. Variación natural = humano · texto idéntico = bot.

02system prompt

Si el usuario pide parar, paráte

Si el usuario escribe "stop", "borrame", "no me escribas más", "alta", "quitame de tu lista", o expresa enojo sobre recibir mensajes ("¿quién te dio mi número?", "dejá de joder"), respondé UNA última vez disculpándote y después no respondas más a ese chatId hasta que el usuario te escriba algo positivo. Reports y bloqueos disparan ban más rápido que cualquier otra cosa · la disciplina acá es lo que más te protege.

03system prompt

Espejá el tono, idioma y longitud del usuario

Si te escribe formal, respondé formal · si te escribe en spanglish, respondé en spanglish · si te escribe en inglés, respondé en inglés. Si te manda 3 palabras, respondé en 3 palabras · no le tires un párrafo. Si te escribe a las 23:00 con audio largo, no le contestes con una novela. Patrones rígidos de respuesta (siempre formal, siempre largo, siempre la misma estructura) son la 2da firma de bot que detecta WhatsApp.

04system prompt

No mandes el mismo template verbatim a varios chats

Si 5 personas te preguntan "cuánto cuesta el plan básico?", no les mandes la respuesta idéntica letra por letra. Pedile a Claude 5 redacciones distintas con la misma información · "sale $30 mensual" · "el básico te queda en $30/mes" · "el plan básico cuesta 30 dólares al mes" · etc. WhatsApp hashea contenido cross-chat · si 50 chats reciben el mismo string, te marca como broadcast bot.

05bridge.js

Delay artificial 5-15 segundos antes de responder

Las respuestas en menos de 1 segundo son la firma de bot #1 que detecta WhatsApp · ningún humano lee, piensa y tipea en 800ms. En el bridge.js, antes del POST a /messages/send-text, esperá un random entre 5000-15000ms. Si la respuesta es larga, sumá tiempo proporcional al texto (simulando que tardás más en tipear más). Loggealo como [delay] esperando Xs · es la mejora más fácil que más impacto tiene.

06bridge.js

Pausa nocturna 22:00-08:00 hora local

Humanos duermen · bots no. Si tu agente responde a las 3am todas las noches, WhatsApp lo nota en una semana. En el bridge.js, si el mensaje entra entre las 22:00-08:00 (hora del país del negocio · configurable via env TZ), poné el mensaje en una cola en memoria (array simple) y procesála a las 08:00 del día siguiente. Loggealo como [night-pause] mensaje encolado · responde a las 08:00. Como bonus · evita responder borracho a clientes a las 3am.

07operativo

Warmup gradual del número nuevo

Un número WhatsApp recién creado que pasa de 0 a 100 chats por día = ban instantáneo. La regla operativa: día 1 máximo 10 chats nuevos · día 2 máximo 20 · día 3 máximo 30 · y así. Después de 2-3 semanas con crecimiento gradual y zero reports, el número está "caliente" y aguanta volumen normal. Si vas a importar una base de contactos, hacé warmup conversando manualmente con 20-30 personas reales antes de prender el bridge.

Aplicá las 6 reglas técnicas en 1 pegada

El prompt #07 de la sección de Prompts copy-paste de abajo ("Anti-baneo · pegale esto a Claude para actualizar bridge.js + system prompt") le pide a Claude Code que sume las 4 reglas al SYSTEM_PROMPT sin borrar las que ya hay + agregue 3 mecanismos al bridge.js (delay artificial · pausa nocturna · rate limit por chat). Funciona con los 3 motores (SDK · claude -p · Ollama) porque toca el system prompt y la lógica del bridge, no la SDK específica.

Prompts copy-paste · 6 fases del recorrido

Pegale uno de estos a Claude Code · reemplazá los corchetes primero

Estos 7 prompts cubren el recorrido completo · cada uno es copy-paste listo · reemplazá los [entre corchetes] con tus datos antes de pegar. Si nunca usaste Claude Code, leé primero /community/instalar-claude-code · 5 minutos.

01 · Instalá OpenWA en mi compu

Claude detecta tu OS, instala Docker si falta, clona el repo, levanta el container y verifica que el dashboard responde en localhost:2785.

Instalá OpenWA (github.com/rmyndharis/OpenWA) en mi compu paso a paso. Hacé esto:

1. Detectá mi OS · si es mac corré sw_vers · si es linux corré uname -a · si es windows corré ver.

2. Verificá si tengo Docker (docker --version) · si no lo tengo, decime el comando para instalarlo en mi OS y esperá que confirme.

3. Verificá que Docker Desktop esté corriendo (docker ps no debe dar error).

4. git clone https://github.com/rmyndharis/OpenWA.git en esta carpeta.

5. cd OpenWA && docker compose -f docker-compose.dev.yml up -d.

6. Esperá 2-3 minutos · mostrame los logs del pull mientras baja.

7. Verificá que localhost:2785 responde con curl · si responde, decime "abrí localhost:2785 en tu navegador" · si no, mostrame el error.

Pidiéndome confirmación antes de cada paso destructivo. En español Latam con voseo.

02 · Creá la sesión y mostrame el QR en terminal

Claude orquesta los 3 endpoints REST de OpenWA (crear sesión, start, get QR), te dibuja el QR en ASCII en la terminal y se queda esperando hasta confirmar que el número se conectó.

OpenWA está corriendo en localhost:2785. Conectame mi número así · armá un script connect.js:

1. POST a /api/sessions con sessionId "mi-vendedor".

2. POST a /api/sessions/mi-vendedor/start.

3. GET a /api/sessions/mi-vendedor/qr pollearlo cada 2 segundos hasta tener el base64.

4. Usá qrcode-terminal (npm install qrcode-terminal) para dibujar el QR en mi terminal en ASCII grande.

5. Pollear /api/sessions/mi-vendedor/status cada 3 segundos hasta que diga connected · cuando confirme, decí "número conectado, listo para el bridge" y terminá.

6. Agregá package.json con las dependencies · mostrame el comando exacto para correrlo.

Si algo falla, mostrame el error completo · no asumas.

03 · Armame el bridge Node con webhook + Claude (Camino A · SDK)

El prompt maestro abreviado · construye el puente Express con HMAC, llamada a Claude via SDK, retry exponencial, .env.example y README. Esta es la versión rápida del Camino A. Si querés los Caminos B (claude -p sin API key) o C (Ollama local), mirá Paso 3 arriba con los 3 motores · cada uno trae su prompt completo.

Armá bridge.js que conecte OpenWA (localhost:2785) con la API de Claude para responder mensajes de WhatsApp automáticamente. Variables:

- NOMBRE-NEGOCIO: [poné el nombre]
- QUE-VENDÉS: [una línea]
- TONO: [ej: cálido voseo Latam mensajes cortos]

Requisitos:
1. Express en localhost:3001 · endpoint POST /webhook.
2. Verificá HMAC con OPENWA_WEBHOOK_SECRET · 401 si no coincide.
3. Extraé text, sessionId, chatId del payload de OpenWA.
4. Llamá @anthropic-ai/sdk · modelo claude-haiku-4-5-20251001 · max_tokens 500. System prompt con la personalidad de las variables de arriba + 4 reglas (no inventes precios · pasá a humano si la pregunta es compleja · mensajes de máximo 3 líneas · sin saludos largos).
5. POST la respuesta de Claude a /api/sessions/{sessionId}/messages/send-text con header X-API-Key (OPENWA_API_KEY del env).
6. Logging estructurado [webhook] [claude] [openwa] [error].
7. Retry exponencial 3 intentos (500ms · 1500ms · 4000ms) para 5xx · fallback "estamos con un problema técnico" si todos fallan.
8. .env.example con todas las vars · .gitignore con .env.
9. package.json con dev (node --watch) y start.
10. README.md de 10 líneas de uso.

Después mostrame el comando para configurar el webhook de OpenWA apuntando a http://localhost:3001/webhook con el HMAC secret.

04 · Definí la personalidad del agente

Template del system prompt con corchetes reemplazables · pegale esto a Claude pidiéndole que lo guarde en bridge.js o en .env como SYSTEM_PROMPT.

Reemplazá el system prompt actual del bridge.js con este · adaptado a mi caso. Variables:

- NOMBRE-NEGOCIO: [ej: Cafetería Don Luis]
- QUÉ-VENDÉS: [ej: café especial, pastelería casera, almuerzos para llevar]
- TONO: [ej: amable, cálido, voseo Latam, mensajes cortos, sin emojis]
- QUÉ-NO-HACER: [ej: no inventes precios · no prometas tiempos de entrega · no des recetas]
- CUÁNDO-DERIVAR-A-HUMANO: [ej: si preguntan por catering, reservas de grupo, quejas]

System prompt final (pegámelo verbatim en bridge.js como const SYSTEM_PROMPT):

"Sos el asistente de WhatsApp de [NOMBRE-NEGOCIO]. Vendemos [QUÉ-VENDÉS].

Tono: [TONO].

Reglas:
1. Si te preguntan algo que no sabés, decí: 'dejame consultar y te confirmo, dame unos minutos'.
2. Si piden precios y no los tenés en este prompt, decí: 'te paso el catálogo por acá ahora mismo' (pero NO inventes precios).
3. [QUÉ-NO-HACER].
4. Si la pregunta entra en estos casos: [CUÁNDO-DERIVAR-A-HUMANO] · respondé: 'te paso con [TU-NOMBRE], él te contesta en breve'.
5. Mensajes cortos, máximo 3 líneas. Sin saludos largos."

Reiniciá el bridge (Ctrl+C y npm run dev de nuevo) y confirmame que el system prompt nuevo está cargado.

05 · Probá el flujo escribiéndote a vos mismo

Claude te guía para mandar el primer mensaje desde otro número (otro celular o WhatsApp Web tuyo desde otra cuenta), revisar los logs del bridge y confirmar que el loop funciona end-to-end.

OpenWA y bridge.js están corriendo. Quiero probar el flow completo. Ayudame así:

1. Decime cómo verificar que OpenWA y el bridge están vivos · qué comando correr para chequear (curl localhost:2785, ps aux | grep node, etc).

2. Dame instrucciones claras para mandar un mensaje al número conectado · "abrí WhatsApp en otro teléfono, escribíle al número [TU-NUMERO], pegá este texto: 'Hola, ¿cuánto cuesta el café?'" · ese texto debe ser representativo del caso real.

3. Mientras yo mando el mensaje, monitoreá los logs del bridge en la terminal · decime exactamente qué tengo que ver aparecer: [webhook] mensaje recibido, [claude] generando respuesta, [openwa] enviando respuesta.

4. Cuando llegue la respuesta de vuelta a mi WhatsApp, pedime que te la pegue · revisá si el tono coincide con el system prompt · si está raro, decime qué ajustar.

5. Si algo no anduvo (el mensaje no llegó, el bridge no logueó nada, etc), guíame paso a paso para debuggear · empezando por verificar que el webhook de OpenWA está configurado correctamente apuntando a localhost:3001/webhook.

06 · Mejorá la respuesta cuando algo no funciona

Loop de feedback iterativo · le pegás el screenshot del chat malo o el texto, Claude propone ajustes al system prompt o al bridge, vos aprobás y reinicia.

Mi bridge contestó esto y no me convence:

[Pegá el chat: lo que escribió el cliente · lo que respondió Claude · qué hubiera contestado vos]

Ayudame a iterar:

1. Diagnosticá por qué Claude respondió así · ¿es el system prompt? ¿es el modelo? ¿es que faltaba contexto en la conversación?

2. Si es el system prompt, proponé 2 versiones del fix · una mínima (1 regla nueva) y una más profunda (rewrite de la sección de tono o reglas). Mostrame ambas, dejame elegir.

3. Si es el modelo (Haiku no captura matices), proponé subir a Sonnet · explicame el costo extra (~10x más por respuesta).

4. Si es contexto, proponé agregar memoria de últimos 5 mensajes por chatId · explicame los pros y contras (Claude entiende mejor pero gasta más tokens).

5. Después de elegir, aplicá el cambio al bridge.js o .env · reiniciá · pedime que pruebe de nuevo con el mismo mensaje original para comparar.

07 · Anti-baneo · sumá las 6 reglas técnicas al bridge + system prompt

Pegale esto a Claude Code dentro de la carpeta donde tenés bridge.js. Claude suma 4 reglas al SYSTEM_PROMPT sin borrar las que ya hay y agrega 3 mecanismos al bridge.js (delay artificial · pausa nocturna · rate limit por chat). Funciona con los 3 motores (SDK · claude -p · Ollama) porque toca el system prompt y la lógica del bridge, no la SDK específica. La regla #07 (warmup gradual) es operativa · vos la respetás manualmente.

Quiero agregar 6 reglas anti-baneo a mi setup de OpenWA para que WhatsApp no me banee el número. Tengo bridge.js funcionando en esta carpeta. Hacé estos cambios sin romper lo que ya hay.

PARTE 1 · sumá estas 4 reglas al SYSTEM_PROMPT (ya sea constante en bridge.js o env SYSTEM_PROMPT)

Encontrá el SYSTEM_PROMPT actual · agregá estas 4 reglas a continuación de las que ya están (sin borrar las existentes · solo sumalas como reglas 5, 6, 7, 8):

5) Variá saludos, cierres y formulaciones · nunca uses la misma apertura más de 2 veces seguidas · alterná entre "Hola", "¡Buenas!", "Holaa", "Hola, ¿qué necesitás?", etc. Mismo con los cierres · variación natural simula humano.

6) Si el usuario escribe "stop", "borrame", "no me escribas más", "alta", "quitame", o expresa enojo sobre recibir mensajes ("¿quién te dio mi número?", "dejá de joder"), respondé UNA última vez disculpándote brevemente y después marcá ese chatId como BLOQUEADO en memoria · no respondas más a ese chat hasta que el usuario escriba algo positivo (saludo, pregunta neutral).

7) Espejá el tono, idioma y longitud del usuario · si te escribe formal, respondé formal · si escribe en spanglish, respondé en spanglish · si te manda 3 palabras, respondé en 3 palabras · no le tires un párrafo a una pregunta corta.

8) No mandes el mismo template verbatim a varios chats · si la misma pregunta llega de chats distintos, contestala con redacciones distintas (misma información, distintas palabras).

PARTE 2 · agregá estos 3 mecanismos al bridge.js

a) DELAY ARTIFICIAL · justo antes del POST a /api/sessions/{sessionId}/messages/send-text, esperá un random entre 5000-15000 ms · usá Math.floor(Math.random() * 10000 + 5000) · si el texto de la respuesta es largo (>200 chars), sumá 1000ms cada 100 chars adicionales (simulando que tardás más tipeando textos largos). Loggealo como [delay] esperando Xs antes de responder.

b) PAUSA NOCTURNA · al inicio del manejo de cada webhook, checkeá la hora local con new Date() y un offset de TZ del env (default America/Argentina/Buenos_Aires). Si la hora actual está entre NIGHT_PAUSE_START (default 22) y NIGHT_PAUSE_END (default 8), NO mandes la respuesta inmediatamente · poné el mensaje en una cola en memoria (array simple { chatId, sessionId, originalText, claudeResponse, queuedAt }) y arrancá un setInterval que cada 15 minutos checkea si ya son las NIGHT_PAUSE_END y procesa la cola en orden. Loggealo como [night-pause] mensaje encolado · responderá a las HH:MM.

c) RATE LIMIT POR CHAT · mantené un Map<chatId, lastReplyTimestamp> en memoria. Antes de mandar una respuesta, checkeá si el último envío al mismo chatId fue hace menos de 30 segundos · si sí, agregá ese delta al delay artificial (parte 2a) para que el bridge nunca dispare 2 mensajes al mismo chat en menos de 30s. Loggealo como [rate-limit] esperando Xs extra antes de responder a chatId.

PARTE 3 · entrega esperada

- Mostrame el diff antes de aplicar · sección por sección · explicame qué cambia y qué quedó intacto.
- Si alguna regla colide con algo del bridge actual (ej: ya hay un delay, ya hay un rate limit), pará y avisame · no sobrescribas sin preguntar.
- Después de aplicar, mostrame el comando para reiniciar (Ctrl+C + npm run dev) y proponé un test sencillo (mandate un mensaje, ver el log mostrando [delay] esperando Xs, ver la respuesta llegar 5-15s después).
- Si el .env necesita nuevas variables (TZ, NIGHT_PAUSE_START, NIGHT_PAUSE_END), updateá .env.example con comentarios pero NO toques mi .env existente.

Importante: la regla #07 (warmup gradual del número · día 1 max 10 chats, día 2 max 20, etc.) es operativa · no la implementes en código, solo recordámela en el README.md con un párrafo claro.

Paso 4 · probarlo escribiéndote a vos mismo

4 pasos para que la primera prueba salga limpia

Esto es lo que hace el reel: agarrás otro teléfono (o le pedís a un amigo · o usás otro número tuyo), le mandás un mensaje al número OpenWA y Claude responde solo. Acá los 4 pasos para que la primera prueba salga limpia · y para que cuando algo falle sepas dónde mirar.

  1. Paso 01

    Mandá el primer mensaje desde otro número

    Tomá otro celular (el tuyo personal, el de alguien de confianza) y mandá un mensaje real al número que conectaste · empezá con algo representativo del caso real, no "test". Por ejemplo: "Hola, ¿cuánto cuesta el café?" o "Buenas, ¿están abiertos hoy?". El texto real te dice si la respuesta del agente va a ser útil en producción.

  2. Paso 02

    Mirá el log del bridge en la terminal

    En la terminal donde corrés bridge.js vas a ver 3 líneas seguidas: [webhook] mensaje recibido de +54... · [claude] generando respuesta · modelo claude-haiku-4-5 · [openwa] enviando respuesta a chatId. Si solo ves la primera línea y nada más, el problema está entre el bridge y Claude · revisá ANTHROPIC_API_KEY. Si ves las 3 pero el mensaje no llega al celular, el problema está entre el bridge y OpenWA · revisá OPENWA_API_KEY y que la sesión siga conectada.

  3. Paso 03

    Ajustá el tono si suena raro

    Cuando llegue la respuesta a tu celular, leéla con ojo crítico · ¿usaría esas palabras un vendedor real tuyo? ¿el saludo es muy largo? ¿inventó un precio? Si algo no suena, editá el SYSTEM_PROMPT en bridge.js o en .env, reiniciá el bridge (Ctrl+C y npm run dev), y probá de nuevo con el MISMO mensaje original · así comparás manzana con manzana.

  4. Paso 04

    Iterá con 5-10 mensajes reales

    No asumas que con 1 mensaje ya está. Probá: objeciones ("está caro"), preguntas en spanglish ("hi, vendés delivery?"), preguntas trampa ("¿hablo con un humano?"), pedidos complejos ("quiero 2 cafés y 1 medialuna para llevar en 30 min"). Cada caso te muestra una grieta del system prompt. Después de 5-10 iteraciones tenés un agente que aguanta el mundo real.

Guía de la comunidad

Esta entrada destila OpenWA — el gateway WhatsApp self-hosted MIT — más el flow de bridge con Claude que el reel comprime. Es parte de la bóveda de tododeia, una colección libre de recursos para quienes construyen con Claude todos los días.

Cierre personal

Si te cansaste de pagar SaaS por mensaje o de ver cómo se te van las horas contestando lo mismo 50 veces al día, montar tu propio agente de WhatsApp en tu compu con OpenWA y Claude es el camino más honesto que hay en 2026 · gratis 100 por ciento no es (Claude cuesta centavos por respuesta) pero es la versión más cerca de cero que vas a encontrar · y la única donde vos controlás cada línea del bridge.

Guías hermanas que cruzan con openwa-whatsapp

Por dónde empezar si llegaste sin saber qué es OpenWA

Si llegaste sin saber nada · empezá así: (1) leé la sección de Seguridad arriba completa · 3 minutos · (2) sacate una SIM nueva o eSIM virtual antes de tocar el código · (3) instalá Claude Code si no lo tenés (link en cross-links · 5 min) · (4) seguí el Camino A con Docker que es el oficial · (5) cuando OpenWA esté corriendo, pegá el prompt #2 para conectar tu número con QR · (6) después el prompt #3 (el maestro) para que Claude arme el bridge · contás 60-90 minutos en total el primer día.

Para quién no aplica esta página

Esta guía NO es para vos si: tu negocio está en una industria regulada (banca, salud, legal) donde la API oficial Business de Meta es obligatoria · si no tenés forma de correr Docker o Node 22 (compus muy viejas, Chromebooks bloqueados) · si esperás 24/7 sin un VPS (en tu compu personal el agente se cae cuando dormís) · si el único número WhatsApp que tenés es el de tu mamá o el principal de tu negocio activo (releé Seguridad · no lo conectes).