← Tutte le idee Gestionali per aziende

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.