← Tutte le idee Attività locali e immobiliare

Piattaforma turistica

Un sito turistico locale con app e strumenti di marketing per le attività

Incasso mensile: 168 USD (fonte indicata nella scheda)

Cosa fa

Una piattaforma turistica con sito, app Android e strumenti di marketing per le attività locali (hotel, ristoranti, esperienze).

Come guadagna

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

Rendilo tuo

  • Per un borgo o una valle italiana: tutto quello che c'è da fare, in più lingue.
  • Le attività pagano per comparire in evidenza.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Vivi il Borgo": il portale turistico di un territorio (un borgo, una valle, un'isola) con cose da fare, dove mangiare e dormire, ed esperienze prenotabili online dalle attività locali. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con le foto del territorio, le esperienze in evidenza e il meteo
2. Esperienze: elenco con date e posti liberi
3. Scheda dell'esperienza con prenotazione e pagamento
4. Dove mangiare e dormire, con mappa
5. Pannello delle attività locali: esperienze, date, prenotazioni

Stile: caldo e locale: sfondo bianco, verde bosco #166534, terracotta #C2410C, carattere "Lora" per i titoli e "Inter" per i testi, foto grandi e mappa dei luoghi. 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:
- "attivita": nome, tipo (ristorante, alloggio, guida, cantina), descrizione, contatti, approvata, collegate al titolare
- "esperienze": titolo, descrizione, durata, prezzo, attività
- "date_esperienza": data e ora, posti totali
- "prenotazioni": data, nome, email, numero di persone, pagata

Regole di sicurezza obbligatorie:
- tutti vedono attività approvate, esperienze e posti liberi
- il titolare gestisce solo le sue esperienze e vede le prenotazioni ricevute
- non si possono prenotare più posti di quelli liberi: lo controlla il database

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. Esperienze prenotabili

Le attività locali (guide, cantine, fattorie, noleggi) si iscrivono, vengono approvate dall'amministratore del portale e pubblicano le loro esperienze con date e posti (es. "Degustazione in cantina, sabato 10:30, 12 posti").

Il visitatore sceglie la data, il numero di persone e paga online. La prenotazione passa da una funzione del database che blocca la data mentre controlla i posti (codice nei Dettagli tecnici): due persone che prenotano l'ultimo posto nello stesso istante non possono riuscirci entrambe.

Dopo il pagamento il visitatore riceve la conferma con il punto di ritrovo su mappa; il titolare riceve un'email con i dati.

4. Pagine del territorio e attività

Pagine curate dalla redazione: cosa vedere, itinerari di 1, 2 e 3 giorni, eventi del mese, dove mangiare e dormire con mappa e filtri. Tutto pensato per farsi trovare su Google (titoli, descrizioni, sitemap).

Pannello attività: le loro esperienze, il calendario delle date, le prenotazioni e gli incassi. Il portale trattiene una commissione su ogni prenotazione.

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di il prezzo dell'esperienza per il numero di persone. Il pagamento conferma la prenotazione e i posti.

A pagamento riuscito il webhook imposta "pagata" a true nella tabella "prenotazioni", sulla riga del prenotazione 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. Posti: apri l'ultima disponibilità in due finestre e prenota insieme: una sola prenotazione deve riuscire.
2. Prenotazioni non pagate: se il visitatore non completa il pagamento entro 15 minuti, i posti devono tornare liberi.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Prenotare senza superare i posti

La funzione blocca la data dell'esperienza ("for update") mentre conta i posti: due prenotazioni contemporanee vengono messe in fila e l'ultima trova i posti esauriti.

create table date_esperienza (
  id uuid primary key default gen_random_uuid(),
  esperienza_id uuid not null,
  quando timestamptz not null,
  posti_totali int not null check (posti_totali > 0)
);

create table prenotazioni (
  id uuid primary key default gen_random_uuid(),
  data_id uuid not null references date_esperienza(id) on delete cascade,
  nome text not null,
  email text not null,
  persone int not null check (persone between 1 and 20),
  pagata boolean not null default false,
  creata_il timestamptz not null default now()
);

-- Posti occupati: prenotazioni pagate + quelle in pagamento da meno di 15 minuti
create function prenota(data uuid, nome_cliente text, email_cliente text, quante int) returns uuid
language plpgsql security definer set search_path = public as $
declare totali int; occupati int; nuova uuid;
begin
  select posti_totali into totali from date_esperienza where id = data for update;  -- mette in fila
  if totali is null then raise exception 'Data non trovata'; end if;

  select coalesce(sum(persone), 0) into occupati from prenotazioni
  where data_id = data and (pagata or creata_il > now() - interval '15 minutes');

  if occupati + quante > totali then
    raise exception 'Restano solo % posti', totali - occupati;
  end if;

  insert into prenotazioni (data_id, nome, email, persone)
  values (data, nome_cliente, email_cliente, quante) returning id into nuova;
  return nuova;   -- poi si crea il pagamento Stripe con questo id
end $;

-- Posti liberi per il visitatore
create view posti_liberi as
  select d.id, d.esperienza_id, d.quando,
         d.posti_totali - coalesce(sum(p.persone) filter (
           where p.pagata or p.creata_il > now() - interval '15 minutes'), 0) as liberi
  from date_esperienza d left join prenotazioni p on p.data_id = d.id
  group by d.id;

Pezzi comuni a tutti i progetti

Glossario

Cron
Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
Commissione
La percentuale che il portale trattiene su ogni prenotazione fatta tramite il sito.