canove/whaticket-community
canove/whaticket-community has 2,086 GitHub stars and 1,047 forks. GitHot measured 0 stars in 24 hours and +3 in 7 days. Last checked 2026-11-12 17:14 UTC. Last push 2026-10-13.
A very simple Ticket System based on WhatsApp messages, that allow multi-users in same WhatsApp account.
What you can do
- 💬 Shared inbox: several agents answering from the same WhatsApp number
- 📱 Multiple connections: link more than one WhatsApp account, receive it all in one place
- 🎫 Ticket lifecycle: pending → open → resolved, with assignment per agent
- 🏷️ Queues: route incoming conversations to the right department
Crecimiento de estrellas medido
- in 24h
- 0
- in 7 days
- +3
- in 15 days
- Recopilando historial
- in 1 month
- Recopilando historial
Cambios netos en períodos que se solapan, no totales diarios. Los datos no disponibles se dejan en blanco. Las estrellas indican interés, no calidad.
README.es.md
OriginalWhaticket Open Source
El sistema de tickets de WhatsApp, de código abierto, que dio origen a Whaticket.
Varios agentes en un mismo número. Cada conversación se convierte en un ticket.
Qué es esto · Open Source vs Whaticket · Capturas de pantalla · Inicio rápido · Configuración · Estado del proyecto
Qué es esto
En 2020 este repositorio era un experimento de fin de semana: convertir mensajes de WhatsApp en tickets de soporte para que todo un equipo pudiera responder desde un único número. Se convirtió en uno de los proyectos de helpdesk para WhatsApp más forkeados de GitHub, y dio origen a Whaticket, la plataforma comercial que hoy atiende a más de 4.500 empresas en América Latina.
Este repositorio es Whaticket Open Source: el código original, con licencia MIT. Puedes alojarlo por tu cuenta, forkearlo y construir encima. El código del que nació la empresa sigue siendo público.
Backend: Node.js + TypeScript + Express + Sequelize. Se comunica con WhatsApp a través de una capa de proveedores intercambiable (whatsapp-web.js o zapo-js) y guarda todo en MySQL/MariaDB.
Frontend: una aplicación de chat en React + Material UI, empaquetada con Vite. Habla con el backend mediante REST y WebSockets, en español, portugués e inglés.
[!NOTE] ¿Prefieres no administrar servidores? Whaticket es la plataforma gestionada creada por el mismo equipo. Trabaja con la API oficial de WhatsApp y reúne Instagram, Facebook, TikTok, Telegram y chat web en una sola bandeja de entrada, con chatbots con IA, campañas masivas y soporte 24/7. 14 días gratis, sin tarjeta de crédito.
Open Source vs Whaticket
Ambos están hechos por el mismo equipo. La diferencia está en cuánta infraestructura quieres administrar.
| Whaticket Open Source | Whaticket | |
|---|---|---|
| Licencia / precio | MIT, gratis para siempre | Desde US$ 49/mes para 3 usuarios |
| Alojamiento, actualizaciones, respaldos | Por tu cuenta | Gestionado |
| WhatsApp por código QR | ✅ | ✅ |
| API oficial de WhatsApp (Cloud API) | ❌ | ✅ |
| Varios agentes en el mismo número | ✅ | ✅ |
| Múltiples conexiones de WhatsApp | ✅ | ✅ |
| Colas / departamentos | ✅ | ✅ |
| Respuestas rápidas | ✅ | ✅ |
| Multimedia (imagen/audio/video/archivos) | ✅ | ✅ |
| Instagram, Facebook, TikTok, Telegram, chat web | ❌ | ✅ |
| Chatbots por reglas y con IA (Wäbot) | ❌ | ✅ |
| Campañas masivas | ❌ | ✅ |
| Reportes, CSAT y métricas de desempeño | Panel básico | ✅ |
| Integraciones (Zapier, Shopify, Slack, Google…) | ❌ | ✅ |
| Aplicaciones móviles (iOS / Android) | ❌ | ✅ |
| Soporte | Comunidad, en Discord y en los issues | 24/7 por WhatsApp |
El plan comercial empieza en 3 usuarios, lo que sale alrededor de US$ 16 por usuario al mes.
Capturas de pantalla
![]() |
![]() |
| Conversación de un ticket | Vista del agente |
![]() |
![]() |
| Múltiples conexiones de WhatsApp | Gestión de contactos |
Funcionalidades
- 💬 Bandeja de entrada compartida: varios agentes respondiendo desde el mismo número
- 📱 Múltiples conexiones: conecta más de una cuenta de WhatsApp y recíbelo todo en un solo lugar
- 🎫 Ciclo de vida del ticket: pendiente → abierto → resuelto, con asignación por agente
- 🏷️ Colas: dirige las conversaciones entrantes al departamento correcto
- ⚡ Respuestas rápidas: mensajes predefinidos para las preguntas de todos los días
- 🖼️ Multimedia: envía y recibe imágenes, audios, videos y documentos
- 👥 Contactos: inicia conversaciones con contactos nuevos sin tocar el teléfono
- 📊 Panel: visión general de tickets y actividad de los agentes
- 🔌 Proveedor de WhatsApp intercambiable:
whatsapp-web.js(Puppeteer) ozapo(WebSocket) - 🌍 i18n: español, portugués e inglés incluidos
Cómo funcionan los tickets
Cada mensaje nuevo en un número de WhatsApp conectado crea un Ticket. Los tickets llegan a una cola en la página Tickets, donde un agente acepta el ticket, lo responde y finalmente lo resuelve.
Los mensajes posteriores del mismo contacto se adjuntan al primer ticket abierto/pendiente que se encuentre. Si el contacto vuelve a escribir en menos de 2 horas y no tiene ningún ticket pendiente ni abierto, se reabre el ticket cerrado más reciente en lugar de crear uno nuevo.
Requisitos
- Node.js 14+ para el proveedor
wwebjs, Node.js 22+ para el proveedorzapo(la CI y el Dockerfile del backend compilan en Node 22) - MySQL 5.7+ o MariaDB 10.6+
- Docker (opcional, pero es la forma más rápida de levantar la base de datos)
- Un servidor Linux si vas a producción. Estas instrucciones asumen Ubuntu 20.04+.
[!WARNING] Los proveedores por código QR que se usan aquí son clientes no oficiales de WhatsApp. WhatsApp no permite bots ni clientes no oficiales en su plataforma, y los números conectados así pueden ser bloqueados. La alternativa soportada es la API oficial de WhatsApp, que Whaticket ofrece.
Inicio rápido con Docker
git clone https://github.com/canove/whaticket.git
cd whaticket
cp .env.example .env
Edita el .env. Como mínimo, define MYSQL_ROOT_PASSWORD, JWT_SECRET y JWT_REFRESH_SECRET:
# MYSQL
MYSQL_ENGINE=mariadb
MYSQL_VERSION=10.6
MYSQL_ROOT_PASSWORD=cambia-esto
MYSQL_DATABASE=whaticket
MYSQL_PORT=3306
TZ=America/Fortaleza
# BACKEND
BACKEND_PORT=8080
BACKEND_SERVER_NAME=api.midominio.com
BACKEND_URL=https://api.midominio.com
PROXY_PORT=443
JWT_SECRET=cambia-esto
JWT_REFRESH_SECRET=cambia-esto-tambien
# FRONTEND
FRONTEND_PORT=80
FRONTEND_SSL_PORT=443
FRONTEND_SERVER_NAME=app.midominio.com
FRONTEND_URL=https://app.midominio.com
Levanta todo:
docker-compose up -d --build
Solo en la primera ejecución, carga los datos iniciales:
docker-compose exec backend npx sequelize db:seed:all
Abre el frontend, inicia sesión con la cuenta creada por el seed, ve a Conexiones, crea tu primera conexión de WhatsApp y escanea el código QR. A partir de ahí, cada mensaje que reciba ese número aparece en la lista de tickets.
Credenciales por defecto: [email protected] / admin. Cámbialas de inmediato.
Servicios Docker opcionales
phpMyAdmin, para inspeccionar la base de datos (puerto 9000 por defecto, configurable con
PMA_PORT):
docker-compose -f docker-compose.phpmyadmin.yaml up -d
Browserless, para ejecutar Chrome fuera del contenedor del backend (define
MAX_CONCURRENT_SESSIONS):
docker-compose -f docker-compose.browserless.yaml up -d
Certificados SSL en el entorno Docker
Coloca tus certificados en ssl/certs, con una carpeta por servicio:
.
├── certs
│ ├── backend
│ │ ├── fullchain.pem
│ │ └── privkey.pem
│ └── frontend
│ ├── fullchain.pem
│ └── privkey.pem
└── www
El contenedor nginx del frontend ya está preparado para responder al desafío webroot de certbot:
certbot certonly --cert-name backend --webroot --webroot-path ./ssl/www/ -d api.midominio.com
certbot certonly --cert-name frontend --webroot --webroot-path ./ssl/www/ -d app.midominio.com
Ejecutar en local para desarrollo
Paso a paso del entorno de desarrollo
1. Levanta una base de datos
docker run --name whaticketdb \
-e MYSQL_ROOT_PASSWORD=strongpassword \
-e MYSQL_DATABASE=whaticket \
-e MYSQL_USER=whaticket \
-e MYSQL_PASSWORD=whaticket \
--restart always -p 3306:3306 -d mariadb:10.6 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_bin
2. Instala las dependencias de sistema de Puppeteer (solo necesarias para el proveedor
wwebjs):
sudo apt-get install -y libxshmfence-dev libgbm-dev wget unzip fontconfig locales gconf-service \
libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 \
libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 \
libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 \
libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates \
fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils
3. Backend
cd backend
cp .env.example .env # luego complétalo, ver Configuración más abajo
npm install
npm run build
npx sequelize db:migrate
npx sequelize db:seed:all
npm run dev # o: npm start
4. Frontend, en una segunda terminal:
cd frontend
cp .env.example .env
npm install
npm run dev
El frontend/.env solo necesita apuntar al backend:
VITE_BACKEND_URL = http://localhost:8080/
5. Abre http://localhost:3000/signup, crea un usuario, luego ve a Conexiones y escanea el código QR.
Despliegue en producción en un VPS
Ubuntu 20.04 + pm2 + nginx + Let's Encrypt
Estos pasos asumen que no estás como root, porque Puppeteer se niega a arrancar como root.
Apunta dos subdominios a tu servidor antes de empezar; esta guía usa app.midominio.com para
el frontend y api.midominio.com para el backend.
Crea un usuario de despliegue
adduser deploy
usermod -aG sudo deploy
su deploy
Instala Node y Docker
sudo apt update && sudo apt upgrade -y
curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update && sudo apt install -y docker-ce
sudo usermod -aG docker ${USER}
su - ${USER}
Base de datos, código y backend
docker run --name whaticketdb \
-e MYSQL_ROOT_PASSWORD=strongpassword -e MYSQL_DATABASE=whaticket \
-e MYSQL_USER=whaticket -e MYSQL_PASSWORD=whaticket \
--restart always -p 3306:3306 -d mariadb:10.6 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_bin
cd ~ && git clone https://github.com/canove/whaticket.git whaticket
cp whaticket/backend/.env.example whaticket/backend/.env
nano whaticket/backend/.env # usa URLs https:// y PROXY_PORT=443
cd whaticket/backend
npm install
npm run build
npx sequelize db:migrate
npx sequelize db:seed:all
Confirma que arranca con npm start (deberías ver Server started on port...), detenlo con
CTRL + C y entrégalo a pm2:
sudo npm install -g pm2
pm2 start dist/server.js --name whaticket-backend
pm2 startup ubuntu -u $USER # ejecuta el comando que imprima
Frontend
cd ../frontend
npm install
echo "VITE_BACKEND_URL = https://api.midominio.com/" > .env
npm run build
pm2 start server.js --name whaticket-frontend
pm2 save
nginx
sudo apt install -y nginx
sudo rm /etc/nginx/sites-enabled/default
sudo nano /etc/nginx/sites-available/whaticket-frontend
server {
server_name app.midominio.com;
location / {
proxy_pass http://127.0.0.1:3333;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
Copia el archivo para el backend, cambiando server_name a api.midominio.com y proxy_pass
a http://127.0.0.1:8080, y habilita ambos:
sudo cp /etc/nginx/sites-available/whaticket-frontend /etc/nginx/sites-available/whaticket-backend
sudo nano /etc/nginx/sites-available/whaticket-backend
sudo ln -s /etc/nginx/sites-available/whaticket-frontend /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/whaticket-backend /etc/nginx/sites-enabled
nginx limita el cuerpo de las peticiones a 1MB, insuficiente para subir multimedia. En
/etc/nginx/nginx.conf, dentro del bloque http { }:
client_max_body_size 20M;
sudo nginx -t && sudo service nginx restart
HTTPS, obligatorio para notificaciones y envío de audio:
sudo snap install --classic certbot
sudo certbot --nginx
Configuración
Backend (backend/.env)
| Variable | Descripción | Por defecto |
|---|---|---|
WHATSAPP_PROVIDER |
Driver de WhatsApp: wwebjs o zapo |
wwebjs |
NODE_ENV |
DEVELOPMENT activa logs más detallados |
|
PORT |
Puerto en el que escucha el backend | 8080 |
PROXY_PORT |
Puerto público detrás del reverse proxy (443 en producción) |
8080 |
BACKEND_URL |
URL pública del backend | http://localhost:8080 |
FRONTEND_URL |
URL pública del frontend. El CORS depende de esto | http://localhost:3000 |
DB_HOST / DB_PORT |
Host y puerto de la base de datos | localhost / 3306 |
DB_DIALECT |
mysql |
mysql |
DB_NAME / DB_USER / DB_PASS |
Credenciales de la base de datos | |
JWT_SECRET / JWT_REFRESH_SECRET |
Secretos de firma de los tokens, cámbialos | |
CHROME_BIN / CHROME_WS / CHROME_ARGS |
Configuración de Puppeteer/Chrome (solo wwebjs) |
|
LOG_LEVEL |
silent, fatal, error, warn, info, debug, trace |
info |
ZAPO_LOG_LEVEL |
Nivel de log del proveedor zapo |
error |
ZAPO_AUTH_PATH |
Archivo SQLite donde el proveedor zapo guarda la sesión |
.zapo_auth/state.sqlite |
Frontend (frontend/.env)
| Variable | Descripción |
|---|---|
VITE_BACKEND_URL |
URL del backend con la que habla la aplicación |
VITE_HOURS_CLOSE_TICKETS_AUTO |
Horas de inactividad antes del cierre automático del ticket |
Elegir un proveedor de WhatsApp
wwebjs |
zapo |
|
|---|---|---|
| Cómo conecta | Puppeteer controlando WhatsApp Web | Protocolo WebSocket directo |
| Consumo de memoria | Alto, un Chrome por sesión | Bajo |
| Dependencias de sistema | Chrome + varios paquetes lib* |
Node 22+ y SQLite (better-sqlite3) |
| Madurez en este repositorio | Por defecto, en producción durante años | Más nuevo, en desarrollo activo |
Cambia entre ellos con WHATSAPP_PROVIDER en backend/.env.
El proveedor zapo envía medios sin ninguna dependencia extra, pero las miniaturas, las
dimensiones y el waveform de las notas de voz vienen del paquete opcional
@zapo-js/media-utils (que necesita ffmpeg/ffprobe y sharp). Al instalarlo, el
proveedor lo usa en el siguiente reinicio; sin él los medios se envían igual, solo sin vista previa.
Actualizar una instalación existente
Compara siempre el .env.example con tu .env antes de actualizar. Las variables nuevas
aparecen ahí primero.
#!/bin/bash
echo "Actualizando Whaticket, espera por favor."
cd ~/whaticket
git pull
cd backend
npm install
rm -rf dist
npm run build
npx sequelize db:migrate
npx sequelize db:seed
cd ../frontend
npm install
rm -rf build
npm run build
pm2 restart all
echo "Actualización finalizada. ¡Disfrútalo!"
Si vienes del proveedor whaileys
El proveedor whaileys fue reemplazado por zapo. Las conexiones emparejadas con whaileys
siguen funcionando solas, sin escanear un código QR nuevo:
- Actualiza el servidor a Node.js 22+ (requisito de
better-sqlite3). - Si quieres, define
WHATSAPP_PROVIDER=zapoenbackend/.env. El valor antiguowhaileyssigue funcionando y apunta al mismo proveedor. - Ejecuta el script de actualización de arriba. Cuando el backend se reinicia, la sesión de cada
conexión se copia de la base de datos a
.zapo_auth/state.sqlitey la conexión vuelve sin un código QR nuevo.
La copia lee la columna session de Whatsapps y la tabla WppKeys, así que conserva WppKeys
hasta que todas las conexiones vuelvan. Redis ya no se lee y puede apagarse. Una conexión cuya
sesión no se pueda copiar muestra un código QR nuevo, como en un emparejamiento desde cero.
Estado del proyecto
En modo mantenimiento, con el desarrollo activo de vuelta.
Durante los últimos años este repositorio recibió solo parches de seguridad y actualizaciones de dependencias, mientras el esfuerzo del equipo se dirigía a la plataforma comercial. Eso está cambiando: planeamos retomar el trabajo regular de funcionalidades aquí. Los commits recientes son los primeros pasos: el frontend migró a Vite, y la integración con WhatsApp pasó a una capa intercambiable de proveedores, con el nuevo driver zapo-js.
Qué significa esto para ti hoy:
- Los issues y pull requests se leen. Las revisiones pueden tardar.
- El código es estable y está ampliamente desplegado, pero espera asperezas y dependencias antiguas.
- Los cambios que rompan compatibilidad se señalarán en las notas de versión.
Si dependes de este proyecto, cuéntanos en Discord qué es lo que más falta hace. Eso es lo que define las prioridades.
Contribuir
Los pull requests son bienvenidos: correcciones de bugs, actualizaciones de dependencias, documentación y traducciones. Para cualquier cosa grande, abre un issue antes para acordar el enfoque.
Proyectos relacionados
- zapo-js: la librería WebSocket de WhatsApp que
usa el proveedor
zapo - Whaticket: la plataforma comercial gestionada
Licencia
MIT © Whaticket y colaboradores.
Aviso legal
Este proyecto no está afiliado, asociado, autorizado, respaldado ni conectado oficialmente de ninguna forma con WhatsApp ni con ninguna de sus subsidiarias o filiales. El sitio oficial de WhatsApp es https://whatsapp.com. "WhatsApp" y los nombres, marcas, emblemas e imágenes relacionados son marcas registradas de sus respectivos dueños.
Usar clientes no oficiales para conectarse a WhatsApp puede provocar el bloqueo de tu número. Usa este software bajo tu propio riesgo y revísalo según tus propios requisitos de seguridad antes de exponerlo a internet.
Explorar proyectos relacionados
codecrafters-io/build-your-own-x
Domina la programación recreando desde cero tus tecnologías favoritas.
562,099 estrellaspublic-apis/public-apis
Una lista colectiva de API gratuitas
498,495 estrellasmorluto/rea
Ingeniería inversa de cualquier cosa con agentes, desde el comportamiento de la aplicación hasta los binarios nativos.
454,853 estrellasopenclaw/openclaw
La IA que de verdad hace las cosas. Cualquier sistema operativo y cualquier plataforma. Al estilo langosta. 🦞
394,406 estrellas



