Bot WA untuk Reservasi & Booking
Cara buat bot WhatsApp untuk reservasi dan booking. Restoran, salon, klinik, hotel. Terima booking 24/7 otomatis!
Terima booking 24 jam tanpa admin standby!
Bot reservasi memungkinkan customer untuk booking kapan saja dan sistem otomatis mengatur semuanya.
Siapa yang Butuh Bot Reservasi?
🍽️ RESTORAN/CAFE
- Booking meja
- Pre-order makanan
- Private dining
💇 SALON/SPA
- Appointment potong rambut
- Treatment booking
- Pilih stylist/terapis
🏥 KLINIK/DOKTER
- Pendaftaran pasien
- Jadwal konsultasi
- Pilih dokter
🏨 HOTEL/PENGINAPAN
- Booking kamar
- Check-in online
- Request layanan
🚗 RENTAL
- Sewa kendaraan
- Pilih tanggal
- Antar-jemput
🎓 LES/KURSUS
- Daftar kelas
- Pilih jadwal
- Trial classAlur Booking via Bot
Customer: "Mau booking"
↓
Bot: "Pilih layanan apa?"
↓
Customer: "Potong rambut"
↓
Bot: "Pilih tanggal?"
↓
Customer: "Besok"
↓
Bot: "Jam berapa? (slot tersedia: 10:00, 13:00, 15:00)"
↓
Customer: "13:00"
↓
Bot: "Dengan stylist siapa?"
↓
Customer: "Kak Ani"
↓
Bot: "✅ BOOKING CONFIRMED!
Potong Rambut
📅 Besok, 13:00
👤 Stylist: Kak Ani
Datang 10 menit lebih awal ya!"Template Percakapan
Greeting & Menu:
🗓️ SISTEM BOOKING [NAMA BISNIS]
Hai Kak! Mau booking untuk layanan apa?
1️⃣ Potong Rambut
2️⃣ Hair Coloring
3️⃣ Treatment/Spa
4️⃣ Paket Lengkap
Ketik angka untuk pilih 😊Pilih Tanggal:
📅 PILIH TANGGAL
Mau booking untuk kapan?
Tanggal tersedia minggu ini:
- Senin, 17 Feb ✅
- Selasa, 18 Feb ✅
- Rabu, 19 Feb ❌ (full)
- Kamis, 20 Feb ✅
- Jumat, 21 Feb ✅
Ketik tanggal yang diinginkan
(format: 17 Feb atau besok)Pilih Waktu:
⏰ PILIH JAM
Slot tersedia untuk [TANGGAL]:
🟢 10:00 - Available
🟢 11:00 - Available
🔴 12:00 - Full
🟢 13:00 - Available
🟢 14:00 - Available
🔴 15:00 - Full
🟢 16:00 - Available
Ketik jam yang diinginkan (contoh: 13:00)Pilih Staff (Optional):
👤 PILIH STYLIST
Mau dengan siapa?
1️⃣ Kak Ani ⭐ (Senior, 5 tahun exp)
2️⃣ Kak Budi (3 tahun exp)
3️⃣ Kak Cici (2 tahun exp)
4️⃣ Siapa saja yang available
Ketik angka untuk pilih!Konfirmasi Booking:
✅ KONFIRMASI BOOKING
Mohon cek detail berikut:
📋 Layanan: Potong Rambut
📅 Tanggal: Senin, 17 Feb 2026
⏰ Jam: 13:00 WIB
👤 Stylist: Kak Ani
💰 Estimasi: Rp 75.000
📍 Lokasi: Salon XYZ, Jl. Sudirman No. 123
Sudah benar?
- Ketik YA untuk konfirmasi
- Ketik UBAH untuk ganti
- Ketik BATAL untuk cancelBooking Success:
🎉 BOOKING BERHASIL!
Booking ID: #BK-2026-0217-001
📋 Potong Rambut
📅 Senin, 17 Feb 2026, 13:00 WIB
👤 Stylist: Kak Ani
📍 Salon XYZ, Jl. Sudirman No. 123
📱 Simpan pesan ini sebagai bukti booking
⚠️ PENTING:
- Datang 10 menit lebih awal
- Konfirmasi kehadiran H-1
- Reschedule max H-1
Sampai jumpa! 💇✨Implementasi
Database Struktur:
javascript
// Slots database
const slots = {
'2026-02-17': {
'10:00': { available: true, staff: ['ani', 'budi'] },
'11:00': { available: true, staff: ['ani', 'cici'] },
'12:00': { available: false, staff: [] },
'13:00': { available: true, staff: ['ani', 'budi', 'cici'] },
// ...
}
};
// Bookings database
const bookings = [
{
id: 'BK-2026-0217-001',
customer: { phone: '628123456789', name: 'Customer A' },
service: 'Potong Rambut',
date: '2026-02-17',
time: '13:00',
staff: 'ani',
status: 'confirmed',
createdAt: '2026-02-15T10:00:00Z'
}
];Booking Flow Handler:
javascript
const bookingState = new Map();
client.on('message', async msg => {
const state = bookingState.get(msg.from) || { step: 'idle' };
// Start booking
if (msg.body.toLowerCase() === 'booking' || msg.body === '1') {
bookingState.set(msg.from, { step: 'select_service' });
await msg.reply(serviceMenuMessage);
return;
}
// Handle each step
switch (state.step) {
case 'select_service':
state.service = parseService(msg.body);
state.step = 'select_date';
bookingState.set(msg.from, state);
await msg.reply(await getAvailableDates());
break;
case 'select_date':
state.date = parseDate(msg.body);
state.step = 'select_time';
bookingState.set(msg.from, state);
await msg.reply(await getAvailableSlots(state.date));
break;
case 'select_time':
state.time = msg.body;
state.step = 'select_staff';
bookingState.set(msg.from, state);
await msg.reply(await getAvailableStaff(state.date, state.time));
break;
case 'select_staff':
state.staff = parseStaff(msg.body);
state.step = 'confirm';
bookingState.set(msg.from, state);
await msg.reply(getConfirmationMessage(state));
break;
case 'confirm':
if (msg.body.toUpperCase() === 'YA') {
const booking = await createBooking(msg.from, state);
await msg.reply(getSuccessMessage(booking));
bookingState.delete(msg.from);
} else if (msg.body.toUpperCase() === 'BATAL') {
await msg.reply('Booking dibatalkan.');
bookingState.delete(msg.from);
}
break;
}
});Check Availability:
javascript
async function getAvailableSlots(date) {
const daySlots = await db.slots.findOne({ date });
if (!daySlots) {
return 'Maaf, tanggal tersebut tidak tersedia. Pilih tanggal lain ya!';
}
let message = `⏰ SLOT TERSEDIA - ${formatDate(date)}:\n\n`;
for (const [time, slot] of Object.entries(daySlots.slots)) {
const status = slot.available ? '🟢' : '🔴';
const label = slot.available ? 'Available' : 'Full';
message += `${status} ${time} - ${label}\n`;
}
message += '\nKetik jam yang diinginkan (contoh: 13:00)';
return message;
}Create Booking:
javascript
async function createBooking(phone, bookingData) {
const bookingId = generateBookingId();
const booking = {
id: bookingId,
customer: { phone },
service: bookingData.service,
date: bookingData.date,
time: bookingData.time,
staff: bookingData.staff,
status: 'confirmed',
createdAt: new Date()
};
// Save to database
await db.bookings.insert(booking);
// Update slot availability
await db.slots.updateOne(
{ date: bookingData.date, [`slots.${bookingData.time}.available`]: true },
{ $set: { [`slots.${bookingData.time}.available`]: false } }
);
// Schedule reminder
await scheduleReminder(booking);
return booking;
}Fitur Tambahan
1. Reschedule
Customer: "Mau reschedule booking #BK-2026-0217-001"
Bot: "Booking ditemukan:
📋 Potong Rambut, 17 Feb 13:00
Mau pindah ke kapan?
Ketik tanggal dan jam baru
(contoh: 18 Feb 14:00)"2. Cancel
Customer: "Cancel booking #BK-2026-0217-001"
Bot: "⚠️ Yakin mau cancel booking?
📋 Potong Rambut, 17 Feb 13:00
Ketik YA untuk konfirmasi cancel
Ketik TIDAK untuk keep booking"3. Reminder Otomatis
// H-1 Reminder
"🔔 REMINDER BOOKING
Hai Kak! Jangan lupa besok:
📋 Potong Rambut
📅 Senin, 17 Feb 2026
⏰ 13:00 WIB
📍 Salon XYZ
Konfirmasi kehadiran:
- Ketik HADIR jika bisa datang
- Ketik RESCHEDULE untuk ubah jadwal
Sampai jumpa! 💇"Best Practices
DO ✅
- Real-time availability check
- Konfirmasi sebelum finalize
- Kirim reminder H-1
- Easy reschedule/cancel
- Booking ID untuk tracking
- Konfirmasi via WA after bookingDON'T ❌
- Double booking (overbooking)
- Tidak ada konfirmasi
- Susah untuk reschedule
- Tidak ada reminder
- Manual update availabilityFAQ
Bagaimana avoid double booking?
Lock slot saat user mulai booking flow. Gunakan database transaction untuk atomic operations.
Perlu deposit/payment?
Optional, tapi recommended untuk reduce no-show. Bisa integrasikan dengan payment gateway.
Kalau customer no-show?
Track history, bisa implement blacklist atau require deposit untuk repeat offenders.
Kesimpulan
Bot reservasi = Booking 24/7 tanpa admin!
| Manual Booking | Bot Reservasi |
|---|---|
| Admin harus standby | Otomatis 24/7 |
| Human error | Consistent |
| Slow response | Instant |
| Limited hours | Anytime |
Let customers book anytime, anywhere!