Aplikasi web untuk mengirim pesan WhatsApp massal dengan fitur anti-ban dan manajemen kontak yang lengkap.
- Fitur
- Screenshots
- Teknologi
- Spesifikasi Sistem
- Quick Start
- Instalasi Development
- Konfigurasi
- Panduan Penggunaan
- Fitur Anti-Ban
- Deploy Production
- API Documentation
- Troubleshooting
- Changelog
- Disclaimer
- β WhatsApp Web Integration - Menggunakan Baileys v7.0.0-rc.9 (unofficial API)
- β QR Code Authentication - Login via scan QR dari HP
- β Session Persistence - Session tersimpan, tidak perlu scan ulang setiap restart
- β Bulk Messaging - Kirim pesan ke banyak kontak sekaligus
- β Contact Management - Import Excel dengan template download, grup kontak, validasi nomor WA
- β
Message Templates - Template dengan variabel
{{nama}},{{no_hp}},{{group}}dan tracking penggunaan - β Campaign Management - Buat, jalankan, pause, resume, stop campaign dengan status dan durasi
- β Random Delay - Jeda acak antar pesan (1-15 menit, termasuk 1 menit untuk testing)
- β Daily Limit - Batas pesan per hari (default 100)
- β Message Variation - Variasi pesan otomatis (spasi invisible)
- β Consecutive Error Stop - Stop otomatis jika 5 error berturut
- β Connection Conflict Detection - Deteksi dan handle sesi duplikat
- β Real-time Status - Status koneksi WA via WebSocket (Socket.io)
- β Statistics - Statistik pengiriman (sent, failed, skipped)
- β Pie Chart Statistik Blast - Visualisasi donut chart untuk sent/failed/skipped
- β 5 Campaign Terakhir - Tabel ringkasan campaign dengan template, kontak, progress, durasi, status (Selesai/Proses)
- β Activity Log dengan Pagination - 5 log per halaman, navigasi prev/next
- β Live Countdown Timer - Countdown waktu tersisa untuk pesan pending (real-time)
- β Queue Position - Posisi antrian untuk setiap pesan pending
- β Campaign Status & Duration - Status otomatis "Selesai" saat 100%, tampilan durasi campaign
- β Template Usage Counter - Tracking penggunaan template pesan
- β Responsive UI - Tailwind CSS, Lucide Icons, mobile-friendly
- β Footer Credit - Footer dengan credit di login (transparan) dan dashboard (putih)
- Modern gradient design
- Email & password authentication
- JWT token-based security
- Footer credit transparan menyatu dengan gradient
- Real-time statistics cards
- WhatsApp connection status indicator
- Pie chart statistik blast (sent/failed/skipped)
- 5 campaign terakhir dengan detail progress
- Recent activity with live countdown
- Blast statistics with progress bars
- Create new campaign with template selection
- Target specific contact groups
- Configurable message interval
- Pause/Resume/Stop controls
| Layer | Teknologi |
|---|---|
| Runtime | Node.js 20.x LTS |
| Framework | Express.js 4.18.x |
| @whiskeysockets/baileys 7.0.0-rc.9 | |
| Database | MySQL 8.x + Sequelize ORM 6.x |
| Realtime | Socket.io 4.7.x |
| Auth | JWT (jsonwebtoken 9.x) + bcryptjs |
| Frontend | Vanilla JS, Tailwind CSS, Lucide Icons |
| Queue | In-memory queue (production-ready) |
| File Upload | Multer 2.x + ExcelJS 4.x |
| Resource | Development | Production |
|---|---|---|
| CPU | 2 Core | 4 Core |
| RAM | 2 GB | 4 GB |
| Storage | 10 GB | 50 GB SSD |
| Node.js | 18.x+ | 20.x LTS |
| MySQL | 5.7+ | 8.x |
- Node.js >= 18.0.0 (Recommended: 20.x LTS)
- MySQL >= 5.7 (Recommended: 8.x)
- npm >= 9.x atau yarn >= 1.22
- Git (untuk clone repository)
- PM2 (process manager)
- Nginx (reverse proxy)
- SSL Certificate (Let's Encrypt)
- VPS/Cloud Server (Ubuntu 22.04 recommended)
# 1. Clone & Install
git clone <repository-url>
cd Blast-WA
npm install
# 2. Setup Database (MySQL)
mysql -u root -p -e "CREATE DATABASE blast_wa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# 3. Configure Environment
cp .env.example .env
# Edit .env sesuai kebutuhan
# 4. Start Server
npm run dev
# 5. Open Browser
# http://localhost:3000
# Login: admin@blasta.com / admin123git clone <repository-url>
cd Blast-WAnpm install-- Login ke MySQL
mysql -u root -p
-- Buat database
CREATE DATABASE blast_wa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Buat user (optional)
CREATE USER 'wa'@'localhost' IDENTIFIED BY 'wa123';
GRANT ALL PRIVILEGES ON blast_wa.* TO 'wa'@'localhost';
FLUSH PRIVILEGES;# Copy template environment
cp .env.example .env
# Edit konfigurasi
nano .env# Development
npm run dev
# Production
npm startURL: http://localhost:3000
Email: admin@blasta.com
Password: admin123
# ==================================
# SERVER CONFIGURATION
# ==================================
PORT=3000
NODE_ENV=development
# ==================================
# DATABASE CONFIGURATION
# ==================================
DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=blast_wa
DB_USER=root
DB_PASSWORD=
# ==================================
# JWT AUTHENTICATION
# ==================================
# WAJIB GANTI untuk production!
JWT_SECRET=your-super-secret-key-min-32-chars
JWT_EXPIRES_IN=24h
# ==================================
# WHATSAPP SETTINGS
# ==================================
WA_SESSION_PATH=./wa_sessions
MAX_MESSAGES_PER_DAY=100
MIN_DELAY_SECONDS=300
MAX_DELAY_SECONDS=900
RANDOM_DELAY_MIN=30
RANDOM_DELAY_MAX=90
# ==================================
# ADMIN ACCOUNT
# ==================================
# WAJIB GANTI untuk production!
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=SecurePassword123!
# ==================================
# CORS (Production only)
# ==================================
CORS_ORIGINS=https://yourdomain.com,https://www.yourdomain.com
# ==================================
# REDIS (Optional - for Bull Queue)
# ==================================
# REDIS_HOST=localhost
# REDIS_PORT=6379
# REDIS_PASSWORD=| Setting | Default | Recommended | Description |
|---|---|---|---|
MAX_MESSAGES_PER_DAY |
100 | 50-100 | Batas pesan per hari |
MIN_DELAY_SECONDS |
300 | 300-600 | Delay minimum (5-10 menit) |
MAX_DELAY_SECONDS |
900 | 900-1800 | Delay maksimum (15-30 menit) |
RANDOM_DELAY_MIN |
30 | 30-60 | Random tambahan min (detik) |
RANDOM_DELAY_MAX |
90 | 60-120 | Random tambahan max (detik) |
- Buka
http://localhost:3000 - Login dengan kredensial admin
- Klik tab "WhatsApp"
- Klik tombol "Scan QR"
- Buka WhatsApp di HP β Linked Devices β Link a Device
- Scan QR Code yang muncul
- Tunggu status berubah menjadi "Connected"
Tambah Manual:
- Klik tab "Contacts"
- Klik "Add Contact"
- Isi nama, nomor HP (format: 08xx atau 628xx)
- Pilih grup (opsional)
- Klik "Save"
Import CSV:
- Siapkan file CSV dengan format:
name,phone,group John Doe,081234567890,Customer Jane Doe,089876543210,Prospect
- Klik "Import CSV"
- Upload file
- Kontak akan ditambahkan otomatis
Validasi Nomor WA:
- Pilih kontak yang ingin divalidasi
- Klik "Validate"
- Sistem akan cek apakah nomor terdaftar di WhatsApp
- Status akan berubah menjadi β (registered) atau β (not registered)
- Klik tab "Templates"
- Klik "Add Template"
- Isi nama template
- Tulis konten pesan dengan variabel:
{{nama}}- Nama kontak{{no_hp}}- Nomor HP{{group}}- Nama grup
- Contoh:
Halo {{nama}}! π Terima kasih sudah bergabung dengan kami. Nomor Anda {{no_hp}} sudah terdaftar di grup {{group}}. Salam, Admin - Klik "Save"
- Klik tab "Campaigns"
- Klik "New Campaign"
- Isi:
- Nama Campaign - Identifikasi campaign
- Template - Pilih template pesan
- Target Grup - Pilih grup kontak atau "All"
- Interval - Jeda antar pesan (dalam menit)
- Klik "Create"
- Klik "Start" untuk mulai mengirim
- Monitor progress di dashboard:
- π’ Sent - Terkirim
- π΄ Failed - Gagal
- π‘ Skipped - Dilewati (tidak terdaftar WA)
- π΅ Pending - Menunggu di antrian
| Aksi | Fungsi |
|---|---|
| Start | Mulai mengirim pesan |
| Pause | Jeda sementara (bisa dilanjutkan) |
| Resume | Lanjutkan dari pause |
| Stop | Hentikan permanen |
Bagian "Aktivitas Terbaru" menampilkan log pengiriman dengan fitur:
Pagination:
- 5 log per halaman
- Navigasi dengan tombol Prev dan Next
- Informasi halaman "Hal X dari Y"
Status Informatif:
| Status | Tampilan | Keterangan |
|---|---|---|
| Sent | π’ Terkirim 14:30 |
Pesan berhasil dikirim, tampil jam kirim |
| Pending | π΅ Antrian #3 ~2m 30d |
Posisi antrian & estimasi waktu tersisa |
| Failed | π΄ Gagal | Pesan error atau waktu gagal |
| Skipped | π‘ Skip | Alasan skip (not registered, dll) |
Estimasi Waktu Pending (Live Countdown):
- Countdown otomatis berjalan setiap detik
- Tidak perlu refresh halaman
- Menampilkan
~Xm Xd(menit & detik tersisa) - Berubah menjadi "Sedang dikirim..." saat waktu habis
- Dihitung dari interval campaign + random delay
-
Random Delay
- Setiap pesan dikirim dengan jeda acak
- Formula:
base_interval + random(30-90 detik) - Contoh: interval 5 menit β actual 5.5-6.5 menit
-
Message Variation
- Setiap pesan sedikit berbeda
- Menambahkan zero-width space di posisi random
- Mencegah deteksi pesan identik
-
Daily Limit
- Batas default: 100 pesan/hari
- Reset otomatis setiap hari
- Campaign pause otomatis saat limit tercapai
-
Error Detection
- Jika 5 error berturut-turut, campaign stop
- Mencegah spam saat ada masalah koneksi
-
Connection Monitoring
- Deteksi jika WhatsApp disconnect
- Campaign pause otomatis
-
Jangan kirim terlalu banyak
- Akun baru: max 20-30 pesan/hari
- Akun lama: max 100-200 pesan/hari
-
Gunakan delay yang wajar
- Minimum 5 menit antar pesan
- Lebih baik 10-15 menit
-
Variasi konten pesan
- Jangan copy-paste pesan yang sama
- Gunakan variabel
{{nama}}
-
Warmup akun baru
- Minggu 1: 10-20 pesan/hari
- Minggu 2: 30-50 pesan/hari
- Minggu 3+: 50-100 pesan/hari
-
Monitor status kontak
- Hapus nomor yang tidak aktif
- Validasi nomor secara berkala
# Update system
sudo apt update && sudo apt upgrade -y
# Install Node.js 20.x
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# Install MySQL
sudo apt install -y mysql-server
sudo mysql_secure_installation
# Install PM2
sudo npm install -g pm2
# Install Nginx
sudo apt install -y nginx# Login MySQL
sudo mysql -u root -p
# Buat database dan user
CREATE DATABASE blast_wa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'blastuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON blast_wa.* TO 'blastuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;# Clone repository
cd /var/www
sudo git clone <repository-url> blast-wa
cd blast-wa
# Set ownership
sudo chown -R $USER:$USER /var/www/blast-wa
# Install dependencies
npm install --production
# Setup environment
cp .env.example .env
nano .envPORT=3000
NODE_ENV=production
DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=blast_wa
DB_USER=blastuser
DB_PASSWORD=StrongPassword123!
# WAJIB: Generate random string 32+ karakter
JWT_SECRET=your-very-long-random-secret-key-here-minimum-32-chars
ADMIN_EMAIL=admin@yourdomain.com
ADMIN_PASSWORD=YourSecureAdminPassword123!
WA_SESSION_PATH=./wa_sessions
MAX_MESSAGES_PER_DAY=100
MIN_DELAY_SECONDS=300
MAX_DELAY_SECONDS=900
CORS_ORIGINS=https://yourdomain.com# Buat ecosystem file
nano ecosystem.config.jsmodule.exports = {
apps: [{
name: 'blast-wa',
script: 'src/server.js',
instances: 1, // JANGAN lebih dari 1 (singleton WA connection)
autorestart: true,
watch: false,
max_memory_restart: '500M',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/error.log',
out_file: './logs/output.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss'
}]
};# Buat folder logs
mkdir -p logs
# Start dengan PM2
pm2 start ecosystem.config.js
# Auto-start on boot
pm2 startup
pm2 save# Buat config Nginx
sudo nano /etc/nginx/sites-available/blast-waserver {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# SSL (Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
location / {
proxy_pass http://127.0.0.1:3000;
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-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}# Enable site
sudo ln -s /etc/nginx/sites-available/blast-wa /etc/nginx/sites-enabled/
# Test config
sudo nginx -t
# Install Certbot untuk SSL
sudo apt install -y certbot python3-certbot-nginx
# Generate SSL
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# Reload Nginx
sudo systemctl reload nginx# Allow ports
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable# Lihat logs real-time
pm2 logs blast-wa
# Monitor resources
pm2 monit
# Restart aplikasi
pm2 restart blast-wa
# Update aplikasi
cd /var/www/blast-wa
git pull
npm install --production
pm2 restart blast-wa
# Backup database (cron daily)
sudo crontab -e
# Tambahkan:
0 2 * * * mysqldump -u blastuser -p'StrongPassword123!' blast_wa > /backup/blast_wa_$(date +\%Y\%m\%d).sqlPOST /api/auth/login
Content-Type: application/json
{
"email": "admin@example.com",
"password": "password123"
}
Response:
{
"success": true,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": { "id": 1, "name": "Admin", "email": "admin@example.com" }
}# Get status
GET /api/whatsapp/status
Authorization: Bearer <token>
# Connect (generate QR)
POST /api/whatsapp/connect
# Disconnect
POST /api/whatsapp/disconnect
# Validate phone number
POST /api/whatsapp/validate
{ "phone": "081234567890" }# List contacts
GET /api/contacts?page=1&limit=10&search=john
# Create contact
POST /api/contacts
{ "name": "John", "phone": "081234567890", "group_id": 1 }
# Import CSV
POST /api/contacts/import
Content-Type: multipart/form-data
file: contacts.csv# List campaigns
GET /api/campaigns
# Create campaign
POST /api/campaigns
{
"name": "Promo Campaign",
"template_id": 1,
"group_id": 1,
"interval_minutes": 5
}
# Start campaign
POST /api/campaigns/:id/start
# Pause/Stop
POST /api/campaigns/:id/pause
POST /api/campaigns/:id/stop# Get dashboard statistics
GET /api/dashboard/stats
Authorization: Bearer <token>
Response:
{
"success": true,
"data": {
"contacts": { "total": 100, "registered": 85, "notRegistered": 15 },
"groups": 5,
"templates": 3,
"blast": {
"total": { "sent": 500, "failed": 20, "skipped": 30 },
"today": { "sent": 50, "failed": 2, "skipped": 5 }
},
"whatsapp": { "status": "connected", "name": "John Doe", "phone": "6281234567890" }
}
}
# Get recent activity with pagination
GET /api/dashboard/activity?page=1&limit=5
Authorization: Bearer <token>
Response:
{
"success": true,
"data": {
"logs": [
{
"id": 123,
"phone": "081234567890",
"name": "John Doe",
"status": "sent",
"sent_at": "2026-01-09T14:30:00.000Z",
"campaign": { "name": "Promo Campaign", "interval_minutes": 5 }
},
{
"id": 122,
"phone": "089876543210",
"name": "Jane Doe",
"status": "pending",
"queuePosition": 3,
"estimatedSendTime": "2026-01-09T14:45:00.000Z",
"timeLeftMs": 300000,
"campaign": { "name": "Promo Campaign", "interval_minutes": 5 }
}
],
"pagination": {
"page": 1,
"limit": 5,
"totalLogs": 150,
"totalPages": 30,
"hasNext": true,
"hasPrev": false
}
}
}# Hapus session lama
rm -rf ./wa_sessions/*
# Restart server
pm2 restart blast-wa
# Cek logs
pm2 logs blast-wa- Buka WhatsApp di HP
- Settings β Linked Devices
- Logout semua device
- Tunggu 1-2 menit
- Scan QR ulang
# Cek MySQL running
sudo systemctl status mysql
# Test koneksi manual
mysql -u blastuser -p blast_wa
# Cek firewall
sudo ufw status- Pastikan HP tidak mode hemat baterai
- WhatsApp di HP harus tetap aktif (tidak di-close)
- Koneksi internet HP harus stabil
- Jangan login WhatsApp Web di tempat lain
- Jika muncul "Conflict", tunggu 2 menit lalu scan ulang
- Hard refresh browser:
Ctrl + Shift + R - Clear localStorage: Buka DevTools (F12) β Application β Local Storage β Clear
- Periksa Console (F12) untuk error JavaScript
- Pastikan server berjalan tanpa error
# Restart server
pm2 restart blast-wa
# Atau reset manual di database
mysql -u root -p
USE blast_wa;
UPDATE blast_campaigns SET status = 'stopped' WHERE status = 'running';- Pastikan browser mendukung JavaScript modern
- Hard refresh:
Ctrl + Shift + R - Periksa Console untuk error
Features:
- Initial release
- WhatsApp integration with Baileys v7.0.0-rc.9
- Contact management with CSV/Excel import
- Message templates with variables
- Campaign management (create, pause, resume, stop)
- Real-time dashboard with Socket.io
- Activity log with pagination (5 per page)
- Live countdown timer for pending messages
- Queue position indicator
- Anti-ban features (random delay, daily limit, message variation)
- JWT authentication
- Session persistence (no need to re-scan QR)
- Connection conflict detection
Security:
- Production security checks for JWT_SECRET
- bcryptjs password hashing
- Protected API routes with JWT middleware
- CORS configuration for production
-
Unofficial API - Aplikasi ini menggunakan Baileys yang merupakan unofficial WhatsApp API. Penggunaan berisiko akun diblokir oleh WhatsApp.
-
Gunakan dengan bijak - Jangan gunakan untuk spam. Kirim pesan hanya ke kontak yang sudah memberikan izin.
-
Tanggung jawab pengguna - Developer tidak bertanggung jawab atas penyalahgunaan aplikasi atau pemblokiran akun.
-
Terms of Service - Penggunaan mungkin melanggar WhatsApp Terms of Service.
-
Untuk keperluan bisnis, pertimbangkan menggunakan WhatsApp Business API resmi.
MIT License - lihat file LICENSE untuk detail.
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Jika mengalami masalah atau butuh bantuan:
- Cek bagian Troubleshooting
- Buka Issue di repository ini
- Sertakan log error dan langkah reproduksi
Build with β€οΈ + AI by @deffnotjeff
Blast-WA/
βββ public/ # Frontend files
β βββ index.html # Main HTML
β βββ js/
β βββ app.js # Frontend JavaScript
βββ src/
β βββ config/ # App configuration
β βββ controllers/ # Route controllers
β βββ middleware/ # Express middleware
β βββ models/ # Sequelize models
β βββ routes/ # API routes
β βββ seeders/ # Database seeders
β βββ services/ # Business logic
β β βββ queue.service.js # Queue system
β β βββ whatsapp.service.js # WhatsApp integration
β βββ utils/ # Helper utilities
β βββ server.js # Entry point
βββ wa_sessions/ # WhatsApp session storage
βββ uploads/ # File uploads
βββ .env.example # Environment template
βββ package.json # Dependencies
βββ README.md # This file