followup-win
Non perdere più un preventivo per non aver richiamato il cliente
Cosa fa
CRM semplice per gestire preventivi, opportunità di vendita e i solleciti da fare.
Come guadagna
Il progetto è stato messo in vendita su SideProjectors a circa 580 $. Come guadagna non è indicato pubblicamente.
Rendilo tuo
- Per artigiani italiani: idraulici, elettricisti, imprese edili che mandano tanti preventivi.
- Promemoria su WhatsApp: "oggi richiama il signor Rossi".
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Preventivo Chiuso": aiuta artigiani, agenzie e professionisti a non perdere i preventivi inviati: elenco a colonne, promemoria dei solleciti, messaggi pronti e valore delle trattative in corso. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con il problema ("il 40% dei preventivi non viene mai sollecitato") e il prezzo
2. Registrazione e accesso
3. Bacheca a colonne: da inviare, inviato, in trattativa, vinto, perso
4. Scheda del preventivo: cliente, importo, probabilità, cronologia dei contatti
5. Oggi: i solleciti da fare con i messaggi pronti
Stile: concreto e motivante: sfondo bianco, blu #2563EB, verde #16A34A per i vinti, grigio per i persi, carattere "Inter", card trascinabili con l'importo in evidenza. 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:
- "preventivi": cliente, descrizione, importo, probabilità, stato, data di invio, prossimo sollecito, motivo se perso
- "contatti": tipo (chiamata, email, WhatsApp, incontro), nota, data, collegati al preventivo
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi preventivi e contatti
- il piano non si modifica dal browser
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. Solleciti al momento giusto
Quando un preventivo passa a "inviato", il sito propone il primo sollecito dopo 3 giorni, il secondo dopo 7 e l'ultimo dopo 14 (date modificabili). La pagina "Oggi" mostra i solleciti in scadenza (query nei Dettagli tecnici) con un messaggio già pronto, cortese e breve, da copiare o aprire direttamente in WhatsApp o nell'email.
Ogni contatto si segna con un tocco (chiamata, email, WhatsApp) e sposta il sollecito successivo. Quando si segna "perso", il sito chiede il motivo (prezzo, tempi, scelto un altro, nessuna risposta).
4. Valore delle trattative
Pannello: valore totale dei preventivi aperti, valore "pesato" (importo × probabilità), percentuale di preventivi vinti, tempo medio per chiudere, e i motivi più frequenti di perdita.
Importazione dei preventivi da Excel/CSV e promemoria giornaliero via email alle 8:30 con i solleciti del giorno.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 9 € al mese. Gratis l'utente ha: 10 preventivi aperti. Con il piano Pro sblocca: preventivi illimitati, promemoria email, statistiche e importazione.
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. Promemoria: crea un preventivo inviato 3 giorni fa e controlla che compaia in "Oggi" e nell'email delle 8:30.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Solleciti di oggi e valore pesato
I preventivi con il prossimo sollecito, la lista di quelli da fare oggi e il valore delle trattative aperte pesato per probabilità.
create table preventivi (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
cliente text not null,
telefono text,
descrizione text not null,
importo_centesimi int not null,
probabilita int not null default 50 check (probabilita between 0 and 100),
stato text not null default 'da_inviare'
check (stato in ('da_inviare', 'inviato', 'trattativa', 'vinto', 'perso')),
inviato_il date,
prossimo_sollecito date,
motivo_perso text
);
alter table preventivi enable row level security;
create policy "le mie righe" on preventivi
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
-- Quando passa a "inviato", il primo sollecito è tra 3 giorni
create function primo_sollecito() returns trigger language plpgsql as $
begin
if new.stato = 'inviato' and old.stato is distinct from 'inviato' then
new.inviato_il := current_date;
new.prossimo_sollecito := current_date + 3;
end if;
return new;
end $;
create trigger preventivo_inviato before update on preventivi
for each row execute function primo_sollecito();
-- Da sollecitare oggi
select id, cliente, telefono, importo_centesimi / 100.0 as euro, current_date - inviato_il as giorni
from preventivi
where utente_id = auth.uid() and stato in ('inviato', 'trattativa') and prossimo_sollecito <= current_date
order by importo_centesimi desc;
-- Valore delle trattative aperte
select sum(importo_centesimi) / 100.0 as totale,
sum(importo_centesimi * probabilita / 100) / 100.0 as pesato
from preventivi
where utente_id = auth.uid() and stato in ('inviato', 'trattativa');
Pezzi comuni a tutti i progetti
Glossario
- Cron
- Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
- CSV
- Un file di testo con i dati separati da virgole, che si apre con Excel.
- Pipeline
- L'insieme delle trattative in corso, divise per fase, dalla prima offerta alla firma.