BeautyFlow
Il gestionale semplice per chi lavora da sola nel mondo della bellezza
Incasso mensile: 425 USD (fonte indicata nella scheda)
Cosa fa
Un CRM moderno pensato per professioniste indipendenti: unghie, sopracciglia, ciglia. Clienti, appuntamenti e storico in un posto solo.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Promemoria via WhatsApp alle clienti e richiesta di recensione.
- Galleria dei lavori fatti per ogni cliente, da mostrare su Instagram.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Agenda Bellezza": un gestionale semplice per estetiste, onicotecniche e lash maker che lavorano da sole: clienti, appuntamenti, scheda tecnica di ogni cliente e richiamo di chi non torna da un po'. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con le funzioni e il prezzo
2. Registrazione e servizi offerti (durata, prezzo, ogni quante settimane si rifà)
3. Agenda della settimana
4. Scheda cliente: contatti, storico, scheda tecnica (colori, forme, allergie), foto dei lavori
5. Clienti da richiamare
Stile: elegante e femminile ma pratico: sfondo bianco, rosa antico #BE7C8B, nude #E8D5C4, carattere "Jost", foto dei lavori in griglia. 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:
- "clienti": nome, telefono, allergie, note, consenso privacy, collegati all'utente
- "servizi": nome, durata, prezzo, ogni quante settimane si rifà
- "appuntamenti": cliente, servizio, inizio, fine, stato, prezzo, dettagli tecnici (colore, forma, lunghezza)
Regole di sicurezza obbligatorie:
- ogni professionista vede solo i suoi clienti e appuntamenti
- le foto dei lavori stanno in uno spazio privato e si usano sui social solo con il consenso della cliente
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. Agenda e scheda tecnica
Agenda settimanale con gli appuntamenti colorati per servizio, creazione rapida toccando uno spazio libero, e prenotazione online facoltativa con un link da mettere su Instagram.
La scheda cliente ha lo storico degli appuntamenti con la "scheda tecnica" di ognuno: colore usato (codice del prodotto), forma e lunghezza, curvatura delle ciglia, e foto del lavoro. Così al prossimo appuntamento basta un tocco su "Rifai uguale".
Le allergie compaiono in rosso in cima alla scheda e nell'appuntamento. Promemoria WhatsApp o SMS il giorno prima.
4. Clienti da richiamare e incassi
La pagina "Da richiamare" elenca le clienti che hanno superato il tempo normale tra un servizio e l'altro (es. refill ogni 3 settimane) senza un nuovo appuntamento (query nei Dettagli tecnici), con il pulsante per mandare un messaggio WhatsApp già scritto.
Incassi della settimana e del mese, servizi più richiesti, clienti più fedeli. Esportazione CSV.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 12 € al mese. Gratis l'utente ha: 30 clienti e niente promemoria. Con il piano Pro sblocca: clienti illimitati, promemoria, prenotazione online, richiami ed esportazioni.
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. Allergie: crea una cliente con un'allergia e controlla che compaia in rosso nell'agenda, nella scheda e nell'appuntamento.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Clienti da richiamare
Trova le clienti la cui ultima visita è più vecchia del tempo normale per quel servizio, e che non hanno appuntamenti futuri.
create table servizi (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
nome text not null,
durata_minuti int not null,
prezzo_centesimi int not null,
ripetere_ogni_settimane int -- es. 3 per il refill
);
create table clienti (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
nome text not null,
telefono text,
allergie text,
consenso_privacy_il timestamptz not null,
consenso_foto_social boolean not null default false
);
create table appuntamenti (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
cliente_id uuid not null references clienti(id) on delete cascade,
servizio_id uuid not null references servizi(id),
inizio timestamptz not null,
stato text not null default 'confermato' check (stato in ('confermato', 'fatto', 'annullato')),
scheda_tecnica jsonb not null default '{}'
);
alter table servizi enable row level security;
create policy "le mie righe" on servizi
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
alter table clienti enable row level security;
create policy "le mie righe" on clienti
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
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);
-- Da richiamare: ultima visita oltre il tempo normale e niente in agenda
select c.nome, c.telefono, s.nome as servizio, max(a.inizio)::date as ultima_visita
from appuntamenti a
join clienti c on c.id = a.cliente_id
join servizi s on s.id = a.servizio_id
where a.utente_id = auth.uid() and a.stato = 'fatto' and s.ripetere_ogni_settimane is not null
group by c.id, c.nome, c.telefono, s.id, s.nome, s.ripetere_ogni_settimane
having max(a.inizio) < now() - make_interval(weeks => s.ripetere_ogni_settimane + 1)
and not exists (select 1 from appuntamenti f
where f.cliente_id = c.id and f.inizio > now() and f.stato = 'confermato')
order by ultima_visita;Messaggio WhatsApp già scritto
Crea il link che apre WhatsApp con il messaggio pronto: l'estetista deve solo premere invio.
export function linkRichiamo(cliente: { nome: string; telefono: string }, servizio: string, attivita: string) {
const numero = cliente.telefono.replace(/\D/g, "").replace(/^(?!39)/, "39"); // prefisso Italia
const testo =
"Ciao " + cliente.nome.split(" ")[0] + "! Sono di " + attivita + ". " +
"È passato un po' dall'ultimo " + servizio + ": vuoi che ti tenga un posto questa settimana?";
return "https://wa.me/" + numero + "?text=" + encodeURIComponent(testo);
}
Pezzi comuni a tutti i progetti
Glossario
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- Storage
- Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.
- CSV
- Un file di testo con i dati separati da virgole, che si apre con Excel.