← Tutte le idee Negozi e community

Marketplace di profumi

Un mercato dove si comprano e vendono profumi, anche in piccole dosi

Incasso mensile: 75 USD (fonte indicata nella scheda)

Cosa fa

Un sito dove appassionati di profumi comprano e vendono flaconi interi e "decant", cioè piccole quantità travasate per provare un profumo.

Come guadagna

Incasso annuo dichiarato di circa 900 $ nell'annuncio di vendita su Microns, che verifica i dati. Il nome del progetto non è pubblico.

Rendilo tuo

  • Per gli appassionati italiani di profumeria artistica.
  • Lo stesso modello per altre passioni da collezione: vini, caffè specialty, tè.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Annusa e Scambia": una bacheca per appassionati di profumi dove vendere e scambiare tra privati flaconi interi, usati o nuovi, e piccole quantità per provarli, con recensioni dei venditori. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con gli annunci recenti, ricerca e marche
2. Elenco annunci con filtri: marca, famiglia olfattiva, formato, prezzo
3. Scheda dell'annuncio con foto, stato del flacone e contatto
4. Pubblica un annuncio
5. Profilo del venditore con recensioni

Stile: elegante e sensoriale: sfondo avorio #FAF7F2, nero #1C1917, oro rosa #B76E79, carattere "Playfair Display" per i titoli e "Inter" per i testi, foto dei flaconi su sfondo chiaro. 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:
- "annunci": marca, nome del profumo, formato (flacone pieno, usato con percentuale, campione), millilitri, prezzo, foto, città, stato (attivo, venduto), in evidenza fino a, collegati al venditore
- "recensioni": voto e commento di un acquirente sul venditore, collegate a un annuncio venduto

Regole di sicurezza obbligatorie:
- tutti vedono gli annunci attivi
- il venditore gestisce solo i suoi annunci
- si può recensire un venditore una sola volta per annuncio, e non se stessi
- l'evidenza la cambia solo il pagamento

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. Annunci e ricerca

Il venditore pubblica: marca e nome (con suggerimenti mentre scrive), formato, millilitri o percentuale rimasta, lotto, prezzo, foto (almeno 2, una con il flacone e la scatola). Ricerca per testo libero in italiano che trova anche parole parziali (codice nei Dettagli tecnici), più filtri.

Contatto tramite messaggi interni, senza mostrare email o telefono. Il pagamento avviene tra le parti: il sito consiglia metodi con protezione acquisti.

Regole visibili: solo profumi originali; i campioni travasati da privati sono scambi occasionali tra appassionati, con etichetta che riporta nome del profumo e lotto. Vietata la vendita di falsi: segnalazioni con un pulsante.

4. Recensioni ed evidenza

Quando un annuncio è segnato "venduto" a un utente, l'acquirente può lasciare una recensione al venditore (da 1 a 5 e commento). Il profilo mostra media, numero di vendite e recensioni.

Pagando, un annuncio sta "In evidenza" per 30 giorni in cima ai risultati, con l'etichetta. Pannello moderazione per le segnalazioni.

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di 2,99 € per 30 giorni in evidenza. Il pagamento mette l'annuncio in evidenza per 30 giorni.

A pagamento riuscito il webhook imposta "in_evidenza_fino" a la data di oggi più 30 giorni nella tabella "annunci", sulla riga del annuncio indicata in client_reference_id.

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. Recensioni: prova a recensire te stesso o due volte lo stesso annuncio: deve essere impossibile.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Annunci con ricerca e recensioni protette

Ricerca tollerante agli errori di battitura (pg_trgm) e recensioni possibili solo all'acquirente vero, una volta.

create extension if not exists pg_trgm;

create table annunci (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  marca text not null,
  profumo text not null,
  formato text not null check (formato in ('pieno', 'usato', 'campione')),
  ml numeric not null,
  prezzo_centesimi int not null,
  citta text,
  stato text not null default 'attivo' check (stato in ('attivo', 'venduto')),
  acquirente_id uuid references auth.users(id),
  in_evidenza_fino timestamptz,
  creato_il timestamptz not null default now()
);
create index on annunci using gin ((marca || ' ' || profumo) gin_trgm_ops);

alter table annunci enable row level security;
create policy "annunci visibili" on annunci for select using (stato = 'attivo' or auth.uid() in (utente_id, acquirente_id));
create policy "pubblico i miei" on annunci for insert with check (auth.uid() = utente_id and in_evidenza_fino is null);
create policy "modifico i miei" on annunci for update using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

create table recensioni (
  annuncio_id uuid primary key references annunci(id) on delete cascade,   -- una per annuncio
  autore_id uuid not null references auth.users(id),
  venditore_id uuid not null references auth.users(id),
  voto int not null check (voto between 1 and 5),
  commento text not null default '',
  check (autore_id <> venditore_id)
);
alter table recensioni enable row level security;
create policy "recensioni pubbliche" on recensioni for select using (true);
create policy "recensisco se ho comprato" on recensioni for insert with check (
  auth.uid() = autore_id and exists (
    select 1 from annunci a where a.id = annuncio_id and a.acquirente_id = auth.uid()
      and a.utente_id = venditore_id and a.stato = 'venduto'));

-- Ricerca: trova "sauvage dior" anche scritto "savage dior"
select id, marca, profumo, prezzo_centesimi
from annunci
where stato = 'attivo' and (marca || ' ' || profumo) % 'savage dior'
order by in_evidenza_fino > now() desc nulls last, similarity(marca || ' ' || profumo, 'savage dior') desc
limit 30;

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.
pg_trgm
Un'estensione di Postgres che trova parole simili, anche con errori di battitura.
Decant
Una piccola quantità di profumo travasata da un flacone in un contenitore più piccolo, per provarlo.