Sistema prenotazioni tavoli: setup + booking online
Configura tavoli, orari, servizi (pranzo/cena/brunch), modalità INSTANT/REQUEST/HYBRID. Stripe deposit + no-show fee. SMS reminder 24h.
12 min lettura
Sprint 102-104 (v1.4.0) ha lanciato il sistema prenotazioni tavoli competitivo con OpenTable/Resy/Anolla. Configurabile per ogni ristorante.
- Apertura (es. 12:00)
- Chiusura (es. 23:00)
- Checkbox "Chiuso" se giorno di chiusura
Tab 2 — Servizi prenotabili
- Tipo (LUNCH/DINNER/BRUNCH/APERITIVO/TASTING)
- Giorno settimana (es. solo Ven+Sab+Dom per cena gourmet)
- Apertura/Chiusura (es. 19:30-22:30)
- Slot booking (15/30/60 min — quanto distanti gli slot)
- Durata coperta (default 120min — quanto rimane occupato il tavolo)
- Capacity max (totale coperti simultanei)
- Modalità booking:
- 🟢 INSTANT: conferma immediata via email (massima conversion)
- 🟡 REQUEST: cliente invia richiesta, tu approvi entro 24h
- 🔵 HYBRID: instant weekday, request weekend
Tab 3 — Tavoli
- Numero (es. "1", "A1", "Window-3")
- Min/Max coperti
- Forma (ROUND/SQUARE/RECTANGULAR/BAR_STOOL)
- Sezione opzionale (Sala A, Dehors, Privé)
Come funziona il booking pubblico
- Step 1: sceglie data + numero coperti (1-50)
- Step 2: vede slot disponibili calcolati realtime (capacity meno reservations attive)
- Slot raggruppati per servizio (Pranzo/Cena/Brunch)
- Click su orario → seleziona
- Step 3: compila guest info (nome, email obbligatori; telefono consigliato per SMS reminder)
- Note (allergie, preferenze tavolo)
- Occasione (anniversario, compleanno, cena lavoro)
- Highchair toggle per bambini
- Submit → riceve codice booking VINBK-XXXX + email conferma immediata (se INSTANT)
Admin flow
- Lista prenotazioni con filtri date/status/restaurant
- Status: PENDING → CONFIRMED → SEATED → COMPLETED (o CANCELLED / NO_SHOW)
- Azioni: confirm (per REQUEST) · seat (assign table) · complete · cancel · mark no-show
Stripe deposit (anti no-show)
Servizio: Cena del weekend Deposito: €25/persona Refundable: 24h prima Charge: PaymentIntent EUR automatic_payment_methods
Quando cliente prenota servizio con deposito > 0:
1. Booking creato in status PENDING + paymentStatus=PENDING
2. Email con link Stripe checkout
3. Cliente paga → webhook conferma → status=CONFIRMED
4. Refund automatico se cancellazione entro refundableUntil
## Dynamic deposit (Sprint 107 v1.4.5)
Regole avanzate peak hours:
Rule "Weekend night €30"
- Days: Ven+Sab
- Time: 20:00-22:00
- Min party: 4
- Days before max: 7
- Deposit: €30/persona
- Priority: 10
Calcolato realtime quando cliente seleziona slot. Rule più specifica (priority alta) vince.
## SMS reminder 24h (Sprint 104)
Cron `/api/cron/booking-reminder` ogni 2h:
- Scan CONFIRMED reservations 22-26h da ora
- Invia email + SMS Skebby (se telefono presente)
- Marca `reminderSentAt` (no doppio invio)
## No-show auto-mark (Sprint 104)
Cron `/api/cron/booking-noshow-mark` ogni 15min:
- Scan CONFIRMED >30min in ritardo + arrivedAt null
- Marca status=NO_SHOW + addebita `noShowFee` da depositRequired
- Increment `Guest.totalNoShows` per blacklist auto (Sprint 105)
## Best practices
- ✅ **Cutoff 60-90min**: minimo tempo prima dello slot prenotabile (evita last-minute walk-in equivocate)
- ✅ **Advance days 60-90**: prenotazioni max 2-3 mesi avanti (evita slot stale)
- ✅ **Deposito peak only**: €15-25 cena weekend, gratis pranzo lavorativo
- ✅ **Refundable 24h**: standard industria
- ✅ **Reminder SMS**: +40% reduce no-show vs solo email
- ✅ **Multiple servizi/giorno**: separa pranzo (12:30-14:30) e cena (19:30-22:30) per stats accurate
## Roadmap booking
- **Sprint 105** (v1.4.1): Guest CRM 360° auto-popolato da bookings
- **Sprint 106** (v1.4.2): Smart waitlist quando slot pieno
- **Sprint 107** (v1.4.5): AI seating + dynamic deposit pricing
- **Sprint 109** (v1.5.0): Custom domain Enterprise (`prenota.osteriadelvino.com`)
- **Sprint 111+**: WhatsApp Business API booking · Loyalty program · Online ordering integrationVedi anche
- Crea landing page personalizzata del tuo ristorante— 10 min lettura
- Guest CRM 360°: profili clienti, preferenze, birthday triggers— 8 min lettura