← Tutte le idee Attività locali e immobiliare

Calendesk

Prenotazioni, pagamenti e clienti per terapeuti e professionisti

Incasso mensile: 21.000 USD (fonte indicata nella scheda)

Cosa fa

Software per terapeuti, psicologi e attività di servizi: prenotazioni online, pagamenti, pacchetti di sedute e rapporto con i clienti.

Come guadagna

Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.

Rendilo tuo

  • Per fisioterapisti, osteopati e nutrizionisti italiani.
  • Attenzione ai dati sanitari: privacy e conservazione vanno fatte bene.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Agenda Cura": gestisce prenotazioni online, pacchetti di sedute, pagamenti e schede clienti per fisioterapisti, osteopati, nutrizionisti e psicologi. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale per i professionisti, con vantaggi e prezzi
2. Registrazione e configurazione: servizi, orari, studio
3. Pagina pubblica di prenotazione /:slug
4. Calendario del professionista
5. Schede dei pazienti e pacchetti di sedute

Stile: calmo e professionale: sfondo bianco, verde salvia #5F8D7A, blu tenue #3B5B7A, carattere "Nunito Sans", molto spazio e niente colori aggressivi. 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:
- "servizi": nome, durata, prezzo, collegati al professionista
- "pazienti": nome, contatti, consenso privacy, collegati al professionista
- "pacchetti": numero di sedute comprate e usate per paziente
- "appuntamenti": paziente, servizio, inizio e fine, stato

Regole di sicurezza obbligatorie:
- ogni professionista vede solo i suoi pazienti, pacchetti e appuntamenti
- i pazienti prenotano solo orari liberi e non vedono i dati degli altri
- le note cliniche non vanno salvate in questa app: solo dati organizzativi

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. Prenotazione e pacchetti di sedute

Crea la pagina pubblica /:slug del professionista: foto, studio, servizi con durata e prezzo, poi scelta del giorno e dell'orario libero, nome, email, telefono e consenso al trattamento dei dati (obbligatorio).

Aggiungi i pacchetti di sedute: il professionista crea pacchetti (es. 5 sedute a 200 €, 10 sedute a 380 €) e il paziente li compra online. A ogni appuntamento completato si scala una seduta dal pacchetto (funzione nei Dettagli tecnici); quando ne resta una, il paziente riceve un'email per rinnovare.

Promemoria automatico 24 ore prima con il link per spostare o annullare.

4. Calendario e schede

Crea il calendario del professionista (giorno, settimana, mese) con gli appuntamenti colorati per servizio, blocchi per ferie e pause, e appuntamenti presi al telefono.

Scheda paziente con: contatti, storico degli appuntamenti, pacchetto attivo con sedute rimaste, pagamenti. Statistiche del mese: incasso, sedute, nuovi pazienti, tasso di appuntamenti annullati.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 25 € al mese. Gratis l'utente ha: un solo servizio e 20 appuntamenti al mese. Con il piano Pro sblocca: servizi e appuntamenti illimitati, pacchetti di sedute e pagamenti online dei pazienti.

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. Dati sanitari: verifica che non ci siano campi per diagnosi o note cliniche, e che la privacy spieghi chi tratta i dati dei pazienti.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Pacchetti di sedute

I pacchetti comprati dai pazienti e la funzione che scala una seduta in modo sicuro, anche se due persone ci provano insieme.

create table pacchetti (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,  -- il professionista
  paziente_id uuid not null,
  sedute_totali int not null check (sedute_totali > 0),
  sedute_usate int not null default 0,
  pagato boolean not null default false,
  check (sedute_usate <= sedute_totali)
);

alter table pacchetti enable row level security;
create policy "le mie righe" on pacchetti
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

-- Scala una seduta solo se ne restano: restituisce quante ne rimangono, o null
create function usa_seduta(pacchetto uuid) returns int
language plpgsql security definer set search_path = public as $
declare rimaste int;
begin
  update pacchetti
     set sedute_usate = sedute_usate + 1
   where id = pacchetto
     and utente_id = auth.uid()          -- solo il professionista del pacchetto
     and pagato
     and sedute_usate < sedute_totali
  returning sedute_totali - sedute_usate into rimaste;
  return rimaste;
end $;

Appuntamenti senza sovrapposizioni

Come per le prenotazioni dei negozi: il database impedisce due appuntamenti nello stesso orario.

create extension if not exists btree_gist;

create table appuntamenti (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  paziente_id uuid not null,
  servizio text not null,
  periodo tstzrange not null,
  stato text not null default 'confermato'
    check (stato in ('confermato', 'completato', 'annullato')),
  exclude using gist (utente_id with =, periodo with &&) where (stato = 'confermato')
);

alter table appuntamenti enable row level security;
create policy "le mie righe" on appuntamenti
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

Pezzi comuni a tutti i progetti

Glossario

Slug
La parte finale e leggibile dell'indirizzo di una pagina, es. /pizzeria-da-mario.