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.