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.