← Tutte le idee Negozi e community

JuJuBit

Dalle foto a statuine stampate in 3D, da collezionare o regalare

Cosa fa

Si mandano alcune foto (di una persona, di un animale) e si riceve una statuina personalizzata stampata in 3D.

Come guadagna

Startup appena presentata su BetaList, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: vendita delle statuine: prodotto fisico con buon margine, perfetto come regalo.

Rendilo tuo

  • Statuine degli animali domestici: un regalo molto richiesto.
  • Sposi e cake topper personalizzati per i matrimoni italiani.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Mini Me": si caricano alcune foto di una persona o di un animale e si riceve a casa una statuina personalizzata stampata in 3D, dipinta, alta 10–20 cm. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con esempi di statuine e prezzi
2. Ordine: tipo (persona, coppia, animale), misura, posa, colori, foto
3. Anteprima del modello 3D da approvare prima della stampa
4. I miei ordini con lo stato di lavorazione
5. Pannello del laboratorio

Stile: giocoso e artigianale: sfondo crema #FFF7ED, arancione #F97316, blu #1E40AF, carattere "Fredoka" per i titoli e "Inter" per i testi, foto delle statuine su sfondo colorato. 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:
- "ordini": tipo, misura, posa, note, foto, indirizzo, prezzo, pagato, stato (in attesa di foto, modellazione, da approvare, in stampa, spedito)
- "modelli": file 3D dell'anteprima, versione, commento del cliente

Regole di sicurezza obbligatorie:
- ogni cliente vede solo i suoi ordini, foto e modelli
- le foto stanno in uno spazio privato e si cancellano 30 giorni dopo la spedizione
- prezzo e stato li cambiano solo il laboratorio e 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. Ordine, foto e consenso

Il cliente sceglie tipo, misura (10, 15 o 20 cm), posa e colori, e carica da 3 a 8 foto (fronte, lati, figura intera). Il sito controlla che le foto siano abbastanza grandi e dà consigli per scattarle.

Per le statuine di persone c'è una casella obbligatoria: "Le persone ritratte hanno dato il consenso (o sono io)". Per i minori serve il consenso di un genitore.

Il prezzo si calcola dal server in base a tipo e misura; dopo il pagamento l'ordine passa al laboratorio. Gli stati dell'ordine seguono una sequenza fissa che il database fa rispettare (codice nei Dettagli tecnici).

4. Anteprima 3D e laboratorio

Il laboratorio crea il modello 3D (con scansione da foto e ritocco a mano) e lo carica: il cliente lo vede ruotare nel browser e lo approva o chiede modifiche (fino a 2 revisioni incluse). Solo dopo l'approvazione si stampa.

Pannello del laboratorio: ordini per stato, foto in alta qualità, caricamento delle anteprime, numero di spedizione. Il cliente riceve un'email a ogni passaggio.

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di da 59 € (10 cm) a 129 € (20 cm), calcolato dal server. Il pagamento conferma l'ordine e avvia la modellazione.

A pagamento riuscito il webhook imposta "pagato" a true nella tabella "ordini", sulla riga del ordine 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. Stati: prova a mandare un ordine in stampa senza approvazione del modello: il database deve rifiutarlo.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Stati dell'ordine in sequenza

Un trigger permette solo i passaggi di stato previsti: per esempio non si può andare in stampa senza che il cliente abbia approvato il modello.

create table ordini (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  tipo text not null check (tipo in ('persona', 'coppia', 'animale')),
  misura_cm int not null check (misura_cm in (10, 15, 20)),
  posa text not null,
  consenso_ritratti boolean not null,
  prezzo_centesimi int not null,
  pagato boolean not null default false,
  stato text not null default 'in_attesa'
    check (stato in ('in_attesa', 'modellazione', 'da_approvare', 'approvato', 'in_stampa', 'spedito')),
  revisioni int not null default 0,
  check (tipo = 'animale' or consenso_ritratti)
);
alter table ordini enable row level security;
create policy "i miei ordini" on ordini for select using (auth.uid() = utente_id);

create function passaggio_valido() returns trigger language plpgsql as $
declare ammessi jsonb := '{
  "in_attesa": ["modellazione"],
  "modellazione": ["da_approvare"],
  "da_approvare": ["approvato", "modellazione"],
  "approvato": ["in_stampa"],
  "in_stampa": ["spedito"]
}';
begin
  if new.stato is distinct from old.stato then
    if not (ammessi -> old.stato) ? new.stato then
      raise exception 'Passaggio non permesso: % -> %', old.stato, new.stato;
    end if;
    if new.stato = 'modellazione' and old.stato = 'in_attesa' and not new.pagato then
      raise exception 'Ordine non ancora pagato';
    end if;
    if old.stato = 'da_approvare' and new.stato = 'modellazione' then
      new.revisioni := old.revisioni + 1;          -- il cliente ha chiesto una modifica
    end if;
  end if;
  return new;
end $;
create trigger ordine_in_sequenza before update on ordini
  for each row execute function passaggio_valido();

insert into storage.buckets (id, name, public) values ('statuine', 'statuine', false);
create policy "la mia cartella statuine" on storage.objects for all to authenticated
  using (bucket_id = 'statuine' and (storage.foldername(name))[1] = auth.uid()::text)
  with check (bucket_id = 'statuine' and (storage.foldername(name))[1] = auth.uid()::text);

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.
Macchina a stati
Un insieme di stati con i soli passaggi permessi tra l'uno e l'altro: evita che un ordine salti dei passaggi.