← Blog  •  12 Jun 2026  •  Tim LoginWA

Cara Broadcast WhatsApp dari File CSV dengan Personalisasi

Kirim pesan WhatsApp massal satu per satu? Capek. Copy-paste nama pelanggan ke 500 chat berbeda? Lebih capek lagi. Padahal pesan yang menyebut nama penerima terbukti lebih diperhatikan daripada pesan generik yang jelas-jelas terasa seperti broadcast.

Kabar baiknya: dengan file CSV sederhana dan beberapa baris kode, kamu bisa kirim broadcast WhatsApp yang terasa personal ke ratusan kontak sekaligus, lengkap dengan nama masing-masing penerima, terjadwal otomatis, dan dengan delay yang aman supaya nomor kamu tidak kena banned.

Di tutorial ini kita pakai API dari LoginWA, WhatsApp gateway lokal yang punya fitur broadcast campaign berbasis CSV. Semua kode di bawah bisa langsung dijalankan setelah kamu punya API key (gratis, tanpa kartu kredit).

Yang Kamu Butuhkan Sebelum Mulai

Persiapannya singkat:

  1. Akun LoginWA, daftar pakai nomor WhatsApp di loginwa.com/auth/otp, verifikasi OTP, selesai. Paket Free dapat 500 pesan per bulan.
  2. Device yang sudah terhubung, buat app di dashboard, scan QR code pakai WhatsApp di HP kamu. Nomor inilah yang jadi pengirim broadcast.
  3. API key, generate dari dashboard, simpan baik-baik.
  4. File CSV berisi kontak, kita bahas formatnya sekarang.

Catatan kuota: di LoginWA, 1 pesan broadcast = 1 kuota, sama seperti 1 OTP atau 1 pesan API biasa. Jadi broadcast ke 300 kontak memakan 300 kuota. Detail paket bisa dicek di halaman pricing.

Format CSV yang Benar

File CSV-nya sederhana saja. Baris pertama adalah header (nama kolom), baris berikutnya data kontak:

phone,name,var1
628123456789,Budi Santoso,Kemeja Flanel
628198765432,Siti Rahma,Dress Batik
628111222333,Andi Wijaya,Celana Chino

Beberapa aturan penting:

  • Kolom phone wajib ada. Pakai format internasional tanpa tanda +, jadi 628123456789, bukan 08123456789 atau +628123456789.
  • Kolom lain bebas kamu namai, name, var1, kota, total_belanja, apa saja. Setiap nama kolom otomatis jadi variabel yang bisa dipakai di template pesan.
  • Hindari koma di dalam nilai tanpa tanda kutip. Kalau ada nilai seperti Jakarta, Selatan, bungkus dengan kutip ganda: "Jakarta, Selatan".
  • Simpan sebagai UTF-8 supaya nama dengan karakter khusus tidak rusak.

Kalau data pelanggan kamu ada di Excel atau Google Sheets, tinggal File → Download/Save As → CSV. Selesai.

Variabel Personalisasi di Template

Di template pesan, panggil kolom CSV dengan kurung kurawal. Contoh template:

Halo {name}! 👋

Produk yang kamu tunggu, {var1}, sudah restock nih. Stok terbatas, cek sekarang sebelum kehabisan ya.

Balas pesan ini kalau mau kami bantu pesankan.

Saat broadcast jalan, Budi menerima "Halo Budi Santoso! Produk yang kamu tunggu, Kemeja Flanel, sudah restock..." sementara Siti menerima versi dengan nama dan produknya sendiri. Satu template, ratusan pesan personal.

Cara 1: Upload CSV Lewat Dashboard (Tanpa Koding)

Buat yang tidak mau menyentuh kode sama sekali, dashboard LoginWA sudah menyediakan alurnya:

  1. Masuk menu BroadcastBuat Campaign.
  2. Upload file CSV kamu. Sistem akan mendeteksi kolom-kolomnya.
  3. Tulis template pesan, sisipkan variabel seperti {name} dari daftar kolom yang terdeteksi.
  4. Atur jadwal kirim dan delay antar pesan.
  5. Klik kirim atau jadwalkan. Pantau progresnya real-time di dashboard.

Fitur blast terjadwal + import CSV tersedia mulai paket Regular (Rp65.000/bulan, 15.000 pesan). Dashboard-nya bilingual Indonesia/Inggris, jadi tim kamu tidak perlu adaptasi lama.

Tapi artikel ini fokus ke cara yang lebih fleksibel: lewat API. Cocok kalau kamu mau broadcast jalan otomatis dari sistem internal, misalnya tiap ada produk restock, sistem langsung blast ke pelanggan yang pernah wishlist produk itu.

Cara 2: Buat Campaign Broadcast via API

Langkah 1, Parse CSV jadi Array Kontak

Endpoint campaign menerima daftar kontak dalam format JSON. Jadi langkah pertama adalah mengubah CSV menjadi array. Contoh dengan Node.js:

const fs = require("fs");

function parseCsv(path) {
  const lines = fs.readFileSync(path, "utf-8").trim().split("\n");
  const headers = lines[0].split(",").map((h) => h.trim());

  return lines.slice(1).map((line) => {
    const values = line.split(",").map((v) => v.trim());
    const contact = {};
    headers.forEach((h, i) => (contact[h] = values[i]));
    return contact;
  });
}

const contacts = parseCsv("./pelanggan.csv");
console.log(contacts);
// [ { phone: '628123456789', name: 'Budi Santoso', var1: 'Kemeja Flanel' }, ... ]

Untuk file CSV yang lebih kompleks (ada kutip, koma di nilai), pakai library seperti csv-parse daripada split manual.

Langkah 2, Buat Campaign

Kirim kontak beserta template pesan ke endpoint campaign:

curl -X POST https://api.loginwa.com/api/v1/broadcast/campaigns \
  -H "Authorization: Bearer API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Restock Juni 2026",
    "message": "Halo {name}! Produk {var1} sudah restock. Balas pesan ini kalau mau dibantu pesankan ya.",
    "contacts": [
      { "phone": "628123456789", "name": "Budi Santoso", "var1": "Kemeja Flanel" },
      { "phone": "628198765432", "name": "Siti Rahma", "var1": "Dress Batik" },
      { "phone": "628111222333", "name": "Andi Wijaya", "var1": "Celana Chino" }
    ],
    "delay_min": 5,
    "delay_max": 15
  }'

Versi Node.js lengkap yang menggabungkan parse CSV + buat campaign:

async function createCampaign(contacts) {
  const res = await fetch(
    "https://api.loginwa.com/api/v1/broadcast/campaigns",
    {
      method: "POST",
      headers: {
        Authorization: "Bearer API_KEY",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        name: "Restock Juni 2026",
        message:
          "Halo {name}! Produk {var1} sudah restock. Balas pesan ini kalau mau dibantu pesankan ya.",
        contacts: contacts,
        delay_min: 5,
        delay_max: 15,
      }),
    }
  );

  const data = await res.json();
  console.log("Campaign dibuat:", data);
  return data;
}

createCampaign(parseCsv("./pelanggan.csv"));

Perhatikan delay_min dan delay_max: LoginWA akan mengambil jeda acak di antara dua angka itu (dalam detik) untuk setiap pesan. Kenapa acak? Karena pola kirim yang terlalu rapi dan cepat adalah salah satu sinyal yang bisa memicu deteksi spam WhatsApp. Kita bahas lebih dalam di bagian tips di bawah.

Langkah 3, Jadwalkan Campaign

Mau broadcast jalan besok jam 9 pagi saat pelanggan sudah bangun (dan tidak terganggu pesan tengah malam)? Tambahkan parameter jadwal saat membuat campaign:

{
  "name": "Restock Juni 2026",
  "message": "Halo {name}! Produk {var1} sudah restock.",
  "contacts": [ ... ],
  "delay_min": 5,
  "delay_max": 15,
  "scheduled_at": "2026-06-13 09:00:00"
}

Campaign akan berstatus terjadwal dan mulai berjalan otomatis di waktu tersebut. Kamu tidak perlu menyalakan laptop atau standby, semua jalan di server LoginWA.

Langkah 4, Pause dan Resume

Broadcast sudah jalan setengah, lalu kamu sadar ada typo di link promo? Jangan panik, pause dulu:

curl -X POST https://api.loginwa.com/api/v1/broadcast/campaigns/CAMPAIGN_ID/pause \
  -H "Authorization: Bearer API_KEY"

Pesan yang belum terkirim akan ditahan. Setelah masalah beres, lanjutkan dari posisi terakhir:

curl -X POST https://api.loginwa.com/api/v1/broadcast/campaigns/CAMPAIGN_ID/resume \
  -H "Authorization: Bearer API_KEY"

Campaign melanjutkan ke kontak berikutnya, tidak mengulang dari awal, jadi tidak ada pelanggan yang menerima pesan dobel.

Langkah 5, Pantau Progress

Cek status dan progres campaign kapan saja:

curl https://api.loginwa.com/api/v1/broadcast/campaigns/CAMPAIGN_ID \
  -H "Authorization: Bearer API_KEY"

Respons berisi status campaign (terjadwal, berjalan, dijeda, selesai) beserta hitungan pesan terkirim, gagal, dan yang masih antre. Kalau mau update real-time tanpa polling, aktifkan webhook, LoginWA mendukung 10 tipe event dengan signature HMAC-SHA256 dan retry otomatis, jadi sistem kamu bisa dapat notifikasi tiap pesan terkirim atau gagal.

Bonus: Validasi Nomor Sebelum Broadcast

Salah satu penyebab pesan gagal adalah nomor yang tidak terdaftar di WhatsApp. Daripada membuang kuota, cek dulu nomornya:

curl -X POST https://api.loginwa.com/api/v1/numbers/check \
  -H "Authorization: Bearer API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "phones": ["628123456789", "628198765432"] }'

Filter kontak yang tidak aktif sebelum dimasukkan ke campaign. Database kontak jadi bersih, kuota tidak terbuang, dan rasio pesan gagal tetap rendah.

Tips Delay Aman Supaya Tidak Kena Banned

Ini bagian yang sering disepelekan, padahal paling menentukan umur nomor WhatsApp kamu. Tidak ada layanan yang bisa menjamin 100% bebas banned, siapa pun yang mengklaim itu sedang melebih-lebihkan. Yang bisa dilakukan adalah meminimalkan risiko:

Skenario Rekomendasi Delay Catatan
Nomor baru (< 2 minggu) 30–60 detik Mulai maksimal 50–100 pesan/hari, naikkan bertahap
Nomor lama, kontak sudah save nomor kamu 5–15 detik Risiko paling rendah
Kontak dingin (belum pernah chat) 20–45 detik Pecah jadi beberapa batch per hari
Promo massal ribuan kontak 15–30 detik Sebar ke beberapa device (paket Regular: 3 device, Business: 10 device)

Selain delay, beberapa kebiasaan yang membantu:

  • Pakai delay acak, bukan tetap. Manusia tidak mengirim pesan tiap 10,0 detik persis. LoginWA otomatis menambahkan typing indicator dan jeda acak menyerupai perilaku manusia di setiap pesan.
  • Personalisasi itu proteksi. Pesan identik yang dikirim massal lebih mudah terdeteksi sebagai spam. Variabel {name} membuat tiap pesan unik, sekali dayung, dua manfaat.
  • Kirim hanya ke orang yang mengenal kamu. Banyak penerima yang block atau report = sinyal kuat ke WhatsApp. Broadcast ke pelanggan yang pernah transaksi jauh lebih aman daripada ke daftar nomor hasil beli.
  • Beri opsi berhenti. Kalimat sederhana seperti "balas STOP kalau tidak mau menerima info promo" mengurangi kemungkinan di-report. Kamu bisa otomasi ini dengan fitur auto-reply keyword LoginWA (mode exact match untuk kata "STOP").
  • Jangan broadcast tengah malam. Selain mengganggu, pesan jam 2 pagi lebih mungkin dianggap spam oleh penerima. Pakai scheduled_at untuk kirim di jam wajar.

Perbandingan Singkat dengan Layanan Lain

Fitur broadcast dari CSV bukan eksklusif LoginWA. Fonnte, pemain terbesar di Indonesia, juga punya fitur serupa yang sangat lengkap, dengan paket mulai Rp25.000/bulan untuk 1.000 pesan. Wablas menawarkan paket Rp22.000–139.000/bulan dengan trial 15 hari, dan Watzap.id memakai model tahunan Rp449.000–649.000 dengan pesan unlimited.

Pembeda LoginWA ada di hitungan harga per pesan, paket Regular Rp65.000 sudah termasuk 15.000 pesan dan 3 device, plus paket Free 500 pesan/bulan yang boleh kirim media (dengan watermark kecil). Perbandingan lengkapnya pernah kami bahas di artikel Fonnte vs LoginWA vs Wablas. Saran jujurnya: coba versi gratis masing-masing, lihat mana yang alurnya paling cocok dengan workflow kamu.

Kesimpulan

Broadcast WhatsApp dari CSV intinya empat langkah: siapkan file CSV dengan kolom phone plus variabel personalisasi, buat campaign lewat POST /api/v1/broadcast/campaigns dengan template {name}, atur delay_min/delay_max plus jadwal, lalu pantau progresnya. Pause/resume tersedia kalau ada yang perlu dikoreksi di tengah jalan.

Mau langsung coba? Daftar gratis di loginwa.com/auth/otp, cukup nomor WhatsApp, tanpa kartu kredit, langsung dapat 500 pesan per bulan untuk eksperimen. Dokumentasi API lengkap (termasuk SDK JavaScript dan PHP) ada di loginwa.com/docs, dan detail paket bisa dilihat di halaman pricing.

Selamat broadcast, dengan delay yang manusiawi, ya.

Ready to try? Free 500 messages/month, no credit card.
Start free See pricing