Skip to content

deffan10/Blast-WA

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

31 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“± WhatsApp Blast - Bulk Messaging Application

Aplikasi web untuk mengirim pesan WhatsApp massal dengan fitur anti-ban dan manajemen kontak yang lengkap.

Node.js Baileys MySQL License


πŸ“‹ Daftar Isi


✨ Fitur

Core Features

  • βœ… 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

Anti-Ban Features

  • βœ… 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

Grup Kontak

  • βœ… 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

Dashboard Features

  • βœ… 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)

πŸ“Έ Screenshots

image

Login Page

  • Modern gradient design
  • Email & password authentication
  • JWT token-based security
  • Footer credit transparan menyatu dengan gradient
image

Dashboard

  • 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
image

Campaign Management

  • 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

πŸ›  Teknologi

Layer Teknologi
Runtime Node.js 20.x LTS
Framework Express.js 4.18.x
WhatsApp @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

πŸ’» Spesifikasi Sistem

Minimum Requirements

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

Software Requirements

  • 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)

Untuk Production

  • PM2 (process manager)
  • Nginx (reverse proxy)
  • SSL Certificate (Let's Encrypt)
  • VPS/Cloud Server (Ubuntu 22.04 recommended)

πŸš€ Quick Start

# 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 / admin123

πŸš€ Instalasi Development

1. Clone Repository

git clone <repository-url>
cd Blast-WA

2. Install Dependencies

npm install

3. Setup Database

-- 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;

4. Konfigurasi Environment

# Copy template environment
cp .env.example .env

# Edit konfigurasi
nano .env

5. Jalankan Server

# Development
npm run dev

# Production
npm start

6. Akses Dashboard

URL: http://localhost:3000
Email: admin@blasta.com
Password: admin123

βš™οΈ Konfigurasi

File .env

# ==================================
# 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=

Konfigurasi Anti-Ban (Recommended)

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

πŸ“– Panduan Penggunaan

1️⃣ Login & Koneksi WhatsApp

  1. Buka http://localhost:3000
  2. Login dengan kredensial admin
  3. Klik tab "WhatsApp"
  4. Klik tombol "Scan QR"
  5. Buka WhatsApp di HP β†’ Linked Devices β†’ Link a Device
  6. Scan QR Code yang muncul
  7. Tunggu status berubah menjadi "Connected"

2️⃣ Kelola Kontak

Tambah Manual:

  1. Klik tab "Contacts"
  2. Klik "Add Contact"
  3. Isi nama, nomor HP (format: 08xx atau 628xx)
  4. Pilih grup (opsional)
  5. Klik "Save"

Import Excel/CSV:

  1. Download template dari "Download Template" (kolom: nama, no_hp, group). Format no_hp didukung: 08xx, +62/62xx, 8xx.
  2. Isi file lalu Import Excel atau Import CSV (format: name, phone, group).
  3. 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:

  1. Pilih kontak yang ingin divalidasi
  2. Klik "Validate"
  3. Sistem akan cek apakah nomor terdaftar di WhatsApp
  4. 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.

3️⃣ Buat Template Pesan

  1. Klik tab "Templates"
  2. Klik "Add Template"
  3. Isi nama template
  4. Tulis konten pesan dengan variabel:
    • {{nama}} - Nama kontak
    • {{no_hp}} - Nomor HP
    • {{group}} - Nama grup
  5. Contoh:
    Halo {{nama}}! πŸ‘‹
    
    Terima kasih sudah bergabung dengan kami.
    Nomor Anda {{no_hp}} sudah terdaftar di grup {{group}}.
    
    Salam,
    Admin
    
  6. Klik "Save"

4️⃣ Jalankan Campaign Blast

  1. Klik tab "Campaigns" (atau Blast).
  2. 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)
  3. Klik "Mulai Blast" β†’ campaign langsung masuk antrian (create = start).
  4. 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

5️⃣ Kontrol Campaign

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)

6️⃣ Dashboard Aktivitas Terbaru

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

πŸ›‘ Fitur Anti-Ban

Cara Kerja

  1. 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=false untuk batas 100 total dibagi ke semua akun
  2. 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
  3. Message Variation

    • Setiap pesan sedikit berbeda (spasi/emoji di akhir)
    • Kadang sisip zero-width character di posisi acak
    • Mencegah deteksi pesan identik
  4. 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
  5. Error Detection

    • Jika 5 error berturut-turut, campaign stop
    • Mencegah spam saat ada masalah koneksi
  6. 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

⚠️ Tips Menghindari Ban

  1. Jangan kirim terlalu banyak

    • Akun baru: max 20-30 pesan/hari
    • Akun lama: max 100-200 pesan/hari
  2. Gunakan delay yang wajar

    • Minimum 5 menit antar pesan
    • Lebih baik 10-15 menit
  3. Variasi konten pesan

    • Jangan copy-paste pesan yang sama
    • Gunakan variabel {{nama}}
  4. Warmup akun baru

    • Minggu 1: 10-20 pesan/hari
    • Minggu 2: 30-50 pesan/hari
    • Minggu 3+: 50-100 pesan/hari
  5. Monitor status kontak

    • Hapus nomor yang tidak aktif
    • Validasi nomor secara berkala

🌐 Deploy Production

A. Persiapan VPS

# 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

B. Setup Database

# 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;

C. Deploy Aplikasi

# 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 .env

D. Konfigurasi Production .env

PORT=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

E. Setup PM2

# Buat ecosystem file
nano ecosystem.config.js
module.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

F. Setup Nginx (Reverse Proxy + SSL)

# Buat config Nginx
sudo nano /etc/nginx/sites-available/blast-wa
server {
    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

G. Firewall

# Allow ports
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

H. Monitoring & Maintenance

# 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).sql

πŸ“š API Documentation

Authentication

POST /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" }
}

WhatsApp

# 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" }

Contacts

# 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

Campaigns (Blast)

# 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

Dashboard

# 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
    }
  }
}

πŸ—ƒ Migrasi Database

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.sql

Aplikasi juga memakai sequelize.sync({ alter: true }) saat start; kolom baru di model bisa ikut terbentuk otomatis tergantung environment.


❓ Troubleshooting

QR Code tidak muncul

# Hapus session lama
rm -rf ./wa_sessions/*

# Restart server
pm2 restart blast-wa

# Cek logs
pm2 logs blast-wa

Error "Stream Errored (conflict)"

  1. Buka WhatsApp di HP
  2. Settings β†’ Linked Devices
  3. Logout semua device
  4. Tunggu 1-2 menit
  5. Scan QR ulang

Database connection failed

# Cek MySQL running
sudo systemctl status mysql

# Test koneksi manual
mysql -u blastuser -p blast_wa

# Cek firewall
sudo ufw status

WhatsApp terputus / logout sendiri

  1. Auto-reconnect: Aplikasi akan coba reconnect otomatis (timeout/connection lost). Cek log untuk "Auto-reconnect in Xs".
  2. Pastikan HP tidak mode hemat baterai; WhatsApp di HP tetap aktif (tidak di-force close).
  3. Koneksi internet HP harus stabil; inactivity lama bisa bikin WA putus (normal).
  4. Jangan login WhatsApp Web di browser lain (conflict = harus scan ulang).
  5. Jika muncul "Conflict", tunggu 2 menit lalu scan ulang.
  6. Untuk production: pastikan server punya akses internet stabil; putus jaringan = disconnect.

Login redirect loop / tidak bisa masuk dashboard

  1. Hard refresh browser: Ctrl + Shift + R
  2. Clear localStorage: Buka DevTools (F12) β†’ Application β†’ Local Storage β†’ Clear
  3. Periksa Console (F12) untuk error JavaScript
  4. Pastikan server berjalan tanpa error

Campaign stuck di "running"

# 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';

Countdown tidak berjalan

  1. Pastikan browser mendukung JavaScript modern
  2. Hard refresh: Ctrl + Shift + R
  3. Periksa Console untuk error

πŸ“ Changelog

v1.1.0 (2026-02)

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 sent yang masuk campaign; kolom only_not_blasted di 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.md dan add_only_not_blasted_to_blast_campaigns.sql

v1.0.0 (2026-01-09)

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

⚠️ Disclaimer

  1. Unofficial API - Aplikasi ini menggunakan Baileys yang merupakan unofficial WhatsApp API. Penggunaan berisiko akun diblokir oleh WhatsApp.

  2. Gunakan dengan bijak - Jangan gunakan untuk spam. Kirim pesan hanya ke kontak yang sudah memberikan izin.

  3. Tanggung jawab pengguna - Developer tidak bertanggung jawab atas penyalahgunaan aplikasi atau pemblokiran akun.

  4. Terms of Service - Penggunaan mungkin melanggar WhatsApp Terms of Service.

  5. Untuk keperluan bisnis, pertimbangkan menggunakan WhatsApp Business API resmi.


πŸ“„ License

MIT License - lihat file LICENSE untuk detail.


🀝 Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.


πŸ“ž Support

Jika mengalami masalah atau butuh bantuan:

  1. Cek bagian Troubleshooting
  2. Buka Issue di repository ini
  3. Sertakan log error dan langkah reproduksi

πŸ‘¨β€πŸ’» Credits

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

About

Blast WA Unofficial with Vibe Coding.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors