Coco
Un assistente personale che vive su WhatsApp e Telegram
Incasso mensile: 1600 USD (fonte indicata nella scheda)
Cosa fa
Chatbot personale su WhatsApp e Telegram: promemoria (anche per gli amici), appunti, calendario e altro, scrivendo come a una persona.
Come guadagna
Ha entrate ricorrenti ogni mese, verificate su TrustMRR. Prezzi e piani esatti sono indicati sul sito del progetto.
Rendilo tuo
- Per persone anziane: promemoria delle medicine e degli appuntamenti, detti a voce.
- Parti da Telegram, che ha API gratuite e semplici.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Ricordamelo": un assistente su WhatsApp a cui si scrive come a una persona per salvare promemoria, appunti e liste della spesa: "ricordami domani alle 9 di chiamare il dentista". Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con esempi di chat e prezzi
2. Registrazione e collegamento del proprio numero WhatsApp con un codice
3. Pannello web con promemoria, appunti e liste
4. Impostazioni: fuso orario, orario del riepilogo mattutino
5. Pagina privacy chiara
Stile: amichevole e semplice: sfondo bianco, verde WhatsApp scuro #075E54, verde chiaro #25D366, carattere "Inter", esempi mostrati come fumetti di chat. 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:
- "numeri": numero di telefono collegato e verificato, collegato all'utente
- "promemoria": testo, data e ora, inviato o no
- "appunti": testo, lista di appartenenza (spesa, idee, libri), fatto o no
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi dati
- i messaggi WhatsApp li riceve e li invia solo la Edge Function
- il numero si collega solo dopo la verifica con il codice
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. Capire i messaggi
Usa la WhatsApp Business Platform (Cloud API) di Meta. La Edge Function "whatsapp" riceve i messaggi (codice nei Dettagli tecnici): verifica che la chiamata arrivi da Meta, trova l'utente dal numero e passa il testo a Claude, che lo trasforma in un'azione in JSON: promemoria con data e ora, appunto in una lista, richiesta di elenco ("cosa devo fare domani?") o cancellazione.
L'assistente risponde sempre confermando cosa ha capito: "Ok! Domani alle 9:00 ti ricordo: chiamare il dentista". Se la data non è chiara, chiede.
Ogni minuto una funzione invia i promemoria arrivati all'orario. Fuori dalla finestra di 24 ore dall'ultimo messaggio dell'utente, WhatsApp richiede un messaggio modello approvato: preparalo nel pannello di Meta.
4. Pannello web e riepilogo
Il pannello web mostra promemoria futuri e passati, appunti divisi per lista con le caselle da spuntare, e permette di modificare tutto.
Riepilogo facoltativo ogni mattina su WhatsApp con gli impegni del giorno. Comando "aiuto" che spiega cosa si può chiedere.
5. Pagamenti con Stripe
Aggiungi un abbonamento a 3,99 € al mese. Gratis l'utente ha: 10 promemoria al mese. Con il piano Pro sblocca: promemoria e appunti illimitati, riepilogo mattutino e liste condivise.
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. Date: prova frasi come "tra due ore", "lunedì prossimo", "il 3 alle 15": il promemoria deve essere salvato all'ora giusta nel fuso orario dell'utente.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Ricevere i messaggi da WhatsApp
La Edge Function che Meta chiama: risponde alla verifica iniziale e, per ogni messaggio, controlla la firma prima di fidarsi.
// supabase/functions/whatsapp/index.ts (pubblicata con --no-verify-jwt)
async function firmaValida(corpo: string, firma: string | null): Promise<boolean> {
if (!firma) return false;
const chiave = await crypto.subtle.importKey(
"raw", new TextEncoder().encode(Deno.env.get("META_APP_SECRET")!),
{ name: "HMAC", hash: "SHA-256" }, false, ["sign"],
);
const firmato = await crypto.subtle.sign("HMAC", chiave, new TextEncoder().encode(corpo));
const atteso = "sha256=" + [...new Uint8Array(firmato)].map((b) => b.toString(16).padStart(2, "0")).join("");
return atteso === firma;
}
Deno.serve(async (req) => {
const url = new URL(req.url);
// 1. Verifica iniziale fatta da Meta quando si configura il webhook
if (req.method === "GET") {
const ok = url.searchParams.get("hub.verify_token") === Deno.env.get("WHATSAPP_VERIFY_TOKEN");
return ok ? new Response(url.searchParams.get("hub.challenge")) : new Response("No", { status: 403 });
}
// 2. Messaggi in arrivo
const corpo = await req.text();
if (!(await firmaValida(corpo, req.headers.get("x-hub-signature-256")))) {
return new Response("Firma non valida", { status: 401 });
}
const dati = JSON.parse(corpo);
const messaggio = dati.entry?.[0]?.changes?.[0]?.value?.messages?.[0];
if (messaggio?.type === "text") {
await gestisciMessaggio(messaggio.from, messaggio.text.body); // Claude + database + risposta
}
return new Response("ok"); // rispondere subito, altrimenti Meta riprova
});Promemoria da inviare
Ogni minuto prende i promemoria arrivati all'orario e li segna come inviati, senza mai mandarne uno due volte.
create table promemoria (
id uuid primary key default gen_random_uuid(),
utente_id uuid not null references auth.users(id) on delete cascade,
testo text not null,
quando timestamptz not null,
inviato boolean not null default false
);
create index on promemoria (quando) where not inviato;
alter table promemoria enable row level security;
create policy "le mie righe" on promemoria
for all using (auth.uid() = utente_id) with check (auth.uid() = utente_id);
create function promemoria_da_inviare() returns table (id uuid, utente_id uuid, testo text)
language sql security definer set search_path = public as $
update promemoria set inviato = true
where promemoria.id in (
select p.id from promemoria p
where not p.inviato and p.quando <= now()
for update skip locked
)
returning promemoria.id, promemoria.utente_id, promemoria.testo;
$;
revoke execute on function promemoria_da_inviare() from public, anon, authenticated;
grant execute on function promemoria_da_inviare() to service_role;
Pezzi comuni a tutti i progetti
Glossario
- Cron
- Un'operazione programmata che parte da sola a orari fissi, per esempio ogni lunedì mattina.
- Finestra di 24 ore
- La regola di WhatsApp: si può scrivere liberamente a un utente solo entro 24 ore dal suo ultimo messaggio; dopo servono messaggi modello approvati.