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
- Migrasi Database
- Troubleshooting
- Changelog
- Disclaimer
- β WhatsApp Web Integration - Menggunakan Baileys v7.0.0-rc.9 (unofficial API)
- β Multi-Session WhatsApp - Bisa beberapa akun WA; pilih "Semua WhatsApp" atau satu akun per campaign
- β 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/CSV (template download), grup kontak, validasi nomor WA, Total Blast per kontak, bulk delete (pilih beberapa kontak β Hapus Terpilih)
- β
Message Templates - Template dengan variabel
{{nama}},{{no_hp}},{{group}}dan tracking penggunaan - β Campaign Management - Buat, jalankan, pause, resume, stop; pilih pengirim WA; Bypass (tandai sisa sebagai terkirim); Hanya kirim ke yg belum di blast; ganti pengirim/interval saat campaign jalan
- β Random Delay - Jeda acak antar pesan (1-15 menit, termasuk 1 menit untuk testing) + random 30-90 detik
- β
Daily Limit - Batas pesan per hari (default 100); per akun jika
LIMIT_PER_ACCOUNT=true(beban dibagi ke akun yang paling sedikit kirim hari ini) - β
Send Hours & Timezone - Batas jam kirim (
SEND_HOUR_START/SEND_HOUR_END);APP_TIMEZONE(mis. Asia/Jakarta) untuk "hari ini" dan reset harian - β
Delay Between Campaigns - Jeda antar campaign saat antrian (
DELAY_BETWEEN_CAMPAIGNS_SECONDS, default 30) - β Message Variation - Variasi pesan otomatis (spasi invisible)
- β Consecutive Error Stop - Stop otomatis jika 5 error berturut
- β Connection Conflict Detection - Deteksi dan handle sesi duplikat; auto-reconnect dengan backoff (408/428/503); clear session hanya pada 401/conflict
- β Badge Status Blast - Tiap grup tampil badge Sudah (semua kontak di grup pernah di-blast) / Proses (sebagian) / Belum (belum ada yang di-blast), agar bisa prioritas blast per grup
- β 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: template, target grup (atau Semua Kontak), Hanya kirim ke yg belum di blast (checkbox), pengirim WA (opsional), interval
- Target specific contact groups; opsi "Hanya kirim ke yg belum di blast" hanya memasukkan kontak yang belum pernah dapat blast
- Ganti pengirim WA / Edit interval saat campaign jalan (running/paused)
- Bypass: tombol untuk menandai sisa (pending/skipped/failed) sebagai terkirim dan selesaikan campaign
- 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 |
|---|---|---|---|
LIMIT_PER_ACCOUNT |
true | true | true = batas per akun WA (100/akun), false = 100 total dibagi |
MAX_MESSAGES_PER_DAY |
100 | 50-100 | Batas pesan per hari (per akun jika LIMIT_PER_ACCOUNT=true) |
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) |
DELAY_BETWEEN_CAMPAIGNS_SECONDS |
30 | 30-60 | Jeda (detik) antar campaign saat multi campaign (anti-ban) |
SEND_HOUR_START |
(kosong) | 0-23 | Jam mulai boleh kirim (kosong = dari 00:00) |
SEND_HOUR_END |
22 | 0-23 | Jam selesai boleh kirim (kosong = sampai 23:59). Contoh: 22 = stop jam 22:59, tidak kirim lewat tengah malam |
APP_TIMEZONE |
(kosong) | IANA | Zona waktu untuk jam kirim & "hari ini" (contoh: Asia/Jakarta). Kosong = waktu server |
- 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 Excel/CSV:
- Download template dari "Download Template" (kolom: nama, no_hp, group). Format no_hp didukung: 08xx, +62/62xx, 8xx.
- Isi file lalu Import Excel atau Import CSV (format: name, phone, group).
- Nomor duplikat akan di-skip; validasi WA berjalan otomatis setelah import.
Tabel Kontak:
- Kolom Total Blast: jumlah kali kontak sudah di-blast (angka), atau Belum jika 0.
- Pilih beberapa kontak (checkbox) β Hapus Terpilih untuk bulk delete.
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)
Grup Kontak:
- Di daftar grup, tiap kartu menampilkan badge Sudah / Proses / Belum (status blast untuk kontak di grup tersebut). Berguna untuk memprioritaskan grup mana yang akan di-blast dulu.
- Hapus grup: kontak di grup akan di-nonaktifkan (soft-delete) dan lepas dari grup.
- 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" (atau Blast).
- Di form Buat Blast Baru isi:
- Nama Campaign - Identifikasi campaign
- Template - Pilih template pesan
- Target Grup - Pilih grup kontak atau "Semua Kontak"
- Hanya kirim ke yg belum di blast (checkbox) - Jika dicentang, hanya kontak yang belum pernah dapat blast yang masuk campaign (berguna untuk blast per grup setelah bypass campaign besar)
- Pengirim WhatsApp - Opsional: Semua WhatsApp atau satu akun (wa_1, wa_2, ...)
- Interval - Jeda antar pesan (1/5/10/15 menit)
- Klik "Mulai Blast" β campaign langsung masuk antrian (create = start).
- Monitor progress di daftar campaign dan dashboard:
- π’ Sent - Terkirim
- π΄ Failed - Gagal
- π‘ Skipped - Dilewati (sudah kirim hari ini / tidak terdaftar WA / dll)
- π΅ Pending - Menunggu di antrian
| Aksi | Fungsi |
|---|---|
| Pause | Jeda sementara (bisa dilanjutkan) |
| Resume | Lanjutkan dari pause |
| Stop | Hentikan permanen (sisa jadi skipped) |
| Ganti pengirim WA | Ubah akun WA yang dipakai untuk kirim (tanpa stop campaign) |
| Edit Interval | Ubah jeda antar pesan saat campaign jalan |
| Bypass | Tandai semua sisa (pending/skipped/failed) sebagai terkirim dan selesaikan campaign β berguna agar campaign besar dianggap selesai lalu buat campaign per grup dengan "Hanya kirim ke yg belum di blast" |
| Delete | Hapus campaign (hanya untuk status completed/stopped/failed) |
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
-
Batas per akun (LIMIT_PER_ACCOUNT)
- Default: 100 pesan/hari per akun WA (bukan total)
- Beban dibagi rata: sistem pilih akun yang paling sedikit kirim hari ini
- Set
LIMIT_PER_ACCOUNT=falseuntuk batas 100 total dibagi ke semua akun
-
Random Delay
- Setiap pesan dikirim dengan jeda acak (minimum 1 menit)
- Formula:
max(base_interval + random(30-90 detik), 60 detik) - Contoh: interval 5 menit β actual 5.5-6.5 menit
-
Message Variation
- Setiap pesan sedikit berbeda (spasi/emoji di akhir)
- Kadang sisip zero-width character di posisi acak
- Mencegah deteksi pesan identik
-
Daily Limit
- Batas default: 100 pesan/hari per akun (jika LIMIT_PER_ACCOUNT=true)
- Reset otomatis setiap hari per akun
- Campaign pause otomatis saat semua akun mencapai limit
-
Error Detection
- Jika 5 error berturut-turut, campaign stop
- Mencegah spam saat ada masalah koneksi
-
Connection Monitoring & Auto-Reconnect
- Deteksi disconnect (timeout/connection lost); auto-reconnect dengan backoff
- Campaign pause jika tidak ada akun connected
- Hindari conflict: jangan buka WhatsApp Web di browser lain
-
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 (includes blast_sent_count per contact)
GET /api/contacts?page=1&limit=10&search=john&group_id=1&wa_status=registered
# Create contact
POST /api/contacts
{ "name": "John", "phone": "081234567890", "group_id": 1 }
# Bulk delete
POST /api/contacts/bulk-delete
Content-Type: application/json
{ "ids": [1, 2, 3] }
# Import CSV/Excel
POST /api/contacts/import
Content-Type: multipart/form-data
file: contacts.csv# List campaigns
GET /api/blast/campaigns?page=1&limit=20&status=running
# Create campaign (langsung masuk queue)
POST /api/blast/campaigns
{
"name": "Promo Campaign",
"template_id": 1,
"group_id": 1,
"interval_minutes": 5,
"sender_session_id": null,
"only_not_blasted": false
}
# Pause / Resume / Stop
POST /api/blast/campaigns/:id/pause
POST /api/blast/campaigns/:id/resume
POST /api/blast/campaigns/:id/stop
# Ganti pengirim WA (saat campaign jalan)
PATCH /api/blast/campaigns/:id/sender
{ "sender_session_id": "wa_1" }
# Edit interval (saat campaign jalan)
PATCH /api/blast/campaigns/:id/interval
{ "interval_minutes": 10 }
# Bypass: tandai sisa sebagai terkirim, selesaikan campaign
POST /api/blast/campaigns/:id/bypass
# Delete campaign
DELETE /api/blast/campaigns/:id# 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
}
}
}Perubahan skema (kolom baru) bisa dijalankan manual lewat SQL di folder migrations/. Lihat migrations/README.md untuk penjelasan tiap file.
| File | Deskripsi |
|---|---|
add_only_not_blasted_to_blast_campaigns.sql |
Menambah kolom only_not_blasted di blast_campaigns. Campaign existing dapat default 0 (aman). |
Contoh:
mysql -u root -p nama_database < migrations/add_only_not_blasted_to_blast_campaigns.sqlAplikasi juga memakai sequelize.sync({ alter: true }) saat start; kolom baru di model bisa ikut terbentuk otomatis tergantung environment.
# 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- Auto-reconnect: Aplikasi akan coba reconnect otomatis (timeout/connection lost). Cek log untuk "Auto-reconnect in Xs".
- Pastikan HP tidak mode hemat baterai; WhatsApp di HP tetap aktif (tidak di-force close).
- Koneksi internet HP harus stabil; inactivity lama bisa bikin WA putus (normal).
- Jangan login WhatsApp Web di browser lain (conflict = harus scan ulang).
- Jika muncul "Conflict", tunggu 2 menit lalu scan ulang.
- Untuk production: pastikan server punya akses internet stabil; putus jaringan = disconnect.
- 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
Manajemen Kontak:
- Kolom Total Blast di tabel kontak (angka atau "Belum")
- Bulk delete: pilih kontak (checkbox) + tombol Hapus Terpilih; API
POST /api/contacts/bulk-delete - Import Excel dengan template download; normalisasi no_hp (08xx, +62/62xx, 8xx)
Grup Kontak:
- Badge Sudah / Proses / Belum per grup (berdasarkan apakah kontak di grup sudah pernah di-blast)
- Hapus grup β soft-delete kontak (is_active: false, group_id: null)
Campaign / Blast:
- Pengirim WhatsApp: pilih Semua WhatsApp atau satu akun (wa_1, wa_2, β¦) saat buat campaign; Ganti pengirim WA saat campaign jalan (PATCH sender)
- Edit interval saat campaign jalan (PATCH interval)
- Bypass: tombol untuk menandai sisa (pending/skipped/failed) sebagai terkirim dan selesaikan campaign (POST bypass)
- Hanya kirim ke yg belum di blast: checkbox di form; hanya kontak yang belum punya BlastLog
sentyang masuk campaign; kolomonly_not_blasteddi DB + migrasi SQL
Anti-ban & koneksi:
- Limit per akun:
LIMIT_PER_ACCOUNT=trueβ batas per akun WA; pemilihan akun by messages_sent_today DELAY_BETWEEN_CAMPAIGNS_SECONDS(jeda antar campaign)- Send hours & timezone:
SEND_HOUR_START/SEND_HOUR_END,APP_TIMEZONE(Asia/Jakarta dll); campaign pause di luar jam kirim - Auto-reconnect dengan backoff (408/428/503); clear session hanya pada 401 & conflict
Lain:
- Perbaikan tampilan tabel kontak (checkbox, escape HTML)
- Dokumen alur:
docs/BLAST-FLOW.md; migrasi:migrations/README.mddanadd_only_not_blasted_to_blast_campaigns.sql
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/
βββ docs/ # Dokumentasi alur & flow
β βββ BLAST-FLOW.md # Alur blast (create β queue β process)
βββ migrations/ # Skrip SQL migrasi (manual)
β βββ README.md # Penjelasan tiap migrasi
β βββ add_only_not_blasted_to_blast_campaigns.sql
β βββ multi_session_migration.sql
βββ 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