Media di viaggi irlandese
Un sito di viaggi dedicato a un solo paese, che vive di contenuti
Incasso mensile: 7120 USD (fonte indicata nella scheda)
Cosa fa
Un sito e una pagina social sui viaggi in Irlanda, attivi da 12 anni, con oltre 800.000 follower. Nell'annuncio dichiara entrate da più fonti.
Come guadagna
Più fonti: pubblicità, contenuti sponsorizzati, affiliazioni. Dati dall'annuncio di vendita su Flippa, con dati verificati dalla piattaforma.
Rendilo tuo
- Un sito su una regione italiana o un tipo di viaggio preciso: borghi, treni panoramici, viaggi con il cane.
- Guadagna con le affiliazioni di hotel ed esperienze.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Guida Locale": un sito di guide di viaggio su una zona d'Italia (es. Salento, Dolomiti, Langhe) che guadagna con pubblicità, link di affiliazione e schede in evidenza delle attività locali. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con le guide più lette, mappa della zona e itinerari
2. Pagina dell'articolo /:slug con indice, foto, mappa e box "Dove dormire"
3. Elenco delle attività locali consigliate (ristoranti, B&B, esperienze)
4. Pagina "Metti in evidenza la tua attività" per i titolari
5. Pannello di redazione (solo amministratori)
Stile: da rivista di viaggio: sfondo bianco, blu mare #0369A1, sabbia #FDE68A per i riquadri, carattere "DM Serif Display" per i titoli e "Inter" per i testi, foto grandi a tutta larghezza. 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:
- "articoli": titolo, slug, testo, foto, zona, data di aggiornamento, pubblicato o no
- "attivita": nome, tipo, zona, descrizione, sito, in evidenza fino a, collegate al titolare
Regole di sicurezza obbligatorie:
- tutti leggono gli articoli pubblicati e le attività approvate
- solo gli amministratori scrivono articoli
- il titolare modifica la descrizione della sua attività, ma 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. Articoli che si fanno trovare
Crea il pannello di redazione: editor degli articoli con titolo, slug, testo con titoletti, foto (caricate nello Storage, ridotte a 1.600 pixel), zona, e anteprima.
Ogni articolo deve avere: indice cliccabile in alto, data "Aggiornato il", mappa dei luoghi citati, e riquadri "Dove dormire" con link di affiliazione (es. Booking, GetYourGuide) marcati con rel="sponsored" e la nota "Link affiliati: se prenoti guadagniamo una piccola commissione, senza costi per te".
Per Google: titolo e descrizione per ogni pagina, dati strutturati Article, e una sitemap generata in automatico (codice nei Dettagli tecnici).
4. Pubblicità e attività in evidenza
Spazi pubblicitari in posizioni fisse (dopo l'introduzione, a metà, in fondo) che non spostano il testo mentre la pagina carica. Banner dei cookie con rifiuto facile come l'accettazione, e pubblicità solo dopo il consenso.
Le attività locali si iscrivono gratis; pagando, compaiono "In evidenza" per 30 giorni in cima all'elenco e nei riquadri degli articoli della loro zona, sempre con l'etichetta "Sponsorizzato".
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 49 € per 30 giorni in evidenza. Il pagamento mette l'attività in evidenza per 30 giorni.
A pagamento riuscito il webhook imposta "in_evidenza_fino" a la data di oggi più 30 giorni nella tabella "attivita", sulla riga del attività 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. Trasparenza: ogni contenuto pagato deve avere l'etichetta "Sponsorizzato" e ogni link affiliato rel="sponsored".
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Tabelle del database
Articoli pubblici e attività locali, con l'evidenza protetta dal pagamento.
create table articoli (
id uuid primary key default gen_random_uuid(),
slug text not null unique,
titolo text not null,
descrizione text not null default '',
testo text not null,
zona text not null,
pubblicato boolean not null default false,
aggiornato_il timestamptz not null default now()
);
alter table articoli enable row level security;
create policy "articoli pubblicati" on articoli for select using (pubblicato);
-- Scrittura solo dagli amministratori (con la funzione sono_admin)
create policy "redazione" on articoli for all using (sono_admin()) with check (sono_admin());
create table attivita (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
nome text not null,
tipo text not null,
zona text not null,
descrizione text not null default '',
sito text,
approvata boolean not null default false,
in_evidenza_fino timestamptz
);
alter table attivita enable row level security;
create policy "attivita visibili" on attivita
for select using (approvata or auth.uid() = utente_id);
create policy "iscrivo la mia" on attivita
for insert with check (auth.uid() = utente_id and not approvata and in_evidenza_fino is null);
create policy "modifico la mia" on attivita
for update using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
create function proteggi_attivita() returns trigger language plpgsql as $
begin
if (new.approvata is distinct from old.approvata
or new.in_evidenza_fino is distinct from old.in_evidenza_fino)
and coalesce(auth.role(), '') <> 'service_role' then
raise exception 'Approvazione ed evidenza le cambia solo la redazione';
end if;
return new;
end $;
create trigger attivita_protetta before update on attivita
for each row execute function proteggi_attivita();Sitemap automatica per Google
Una Edge Function pubblica che elenca tutti gli articoli pubblicati: si indica il suo indirizzo in Google Search Console e Google trova da solo le pagine nuove.
// supabase/functions/sitemap/index.ts (pubblicata con --no-verify-jwt)
import { createClient } from "npm:@supabase/supabase-js";
const db = createClient(Deno.env.get("SUPABASE_URL")!, Deno.env.get("SUPABASE_ANON_KEY")!);
const SITO = "https://www.tuaguida.it";
Deno.serve(async () => {
const { data: articoli } = await db
.from("articoli")
.select("slug, aggiornato_il")
.eq("pubblicato", true);
const righe = (articoli ?? []).map((a) =>
"<url><loc>" + SITO + "/" + a.slug + "</loc>" +
"<lastmod>" + a.aggiornato_il.slice(0, 10) + "</lastmod></url>"
);
const xml =
'<?xml version="1.0" encoding="UTF-8"?>' +
'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' +
righe.join("") +
"</urlset>";
return new Response(xml, { headers: { "Content-Type": "application/xml" } });
});
Pezzi comuni a tutti i progetti
Glossario
- Slug
- La parte finale e leggibile dell'indirizzo di una pagina, es. /pizzeria-da-mario.
- Storage
- Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.
- Sitemap
- L'elenco di tutte le pagine del sito, in un formato che Google legge per trovarle più in fretta.
- Link affiliato
- Un link che fa guadagnare una commissione al sito se il visitatore compra o prenota.