Bot WA untuk Reservasi & Booking

Cara buat bot WhatsApp untuk reservasi dan booking. Restoran, salon, klinik, hotel. Terima booking 24/7 otomatis!

Bot WA untuk Reservasi
Bot WA untuk Reservasi

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 class

Alur 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 cancel

Booking 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 booking

DON'T ❌

- Double booking (overbooking)
- Tidak ada konfirmasi
- Susah untuk reschedule
- Tidak ada reminder
- Manual update availability

FAQ

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 BookingBot Reservasi
Admin harus standbyOtomatis 24/7
Human errorConsistent
Slow responseInstant
Limited hoursAnytime

Let customers book anytime, anywhere!

Setup Bot Reservasi →


Artikel Terkait