← Tutte le idee Marketing e social

AdStellar

Lancia le pubblicità su Facebook e Instagram dieci volte più in fretta

Incasso mensile: 9800 USD (fonte indicata nella scheda)

Cosa fa

Strumento per chi fa pubblicità su Meta: crea in blocco tante combinazioni di immagini e testi e aiuta a capire quali funzionano meglio spendendo meno.

Come guadagna

Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.

Rendilo tuo

  • Per piccoli negozi italiani che non hanno un'agenzia.
  • Report semplice in italiano: quale annuncio ha portato più clienti e quanto è costato.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Combina Ads": aiuta chi fa pubblicità su Facebook e Instagram a creare in blocco tante combinazioni di immagini e testi, e a capire quali funzionano meglio. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con l'esempio "3 immagini × 4 titoli × 2 testi = 24 annunci" e prezzi
2. Registrazione e collegamento dell'account pubblicitario Meta
3. Nuova campagna: carica immagini, scrivi titoli e testi, vedi le combinazioni
4. Risultati: quale immagine, titolo e testo rendono di più
5. Libreria dei pezzi migliori

Stile: da strumento di marketing: sfondo bianco, blu #1877F2, verde #16A34A per i vincitori, carattere "Inter", tabelle e anteprime degli annunci affiancate. 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:
- "campagne": nome, account Meta collegato, budget giornaliero, collegate all'utente
- "pezzi": immagini, titoli e testi della campagna
- "annunci": ogni combinazione creata con l'id dell'annuncio su Meta e i risultati (spesa, clic, conversioni)

Regole di sicurezza obbligatorie:
- ogni utente vede solo le sue campagne, pezzi e annunci
- il token dell'account Meta si salva solo lato server, mai nel browser

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. Combinazioni e caricamento su Meta

Collega l'account pubblicitario tramite il login di Facebook e le API ufficiali di Meta (Marketing API), chiedendo solo i permessi necessari per creare e leggere gli annunci.

Nella nuova campagna l'utente carica fino a 10 immagini o video, scrive fino a 5 titoli e 5 testi. Il sito mostra subito quante combinazioni nascono (codice nei Dettagli tecnici) con le anteprime, e permette di togliere quelle che non piacciono. Claude può proporre altri titoli e testi partendo da quelli scritti.

Il pulsante "Carica su Meta" crea gli annunci in pausa nell'account dell'utente, con nomi ordinati (es. "IMG2 | T3 | TX1"), così l'utente li controlla e li attiva lui.

4. Quali pezzi funzionano

Ogni giorno una Edge Function legge da Meta spesa, clic e conversioni di ogni annuncio. La pagina risultati non si ferma all'annuncio migliore: somma i risultati per pezzo (query nei Dettagli tecnici) e mostra quale immagine, quale titolo e quale testo rendono di più, con il costo per risultato.

Avviso quando un pezzo ha speso poco: "Dati ancora insufficienti, aspetta almeno 50 clic". I pezzi vincenti si salvano nella libreria per le campagne successive.

5. Pagamenti con Stripe

Aggiungi un abbonamento a 39 € al mese. Gratis l'utente ha: una campagna al mese con massimo 12 combinazioni. Con il piano Pro sblocca: campagne e combinazioni illimitate, lettura automatica dei risultati e libreria dei pezzi migliori.

A pagamento riuscito il webhook porta l'utente al piano Pro; se l'abbonamento viene disdetto o non rinnovato lo riporta al piano gratuito.

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. Permessi: controlla che gli annunci vengano sempre creati in pausa e che il sito non possa mai attivarli o cambiare il budget senza un clic dell'utente.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Tutte le combinazioni

Prende le liste di immagini, titoli e testi e crea ogni combinazione possibile: 3 × 4 × 2 = 24 annunci.

type Pezzi = Record<string, string[]>;   // es. { immagine: [...], titolo: [...], testo: [...] }

export function combinazioni(pezzi: Pezzi): Record<string, string>[] {
  return Object.entries(pezzi).reduce<Record<string, string>[]>(
    (risultati, [tipo, valori]) =>
      risultati.flatMap((combo) => valori.map((v) => ({ ...combo, [tipo]: v }))),
    [{}],
  );
}

// combinazioni({ immagine: ["a.jpg", "b.jpg"], titolo: ["Sconto 20%", "Nuovo"] })
// -> [{immagine:"a.jpg",titolo:"Sconto 20%"}, {immagine:"a.jpg",titolo:"Nuovo"},
//     {immagine:"b.jpg",titolo:"Sconto 20%"}, {immagine:"b.jpg",titolo:"Nuovo"}]

Tabelle e risultati per pezzo

Gli annunci con i loro pezzi e la query che somma i risultati per ogni immagine: si fa lo stesso per titoli e testi.

create table campagne (
  id uuid primary key default gen_random_uuid(),
  utente_id uuid not null references auth.users(id) on delete cascade,
  nome text not null,
  account_meta text not null,
  creato_il timestamptz not null default now()
);

create table annunci (
  id uuid primary key default gen_random_uuid(),
  campagna_id uuid not null references campagne(id) on delete cascade,
  utente_id uuid not null references auth.users(id) on delete cascade,
  immagine text not null,
  titolo text not null,
  testo text not null,
  id_meta text,
  spesa_centesimi int not null default 0,
  clic int not null default 0,
  conversioni int not null default 0
);

alter table campagne enable row level security;
create policy "le mie righe" on campagne
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

alter table annunci enable row level security;
create policy "le mie righe" on annunci
  for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);

-- Quale immagine rende di più (costo per conversione)
select immagine,
       sum(spesa_centesimi) / 100.0 as spesa,
       sum(conversioni) as conversioni,
       round(sum(spesa_centesimi) / 100.0 / nullif(sum(conversioni), 0), 2) as costo_per_conversione
from annunci
where campagna_id = 'ID-CAMPAGNA'
group by immagine
order by costo_per_conversione nulls last;

Pezzi comuni a tutti i progetti

Glossario

Test A/B
Provare più versioni dello stesso annuncio per vedere con i numeri quale funziona meglio.