Car Dealer Tracker
Il gestionale per chi compra e vende auto, dal telefono
Incasso mensile: 950 USD (fonte indicata nella scheda)
Cosa fa
App per concessionari e rivenditori di auto usate: veicoli in vendita, spese, vendite, clienti e accessi per il team.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Per i piccoli rivenditori italiani: margine per auto, passaggi di proprietà, garanzie.
- Pubblicazione automatica degli annunci sui portali.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Salone Auto": un gestionale semplice per piccoli rivenditori di auto usate: veicoli in stock, spese per ognuno, vendite, margini e clienti, con accesso per i collaboratori. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con le funzioni e prezzi
2. Registrazione e creazione del salone
3. Veicoli: elenco con foto, stato e giorni in stock
4. Scheda del veicolo: dati, spese, documenti, vendita
5. Statistiche: margini, tempi di vendita, spese per categoria
Stile: concreto e professionale: sfondo grigio chiaro #F3F4F6, blu acciaio #1E3A5F, verde #16A34A per i margini positivi, rosso #DC2626 per quelli negativi, carattere "Inter", tabelle leggibili anche su tablet. 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:
- "saloni" e "membri": il salone e chi ci lavora (titolare, venditore)
- "veicoli": marca, modello, anno, km, targa, telaio, prezzo d'acquisto, prezzo di vendita esposto, stato (in arrivo, in vendita, venduto), foto
- "spese": categoria (carrozzeria, meccanica, pulizia, passaggio), importo, data
- "vendite": cliente, prezzo finale, data
Regole di sicurezza obbligatorie:
- ogni salone vede solo i suoi dati
- i venditori vedono i veicoli ma non i prezzi d'acquisto e i margini: solo il titolare
- 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. Veicoli, spese e margini
Crea l'elenco dei veicoli con foto, marca e modello, prezzo esposto, stato e "giorni in stock" (in rosso oltre 60). Filtri per stato, marca e alimentazione.
La scheda del veicolo raccoglie dati, foto, documenti (libretto, perizia) nello Storage, e le spese aggiunte nel tempo. Il margine si calcola da solo: prezzo di vendita meno acquisto e spese (vista nei Dettagli tecnici).
I venditori vedono veicoli e prezzi esposti, ma non prezzi d'acquisto, spese e margini: questa regola la applica il database, non solo l'interfaccia.
4. Statistiche del salone
Pagina statistiche solo per il titolare: margine totale e medio del mese, tempo medio di vendita, veicoli fermi da più di 60 giorni con il capitale bloccato, spese per categoria.
Elenco clienti con i veicoli comprati e i contatti, ed esportazione delle vendite in CSV per il commercialista.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 29 € al mese. Gratis l'utente ha: 20 veicoli e un solo utente. Con il piano Pro sblocca: veicoli illimitati, collaboratori, documenti, statistiche ed esportazione.
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. Permessi: entra come venditore e prova a leggere il prezzo d'acquisto di un veicolo chiamando direttamente il database: deve essere bloccato.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Salone, ruoli e margini protetti
I dati riservati (acquisto e spese) stanno in tabelle che solo il titolare può leggere; il margine si calcola in una vista.
create table saloni (
id uuid primary key default gen_random_uuid(),
nome text not null
);
create table membri (
salone_id uuid not null references saloni(id) on delete cascade,
utente_id uuid not null references auth.users(id) on delete cascade,
ruolo text not null check (ruolo in ('titolare', 'venditore')),
primary key (salone_id, utente_id)
);
create function mio_ruolo(salone uuid) returns text
language sql stable security definer set search_path = public as $
select ruolo from membri where salone_id = salone and utente_id = auth.uid();
$;
create table veicoli (
id uuid primary key default gen_random_uuid(),
salone_id uuid not null references saloni(id) on delete cascade,
marca text not null, modello text not null, anno int, km int,
targa text, telaio text,
prezzo_esposto int,
stato text not null default 'in_vendita' check (stato in ('in_arrivo', 'in_vendita', 'venduto')),
arrivato_il date not null default current_date
);
-- Dati riservati al titolare
create table acquisti (
veicolo_id uuid primary key references veicoli(id) on delete cascade,
salone_id uuid not null references saloni(id) on delete cascade,
prezzo_acquisto int not null
);
create table spese (
id uuid primary key default gen_random_uuid(),
veicolo_id uuid not null references veicoli(id) on delete cascade,
salone_id uuid not null references saloni(id) on delete cascade,
categoria text not null,
importo int not null
);
create table vendite (
veicolo_id uuid primary key references veicoli(id) on delete cascade,
salone_id uuid not null references saloni(id) on delete cascade,
cliente text not null,
prezzo_finale int not null,
venduto_il date not null default current_date
);
alter table veicoli enable row level security;
alter table acquisti enable row level security;
alter table spese enable row level security;
alter table vendite enable row level security;
create policy "tutto il salone" on veicoli for all
using (mio_ruolo(salone_id) is not null) with check (mio_ruolo(salone_id) is not null);
create policy "solo titolare" on acquisti for all
using (mio_ruolo(salone_id) = 'titolare') with check (mio_ruolo(salone_id) = 'titolare');
create policy "solo titolare" on spese for all
using (mio_ruolo(salone_id) = 'titolare') with check (mio_ruolo(salone_id) = 'titolare');
create policy "vendite del salone" on vendite for all
using (mio_ruolo(salone_id) is not null) with check (mio_ruolo(salone_id) is not null);
-- Margine per veicolo (rispetta le regole: un venditore non vede righe)
create view margini with (security_invoker = true) as
select v.id, v.marca, v.modello, a.prezzo_acquisto,
coalesce(sum(s.importo), 0) as spese,
ve.prezzo_finale,
ve.prezzo_finale - a.prezzo_acquisto - coalesce(sum(s.importo), 0) as margine,
ve.venduto_il - v.arrivato_il as giorni_per_vendere
from veicoli v
join acquisti a on a.veicolo_id = v.id
left join spese s on s.veicolo_id = v.id
left join vendite ve on ve.veicolo_id = v.id
group by v.id, a.prezzo_acquisto, ve.prezzo_finale, ve.venduto_il;
Pezzi comuni a tutti i progetti
Glossario
- 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.
- Ruoli
- Livelli di accesso diversi per persone diverse dello stesso team: il titolare vede tutto, il venditore solo una parte.