npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

wa-blast

v1.0.9

Published

CLI tool to send personalized WhatsApp messages to contacts from a CSV file

Readme

wa-blast

A CLI tool to send personalized WhatsApp messages to contacts from a CSV file.

Avoids the native WhatsApp broadcast feature (which requires recipients to have saved your number) by sending individual direct messages — ensuring delivery to everyone regardless of whether they have your contact saved.

Features

  • Sends personalized individual DMs to each contact in a CSV file
  • {name} and {phone} placeholders in message text
  • Scheduled sending — start at a specific time (HH:MM or ISO 8601)
  • Rate limiting with random delays and batch pauses to reduce ban risk
  • Crash-safe — state written after every message, resume from where it left off
  • Delivery tracking — tracks sent → delivered → read status per contact
  • Final report — JSON file + terminal summary table with success/failure/unconfirmed breakdown

Prerequisites

  • An active WhatsApp account (personal or business)
  • Node.js 20+ (only required for the npm and source options below)

Installation

Choose the option that best suits you.

Option 1 — npm (recommended)

Installs wa-blast globally as a command available anywhere on your system.

npm install -g wa-blast

Run it:

wa-blast --csv contacts.csv --msg "Hello {name}!"

Option 2 — Standalone binary (no Node.js required)

Download the pre-built binary for your OS from the latest GitHub Release. No Node.js installation needed.

macOS / Linux:

chmod +x wa-blast-*-macos-x64   # or linux-x64
./wa-blast-*-macos-x64 --csv contacts.csv --msg "Hello {name}!"

Windows:

Open a terminal (cmd or PowerShell) in the download folder:

wa-blast-*-win-x64.exe --csv contacts.csv --msg "Hello {name}!"

Option 3 — Build from source

Clone the repo, install dependencies, and compile TypeScript yourself.

git clone https://github.com/unmarshall/wa-blast.git
cd wa-blast
npm install
npm run build

Run it:

node dist/index.js --csv contacts.csv --msg "Hello {name}!"

Usage

wa-blast --csv contacts.csv --msg "Hello {name}!"

Options

| Option | Description | Default | |---|---|---| | --csv <path> | Path to CSV file (columns: name, phone) | required | | --msg <text> | Message text — supports {name} and {phone} placeholders | required* | | --msg-file <path> | Read message from a text file (alternative to --msg) | required* | | --schedule <time> | Start time: HH:MM (local) or ISO 8601 | run immediately | | --output <path> | State/output file path | results_<timestamp>.json | | --delay-min <ms> | Minimum delay between messages | 3000 | | --delay-max <ms> | Maximum delay between messages | 8000 | | --batch-size <n> | Number of messages before a long pause | 5 | | --batch-pause-min <ms> | Minimum long pause duration | 30000 | | --batch-pause-max <ms> | Maximum long pause duration | 60000 | | --resume | Resume a previous interrupted run | false |

*Exactly one of --msg or --msg-file must be provided.

CSV Format

name,phone
John Doe,+491234567890
Jane Smith,+4917612345678

Phone numbers should be in E.164 format (e.g. +15551234567). Set WA_BLAST_COUNTRY_CODE env var to auto-prefix 10-digit numbers.

Examples

# Send immediately
wa-blast --csv contacts.csv --msg "Hi {name}, just checking in!"

# Schedule for 9am
wa-blast --csv contacts.csv --msg-file message.txt --schedule 09:00

# Custom delays (more conservative)
wa-blast --csv contacts.csv --msg "Hello {name}" --delay-min 5000 --delay-max 15000

# Resume an interrupted run
wa-blast --csv contacts.csv --msg "Hello {name}" --output results_123.json --resume

First Run — QR Code

On the first run you will be shown a QR code. Scan it with WhatsApp → Linked DevicesLink a Device.

The session is saved to ~/.wa-blast/session/ and reused on all subsequent runs — no re-scanning needed unless you log out or unlink the device.

Output

After the run completes, two files are written:

  • State file (--output, default results_<timestamp>.json) — live state, used for --resume
  • Report file (<name>_report_<timestamp>.json) — final summary with succeeded/failed/unconfirmed lists

A summary table is also printed to the terminal:

=== Message Delivery Summary ===
┌──────────────┬───────┬────────────┐
│ Status       │ Count │ % of Total │
├──────────────┼───────┼────────────┤
│ read         │   142 │     71.0%  │
│ delivered    │    28 │     14.0%  │
│ unconfirmed  │     8 │      4.0%  │
│ failed       │    22 │     11.0%  │
├──────────────┼───────┼────────────┤
│ Total        │   200 │    100.0%  │
└──────────────┴───────┴────────────┘

Status meanings

| Status | Meaning | |---|---| | read | Recipient opened the message | | delivered | Reached recipient's device | | sent | Accepted by WhatsApp servers, awaiting delivery | | unconfirmed | Sent but no delivery confirmation after 24h (possibly blocked, offline, or uninstalled) | | failed | Hard error — number not on WhatsApp, invalid format, etc. |

Rate Limiting

Default settings send messages with a 3–8 second random delay between each, and a 30–60 second pause every 5 messages. All of these are configurable via --delay-min, --delay-max, --batch-size, --batch-pause-min, and --batch-pause-max.

Warning: Aggressive bulk messaging risks WhatsApp account suspension. Use conservative delays and ensure recipients expect your message.

Platform Support

Works on macOS, Linux, and Windows.

License

MIT