← Tutte le idee Attività locali e immobiliare

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.