Newsletter per chi ha un cane
Una newsletter settimanale con oltre 50.000 iscritti, tutti proprietari di cani
Incasso mensile: 29 USD (fonte indicata nella scheda)
Cosa fa
Una newsletter settimanale per proprietari di cani con oltre 50.000 iscritti, quasi tutti negli Stati Uniti, e un tasso di apertura molto alto (circa metà delle email viene letta).
Come guadagna
Incasso annuo dichiarato di circa 350 $ nell'annuncio di vendita su Microns, che verifica i dati; il valore è soprattutto nel pubblico, che si può far fruttare con sponsor. Il nome del progetto non è pubblico.
Rendilo tuo
- Una newsletter italiana per chi ha un cane o un gatto: consigli, veterinari, posti dove portarli.
- Guadagna con sponsor (negozi di animali, assicurazioni) quando hai qualche migliaio di iscritti.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Coda Felice": una newsletter settimanale in italiano per chi ha un cane: consigli pratici del veterinario, educazione, prodotti provati, posti dove andare con il cane. Si mantiene con sponsor selezionati. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con l'iscrizione, gli argomenti e l'ultimo numero
2. Archivio dei numeri passati, leggibili sul sito
3. Pagina "Sponsorizza" con i numeri del pubblico e i prezzi
4. Pannello redazione: iscritti, numeri, invii, statistiche
5. Pagina di disiscrizione e preferenze
Stile: affettuoso e allegro: sfondo crema #FFF8EE, marrone caldo #92400E, giallo #FBBF24, carattere "Nunito" arrotondato, illustrazioni di cani semplici. 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:
- "iscritti": email, nome del cane, taglia, confermato o no, codice per la disiscrizione, data dell'iscrizione
- "numeri": titolo, testo, sponsor, data di invio
- "sponsorizzazioni": azienda, numero in cui compare, testo, link, pagata
Regole di sicurezza obbligatorie:
- gli iscritti li vede solo la redazione
- l'iscrizione vale solo dopo aver confermato l'email (doppia conferma)
- ci si disiscrive con un clic, senza login
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. Iscrizione con doppia conferma
Il modulo di iscrizione chiede email, nome del cane e taglia (facoltativi) e il consenso. L'iscritto riceve un'email con il link "Conferma la tua iscrizione": solo dopo il clic riceve la newsletter (codice nei Dettagli tecnici). È la regola migliore per la privacy e per arrivare nella posta in arrivo, non nello spam.
Ogni email ha in fondo il link di disiscrizione con un codice personale: un clic e si è fuori, senza login.
Il pannello redazione ha un editor per scrivere il numero della settimana con sezioni fisse (consiglio del veterinario, educazione, prodotto provato, posto dog friendly), l'invio di prova e l'invio programmato a tutti i confermati tramite Resend.
4. Sponsor e statistiche
Pagina "Sponsorizza" con iscritti, tasso di apertura medio e prezzi per uno spazio in un numero. L'azienda sceglie la data, scrive testo e link, paga: lo spazio compare nel numero con l'etichetta "Sponsor".
Statistiche per numero: inviate, aperte, clic sui link, disiscrizioni. Si accettano solo sponsor coerenti con il benessere degli animali.
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di da 150 € per uno spazio sponsor in un numero. Il pagamento conferma lo spazio sponsor nel numero scelto.
A pagamento riuscito il webhook imposta "pagata" a true nella tabella "sponsorizzazioni", sulla riga del sponsorizzazione 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. Disiscrizione: clicca il link in fondo a un'email di prova: l'indirizzo non deve ricevere più nulla, e la pagina deve confermarlo.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Iscritti con doppia conferma e disiscrizione
Gli iscritti hanno due codici segreti: uno per confermare, uno per disiscriversi. Le funzioni pubbliche lavorano solo con questi codici, senza mostrare dati.
create table iscritti (
id uuid primary key default gen_random_uuid(),
email text not null unique,
nome_cane text,
taglia text,
codice_conferma uuid not null default gen_random_uuid(),
codice_uscita uuid not null default gen_random_uuid(),
confermato_il timestamptz,
disiscritto_il timestamptz,
creato_il timestamptz not null default now()
);
alter table iscritti enable row level security;
-- Nessuna regola per il pubblico: gli iscritti li legge solo la redazione via service role
create function conferma_iscrizione(codice uuid) returns boolean
language sql security definer set search_path = public as $
update iscritti set confermato_il = now()
where codice_conferma = codice and confermato_il is null
returning true;
$;
create function disiscriviti(codice uuid) returns boolean
language sql security definer set search_path = public as $
update iscritti set disiscritto_il = now()
where codice_uscita = codice and disiscritto_il is null
returning true;
$;
grant execute on function conferma_iscrizione(uuid), disiscriviti(uuid) to anon, authenticated;
-- Chi riceve il prossimo numero
select email, nome_cane, codice_uscita
from iscritti
where confermato_il is not null and disiscritto_il is null;Invio a gruppi con Resend
Invia il numero a tutti i confermati in gruppi da 100 (il massimo per chiamata), ognuno con il suo link di disiscrizione.
type Iscritto = { email: string; nome_cane: string | null; codice_uscita: string };
export async function inviaNumero(iscritti: Iscritto[], oggetto: string, html: string) {
for (let i = 0; i < iscritti.length; i += 100) {
const gruppo = iscritti.slice(i, i + 100).map((s) => {
const uscita = "https://codafelice.it/disiscriviti?c=" + s.codice_uscita;
return {
from: "Coda Felice <ciao@codafelice.it>",
to: s.email,
subject: oggetto,
html: html.replace("{{nome_cane}}", s.nome_cane ?? "il tuo cane") +
'<p style="font-size:12px"><a href="' + uscita + '">Non voglio più ricevere la newsletter</a></p>',
headers: { "List-Unsubscribe": "<" + uscita + ">" }, // pulsante di disiscrizione di Gmail
};
});
const r = await fetch("https://api.resend.com/emails/batch", {
method: "POST",
headers: { Authorization: "Bearer " + Deno.env.get("RESEND_API_KEY"), "Content-Type": "application/json" },
body: JSON.stringify(gruppo),
});
if (!r.ok) throw new Error("Invio fallito al gruppo " + (i / 100 + 1));
}
}
Pezzi comuni a tutti i progetti
Glossario
- Doppia conferma (double opt-in)
- Dopo l'iscrizione arriva un'email con un link da cliccare: così si è sicuri che l'indirizzo sia vero e della persona giusta.