Gratis update & dukungan instalasi

Tutorial Website 11 Oct 2026

Cara Kirim Notifikasi WhatsApp Otomatis di Laravel: Panduan Lengkap + Queue (2026)

R Oleh renz mobellgnd
Cara Kirim Notifikasi WhatsApp Otomatis di Laravel: Panduan Lengkap + Queue (2026)

Cara Kirim Notifikasi WhatsApp Otomatis di Laravel: Panduan Lengkap + Queue (2026)

Mengirim notifikasi WhatsApp otomatis dari Laravel dilakukan dengan menghubungkan aplikasi ke WhatsApp Business API resmi Meta atau ke gateway lokal seperti Fonnte dan Wablas, lalu memicu pengiriman dari event aplikasi — misalnya order baru atau pembayaran lunas — melalui service class yang dijalankan lewat queue agar tidak memperlambat response website. Panduan ini membahas semuanya dari nol sampai siap produksi.

Apa itu notifikasi WhatsApp otomatis dan kapan memakainya?

Notifikasi WhatsApp otomatis adalah pesan yang dikirim sistem secara otomatis ketika terjadi peristiwa tertentu di aplikasi: invoice pembelian, kode OTP, status pengiriman, pengingat jatuh tempo, atau konfirmasi pembayaran. Berbeda dengan broadcast promosi, notifikasi bersifat event-driven — pesan yang memang ditunggu penerimanya.

Kenapa WhatsApp, bukan email atau SMS saja? Di Indonesia, WhatsApp adalah aplikasi chat yang paling sering dibuka. Notifikasi penting seperti "pembayaran Anda sudah kami terima" jauh lebih cepat dibaca lewat WA dibanding email yang tenggelam di folder promosi. Banyak aplikasi kasir dan toko online — termasuk yang dibahas di artikel integrasi QRIS dinamis Midtrans untuk aplikasi kasir Laravel — memakai WA sebagai kanal konfirmasi utama.

Namun ada batasan yang harus dipahami sejak awal: WhatsApp bukan kanal untuk spam. Mengirim pesan massal ke nomor yang tidak pernah berinteraksi dengan bisnis Anda berisiko membuat nomor dibatasi atau diblokir. Panduan ini fokus pada notifikasi transaksional yang sah.

Dua jalan mengirim WhatsApp dari Laravel: API resmi vs gateway lokal

Secara garis besar ada dua pendekatan, dan memilih yang tepat di awal menghemat banyak waktu:

Aspek WhatsApp Business API resmi (Meta) Gateway lokal (Fonnte, Wablas, dsb)
Proses setupBuat aplikasi di Meta for Developers, verifikasi bisnis, persetujuan template pesan — bisa makan waktu berhari-hariDaftar, tambah device, scan QR — bisa jalan dalam 30 menit
Nomor pengirimNomor bisnis terverifikasiNomor WhatsApp biasa (sebaiknya nomor khusus, bukan nomor pribadi)
Skema biayaBerbasis percakapan (conversation pricing), ada kuota gratis tiap bulanBerbasis pesan atau paket bulanan, umumnya mulai puluhan ribu rupiah
Stabilitas & risikoResmi dari Meta, paling stabil untuk skala besarUnofficial — praktis, tapi ada risiko pembatasan nomor bila disalahgunakan
Paling cocok untukKorporat, volume jutaan pesan, butuh kepatuhan penuhUMKM, MVP, notifikasi internal, dan project yang harus jalan hari ini

Tidak ada jawaban yang selalu benar. Untuk kebanyakan project source code — toko online, aplikasi kasir, sistem informasi sekolah — gateway lokal adalah titik mulai yang realistis. Kalau bisnisnya sudah besar dan butuh garansi kepatuhan, migrasi ke API resmi Meta adalah langkah berikutnya.

Langkah 1: Siapkan gateway dan simpan token dengan aman

Alurnya hampir sama di semua gateway lokal:

  1. Daftar akun di penyedia gateway pilihan Anda.
  2. Tambahkan device dan hubungkan dengan cara scan QR dari aplikasi WhatsApp di HP.
  3. Salin token/API key dari dashboard.

Jangan pernah menempel token langsung di kode. Simpan di file .env:

WA_GATEWAY_URL=https://api.gateway-anda.com
WA_GATEWAY_TOKEN=token_rahasia_anda

Lalu daftarkan di config/services.php agar bisa diakses lewat config('services.whatsapp.token'):

'whatsapp' => [
'url' => env('WA_GATEWAY_URL'),
'token' => env('WA_GATEWAY_TOKEN'),
],

Pastikan .env tidak ikut ter-commit ke Git — ini bagian dari checklist mengamankan website setelah membeli source code yang sudah kami bahas sebelumnya. Token yang bocor bisa disalahgunakan untuk mengirim pesan atas nama nomor Anda.

Langkah 2: Buat service class WhatsApp yang reusable

Jangan menembak API gateway langsung dari controller. Bungkus dalam satu service class di app/Services/WhatsAppService.php supaya logika normalisasi nomor, retry, dan logging terpusat:

<?php

namespace App\Services;

use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;

class WhatsAppService
{
public function send(string $to, string $message): bool
{
$response = Http::timeout(15)
->retry(2, 500)
->withHeaders([
'Authorization' => config('services.whatsapp.token'),
])
->asForm()
->post(config('services.whatsapp.url') . '/send', [
'target' => $this->normalize($to),
'message' => $message,
]);

if ($response->failed()) {
Log::warning('Gagal kirim notifikasi WA', [
'to' => $to,
'body' => $response->body(),
]);

return false;
}

return true;
}

public function normalize(string $phone): string
{
$phone = preg_replace('/[^0-9]/', '', $phone);

if (str_starts_with($phone, '0')) {
$phone = '62' . substr($phone, 1);
}

return $phone;
}
}

Tiga detail penting di kode ini:

  1. normalize() mengubah format nomor Indonesia (0812..., +62812..., 62812...) menjadi satu format konsisten berawalan 62. Ketidakkonsistenan format nomor adalah penyebab gagal kirim yang paling sering terjadi.
  2. retry(2, 500) mencoba ulang dua kali dengan jeda 500 milidetik bila request gagal — berguna saat gateway sedang sibuk sesaat.
  3. Nama endpoint dan parameter bisa berbeda di tiap gateway (/send, /api/sendMessage, dsb). Selalu sesuaikan dengan dokumentasi resmi gateway yang Anda pakai; contoh di atas memakai pola yang umum.

Langkah 3: Bungkus sebagai Notification Channel Laravel

Laravel punya sistem notifikasi bawaan (mail, database, broadcast). Kita bisa menambahkan channel whatsapp sendiri supaya pengiriman WA terintegrasi rapi dengan aplikasi. Buat file app/Notifications/Channels/WhatsAppChannel.php:

<?php

namespace App\Notifications\Channels;

use App\Services\WhatsAppService;
use Illuminate\Notifications\Notification;

class WhatsAppChannel
{
public function send(object $notifiable, Notification $notification): void
{
$message = $notification->toWhatsApp($notifiable);

app(WhatsAppService::class)->send(
$notifiable->routeNotificationFor('whatsapp', $notification)
?? $notifiable->phone,
$message
);
}
}

Lalu buat notification-nya, misalnya untuk order yang baru dibayar:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
use App\Notifications\Channels\WhatsAppChannel;

class OrderPaidNotification extends Notification implements ShouldQueue
{
use Queueable;

public function __construct(public $order) {}

public function via(object $notifiable): array
{
return [WhatsAppChannel::class, 'mail'];
}

public function toWhatsApp(object $notifiable): string
{
return "Halo {$notifiable->name},\n"
. "Pembayaran order #{$this->order->code} sebesar "
. "Rp " . number_format($this->order->total, 0, ',', '.')
. " sudah kami terima. Terima kasih!";
}
}

Dengan pola ini, satu event bisa memicu WA dan email sekaligus — WA sebagai fallback bila email tidak dibaca. Konsep queue untuk email sudah dibahas tuntas di artikel cara kirim email otomatis di Laravel dengan queue; pola yang dipakai di sini sama persis.

Langkah 4: Selalu kirim lewat queue, jangan sinkron

Perhatikan implements ShouldQueue pada notification di atas. Ini bukan opsional — ini wajib untuk produksi. Alasannya sederhana: request HTTP ke gateway butuh 1–3 detik. Kalau dikirim sinkron dari controller, setiap checkout membuat pelanggan menunggu 3 detik lebih lama. Kalau gateway sedang lambat atau timeout, checkout bisa gagal total.

Cara pakainya tetap satu baris di controller atau observer:

$user->notify(new OrderPaidNotification($order));

Lalu pastikan queue worker berjalan di server:

php artisan queue:work --tries=3

Untuk aplikasi mobile yang memakai backend Laravel, pola yang sama berlaku — notifikasi WA melengkapi push notification. Lihat juga panduan membuat REST API Laravel untuk aplikasi mobile bila backend Anda melayani aplikasi Android/iOS.

Checklist produksi sebelum go-live

  1. Validasi format nomor di form pendaftaran — tolak nomor yang tidak valid sejak awal.
  2. Cek nomor terdaftar di WhatsApp sebelum mengirim (banyak gateway menyediakan endpoint pengecekan) supaya kuota tidak terbuang ke nomor mati.
  3. Beri delay antar pesan bila mengirim ke banyak penerima sekaligus; jeda 1–3 detik menyerupai perilaku manusia dan mengurangi risiko pembatasan.
  4. Catat setiap pengiriman ke tabel log sederhana (whatsapp_logs: penerima, isi ringkas, status, waktu) untuk audit dan debugging.
  5. Siapkan fallback: bila WA gagal setelah retry, kirim email sebagai cadangan.
  6. Pakai nomor khusus pengirim, bukan nomor pribadi pemilik bisnis.
  7. Pantau dashboard gateway seminggu pertama — perhatikan pesan yang gagal dan alasannya.

Cara ini tidak cocok jika...

Kejujuran bagian dari panduan yang baik. Pendekatan gateway + queue di atas tidak cocok bila Anda butuh chatbot dua arah yang kompleks (butuh webhook dan bot framework tersendiri), volume jutaan pesan per hari (API resmi Meta lebih tepat), atau broadcast promosi massal (melanggar kebijakan WhatsApp — gunakan kanal resmi seperti email marketing atau iklan). Untuk kebutuhan itu, rancang arsitektur yang berbeda sejak awal.

FAQ

Apakah kirim notifikasi WhatsApp dari Laravel bisa gratis? Bisa untuk eksperimen — banyak gateway menyediakan paket gratis dengan kuota terbatas, dan API resmi Meta memberi kuota percakapan gratis tiap bulan. Untuk produksi, siapkan anggaran paket berbayar; biayanya umumnya jauh lebih murah daripada SMS gateway.

Apakah nomor WhatsApp saya bisa diblokir? Ya, risikonya nyata pada gateway unofficial bila dipakai untuk spam atau broadcast ke nomor asing. Minimalkan dengan memakai nomor khusus, hanya mengirim notifikasi yang diharapkan penerima, dan memberi jeda antar pesan.

Apakah perlu verifikasi bisnis? Hanya untuk WhatsApp Business API resmi Meta. Gateway lokal cukup daftar dan scan QR.

Bisakah mengirim gambar atau file PDF invoice? Bisa — kebanyakan gateway mendukung parameter file/URL untuk mengirim gambar, PDF, atau dokumen. Sesuaikan nama parameter dengan dokumentasi gateway Anda.

Apa bedanya dengan SMS gateway? WhatsApp lebih murah per pesan, mendukung media dan format teks kaya, serta open rate-nya tinggi. Kekurangannya: bergantung pada kebijakan Meta, sedangkan SMS berjalan di infrastruktur operator.

Bagaimana kalau pesan gagal terkirim? Service class di atas melakukan retry otomatis dan mencatat kegagalan ke log. Di level aplikasi, tambahkan fallback ke email dan pantau tabel log secara berkala.

Apakah pendekatan ini bisa dipakai di shared hosting? Bisa, selama PHP versi 8.1+ dengan ekstensi cURL dan Anda bisa menjalankan queue worker (atau memakai cron sebagai pengganti worker). Untuk setup server yang lebih serius, pertimbangkan deploy Laravel ke VPS Ubuntu.

Penutup

Notifikasi WhatsApp otomatis bukan fitur mewah lagi — ini ekspektasi standar pelanggan toko online dan pengguna aplikasi di Indonesia. Mulai dari gateway lokal agar cepat jalan, bungkus dalam service class dan notification channel yang rapi, kirim semuanya lewat queue, dan naikkan ke API resmi Meta saat volumenya membenarkan. Dengan fondasi yang benar sejak awal, migrasi nanti hanya soal mengganti isi WhatsAppService, bukan merombak seluruh aplikasi.