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.
