Ok, se sei qui è perché hai già googlato mezzo internet, hai riletto la documentazione Meta tre volte, hai ricreato la Login Configuration da zero almeno una volta, e sei sul punto di mettere in dubbio la tua sanità mentale. Respira. Ci siamo passati anche noi, per settimane, e alla fine la causa era una cosa che nessuno scrive da nessuna parte in un modo comprensibile. Te la spieghiamo per intero, così tu ci metti cinque minuti invece che tre settimane.
Se hai fretta, è questa
In Standard Access, Instagram manda il webhook messages solo se chi scrive il DM ha un ruolo di Instagram Tester sulla tua app — non l'account business che lo riceve. Sì, hai letto bene: non serve che ce l'abbia il tuo account, serve che ce l'abbia il cliente/tester che ti sta scrivendo. Vai sull'account che sta mandando i messaggi di test → Impostazioni → App e siti web → Inviti dei tester → accetta l'invito per la tua app. Se l'invito non esiste: Meta for Developers → la tua app → Ruoli → Ruoli Instagram Tester → aggiungi proprio quell'account, quello che scrive, non quello che riceve. Poi riprova a mandare un DM. Buona fortuna, ne avevamo bisogno anche noi.
Il sintomo che ti fa dubitare di te stesso
I commenti Instagram arrivano al webhook che è una meraviglia. Stesso URL, stessa app, stesso identico oggetto instagram nel payload. I DM no. Zero. Non un errore, non un log, non uno straccio di richiesta HTTP che arrivi da qualche parte. Per settimane. E la parte peggiore: pages_messaging di Messenger, sullo stesso identico livello di accesso, funziona benissimo anche con persone a caso da fuori.
Ed è proprio questo che ti manda fuori strada, perché il ragionamento sembra ovvio: "se Messenger funziona e Instagram no, con lo stesso Standard Access, allora ho sbagliato qualcosa nella configurazione". Ci abbiamo creduto anche noi per giorni. Non è così. Sono due prodotti con regole di accesso completamente diverse a questo livello, e l'asimmetria da sola non significa niente — è solo una trappola mentale molto convincente.
Tutto quello che abbiamo provato e NON ha funzionato (rispàrmiatelo)
Prima di arrivare alla causa vera abbiamo controllato, uno per uno, con calma sempre più fragile, questi punti — tutti puliti, tutti a posto, tutti inutili:
- Iscrizione ai campi webhook a livello app — il Registro attività confermava
messagesattivo già dal giorno prima - Iscrizione a livello Pagina (
/subscribed_apps) —messagesc'era, presente e corretto - Rifare da zero la sottoscrizione webhook — tutti e 8 i campi accettati, zero errori di permesso
- Scope della Login Configuration —
instagram_manage_messagesera lì, tranquillo - Il toggle "Consenti accesso ai messaggi" su Instagram → Messaggi → Strumenti collegati — già acceso
- Il messaggio finito dentro "Richieste" invece che in chat normale — accettarlo non ha cambiato assolutamente niente
- Conversation Routing / Handover su Business Suite — un'app partner fantasma con tutto spento, totalmente irrilevante
- Il prodotto "Instagram Business Login" mai configurato — webhook vuoto, zero account, un vicolo cieco totale
- Il pulsante "Test" di Meta per l'evento
messagesnella dashboard webhook — non ha mandato letteralmente nulla al server (per pura sfortuna, nello stesso istante è arrivato unmentionsreale e scollegato che per un attimo ci ha fatto pensare di avercela fatta)
Bonus trappola, gratis: la Pagina può vivere sotto il portfolio Business Suite del cliente, non quello della tua agenzia. Se controlli "App collegate" dal portfolio sbagliato, vedi un elenco di permessi più corto e diverso — e giureresti che sia lì il problema. Non lo è, hai solo guardato nel posto sbagliato.
La cosa che ci ha davvero salvato: il log dell'nginx, non un pannello Meta
Dopo aver bruciato tutte le ipotesi sopra, a un certo punto la domanda giusta è cambiata: non più "cosa ho sbagliato nella configurazione" ma "questa richiesta arriva DAVVERO al mio server?". E la risposta non stava in nessuna dashboard Meta — stava nel log del reverse proxy:
grep 'POST /api/webhooks/meta-messaging' /var/log/nginx/access.log
# 46 richieste POST da Meta quel giorno, tutte 200
# NESSUNA agli orari dei nostri test DM
# comments/leadgen invece combaciavano perfettamente
Quella riga di grep vale più di due settimane di dashboard Meta aperte in venti tab diverse. Prova, senza possibilità di dubbio, che Meta non stava nemmeno tentando di mandarci quei webhook. Non un problema di routing nostro, non un bug nel codice, non un token scaduto — la richiesta non arrivava proprio, punto. Se vuoi un consiglio spassionato: controlla il log del proxy PRIMA di toccare sottoscrizioni, token o instradamento. Ci avrebbe risparmiato la metà del tempo perso.
E finalmente, la causa vera
In Standard Access, Instagram consegna i webhook messages solo quando è la persona che scrive il DM ad avere un ruolo sull'app — non l'account business che lo riceve. La doc Meta dice, testuale, che "i webhook vengono inviati solo se la persona che usa la tua app ha un ruolo sull'app" — una frase che sembra parlare del tuo team, e che invece per la messaggistica parla del cliente che ti sta scrivendo. Geniale, no?
Aggiungere l'account business come Instagram Tester: zero effetto, niente di niente. Aggiungere l'account personale che stava fisicamente scrivendo i DM di test come Instagram Tester, e accettare l'invito da quell'account: al messaggio successivo è arrivato tutto. E GET /{page-id}/conversations?platform=instagram, che per tutto il giorno ci aveva risposto con un desolante data: [], all'improvviso ci ha restituito l'intera conversazione — messaggi vecchi compresi, quelli che fino a un minuto prima erano semplicemente invisibili.
Perché i commenti non hanno mai avuto questo problema: sono dati del business stesso, non serve nessun tester per leggere i propri contenuti. Messenger invece consegna da chiunque anche a Standard Access — motivo per cui quella famosa asimmetria "Messenger sì, Instagram no" non prova affatto un bug, prova solo che sono due prodotti con regole diverse. Ci siamo fatti fregare da questo per giorni.
Cosa fare, in pratica, adesso
- Controlla il log del reverse proxy per l'orario esatto del tuo test DM. Zero richieste da Meta? Il problema è a monte, non nel tuo codice — smetti di debuggare l'app.
- Vai sull'account Instagram che sta scrivendo i test (non quello business che riceve) → Impostazioni → App e siti web → Inviti dei tester.
- Accetta l'invito da tester per la tua app da quell'account. Se l'invito non c'è ancora: Meta for Developers → la tua app → Ruoli → Ruoli Instagram Tester → aggiungi proprio quell'account.
- Manda un DM nuovo dall'account appena aggiunto e ricontrolla subito il log del proxy — dovrebbe comparire in pochi secondi.
- Per clienti veri in produzione questo vale solo a Standard Access: la soluzione definitiva resta l'Advanced Access per
instagram_manage_messagesvia App Review, dove sparisce questa restrizione assurda.
Perché ce lo scriviamo da soli, tanto per noi
Niente di tutto questo è scritto da Meta in un posto che lo renda trovabile. Lo scopri solo testando dal vivo, escludendo un'ipotesi alla volta, con la pazienza di chi non ha più opzioni. Se stai leggendo fin qui probabilmente hai lo stesso identico problema — comments sì, DM no — quindi saltati tutti i vicoli ciechi qui sopra e vai dritto al log del proxy. Ti abbiamo tenuto un posto, benvenuto nel club.


