Arsitektur MVP: Booking Klinik & Pengingat WA dengan Google Apps Script
Panduan arsitektur untuk membangun MVP booking klinik menggunakan Google Apps Script dan Google Sheets. Pelajari aktor, modul, alur data, validasi, trigger reminder WA, checklist implementasi, dan roadmap peningkatan.

Banyak klinik kecil masih menangani pendaftaran pasien secara manual, menyebabkan antrean berantakan dan pasien lupa jadwal. Artikel ini menjelaskan arsitektur aplikasi MVP—"Aplikasi booking klinik & WA reminder Sistem"—yang menggunakan Google Apps Script dan Google Sheets untuk menghadirkan halaman publik booking, halaman admin untuk validasi kedatangan, serta reminder WhatsApp otomatis. Anda akan mendapatkan gambaran modul, entitas data, alur kerja langkah-demi-langkah, validasi penting, pengaturan trigger, checklist implementasi, dan roadmap peningkatan.
Ringkasan masalah dan tujuan aplikasi
Masalah operasional yang dituju: antrean tidak tertata, pencatatan manual menyita waktu, dan pasien lupa jadwal. Tujuan solusi MVP ini adalah menyediakan mekanisme sederhana agar pasien bisa booking online, admin bisa memvalidasi kedatangan, dan pasien menerima reminder WhatsApp beberapa jam sebelum jadwal praktik.
Solusi teknis (konfirmasi blueprint): Google Apps Script (HTML Service) sebagai server + UI, Google Sheets sebagai basis data (sheet: Bookings, Doctors, Users, Settings), UrlFetchApp untuk panggilan API pengirim WA eksternal, dan time-driven trigger untuk job pengirim reminder.
Aktor, modul, dan entitas data
Aktor utama - Pasien / pengunjung web: mengisi form booking publik. - Admin / resepsionis: login sederhana, melihat daftar booking, memvalidasi kedatangan, mengelola jadwal. - Sistem scheduler: job terjadwal yang memeriksa jadwal dan memanggil API WA. - Layanan WA pihak ketiga: endpoint eksternal yang menerima payload untuk mengirim pesan.
Modul aplikasi - Halaman publik (index.html): form booking, pilihan dokter & slot, konfirmasi nomor antrian. - Halaman admin: login, dashboard ringkas (jumlah booking, status), daftar booking, validasi kedatangan, manajemen jadwal dokter. - Backend Apps Script (code.gs): endpoint server, validasi input, operasi CRUD ke Sheets, manajemen trigger, dan job reminder. - Client assets: styles.html, scripts.html untuk styling dan interaksi UI.
Entitas data (Google Sheets) - Doctors: id, nama, hari praktik, jam mulai, jam selesai, durasi slot (menentukan slot tersedia). - Bookings: bookingId, nama, telepon, alamat, TTL, umur, keluhan, doctorId, tanggal, jam, slotId, queueNumber, status (Booked/Arrived/Cancelled), reminderSent (true/false), createdAt. - Users: username, password (MVP: plaintext), role (admin). - Settings: waEndpoint, waApiKey (jika perlu), reminderLeadHours (mis. 3), timezone, webhookTimeout.
Alur data dan data flow
1) Pasien membuka halaman publik dan memilih dokter. 2) UI meminta slot tersedia berdasarkan jadwal pada sheet Doctors. Sistem menghitung slot terbuka (menghindari double-booking) dan menampilkan pilihan hari & jam. 3) Pasien submit form → backend men-validate field → menulis baris baru di sheet Bookings dengan status "Booked" dan menghasilkan queueNumber unik. 4) Admin membuka halaman admin, melihat daftar booking, dan saat pasien datang melakukan validasi (ubah status menjadi "Arrived"). 5) Scheduler (time-driven trigger) berjalan berkala; untuk setiap booking dengan status Booked dan waktu praktik dalam jangka waktu lead (mis. 3 jam), sistem memanggil UrlFetchApp ke waEndpoint menggunakan payload yang dikonfigurasi. 6) Hasil panggilan API dicatat (reminderSent set true atau log error) di Bookings atau Logs sheet.
Happy path (alur ideal) - Pasien berhasil memilih slot, menerima nomor antrian, datang hari H, admin memverifikasi kedatangan. - Scheduler berhasil mengirim WA reminder dan mengubah reminderSent ke true.
Failure path (penanganan kegagalan) - Double-booking: sistem harus menolak pembuatan booking jika slot sudah terisi. - Format input salah: sistem menolak dan menampilkan pesan validasi. - Gagal kirim WA: job reminder mencatat kegagalan di Logs, tidak mengubah status reminderSent; sistem dapat mencoba ulang di jadwal berikutnya.
Validasi input dan penanganan error
Validasi sisi klien (recommended): periksa keberadaan field wajib (nama, telepon, doctorId, tanggal, jam), validasi format telepon (angka dan panjang minimal), dan validasi tanggal/jam menggunakan ISO atau epoch.
Validasi sisi server (harus ada): - Periksa tipe data: nama/string, telepon/digits, tanggal valid JS Date, jam dalam range praktik. - Cek ketersediaan slot: hitung jumlah booking pada doctorId + tanggal + jam yang sama. - Sanitasi sederhana: gunakan trim() pada string dan batasi panjang input untuk menghindari penyimpanan berlebihan.
Penanganan kesalahan: - Kembalikan response JSON yang konsisten (success: true/false, message). - Log error ringkas ke Logs sheet dan Logger.log untuk debugging Apps Script.
Kontrol akses dan keamanan
- Autentikasi MVP: username & password yang disimpan di sheet Users (plaintext sesuai batasan MVP). Rekomendasi: segera tingkatkan dengan hashing dan OAuth jika aplikasi dipakai produksi.
- Pembatasan akses web app: saat publish, tetapkan izin akses sesuai kebutuhan (mis. anyone, even anonymous jika publik booking perlu diakses tanpa login).
- Endpoint WA: simpan waEndpoint dan kredensial di sheet Settings; batasi visibilitas file spreadsheet kepada admin saja.
Security considerations (catatan penting) - Rekomendasi: jangan menyimpan kredensial sensitif dalam file yang dibagikan secara luas. Jika kredensial harus disimpan, gunakan PropertiesService (Script Properties) sebagai alternatif. - Rekomendasi: tambahkan validasi server-side untuk menghindari injection dan batasi ukuran payload yang diterima dari klien.
Logging, monitoring, dan testing
Logging & monitoring - Gunakan satu sheet tambahan (Logs) untuk mencatat event penting: reminder attempts, API responses, dan error trace. - Setiap pengiriman WA tulis timestamp, bookingId, responseStatus, dan responseBody (ringkas) di Logs. - Pantau buku harian (daily counts) di Dashboard untuk jumlah booking dan tingkat reminderSent.
Testing - Siapkan data dummy di setiap sheet (Doctors dengan jadwal contoh, Users admin, dan beberapa Bookings) untuk pengujian fungsi utama. - Tes manual: buat booking melalui UI publik, tes validasi slot, dan verifikasi nomor antrian unik. - Tes integrasi WA: gunakan endpoint test (mock server) untuk memastikan payload dan headers benar.
Deployment sequence (urutan langkah implementasi)
1) Buat Google Spreadsheet baru dengan sheet: Doctors, Bookings, Users, Settings, Logs. 2) Isi contoh data: tambahkan user admin (username/password), atur Settings (waEndpoint, reminderLeadHours, timezone). 3) Buat Apps Script project dan tambahkan empat file: code.gs, index.html, styles.html, scripts.html. (Dokumentasi setup disertakan dalam komentar panjang di code.gs.) 4) Implementasikan fungsi server-side: doGet untuk serve UI publik/admin, doPost untuk menerima form, fungsi CRUD ke Sheets, function sendReminders() yang dipanggil oleh trigger. 5) Test lokal via 'Deploy as web app' (akses testing/internal). Pastikan izin yang diperlukan diberikan. 6) Buat time-driven trigger (mis. setiap 15 menit atau 1 jam tergantung kebutuhan) yang memanggil sendReminders. 7) Verifikasi pengiriman reminder pada Logs dan cek respons dari layanan WA. 8) Berikan akses spreadsheet hanya ke akun admin dan batasi share.
Contoh workflow konkret (contoh kasus)
Skenario: Pasien Budi ingin booking dokter umum pada 10 September jam 09:00. 1) Budi buka halaman publik, pilih "Dokter Umum". UI menampilkan slot 09:00 tersedia berdasarkan sheet Doctors (praktik 08:00–12:00, durasi slot 30 menit). 2) Budi isi form (nama, 08123456789, alamat, TTL, umur, keluhan), pilih 10-09-2026 09:00, klik Submit. 3) Backend cek validitas tanggal & telepon, cek slot 09:00 belum terisi, tulis baris di Bookings: bookingId=auto, queueNumber=U-20260910-001, status=Booked, reminderSent=false. 4) Scheduler berjalan 3 jam sebelum 09:00 (yaitu pukul 06:00 jika lead=3 jam). Fungsi sendReminders mencari booking Booked dengan waktu praktik dalam <=3 jam dan reminderSent=false. 5) Fungsi memanggil UrlFetchApp POST ke waEndpoint dengan payload berisi nomor telepon, template pesan, dan metadata booking. 6) Jika response OK, set reminderSent=true di Bookings dan catat log; jika error, tulis entry di Logs untuk retry. 7) Budi datang pukul 08:55; admin buka halaman admin, menemukan booking Budi dan klik "Validasi Kedatangan" → status diubah menjadi Arrived.
Practical implementation checklist
- [ ] Siapkan Google Spreadsheet dengan sheet: Doctors, Bookings, Users, Settings, Logs.
- [ ] Tambahkan admin di sheet Users (username & password) dan atur Settings (waEndpoint, reminderLeadHours, timezone).
- [ ] Tulis atau tempel kode ke Apps Script: code.gs, index.html, styles.html, scripts.html.
- [ ] Implementasikan validasi server-side dan cek ketersediaan slot sebelum insert.
- [ ] Siapkan dummy data Doctors untuk menguji slot.
- [ ] Deploy web app untuk testing (pastikan izin akses sesuai kebutuhan).
- [ ] Buat time-driven trigger untuk fungsi sendReminders.
- [ ] Uji end-to-end: booking publik → admin validation → reminder WA (uji dengan mock endpoint terlebih dulu).
- [ ] Aktifkan Logs sheet dan periksa hasil panggilan UrlFetchApp.
Keterbatasan dan roadmap peningkatan (label: rekomendasi)
Keterbatasan saat ini (dikonfirmasi blueprint): - Autentikasi hanya username & password tanpa hashing. - Pengiriman WA tergantung layanan pihak ketiga; pengiriman tidak dijamin. - Kuota Google Apps Script & UrlFetchApp dapat membatasi pengiriman massal. - Belum diuji di semua device; butuh verifikasi manual sebelum produksi.
Rekomendasi peningkatan (label: rekomendasi): - Gunakan PropertiesService atau Cloud Secret Manager untuk menyimpan kredensial WA secara aman. - Tambahkan hashing (bcrypt) atau OAuth untuk autentikasi admin sebelum produksi. - Tambahkan retry logic dengan backoff untuk pengiriman WA dan mekanisme antrian terpisah. - Implementasikan notifikasi via log/email untuk kegagalan kritis (mis. endpoint down). - Pertimbangkan integrasi resmi WhatsApp Business API di tahap berikutnya.
Kesimpulan dan langkah berikutnya
Blueprint ini memberikan panduan arsitektur untuk membangun MVP booking klinik dengan pengingat WA otomatis menggunakan Google Apps Script dan Google Sheets. Langkah-langkah yang jelas—dari pembuatan sheet, implementasi empat file (code.gs, index.html, styles.html, scripts.html), hingga pembuatan trigger—memungkinkan klinik kecil mempercepat proses booking dan mengurangi no-show.
Langkah berikutnya: siapkan spreadsheet dan Apps Script sesuai checklist, gunakan mock endpoint untuk menguji pengiriman WA, dan setelah berfungsi stabil, prioritaskan perbaikan keamanan (rekoman: hashing password dan aman menyimpan kredensial) sebelum pemakaian di lingkungan produksi.
Catatan: semua detail fitur, batasan, dan dependensi tercantum dari blueprint yang tervalidasi. Rekomendasi di atas ditandai sebagai rekomendasi dan bukan bagian dari deliverable MVP yang dijelaskan dalam blueprint.
