# La tua prima prenotazione

# La prima prenotazione

Come prenota un cliente un posto su un evento: dal widget alla conferma.

## 1. Apri il widget

Il cliente raggiunge il widget in due modi:

- **Embedded** nel sito dell'azienda tramite lo snippet generato, oppure
- **Direttamente** su `/widget/calendar` (l'URL caricato dall'iframe dello snippet).

Il widget elenca gli eventi pubblicati imminenti dell'azienda dentro la loro finestra di prenotazione. (Nell'app staff, il link **Prenotazioni** in nav apre il gestore prenotazioni — non il widget.)

## 2. Scegli un evento

Ogni evento mostra data e disponibilità. Il conteggio esatto dei posti rimasti appare solo quando la disponibilità scende a `show_bookable_threshold` o sotto. Gli eventi sold-out offrono la **waitlist** se l'evento ha `waitlist_enabled`.

## 3. Scegli posti / orario

Dipende dal `booking_mode` dell'evento:

- **Fasce fisse** — scegli un posto in un'area, poi uno slot orario (capacità `seat_time`).
- **Flexible window** — scegli numero di persone e finestra oraria. Se l'evento ha posti, il cliente sceglie anche un posto (nessuno slot orario fisso); senza posti la finestra si prenota sull'evento stesso.

Se il prenotabile espone più righe di prezzo (es. `adult`, `child`), il cliente imposta una quantità per prezzo; il totale persone deve coincidere con la somma delle quantità per prezzo.

## 4. Conferma e paga

- **Prenotazioni gratuite** (totale `0`) saltano il pagamento e si confermano subito — stato `Free`.
- **Codici promo** — il campo "Ho un codice promo" parcheggia la prenotazione in `PromoPending` per la revisione staff invece di addebitare la carta. I codici approvati confermano la prenotazione (copertura piena) o inviano al cliente un link per pagare il restante; quelli rifiutati ricadono su annullamento o pagamento pieno, a scelta dello staff.
- **Prenotazioni a pagamento** vanno a Stripe Checkout sull'account connesso dell'azienda. Un hold di capacità (`booking.hold_minutes`, default 30 min) riserva il posto durante il pagamento; `booking.max_hold_lifetime_minutes` (default 90 min) è il limite massimo dell'intero flusso.
- Lo sweeper `bookings:expire-holds` (ogni 5 min) scade gli hold decaduti — e consolida le sessioni Checkout che Stripe ha già incassato, così un pagamento lento si conferma comunque invece di perdersi.

## 5. Fine

La pagina finale (`/booking/{booking}/{outcome}/finish`) mostra il codice prenotazione e il download `.ics` per il calendario. Le email di promemoria partono 24 h e 1 h prima dell'inizio evento (`bookings:send-reminders`, ogni ora).

> Evento pieno? Con `waitlist_enabled` attivo i clienti entrano in coda e ricevono un link di offerta quando si libera un posto.


---
> Source: https://placeful-app.com/docs/getting-started/first-booking
