Broadcasts

Blast tanpa
bikin paranoid

Template-based, CSV per-row variables, quota refund kalau pre-flight gagal, fairness gate biar tidak monopolize worker. Resume yang fail tanpa double-send.

10k Rows per CSV
4 Recipient modes
Per-row Variables positional
Resume Tanpa double-send
Recipient modes

Pilih audience sesuai kebutuhan

Empat cara select penerima — sederhana sampai bulk CSV dengan per-row personalization.

All contacts

Semua kontak di akun. Bisa exclude list tertentu (excludeIds).

Selected contacts

Explicit list contactIds[], max 10,000. Cocok untuk segmented campaign.

By labels

labelIds[] — semua kontak yang punya minimal satu label dari list. Max 1,000 labels.

CSV upload

Max 10,000 rows dengan per-row variable mapping. Materialized at create — immediate count + rejection summary.

Personalization per-row

Variable mapping positional — {{1}}, {{2}}, dst di template Meta di-isi dari array body sesuai urutan. Set di level broadcast (global) atau override per-row di CSV.

Validasi template otomatis: variables di body, header, button — semua di-check vs Meta-approved template sebelum broadcast jalan.

  • Per-row overrides — masing-masing penerima dapet pesan yang relevan
  • Pre-flight template validation — tidak ada surprise saat run
  • Rejection summary di-return sync saat create
create-broadcast.json
// Upload CSV langsung di dashboard, atau via API.
// Variables positional — {{1}} = body[0].text, dst.
{
  "name": "Promo Lebaran 2026",
  "templateId": "tpl_promo_lebaran",
  "recipients": {
    "type": "csv",
    "csvRows": [
      {
        "phone": "+628123456789",
        "variables": {
          "body": [
            { "type": "text", "text": "Pak Budi" },
            { "type": "text", "text": "20%" }
          ]
        }
      },
      // up to 10,000 rows...
    ]
  }
}
Reliability

Bikin operator tidur nyenyak

Resume failed broadcasts

POST /broadcasts/:id/resume skip kontak yang sudah berhasil ke-send. Tidak ada double-send.

Fairness gate

Per-org concurrent broadcast cap — satu org tidak bisa monopolize worker. Stateless re-evaluation.

Quota auto-refund

Quota di-charge speculatively saat POST. Kalau pre-flight gagal (template missing, account error), quota otomatis di-refund.

Marketing opt-out

Otomatis hormati kontak yang opt-out marketing. Compliance dengan Meta policy out-of-the-box.

Status tracking

Parent broadcast + per-recipient message — lihat penuh siapa sudah delivered, read, atau failed.

Pre-send eligibility check

Validasi compliance status akun + template approval sebelum job jalan.

Status lifecycle yang jelas

Dua level tracking: parent broadcast dan per-recipient message. Operator selalu tahu posisi blast sekarang dan recipient mana yang perlu di-retry.

Visible di dashboard, accessible via API, juga di-push lewat message.status webhook event.

lifecycle.txt
// Parent broadcast lifecycle
draft → scheduled → running → completed
                            ↘ failed
                            ↘ cancelled

// Per-recipient message lifecycle
pending → queued → sent → delivered → read
                        ↘ failed
Heads-up: Broadcasts adalah dashboard feature — bukan endpoint public /v1. Untuk bulk-send via SDK / public API, loop POST /v1/{phone}/messages dengan template payload + idempotency key (auto-set oleh SDK). Schedule field tersedia tapi belum auto-execute — operator klik Send untuk run.

Blast pertama Anda dalam 10 menit

Upload CSV, pilih template, klik Send. Sisanya kami yang urus.