1. Beranda
  2. Blog
  3. Google Sheets ke WhatsApp: Otomasi Konfirmasi dan Reminder Janji Temu

Otomasi AI  ·  9 menit baca

Google Sheets ke WhatsApp: Otomasi Konfirmasi dan Reminder Janji Temu

Otomasi konfirmasi dan reminder janji temu via WhatsApp dari Google Sheets dengan Apps Script — kode siap pakai, aturan template Meta, dan biayanya.

Google Sheets ke WhatsApp: Otomasi Konfirmasi dan Reminder Janji Temu

No-show adalah biaya paling senyap yang ditanggung bisnis jasa. Klinik di Kelapa Gading, bengkel detailing di Surabaya, agen properti yang mengatur site visit di BSD — semuanya rugi dengan cara yang sama: slot sudah dibooking, tidak ada yang mengingatkan, dan satu jam itu hangus. Solusi biasanya adalah admin yang mengetik pesan WhatsApp satu per satu setiap sore, yang berjalan lancar sampai suatu hari tidak.

Panduan ini menunjukkan cara mengganti pekerjaan sore itu dengan satu Google Sheet dan sekitar delapan puluh baris Apps Script. Ini pola yang kami terapkan untuk klien di Indonesia, termasuk bagian-bagian yang baru muncul saat sudah jalan di produksi — format nomor telepon, persetujuan template, dan cara mencegah script mengirim reminder yang sama dua kali.

Apa yang sebenarnya dilakukan otomasi ini

Satu kalimat: saat pelanggan booking, Google Apps Script membaca baris baru di Sheet Anda dan mengirim konfirmasi WhatsApp dalam hitungan detik, lalu mengirim reminder sehari sebelum jadwal — tanpa campur tangan manusia dan tanpa pesan terkirim dua kali.

Alurnya punya empat bagian:

TahapDitangani olehPemicunya
MenerimaGoogle Form, form website, atau baris yang diketik stafPelanggan submit
MenyimpanGoogle Sheet — satu baris per janji temuSubmit form menambah baris
Kirim sekarangTrigger onFormSubmit Apps ScriptJalan beberapa detik setelah booking
Kirim nantiTrigger terjadwal Apps ScriptJalan sekali sehari, mencari jadwal besok

Tidak ada yang butuh server, langganan platform booking, atau developer tetap. Yang dibutuhkan hanya akun Google dan satu kanal pengiriman WhatsApp.

Kenapa WhatsApp, bukan email atau SMS

Karena di Indonesia, WhatsApp adalah tempat pesan benar-benar dibaca. Open rate email untuk reminder transaksional ada di kisaran belasan sampai dua puluhan persen untuk kebanyakan bisnis konsumen di sini, dan email promosi ke Gmail sering mendarat di tab Promotions. WhatsApp adalah kanal percakapan pelanggan yang default di pasar ini, dan pesan utility tentang janji temu yang dibuat pelanggan sendiri persis seperti yang platform ini rancang untuk dibawa.

Ada alasan praktis juga: WhatsApp itu dua arah. Reminder yang bisa dibalas pelanggan — "bisa digeser ke jam 3?" — mengubah broadcast menjadi percakapan penjadwalan ulang, dan itulah yang sebenarnya menyelamatkan slot tersebut.

Memilih cara mengirim: tiga opsi dibandingkan

Jawaban singkat: pakai WhatsApp Business Cloud API langsung kalau ada orang teknis di tim, pakai Business Solution Provider kalau ingin setup diurus orang lain, dan hindari gateway tidak resmi untuk apa pun yang bisnis Anda andalkan.

OpsiEffort setupRisikoCocok untuk
Meta WhatsApp Business Cloud API
(langsung dari Meta)
Sedang — verifikasi Business Manager, satu nomor, persetujuan template Rendah. Resmi, terdokumentasi, stabil. Tim yang punya kapasitas developer. Biaya per pesan paling murah.
Business Solution Provider
(360dialog, Twilio, BSP lokal)
Rendah — mereka mengurus verifikasi dan memberi API yang lebih sederhana Rendah, ditambah margin per pesan atau biaya bulanan di atas tarif Meta Bisnis yang ingin jalan minggu ini tanpa menyentuh konsol Meta.
Gateway tidak resmi
(layanan yang menjalankan WhatsApp Web)
Sangat rendah — tinggal scan QR Tinggi. Melanggar ketentuan WhatsApp. Nomor kena banned, biasanya di saat paling tidak tepat. Tidak untuk apa pun yang bisnis Anda andalkan.

Kode di panduan ini memakai Cloud API. Sebagian besar BSP menerima bentuk request yang hampir sama, jadi pindah tinggal mengganti URL dan header autentikasi.

Menyiapkan spreadsheet

Sheet ini adalah databasenya, jadi kolomnya adalah skemanya. Dua kolom ada murni supaya otomasi aman dijalankan ulang, dan justru dua kolom itu yang paling sering dilewatkan orang.

KolHeaderFungsi
ATimestampDitulis otomatis oleh Google Forms
BNameDipakai di isi pesan
CPhoneApa pun format ketikan pelanggan — dinormalisasi di kode
DDateTanggal janji temu
ETimeJam janji temu, sebagai teks (14:30)
FConfirmSentKolom pengaman. Mencegah kirim ganda saat script dijalankan ulang
GReminderSentKolom pengaman. Sama, untuk reminder H-1

Simpan access token di Project Settings → Script Properties, jangan pernah di dalam kode. Siapa pun yang Anda beri akses ke Sheet bisa membaca script-nya.

Menormalisasi nomor telepon Indonesia

Ini langkah yang paling sering menggagalkan percobaan pertama. API mewajibkan format E.164 — 628119… tanpa tanda plus, tanpa spasi, tanpa angka nol di depan. Pelanggan akan mengetik 0811-9000-111, +62 811 9000 111, dan 811 9000 111, semuanya untuk nomor yang sama.

function toE164Id(raw) {
  var n = String(raw).replace(/[^0-9]/g, '');
  if (n.indexOf('62') === 0) return n;        // sudah 62...
  if (n.indexOf('0') === 0)  return '62' + n.slice(1);   // 0811... -> 62811...
  if (n.indexOf('8') === 0)  return '62' + n;            // 811...  -> 62811...
  return n;
}

Mengirim konfirmasi

Satu fungsi yang bisa dipakai ulang untuk mengirim template apa pun yang sudah disetujui. Semua bagian lain di panduan ini memanggil fungsi ini.

var PHONE_NUMBER_ID = '1234567890';   // dari Meta Business Manager
var API = 'https://graph.facebook.com/v21.0/';

function sendTemplate(toE164, templateName, bodyParams) {
  var token = PropertiesService.getScriptProperties().getProperty('WA_TOKEN');
  var payload = {
    messaging_product: 'whatsapp',
    to: toE164,
    type: 'template',
    template: {
      name: templateName,
      language: { code: 'id' },
      components: [{
        type: 'body',
        parameters: bodyParams.map(function (t) { return { type: 'text', text: String(t) }; })
      }]
    }
  };
  var res = UrlFetchApp.fetch(API + PHONE_NUMBER_ID + '/messages', {
    method: 'post',
    contentType: 'application/json',
    headers: { Authorization: 'Bearer ' + token },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  });
  return { code: res.getResponseCode(), body: res.getContentText() };
}

Sekarang hubungkan ke submit form. Di editor Apps Script, tambahkan trigger installable — Triggers → Add Trigger → onBooking → From spreadsheet → On form submit. Fungsi simple trigger onFormSubmit(e) tidak akan bekerja di sini, karena simple trigger tidak diizinkan memanggil layanan eksternal.

function onBooking(e) {
  var sh  = e.range.getSheet();
  var row = e.range.getRow();
  var v   = sh.getRange(row, 1, 1, 7).getValues()[0];
  var name = v[1], phone = v[2], date = v[3], time = v[4];

  if (v[5]) return;                    // ConfirmSent sudah terisi — hentikan

  var r = sendTemplate(toE164Id(phone), 'appointment_confirm',
                       [name, formatDate_(date), time]);
  sh.getRange(row, 6).setValue(r.code === 200 ? 'YES' : 'ERR ' + r.code);
}

function formatDate_(d) {
  return Utilities.formatDate(new Date(d), Session.getScriptTimeZone(), 'd MMMM yyyy');
}

Menambahkan reminder H-1

Fungsi kedua, dijalankan sekali sehari oleh trigger terjadwal, menangani reminder. Atur sekitar pukul 17.00 — cukup sore supaya besok terasa dekat, cukup awal supaya orang masih bisa menjadwalkan ulang.

function sendDayBeforeReminders() {
  var sh   = SpreadsheetApp.getActive().getSheetByName('Bookings');
  var rows = sh.getDataRange().getValues();
  var tz   = Session.getScriptTimeZone();
  var tomorrow = Utilities.formatDate(
    new Date(Date.now() + 24 * 60 * 60 * 1000), tz, 'yyyy-MM-dd');

  for (var i = 1; i < rows.length; i++) {
    var name = rows[i][1], phone = rows[i][2];
    var date = rows[i][3], time = rows[i][4], reminded = rows[i][6];

    if (reminded) continue;                       // kolom pengaman
    if (!date || !phone) continue;
    if (Utilities.formatDate(new Date(date), tz, 'yyyy-MM-dd') !== tomorrow) continue;

    var r = sendTemplate(toE164Id(phone), 'appointment_reminder', [name, time]);
    sh.getRange(i + 1, 7).setValue(r.code === 200 ? 'YES' : 'ERR ' + r.code);
    Utilities.sleep(300);                         // jaga agar tidak kena rate limit
  }
}

Kolom pengaman itulah kuncinya. Trigger Apps Script bisa jalan dua kali — setelah timeout, atau saat seseorang menjalankan fungsinya manual untuk tes. Menulis YES kembali ke barisnya membuat skenario terburuknya adalah pesan yang tidak terkirim, bukan pelanggan yang menerima reminder sama empat kali.

Membuat template disetujui

Setiap pesan yang dikirim di luar jendela percakapan 24 jam harus memakai template yang sudah disetujui Meta sebelumnya. Persetujuan biasanya keluar dalam hitungan menit sampai beberapa jam, dan penolakan hampir selalu karena alasan yang sama: bahasa promosi di dalam template utility, atau placeholder tanpa teks di sekitarnya.

Ajukan sebagai kategori Utility, bukan Marketing. Contoh template konfirmasi yang bekerja:

Halo {{1}}, booking Anda sudah kami terima.

Tanggal: {{2}}
Jam: {{3}}

Balas pesan ini jika perlu mengubah jadwal.

Tiga aturan yang mencegah sebagian besar penolakan:

  1. Jangan pernah memulai atau mengakhiri isi pesan dengan placeholder. {{1}}, booking Anda… aman; isi pesan yang hanya berupa {{1}} ditolak otomatis.
  2. Jaga template utility tetap transaksional. "Diskon 20% untuk kunjungan berikutnya" mengubah template utility menjadi marketing, yang tarifnya berbeda dan aturan persetujuannya lebih ketat.
  3. Samakan kode bahasa yang Anda kirim. Kalau template terdaftar sebagai id, mengirim language: { code: 'en' } akan gagal dengan error yang terbaca — secara membingungkan — seperti template tidak ditemukan.

Menangani balasan, reschedule, dan pembatalan

Begitu pelanggan membalas, terbuka jendela layanan 24 jam di mana Anda bisa mengirim pesan bebas tanpa template. Di jendela itulah penjadwalan ulang sebenarnya terjadi.

Untuk sebagian besar bisnis, jawaban yang tepat adalah tidak mengotomasi bagian ini. Arahkan balasan masuk ke inbox WhatsApp bersama yang memang sudah dipantau staf, dan biarkan manusia memindahkan jadwalnya. Tugas otomasi adalah memulai percakapan secara konsisten; manusia lebih baik untuk dua puluh detik setelahnya.

Kalau volumenya membuat itu tidak praktis, langkah berikutnya adalah webhook yang menangkap balasan berisi kata "batal" atau "ubah", menandai barisnya, dan memberi tahu staf — layak dibangun setelah Anda melewati sekitar lima puluh janji temu per minggu.

Berapa biayanya

Apps Script gratis. Pesannya tidak, tapi murah dibanding satu no-show.

KomponenBiaya
Google Sheets + Apps ScriptTermasuk dalam akun Google. Kuota gratis mengizinkan sekitar 20.000 request keluar per hari.
Template utility WhatsAppDitagih per pesan dengan tarif yang berbeda tiap negara. Pesan utility yang dikirim di dalam jendela layanan yang sedang terbuka gratis.
Business Solution ProviderMargin di atas tarif Meta, atau biaya platform bulanan. Tidak ada sama sekali kalau Anda memakai Cloud API langsung.

Meta mengubah tarif WhatsApp Business dari per-percakapan menjadi per-pesan pada 2025, dan daftar tarifnya direvisi berkala. Cek halaman harga Meta yang berlaku untuk negara Anda sebelum menyusun anggaran — jangan mengandalkan angka yang dikutip artikel mana pun, termasuk artikel ini.

Lima hal yang rusak saat sudah berjalan

  1. Token kedaluwarsa. Access token sementara hanya berlaku 24 jam. Buat System User token permanen di Business Manager, atau otomasi Anda mati diam-diam besok.
  2. Tanggal terbaca sebagai teks. Kalau kolom Sheet diformat sebagai teks, new Date(date) menghasilkan Invalid Date dan semua perbandingan gagal. Paksa kolomnya menjadi Date, atau parse secara eksplisit.
  3. Tidak ada yang memantau kolom error. Tambahkan pengecekan mingguan, atau satu baris yang mengirim email saat ada baris berstatus ERR. Otomasi tanpa sinyal kegagalan bukanlah otomasi.
  4. Timezone trigger bukan timezone Anda. Project Apps Script bisa default ke zona waktu Amerika. Atur di Project Settings, atau reminder pukul 17.00 terkirim pukul 05.00 WIB.
  5. Ada yang mengubah susunan kolom. Script membaca berdasarkan posisi. Sisipkan satu kolom di tengah dan semua pesan terkirim dengan jam yang salah. Proteksi baris header.

Kapan harus pindah dari Sheets

Pola ini nyaman menangani beberapa ratus janji temu per bulan. Lewat dari itu, tandanya konsisten: lebih dari satu orang mengedit Sheet bersamaan, reminder yang perlu dikirim di beberapa interval, janji temu yang terikat staf tertentu dengan kalender masing-masing, atau kebutuhan melaporkan tingkat no-show dari waktu ke waktu.

Di titik itu Sheet berubah dari jalan pintas menjadi hambatan, dan pekerjaannya pindah ke sistem booking yang sebenarnya atau workflow tool dengan database di belakangnya. Logika pesan yang Anda bangun di sini hampir seluruhnya bisa dibawa — dan itulah alasan memulai dengan cara ini, bukan membeli platform di hari pertama.

Butuh bantuan membangunnya

InReality Solutions membangun otomasi seperti ini untuk bisnis di seluruh Indonesia — alur booking dan reminder WhatsApp, pipeline Google Sheets dan Apps Script, integrasi CRM, serta dashboard pelaporan. Kalau Anda lebih memilih semuanya dibangun, diuji, dan diserahkan dalam kondisi berjalan, lihat layanan otomasi AI kami atau hubungi tim kami di Jakarta.

Pertanyaan yang Sering Diajukan

Apakah Google Apps Script bisa mengirim pesan WhatsApp secara langsung?

Tidak secara mandiri — Apps Script tidak punya kemampuan WhatsApp bawaan. Yang bisa dilakukannya adalah memanggil WhatsApp Business Cloud API lewat HTTPS menggunakan UrlFetchApp, dan begitulah semua contoh di panduan ini bekerja. Anda perlu akun WhatsApp Business yang sudah disetujui, satu nomor telepon yang terdaftar padanya, dan access token. Apps Script menangani logika, penjadwalan, dan spreadsheet; Meta menangani pengirimannya.

Apakah saya wajib pakai WhatsApp Business API resmi, atau boleh gateway yang lebih murah?

Secara teknis Anda bisa memakai gateway tidak resmi yang mengotomasi WhatsApp Web di belakang layar, dan memang lebih murah serta lebih cepat disiapkan. Tapi cara itu melanggar ketentuan layanan WhatsApp, dan nomor yang memakainya kena banned — biasanya tanpa peringatan dan justru saat volume sedang naik. Untuk apa pun yang diandalkan bisnis, gunakan Cloud API resmi dari Meta atau Business Solution Provider. Selisih biayanya kecil dibanding kehilangan nomor bisnis Anda.

Kenapa pesan WhatsApp saya gagal dengan error template padahal templatenya sudah disetujui?

Penyebab paling umum adalah ketidakcocokan kode bahasa: template terdaftar dengan kode 'id' tetapi request API menyebut 'en', atau sebaliknya. Meta memperlakukan setiap bahasa sebagai template terpisah, sehingga request terlihat merujuk template yang tidak ada. Penyebab kedua tersering adalah jumlah parameter yang tidak cocok — mengirim dua nilai ke template yang mengharapkan tiga akan gagal validasi. Periksa keduanya sebelum menyimpulkan persetujuannya belum keluar.

Bagaimana cara mencegah otomasi mengirim reminder yang sama dua kali?

Gunakan kolom pengaman. Setelah pesan berhasil terkirim, tulis nilai seperti YES kembali ke baris tersebut, dan buat script melewati baris yang kolomnya sudah terisi. Ini penting karena trigger Apps Script memang bisa jalan lebih dari sekali — setelah eksekusi timeout, atau saat seseorang menjalankan fungsinya manual untuk tes. Tanpa kolom pengaman, satu kali jalan ulang yang tidak disengaja akan mengirim pesan lagi ke seluruh pelanggan di sheet.

Berapa banyak janji temu yang bisa ditangani sebelum cara ini tidak lagi praktis?

Batas teknisnya longgar — Apps Script mengizinkan sekitar 20.000 request keluar per hari di akun Google gratis, jauh lebih banyak dari kebutuhan kebanyakan bisnis jasa. Batas praktisnya datang lebih dulu, biasanya setelah beberapa ratus janji temu per bulan, dan penyebabnya soal orang, bukan kuota: banyak staf mengedit satu sheet, reminder yang dibutuhkan di beberapa interval, atau kalender per staf. Di titik itu sistem booking yang sebenarnya adalah langkah yang tepat, meski logika pesannya sebagian besar bisa dipindahkan apa adanya.

Devain Kapoor
Ditulis oleh Devain Kapoor

Founder & Managing Director · LinkedIn

Siap Membangun Realitas Baru?

Ceritakan kebutuhan bisnis Anda — tim kami akan merespons cepat dengan proposal yang tepat.

Chat via WhatsApp