Telepon berdering saat Anda sedang melayani pelanggan, chat WhatsApp menumpuk berisi pertanyaan "besok jam 3 masih kosong?", lalu dua orang datang di jam yang sama karena jadwalnya dicatat di dua tempat berbeda. Itulah masalah harian salon, klinik, lapangan olahraga, studio foto, dan usaha rental yang masih mengandalkan buku jadwal.
Sistem booking online menyelesaikan masalah itu dengan satu kalender yang menjadi sumber kebenaran. Artikel ini membahas cara kerja sistem semacam itu, modul yang wajib ada, desain database yang mencegah double-booking, cara menjalankan source code berbasis Laravel di komputer lokal, serta checklist sebelum Anda membeli source code apa pun.
Masalah yang Diselesaikan Sistem Booking
Sebelum melihat fitur, pahami dulu tiga kerugian yang ingin ditekan:
- Waktu admin habis untuk konfirmasi jadwal. Setiap tanya-jawab soal slot kosong adalah pekerjaan manual yang bisa diganti halaman booking.
- Double-booking. Terjadi ketika jadwal dicatat di lebih dari satu tempat, atau ketika dua orang memesan slot yang sama hampir bersamaan.
- No-show. Pelanggan memesan lalu tidak datang tanpa kabar, sehingga slot terbuang dan staf menganggur.
Sistem yang baik tidak sekadar memindahkan buku jadwal ke layar. Ia memaksa aturan bisnis berjalan otomatis: durasi layanan, jam operasional, ketersediaan staf, dan kebijakan uang muka.
Modul Inti dan Alur Datanya
Hampir semua sistem booking jasa terdiri dari enam modul berikut.
1. Manajemen jadwal dan ketersediaan
Ini jantung sistem. Kalender harus menampilkan slot kosong secara real-time dan menolak pesanan yang bertabrakan. Slot dihitung dari jam operasional dikurangi jadwal yang sudah terisi, dengan memperhitungkan durasi layanan. Potong rambut 30 menit dan creambath 90 menit tidak boleh diperlakukan sama.
2. Manajemen staf dan layanan
Bisnis jasa sering punya beberapa staf dengan keahlian berbeda. Pelanggan sebaiknya bisa memilih staf favorit, dan sistem otomatis hanya menampilkan slot milik staf tersebut. Relasi staf-layanan menentukan siapa bisa mengerjakan apa.
3. Notifikasi otomatis
Konfirmasi langsung setelah booking, lalu pengingat menjelang jadwal lewat email atau WhatsApp, lengkap dengan tautan untuk menjadwal ulang. Pengingat adalah cara paling murah untuk menekan no-show.
4. Pembayaran dan uang muka
Meminta DP saat booking menyaring pemesan yang tidak serius dan melindungi pendapatan saat ada pembatalan mendadak. Jika Anda ingin menghubungkannya ke payment gateway, pelajari polanya di integrasi payment gateway Midtrans di Laravel.
5. Dashboard dan laporan
Pemilik perlu angka: jumlah booking per hari, jam tersibuk, layanan terpopuler, dan tingkat no-show. Data ini dipakai untuk menyusun shift staf dan merancang promo di jam sepi.
6. Halaman pemesanan untuk pelanggan
Semakin sedikit langkah, semakin banyak booking yang selesai. Alur ideal: pilih layanan, pilih staf (opsional), pilih slot, isi nama dan nomor, bayar DP. Tampilan harus nyaman di ponsel karena sebagian besar pelanggan memesan dari sana.
Alur datanya kira-kira begini: pelanggan memilih layanan dan slot, sistem mengunci slot sementara, pelanggan membayar DP, status booking berubah dari pending menjadi confirmed, lalu job terjadwal mengirim pengingat. Jika DP tidak dibayar dalam batas waktu, slot dilepas kembali.
Rekomendasi Desain Tabel
Berikut skema minimal yang cukup untuk satu lokasi usaha dengan banyak staf. Kalau Anda belum terbiasa membuat relasi tabel, baca dulu merancang ERD sederhana untuk aplikasi.
| Tabel | Kolom penting | Fungsi |
|---|---|---|
| services | name, duration_minutes, price, deposit_amount | Daftar layanan dan durasinya |
| staff | name, phone, is_active | Data staf yang bisa dipesan |
| service_staff | service_id, staff_id | Siapa bisa mengerjakan layanan apa |
| working_hours | staff_id, weekday, start_time, end_time | Jam kerja per staf per hari |
| bookings | customer_name, phone, service_id, staff_id, starts_at, ends_at, status | Jadwal yang sudah dipesan |
| payments | booking_id, amount, method, paid_at | Catatan DP dan pelunasan |
Kolom ends_at sengaja disimpan, bukan dihitung ulang setiap kali, agar pengecekan bentrok cukup dengan satu query. Logika anti double-booking di Laravel 11 bisa ditulis seperti ini:
use App\Models\Booking;
use Illuminate\Support\Facades\DB;
public function store(StoreBookingRequest $request)
{
$data = $request->validated();
return DB::transaction(function () use ($data) {
// Kunci baris jadwal staf ini agar dua request tidak lolos bersamaan
$bentrok = Booking::where('staff_id', $data['staff_id'])
->whereIn('status', ['pending', 'confirmed'])
->where('starts_at', '<', $data['ends_at'])
->where('ends_at', '>', $data['starts_at'])
->lockForUpdate()
->exists();
if ($bentrok) {
abort(409, 'Slot ini baru saja dipesan orang lain.');
}
return Booking::create($data + ['status' => 'pending']);
});
}
Kenapa kondisinya starts_at < ends_at baru dan ends_at > starts_at baru? Karena dua rentang waktu dianggap bertabrakan bila masing-masing dimulai sebelum yang lain selesai. Rumus ini menangkap semua kasus tumpang tindih, termasuk jadwal yang menempel persis di tengah. lockForUpdate() di dalam transaksi mencegah dua pelanggan yang menekan tombol pada detik yang sama sama-sama lolos.
Menjalankan Source Code di Komputer Lokal
Langkah umumnya hampir sama untuk source code Laravel mana pun:
- Pastikan PHP 8.2+, Composer, dan MySQL terpasang. Panduan lengkapnya ada di setup environment PHP, Composer, dan MySQL.
- Ekstrak source code, lalu jalankan
composer installdi folder proyek. - Salin
.env.examplemenjadi.env, isi koneksi database, lalu jalankanphp artisan key:generate. - Jalankan
php artisan migrate --seeduntuk membuat tabel dan data contoh. - Jalankan
php artisan servedan coba alur booking dari sisi pelanggan dan sisi admin. - Untuk pengingat otomatis, aktifkan scheduler dengan
php artisan schedule:worksaat lokal, atau cron* * * * * php artisan schedule:rundi server.
Kustomisasi yang Aman
Hampir setiap bisnis jasa akan mengubah sesuatu: menambah field alamat untuk layanan panggilan, mengganti teks notifikasi, atau mengubah aturan DP. Prinsip utamanya:
- Buat migration baru untuk kolom tambahan, jangan mengedit migration lama yang sudah dijalankan.
- Simpan aturan bisnis (persentase DP, batas waktu bayar, jeda antar-jadwal) di tabel setting atau file config, bukan ditulis langsung di controller.
- Gunakan Git sejak hari pertama agar setiap perubahan bisa dibandingkan dan dibatalkan.
Teknik lebih rinci dibahas di cara kustomisasi source code tanpa merusak.
Checklist Sebelum Membeli Source Code Booking
- Ada pengecekan bentrok di sisi server, bukan hanya slot yang disembunyikan di tampilan.
- Durasi layanan dan jam operasional bisa diatur tanpa mengedit kode.
- Mendukung banyak layanan dan banyak staf.
- Notifikasi konfirmasi dan pengingat bisa dijadwalkan.
- Status booking jelas: pending, confirmed, cancelled, completed, no-show.
- Struktur kode mengikuti konvensi Laravel dan ada file README cara instalasi.
- Ada demo yang bisa Anda coba dari ponsel.
- Jelas versi Laravel dan PHP yang dipakai.
Kesalahan Umum dan Cara Memperbaikinya
| Kesalahan | Akibat | Perbaikan |
|---|---|---|
| Kalender tidak sinkron dengan jadwal offline | Double-booking | Semua pesanan via telepon juga diinput ke sistem yang sama |
| Tidak ada pengingat | No-show tinggi | Kirim pengingat H-1 dan beberapa jam sebelum jadwal |
| Formulir terlalu panjang | Pelanggan batal di tengah | Minta data minimum: nama, nomor, slot |
| Zona waktu server salah | Jadwal bergeser beberapa jam | Atur APP_TIMEZONE sesuai lokasi usaha |
Keterbatasan yang Perlu Disadari
Source code booking siap pakai biasanya dirancang untuk kasus umum. Kebutuhan seperti banyak cabang dengan stok ruangan, paket langganan berulang, atau sinkronisasi dua arah dengan Google Calendar sering kali belum ada dan perlu dikembangkan sendiri. Anda juga tetap bertanggung jawab atas hosting, backup database, dan pembaruan keamanan. Sebagai contoh perhitungan kasar, bila admin Anda menghabiskan sekitar dua jam sehari untuk konfirmasi jadwal, angka itulah yang bisa dibandingkan dengan biaya kustomisasi dan hosting untuk menilai apakah sistem ini layak.
Bila Anda ingin melihat contoh implementasi berbasis Laravel, katalog di GudangCode bisa menjadi titik awal untuk membandingkan struktur kodenya dengan checklist di atas.