← Tutte le idee Attività locali e immobiliare

The Booking Co

Una piattaforma di prenotazioni online per qualsiasi piccola attività

Incasso mensile: 3641 USD (fonte indicata nella scheda)

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.