Skip to main content

Concepts

Instance (number)

Each number is an instance with its own whatsmeow session, persisted and encrypted. It has a state machine with a reason: qr_pendingconnectingconnected; drops are distinguished as transient (reconnects on its own), logged_out (rescan needed), and banned (out of rotation).

Redundancy and delivery

Several numbers form a pool with a strategy (round_robin, least_used, health_weighted). Sending without instance_id rotates automatically. Delivery: per-number pacing, volume ramp-up (growing limits on a fresh number), per-number proxy, and a health score — a bad number leaves the rotation immediately.

🔥 Volume ramp-up — why it matters

WhatsApp bans fresh SIMs that fire too early. That's why every freshly connected number goes through a ramp-up period (default 5 days, configurable per account via warming_days): automatic rotation prefers numbers already at full volume to distribute the load. It's a survival advantage — not an obstacle:

  • During ramp-up, the number joins the rotation as a fallback: if it's the only one available (e.g. you just connected it), it still sends — tests and first sends work normally.
  • When numbers at full volume exist, they are preferred for most of the volume.
  • To force a specific number, pass instance_id on the send.
  • The API only responds 409 no_number_available when there is no connected/healthy number at all.

Recommendation: start slow on a fresh number and ramp up volume over the days — bZapper already applies growing limits automatically.

LID

Contacts may arrive as @lid (a hidden identifier) instead of @s.whatsapp.net. The API normalizes this and exposes sender.lid in the envelope; detect mentions by JID, never by text.

Observability

If a number drops, you know immediately: SSE (status changes live) + the instance.* webhook (with the reason) + an optional alert. Live health score and per-number/per-tenant metrics.

Honest caveats

  • Buttons/lists are unreliable (worse in groups) → the API always sends an equivalent numbered text menu. In groups, text only.
  • Forwarding, labels, and starting a call are experimental (a whatsmeow limitation) and respond 501.
  • An active bot in many groups increases ban risk — respect throttling + proxy.