BlackTwist
Gli strumenti per crescere su Threads
Incasso mensile: 2300 USD (fonte indicata nella scheda)
Cosa fa
Raccolta di strumenti per chi crea contenuti su Threads: programmazione dei post, statistiche, idee.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Concentrati su un solo social nuovo che cresce: chi arriva prima prende gli utenti.
- In italiano, per creator italiani.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Filo": aiuta chi crea contenuti su Threads a programmare i post, vedere le statistiche e trovare idee, usando le API ufficiali di Meta. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con calendario di esempio e prezzi
2. Registrazione e collegamento dell'account Threads
3. Calendario dei post programmati
4. Editor del post con anteprima e contatore di 500 caratteri
5. Statistiche dei post: visualizzazioni, like, risposte
Stile: minimal come Threads: sfondo bianco, nero #000000, grigi, un solo accento viola #7C3AED, carattere "Inter", molto spazio. 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:
- "account": id dell'utente Threads e token di accesso (salvato cifrato, letto solo dal server), collegati all'utente
- "post": testo, data e ora programmata, stato (bozza, programmato, pubblicato, errore), id del post su Threads, statistiche
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi post
- i token di Threads non sono mai leggibili dal browser
- la pubblicazione la fa solo la Edge Function
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. Programmare e pubblicare
Collega l'account con il login ufficiale di Threads (Threads API di Meta), chiedendo solo i permessi per pubblicare e leggere le statistiche. Salva il token lato server; rinnovalo prima della scadenza.
Editor del post: testo fino a 500 caratteri con contatore, anteprima, divisione automatica di un testo lungo in una serie di post collegati, e scelta di data e ora. Il calendario mostra la settimana con i post programmati, spostabili trascinandoli.
Ogni 5 minuti una Edge Function pubblica i post arrivati all'orario, con i due passaggi richiesti dall'API (codice nei Dettagli tecnici). Se fallisce, il post passa a "errore" con il motivo e l'utente riceve un'email.
4. Statistiche e idee
Ogni giorno leggi dall'API le statistiche dei post pubblicati: visualizzazioni, like, risposte, ricondivisioni. Pagina statistiche con i post migliori, il giorno e l'ora in cui i post rendono di più, e l'andamento dei follower.
Pulsante "Idee": partendo dai 5 post migliori, Claude propone 10 spunti nello stesso stile, da modificare prima di programmarli.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 9 € al mese. Gratis l'utente ha: 5 post programmati e statistiche di 7 giorni. Con il piano Pro sblocca: post illimitati, serie di post, statistiche complete e idee con l'AI.
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. Pubblicazione: programma un post tra 6 minuti e controlla che esca una volta sola, anche se la funzione parte due volte.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Pubblicare su Threads in due passaggi
L'API ufficiale chiede prima di creare il post (un "contenitore") e poi di pubblicarlo. Il token resta sul server.
const API = "https://graph.threads.net/v1.0";
export async function pubblicaSuThreads(utenteThreads: string, token: string, testo: string) {
// 1. Crea il contenitore del post
const crea = await fetch(API + "/" + utenteThreads + "/threads", {
method: "POST",
body: new URLSearchParams({ media_type: "TEXT", text: testo, access_token: token }),
});
const contenitore = await crea.json();
if (!crea.ok) throw new Error(contenitore.error?.message ?? "Creazione non riuscita");
// 2. Pubblica il contenitore
const pubblica = await fetch(API + "/" + utenteThreads + "/threads_publish", {
method: "POST",
body: new URLSearchParams({ creation_id: contenitore.id, access_token: token }),
});
const risultato = await pubblica.json();
if (!pubblica.ok) throw new Error(risultato.error?.message ?? "Pubblicazione non riuscita");
return risultato.id as string; // id del post pubblicato
}Post programmati senza doppioni
La funzione prende i post arrivati all'orario e li segna "in pubblicazione" in un colpo solo: anche se parte due volte, ogni post viene preso una volta.
create table post (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
testo text not null check (length(testo) <= 500),
programmato_il timestamptz,
stato text not null default 'bozza'
check (stato in ('bozza', 'programmato', 'in_pubblicazione', 'pubblicato', 'errore')),
id_threads text,
errore text,
statistiche jsonb not null default '{}'
);
alter table post enable row level security;
create policy "le mie righe" on post
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
create function post_da_pubblicare() returns setof post
language sql security definer set search_path = public as $
update post set stato = 'in_pubblicazione'
where id in (
select id from post
where stato = 'programmato' and programmato_il <= now()
for update skip locked
)
returning *;
$;
revoke execute on function post_da_pubblicare() from public, anon, authenticated;
grant execute on function post_da_pubblicare() to service_role;
select cron.schedule('pubblica-threads', '*/5 * * * *', $
select net.http_post(
url := 'https://TUO-PROGETTO.supabase.co/functions/v1/pubblica',
headers := jsonb_build_object('Authorization', 'Bearer TUA-CHIAVE-CRON')
);
$);
Pezzi comuni a tutti i progetti
Glossario
- Cron
- Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
- JSONB
- Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
- Token di accesso
- Una chiave temporanea che Threads dà al sito per agire a nome dell'utente, solo per i permessi concessi.