← Tutte le idee Attività locali e immobiliare

The Booking Co

Una piattaforma di prenotazioni online per qualsiasi piccola attività

Cosa fa

Software di prenotazione online pensato per tutte le piccole attività che lavorano su appuntamento.

Come guadagna

Il progetto è stato messo in vendita su SideProjectors a oltre 1.000 $. Come guadagna non è indicato pubblicamente.

Rendilo tuo

  • Scegli un settore: le prenotazioni generiche ci sono già, quelle su misura per le officine no.
  • Caparra online per ridurre chi non si presenta.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Agenda Aperta": prenotazioni online per piccole attività su appuntamento (personal trainer, tatuatori, fotografi, insegnanti privati), con caparra online per ridurre chi non si presenta. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con vantaggi, esempio e prezzi
2. Registrazione e configurazione: orari settimanali, servizi, caparra
3. Pagina pubblica di prenotazione /:slug
4. Agenda del professionista
5. Regole su caparre, annullamenti e assenze

Stile: moderno e amichevole: sfondo bianco, indaco #4F46E5, menta #10B981, carattere "Inter", orari liberi come pillole da toccare. Nessuna immagine generica di stock.

Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.

2. Database, account e sicurezza

Collega il progetto a Supabase e attiva la registrazione con email e password.

Crea queste tabelle:
- "orari": giorni della settimana con fasce orarie di lavoro, collegati al professionista
- "chiusure": giorni o fasce non disponibili
- "servizi": nome, durata, prezzo, caparra
- "prenotazioni": servizio, cliente, inizio, fine, caparra pagata, stato

Regole di sicurezza obbligatorie:
- pagina e servizi pubblici
- il cliente non vede le prenotazioni degli altri, solo gli orari liberi
- una prenotazione con caparra è confermata solo dopo il pagamento

Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.

3. Orari liberi calcolati dal database

Il professionista imposta gli orari settimanali (es. lunedì 9–13 e 15–19), le chiusure e i servizi con durata, prezzo e caparra facoltativa.

Gli orari liberi si calcolano nel database con una funzione (codice nei Dettagli tecnici): genera gli slot di un giorno in base agli orari e alla durata del servizio e toglie quelli che si sovrappongono a prenotazioni o chiusure. Il cliente vede solo gli slot liberi, mai i nomi degli altri.

Se il servizio ha una caparra, la prenotazione resta "in attesa" 15 minuti mentre il cliente paga; dopo il pagamento diventa "confermata".

4. Annullamenti e assenze

Regole scelte dal professionista: annullamento gratuito fino a 24 o 48 ore prima (con rimborso automatico della caparra), dopo la caparra resta al professionista. Il cliente annulla da un link nell'email di conferma.

Agenda con le prenotazioni, segno "presente/assente", e statistica delle assenze prima e dopo l'introduzione della caparra.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 15 € al mese. Gratis l'utente ha: 20 prenotazioni al mese e niente caparre online. Con il piano Pro sblocca: prenotazioni illimitate, caparre, promemoria e statistiche.

A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.

Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.

6. Controlli specifici di questo progetto

Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Orari: imposta una chiusura e una pausa pranzo e controlla che quegli orari non compaiano mai tra quelli liberi, anche cambiando servizio.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Slot liberi di un giorno

Genera gli orari possibili con generate_series a partire dagli orari di lavoro, e toglie quelli occupati da prenotazioni o chiusure.

create table orari (
  utente_id uuid not null references auth.users(id) on delete cascade,
  giorno_settimana int not null check (giorno_settimana between 1 and 7),   -- 1 = lunedì
  dalle time not null,
  alle time not null,
  check (alle > dalle)
);

create table prenotazioni (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  servizio_id uuid not null,
  cliente_nome text not null,
  cliente_email text not null,
  periodo tstzrange not null,
  stato text not null default 'in_attesa' check (stato in ('in_attesa', 'confermata', 'annullata')),
  creata_il timestamptz not null default now()
);

create table chiusure (
  utente_id uuid not null references auth.users(id) on delete cascade,
  periodo tstzrange not null
);

create function slot_liberi(professionista uuid, giorno date, durata_minuti int)
returns table (inizio timestamptz)
language sql stable security definer set search_path = public as $
  select s
  from orari o,
       generate_series(
         (giorno + o.dalle) at time zone 'Europe/Rome',
         (giorno + o.alle) at time zone 'Europe/Rome' - make_interval(mins => durata_minuti),
         interval '15 minutes'
       ) as s
  where o.utente_id = professionista
    and o.giorno_settimana = extract(isodow from giorno)
    and s > now()
    and not exists (
      select 1 from prenotazioni p
      where p.utente_id = professionista
        and (p.stato = 'confermata' or (p.stato = 'in_attesa' and p.creata_il > now() - interval '15 minutes'))
        and p.periodo && tstzrange(s, s + make_interval(mins => durata_minuti)))
    and not exists (
      select 1 from chiusure c
      where c.utente_id = professionista
        and c.periodo && tstzrange(s, s + make_interval(mins => durata_minuti)))
  order by s;
$;
grant execute on function slot_liberi(uuid, date, int) to anon, authenticated;

Pezzi comuni a tutti i progetti

Glossario

Slug
La parte finale e leggibile dell'indirizzo di una pagina, es. /pizzeria-da-mario.
Caparra
Una piccola somma pagata in anticipo per confermare l'appuntamento: riduce chi prenota e non si presenta.