← Tutte le idee Marketing e social

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.