Migrazione da Twilio a Prelude

Migrazione da Twilio a Prelude: guida tecnica

Una guida tecnica dettagliata per sostituire Twilio Messaging e Twilio Verify con la Verify API di Prelude

Quentin Le Bras

CPO

Riepilogo

Prelude offre un'unica API per l'intero ciclo di vita degli OTP, compresi il rilevamento delle frodi e il routing multicanale, con una prevenzione delle frodi integrata basata su machine learning. Questa guida fornisce una mappatura dei concetti di Twilio nei corrispondenti di Prelude, tra cui l'autenticazione, l'invio e la verifica degli OTP, la gestione dei tentativi e la configurazione di canali e webhook.

Sostituire il tuo provider di OTP non deve essere per forza un progetto che richiede più sprint. L'API Verify unificata di Prelude si mappa direttamente sui concetti di Twilio Verify. Prelude fornisce un singolo endpoint REST che gestisce l'intero ciclo di vita degli OTP, dal rilevamento delle frodi al routing multicanale. La maggior parte dei team rilascia un'alternativa funzionante in un singolo sprint.

Perché migrare? Le aziende che passano a Prelude registrano solitamente tassi di conversione superiori del 20-30% e costi SMS mensili inferiori del 30-40%, oltre a una prevenzione delle frodi basata su ML integrata che non richiede strumenti personalizzati.

Cosa cambia

A grandi linee, andrai a sostituire due servizi di Twilio (Programmable Messaging e Twilio Verify) con una singola API di Prelude. La tabella seguente mappa ogni concetto di Twilio con il suo equivalente in Prelude.

Concetto

Twilio Verify

Prelude Verify

Categoria di servizio

Twilio Programmable Messaging + Twilio Verify

API Prelude Verify (servizio singolo)

URL di base dell'API

api.twilio.com/2010-04-01/Accounts/{SID}

api.prelude.dev

Autenticazione

HTTP Basic (AccountSID:AuthToken)

Bearer token nell'header Authorization

Invia OTP

POST /Services/{ServiceSID}/Verifications

POST /v2/verification

Verifica OTP

POST /Services/{ServiceSID}/VerificationChecks

POST /v2/verification/check

Riprova OTP

POST /Services/{ServiceSID}/Verifications (ripeti)

POST /v2/verification (stesso numero, entro la finestra temporale)

Stato di verifica

pending / approved / canceled

success / retry / blocked / challenged

Servizio / namespace

Verify Service (ServiceSID)

Implicito per API key (configurato nella Dashboard)

Prevenzione frodi

Twilio Fraud Guard (add-on)

ML integrato, attivo di default

Canali

SMS, WhatsApp, chiamata, email

SMS, WhatsApp, Viber, Zalo, RCS, voce, email

Mittente / brand

Servizio di messaggistica o numero di telefono

Configurato contattando il customer success (Sender ID)

Numeri di test

Numeri magici per Verify Service

Numeri di test nella Dashboard (Verify > Configure > Numbers)

Webhook

URL StatusCallback per richiesta

callback_url per richiesta; firma tramite RSASSA-PSS

SDK

twilio-node, twilio-python, ecc.

npm @prelude.so/sdk, pip prelude_python_sdk, go-sdk, Java, Ruby

Autenticazione

Twilio (prima)

Twilio utilizza l'autenticazione HTTP Basic con il tuo Account SID come nome utente e l'Auth Token come password.

# Twilio HTTP Basic Auth

curl -X POST https://verify.twilio.com/v2/Services/{ServiceSID}/Verifications \

  -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN \

  -d 'To=+14155552671' \

  -d 'Channel=sms'
# Twilio HTTP Basic Auth

curl -X POST https://verify.twilio.com/v2/Services/{ServiceSID}/Verifications \

  -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN \

  -d 'To=+14155552671' \

  -d 'Channel=sms'

Prelude (dopo)

Prelude utilizza un Bearer token. Genera una API key nella Dashboard sotto Impostazioni > API Keys.

# Prelude Bearer Token

curl -X POST https://api.prelude.dev/v2/verification \

  -H “Authorization: Bearer $PRELUDE_API_KEY” \

  -H 'Content-Type: application/json' \

  -d '{"target": {"type": "phone_number", "value": "+14155552671"}}'
# Prelude Bearer Token

curl -X POST https://api.prelude.dev/v2/verification \

  -H “Authorization: Bearer $PRELUDE_API_KEY” \

  -H 'Content-Type: application/json' \

  -d '{"target": {"type": "phone_number", "value": "+14155552671"}}'

Azione richiesta:  Salva la tua API key di Prelude in una variabile d'ambiente (ad es. PRELUDE_API_KEY). Non caricarla mai nel controllo versione. Rimuovi TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN e VERIFY_SERVICE_SID una volta completata la migrazione.

Invio di una verifica (OTP)

Twilio Verify – prima

// Node.js – Twilio Verify

const client = require('twilio')(accountSid, authToken);



const verification = await client.verify.v2

  .services(verifySid)

  .verifications

  .create({ to: '+14155552671', channel: 'sms' });



console.log(verification.status); // 'pending'
// Node.js – Twilio Verify

const client = require('twilio')(accountSid, authToken);



const verification = await client.verify.v2

  .services(verifySid)

  .verifications

  .create({ to: '+14155552671', channel: 'sms' });



console.log(verification.status); // 'pending'

Prelude – dopo

// Node.js – Prelude SDK

import Prelude from '@prelude.so/sdk';



const client = new Prelude({ apiToken: process.env.PRELUDE_API_KEY });



const verification = await client.verification.create({

  target: { type: 'phone_number', value: '+14155552671' },

  // Opzionale: invia segnali digitali per combattere meglio le frodi

  signals: {

    ip: '203.0.113.42',          // IP pubblico dell'utente finale

    device_id: 'abc123-unique',   // identificativo univoco e stabile del dispositivo

    device_platform: 'ios',

    device_model: 'iPhone 15',

  },

});



console.log(verification.id);     // 'vrf_01...'

console.log(verification.status); // 'success' | 'blocked' | 'challenged'
// Node.js – Prelude SDK

import Prelude from '@prelude.so/sdk';



const client = new Prelude({ apiToken: process.env.PRELUDE_API_KEY });



const verification = await client.verification.create({

  target: { type: 'phone_number', value: '+14155552671' },

  // Opzionale: invia segnali digitali per combattere meglio le frodi

  signals: {

    ip: '203.0.113.42',          // IP pubblico dell'utente finale

    device_id: 'abc123-unique',   // identificativo univoco e stabile del dispositivo

    device_platform: 'ios',

    device_model: 'iPhone 15',

  },

});



console.log(verification.id);     // 'vrf_01...'

console.log(verification.status); // 'success' | 'blocked' | 'challenged'

Valori di stato

Prelude restituisce un insieme più ricco di stati durante la creazione di una verifica:

Stato

Significato

success

Nuova finestra di verifica aperta; codice inviato all'utente.

retry

Stesso numero di telefono richiamato entro la finestra temporale; nuovo tentativo inviato.

blocked

Richiesta contrassegnata come fraudolenta; nessun codice inviato, nessun addebito per il messaggio.

challenged

Traffico sospetto; consegna limitata ai soli canali non SMS (deve essere abilitata dal supporto di Prelude).

Controllo di un codice di verifica

Twilio Verify – prima

// Node.js – Twilio Verify check

const check = await client.verify.v2

  .services(verifySid)

  .verificationChecks

  .create({ to: '+14155552671', code: '123456' });




if (check.status === 'approved') {

  // consenti l'accesso

}
// Node.js – Twilio Verify check

const check = await client.verify.v2

  .services(verifySid)

  .verificationChecks

  .create({ to: '+14155552671', code: '123456' });




if (check.status === 'approved') {

  // consenti l'accesso

}

Prelude – dopo

// Node.js – Prelude check

const check = await client.verification.check({

  target: { type: 'phone_number', value: '+14155552671' },

  code: '123456',

});




if (check.status === 'success') {

  // consenti l'accesso

}




// Stati possibili: 'success' | 'failure' | ‘expired_or_not_found’
// Node.js – Prelude check

const check = await client.verification.check({

  target: { type: 'phone_number', value: '+14155552671' },

  code: '123456',

});




if (check.status === 'success') {

  // consenti l'accesso

}




// Stati possibili: 'success' | 'failure' | ‘expired_or_not_found’

Gestione dei tentativi di rinvio

In Twilio Verify si avvia un nuovo tentativo creando una nuova verifica per lo stesso numero di telefono all'interno della finestra di rinvio del servizio. Prelude funziona allo stesso modo: chiama nuovamente POST /v2/verification con lo stesso numero di telefono e Prelude riconoscerà la finestra di verifica aperta, effettuando un nuovo tentativo invece di creare una nuova verifica da zero.

// Prelude – retry (stessa chiamata di create)

const retry = await client.verification.create({

  target: { type: 'phone_number', value: '+14155552671' },

});




// retry.status === 'retry' se all'interno della finestra temporale

// Restituisce 429 Too Many Requests se viene raggiunto il numero massimo di tentativi

// o se viene chiamato prima dell'intervallo minimo tra i rinvii
// Prelude – retry (stessa chiamata di create)

const retry = await client.verification.create({

  target: { type: 'phone_number', value: '+14155552671' },

});




// retry.status === 'retry' se all'interno della finestra temporale

// Restituisce 429 Too Many Requests se viene raggiunto il numero massimo di tentativi

// o se viene chiamato prima dell'intervallo minimo tra i rinvii

Puoi configurare il numero massimo di tentativi e la durata della finestra di verifica direttamente dalla Dashboard di Prelude.

Prevenzione delle frodi

Twilio Fraud Guard vs. Prevenzione integrata di Prelude

Twilio Fraud Guard è un add-on opzionale. La prevenzione delle frodi di Prelude è invece attiva di default per ogni richiesta, alimentata da modelli di ML ed euristiche addestrate su decine di milioni di data point in tutta la rete di Prelude.

Segnali da trasmettere

Più segnali fornisci, più efficace sarà il rilevamento delle frodi. La tabella seguente mostra l'aumento stimato della conversione per ciascun segnale:

Campo del segnale

Aumento stimato • Note

signals.ip

+50%  •  IPv4 o IPv6 pubblico del dispositivo dell'utente finale. Se si trova dietro un proxy, usa X-Forwarded-For / CF-Connecting-IP.

signals.device_id

+40%  •  ID univoco e stabile per dispositivo (Android: ANDROID_ID, iOS: identifierForVendor).

signals.device_platform

+35%  •  'ios' o 'android'.

signals.ja4_fingerprint

+30%  •  Rilevato automaticamente quando si usano gli SDK Frontend di Prelude; passalo manualmente se termini la connessione TLS.

signals.device_model

+20%  •  Stringa del modello del dispositivo.

signals.os_version

+20%  •  Versione del sistema operativo.

signals.app_version

+10%  •  Versione della tua applicazione.

Utilizzo degli SDK Frontend per segnali più ricchi e fingerprinting di rete

Installa uno degli SDK Frontend di Prelude (Android, iOS, Web, React Native, Flutter) per raccogliere automaticamente i segnali del dispositivo. L'SDK acquisisce i segnali in automatico e ti fornisce un dispatch_id da passare alla chiamata di verifica sul backend.

// Esempio Web SDK – ottieni il dispatch_id sul frontend

import { dispatchSignals } from "@prelude.so/js-sdk/signals";




const dispatchId = await dispatchSignals(<your-prelude-sdk-key>);




// Backend – passa il dispatch_id per collegare i segnali del dispositivo

const verification = await client.verification.create({

target: { type

// Esempio Web SDK – ottieni il dispatch_id sul frontend

import { dispatchSignals } from "@prelude.so/js-sdk/signals";




const dispatchId = await dispatchSignals(<your-prelude-sdk-key>);




// Backend – passa il dispatch_id per collegare i segnali del dispositivo

const verification = await client.verification.create({

target: { type

Canali e Multi-Routing

Twilio Verify richiede di specificare esplicitamente un canale ('sms', 'whatsapp', 'call', 'email'). Prelude sceglie automaticamente il canale e la rotta migliori in base al costo, al tasso di conversione e ai segnali di frode, eliminando la necessità di gestire logiche di selezione dell'operatore o del canale.

Nessuna azione richiesta:  Rimuovi il campo channel dai tuoi payload. Il motore di multi-routing di Prelude gestisce la selezione del canale in modo automatico. Se necessario, puoi comunque configurare i canali preferiti dalla Dashboard.

Contenuto del messaggio e personalizzazione

Prelude invia l'OTP nel formato:

12345 è il tuo codice di verifica.

Il messaggio viene tradotto automaticamente in 32 lingue in base al prefisso internazionale del numero di telefono. Opzioni di personalizzazione disponibili (configurabili nella Dashboard o per singola richiesta):

  • Suffisso del brand – ad es. “12345 è il tuo codice di verifica per {nome azienda}.”

  • Suffisso di sicurezza – ad es. “Non condividerlo.”

  • Lingua personalizzata – tramite options.locale (formato BCP-47).

  • Lunghezza del codice – da 4 a 8 cifre impostata nella Dashboard, sovrascrivibile tramite options.code_size.

  • Codice OTP personalizzato – inserisci il tuo codice tramite options.custom_code (soggetto ad approvazione).

  • Template PSD2 – template integrato per le transazioni PSD2 tramite options.template_id: 'prelude:psd2'.

Webhook

Twilio – prima

Twilio invia una richiesta POST StatusCallback all'URL specificato nel Verify Service o per singola richiesta.

Prelude – dopo

Specifica un callback_url per ogni richiesta di verifica.

const verification = await client.verification.create({

  target: {

    type: 'phone_number',

    value: '+14155552671',

  },

  options: {

    callback_url: 'https://your-app.example.com/webhooks/prelude',

  },

});
const verification = await client.verification.create({

  target: {

    type: 'phone_number',

    value: '+14155552671',

  },

  options: {

    callback_url: 'https://your-app.example.com/webhooks/prelude',

  },

});

Tipi di eventi

Tipo di evento

Descrizione

verify.authentication

Una verifica è stata creata e tariffata.

verify.attempt

Un tentativo OTP è stato inviato all'utente.

verify.delivery_status

Aggiornamento dello stato di consegna ricevuto dall'operatore.

Verifica della firma

Prelude firma ogni webhook con RSASSA-PSS sull'hash SHA-256 del payload. La firma è presente nell'header X-Webhook-Signature, preceduta da rsassa-pss-sha256=. Genera una chiave di firma nella Dashboard.

IP consentiti (allowlist)

Inserisci questi IP di uscita di Prelude nella whitelist del tuo firewall:

  • 34.252.67.209

  • 52.30.192.161

  • 34.248.153.151

Testare la tua integrazione

Numeri magici di Twilio vs. numeri di test di Prelude

Entrambe le piattaforme forniscono numeri di telefono speciali per test automatizzati che non generano costi. In Prelude, i numeri di test si configurano nella Dashboard sotto Verify API > Configure > Numbers.

Per ogni numero di test definisci un codice fisso. Solo quel codice verrà accettato dall'endpoint Check, consentendoti di creare script per scenari di successo/fallimento nella tua suite di test.

Best practice:  Usa i numeri di test nelle pipeline di CI/CD. Aggiungili alla tua Dashboard prima di eseguire i test di integrazione. 

Installazione e inizializzazione dell'SDK

Node.js

# Rimuovi Twilio

npm uninstall twilio




# Installa Prelude

npm add @prelude.so/sdk
# Rimuovi Twilio

npm uninstall twilio




# Installa Prelude

npm add @prelude.so/sdk
import Prelude from '@prelude.so/sdk';




const client = new Prelude({

  apiToken: process.env.PRELUDE_API_KEY,

});
import Prelude from '@prelude.so/sdk';




const client = new Prelude({

  apiToken: process.env.PRELUDE_API_KEY,

});

Python

# Rimuovi Twilio

pip uninstall twilio




# Installa Prelude

pip install prelude_python_sdk
# Rimuovi Twilio

pip uninstall twilio




# Installa Prelude

pip install prelude_python_sdk
from prelude_python_sdk import Prelude

import os




client = Prelude(api_token=os.environ['PRELUDE_API_KEY'])
from prelude_python_sdk import Prelude

import os




client = Prelude(api_token=os.environ['PRELUDE_API_KEY'])

Go

go get github.com/prelude-so/go-sdk
go get github.com/prelude-so/go-sdk
import (

  "github.com/prelude-so/go-sdk"

  "github.com/prelude-so/go-sdk/option"




client := prelude.NewClient(

  option.WithAPIToken(os.Getenv("PRELUDE_API_KEY")),

)
import (

  "github.com/prelude-so/go-sdk"

  "github.com/prelude-so/go-sdk/option"




client := prelude.NewClient(

  option.WithAPIToken(os.Getenv("PRELUDE_API_KEY")),

)

Java / Kotlin

// build.gradle

implementation("so.prelude.sdk:prelude-java:0.2.0")




// Inizializza

PreludeClient client = PreludeOkHttpClient.fromEnv();

// Imposta la variabile d'ambiente API_TOKEN
// build.gradle

implementation("so.prelude.sdk:prelude-java:0.2.0")




// Inizializza

PreludeClient client = PreludeOkHttpClient.fromEnv();

// Imposta la variabile d'ambiente API_TOKEN

Ruby

# Gemfile

gem 'prelude_sdk'




# Inizializza

require 'prelude_sdk'

prelude = PreludeSDK::Client.new(api_token: ENV['API_TOKEN'])
# Gemfile

gem 'prelude_sdk'




# Inizializza

require 'prelude_sdk'

prelude = PreludeSDK::Client.new(api_token: ENV['API_TOKEN'])

Checklist di migrazione

Segui ogni passaggio riportato sotto per completare la migrazione:

Fase 1 – Configurazione

  • Crea un account Prelude su app.prelude.so e accedi alla Dashboard.

  • Genera una API key in Dashboard > Configure > API Keys.

  • Aggiungi PRELUDE_API_KEY al tuo gestore dei segreti / variabili d'ambiente.

  • Installa l'SDK di Prelude per il tuo linguaggio di programmazione (vedi Sezione 12).

  • Configura i numeri di test in Dashboard > Verify API > Configure > Numbers.

Fase 2 – Modifiche al codice

  • Sostituisci l'inizializzazione dell'SDK di Twilio con quello di Prelude (vedi Sezione 12).

  • Sostituisci verifications.create(...) con client.verification.create(...).

  • Sostituisci verificationChecks.create(...) con client.verification.check(...).

  • Aggiorna i controlli di stato da 'approved' a 'success' e da 'pending' a 'success'.

  • Rimuovi il parametro channel – Prelude seleziona automaticamente il canale migliore.

  • Rimuovi i riferimenti a ServiceSID.

  • Aggiungi i segnali di frode (signals.ip, signals.device_id, ecc.) alle chiamate di creazione della verifica.

  • Aggiorna il gestore dei webhook per i tipi di evento di Prelude (vedi Sezione 10.3).

  • Implementa la verifica della firma dei webhook (RSASSA-PSS, vedi Sezione 10.4).

Fase 3 – Test

  • Esegui un test end-to-end completo in ambiente di staging con un numero di telefono reale.

  • Verifica la consegna dei webhook e il corretto parsing dei payload.

  • Conferma che gli scenari bloccati o fraudolenti restituiscano lo stato previsto.

Fase 4 – Rilascio

  • Rilascia in produzione (si consiglia l'uso di un feature flag o di un rilascio canary).

  • Monitora i tassi di conversione e di blocco nella Dashboard di Prelude.

  • Rimuovi le vecchie credenziali di Twilio dal gestore dei segreti.

Riferimento codici di errore

Prelude utilizza i codici di stato HTTP standard. Il corpo della risposta contiene un oggetto JSON con i campi code e message.

Stato HTTP / Codice

Descrizione

429 too_many_attempts

Numero massimo di tentativi di rinvio raggiunto per questa finestra di verifica.

429 premature_retry

Tentativo di rinvio richiesto prima dell'intervallo minimo stabilito.

429 too_many_checks

Numero massimo di tentativi di controllo del codice raggiunto.

400 invalid_phone_number

Il numero di telefono non è un numero E.164 valido.

401 unauthorized

API key non valida o mancante.

Per vedere l'elenco completo degli errori di tipo 4xx

https://docs.prelude.so/introduction/errors

Supporto e risorse

Perché dovremmo migrare da Twilio a Prelude?

Ci sono quattro motivi principali per cui i team decidono di cambiare:

  • Costi inferiori. Le aziende registrano in genere una spesa mensile per gli SMS inferiore del 30-40%, soprattutto perché la prevenzione delle frodi di Prelude blocca il traffico fittizio prima che raggiunga gli operatori: in questo modo non paghi per i messaggi fraudolenti.

  • Conversioni più alte. Il routing multicanale automatizzato seleziona l'operatore e il canale migliori per ogni destinazione, migliorando i tassi di consegna. Di norma si osserva un aumento del 20-30% nelle conversioni degli OTP.

  • Prevenzione delle frodi inclusa. Twilio Fraud Guard è un add-on a pagamento. Il rilevamento delle frodi basato su ML di Prelude è invece attivo per impostazione predefinita su ogni richiesta, addestrato su decine di milioni di dati in tutta la rete.

  • Integrazione più semplice. Due servizi di Twilio (Programmable Messaging + Verify) si uniscono in una sola API di Prelude. Nessun ServiceSID, nessuna logica di selezione del canale, nessuna gestione degli operatori telefonici: la struttura dell'API è decisamente più snella.

La migrazione stessa è a basso rischio: l'API di Prelude si mappa direttamente sui concetti di Twilio Verify e la maggior parte dei team completa il passaggio a un'alternativa funzionante in un unico sprint con un rilascio tramite feature flag. Scopri come Finfrog, una fintech francese di prestiti, ha ridotto i costi degli SMS del 45% dopo il passaggio: Caso di studio Finfrog

Siamo soddisfatti di Twilio. Vale la pena affrontare questo cambiamento?

Il lavoro richiesto per la migrazione è minimo, solitamente pochi giorni di sviluppo, quindi anche un piccolo miglioramento in termini di conversione o riduzione dei costi si ripaga rapidamente. Il passaggio è fortemente raccomandato se riscontri una di queste situazioni:

  • Noti frodi o abusi significativi tramite SMS sul tuo flusso di verifica.

  • I tuoi tassi di consegna degli OTP variano sensibilmente a seconda del paese o dell'operatore.

  • Stai pagando Twilio Fraud Guard come componente aggiuntivo separato.

  • Vuoi supportare canali oltre agli SMS (WhatsApp, Viber, RCS, Zalo) senza dover gestire direttamente le logiche di routing.

Un rilascio graduale (canary rollout) ti consente di misurare l'impatto reale prima di completare il passaggio: indirizza il 5-10% del traffico su Prelude e confronta direttamente i tassi di conversione e di blocco nella Dashboard. Finfrog ha adottato proprio questo approccio, completando il passaggio in pochissimi giorni: leggi il caso di studio

Quanto tempo richiede la migrazione?

La maggior parte dei team di backend completa la migrazione in un singolo sprint. Le modifiche principali al codice (sostituzione dell'SDK, aggiornamento delle chiamate di invio e verifica e rimappatura dei valori di stato) richiedono solo poche ore. Sarà necessario dell'altro tempo per configurare la verifica della firma dei webhook e l'invio dei segnali di frode, ma si tratta di miglioramenti incrementali che puoi implementare anche dopo il passaggio iniziale.

Posso utilizzare Twilio e Prelude in parallelo durante una migrazione graduale?

Sì, ed è l'approccio consigliato. Gestisci la chiamata di verifica tramite un feature flag e indirizza inizialmente una piccola percentuale di traffico verso Prelude. Monitora i tassi di conversione e di blocco nella Dashboard di Prelude, quindi aumenta gradualmente la percentuale. Mantieni attive le tue credenziali Twilio fino a quando non avrai completato del tutto il passaggio e verificato che le metriche siano stabili.

La prevenzione delle frodi è attiva di default o devo abilitarla?

È attiva di default su ogni richiesta, a differenza di Twilio Fraud Guard che è un add-on opzionale. I modelli di ML di Prelude analizzano automaticamente ogni verifica. Non devi configurare nulla per usufruire della protezione di base. L'invio dei segnali del dispositivo (ipdevice_iddevice_platform) andrà a migliorare ulteriormente l'accuratezza del sistema.

È disponibile una dashboard in tempo reale per monitorare i tassi di consegna e di blocco?

Sì. La Dashboard di Prelude offre una visibilità in tempo reale su tassi di conversione, tassi di blocco, dettagli sugli stati di consegna e distribuzione dei canali. Durante e dopo il rilascio in produzione, potrai monitorare queste metriche per confermare che le prestazioni siano in linea con le aspettative prima di disattivare la configurazione di Twilio.

Sostituire il tuo provider di OTP non deve essere per forza un progetto che richiede più sprint. L'API Verify unificata di Prelude si mappa direttamente sui concetti di Twilio Verify. Prelude fornisce un singolo endpoint REST che gestisce l'intero ciclo di vita degli OTP, dal rilevamento delle frodi al routing multicanale. La maggior parte dei team rilascia un'alternativa funzionante in un singolo sprint.

Perché migrare? Le aziende che passano a Prelude registrano solitamente tassi di conversione superiori del 20-30% e costi SMS mensili inferiori del 30-40%, oltre a una prevenzione delle frodi basata su ML integrata che non richiede strumenti personalizzati.

Cosa cambia

A grandi linee, andrai a sostituire due servizi di Twilio (Programmable Messaging e Twilio Verify) con una singola API di Prelude. La tabella seguente mappa ogni concetto di Twilio con il suo equivalente in Prelude.

Concetto

Twilio Verify

Prelude Verify

Categoria di servizio

Twilio Programmable Messaging + Twilio Verify

API Prelude Verify (servizio singolo)

URL di base dell'API

api.twilio.com/2010-04-01/Accounts/{SID}

api.prelude.dev

Autenticazione

HTTP Basic (AccountSID:AuthToken)

Bearer token nell'header Authorization

Invia OTP

POST /Services/{ServiceSID}/Verifications

POST /v2/verification

Verifica OTP

POST /Services/{ServiceSID}/VerificationChecks

POST /v2/verification/check

Riprova OTP

POST /Services/{ServiceSID}/Verifications (ripeti)

POST /v2/verification (stesso numero, entro la finestra temporale)

Stato di verifica

pending / approved / canceled

success / retry / blocked / challenged

Servizio / namespace

Verify Service (ServiceSID)

Implicito per API key (configurato nella Dashboard)

Prevenzione frodi

Twilio Fraud Guard (add-on)

ML integrato, attivo di default

Canali

SMS, WhatsApp, chiamata, email

SMS, WhatsApp, Viber, Zalo, RCS, voce, email

Mittente / brand

Servizio di messaggistica o numero di telefono

Configurato contattando il customer success (Sender ID)

Numeri di test

Numeri magici per Verify Service

Numeri di test nella Dashboard (Verify > Configure > Numbers)

Webhook

URL StatusCallback per richiesta

callback_url per richiesta; firma tramite RSASSA-PSS

SDK

twilio-node, twilio-python, ecc.

npm @prelude.so/sdk, pip prelude_python_sdk, go-sdk, Java, Ruby

Autenticazione

Twilio (prima)

Twilio utilizza l'autenticazione HTTP Basic con il tuo Account SID come nome utente e l'Auth Token come password.

# Twilio HTTP Basic Auth

curl -X POST https://verify.twilio.com/v2/Services/{ServiceSID}/Verifications \

  -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN \

  -d 'To=+14155552671' \

  -d 'Channel=sms'

Prelude (dopo)

Prelude utilizza un Bearer token. Genera una API key nella Dashboard sotto Impostazioni > API Keys.

# Prelude Bearer Token

curl -X POST https://api.prelude.dev/v2/verification \

  -H “Authorization: Bearer $PRELUDE_API_KEY” \

  -H 'Content-Type: application/json' \

  -d '{"target": {"type": "phone_number", "value": "+14155552671"}}'

Azione richiesta:  Salva la tua API key di Prelude in una variabile d'ambiente (ad es. PRELUDE_API_KEY). Non caricarla mai nel controllo versione. Rimuovi TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN e VERIFY_SERVICE_SID una volta completata la migrazione.

Invio di una verifica (OTP)

Twilio Verify – prima

// Node.js – Twilio Verify

const client = require('twilio')(accountSid, authToken);



const verification = await client.verify.v2

  .services(verifySid)

  .verifications

  .create({ to: '+14155552671', channel: 'sms' });



console.log(verification.status); // 'pending'

Prelude – dopo

// Node.js – Prelude SDK

import Prelude from '@prelude.so/sdk';



const client = new Prelude({ apiToken: process.env.PRELUDE_API_KEY });



const verification = await client.verification.create({

  target: { type: 'phone_number', value: '+14155552671' },

  // Opzionale: invia segnali digitali per combattere meglio le frodi

  signals: {

    ip: '203.0.113.42',          // IP pubblico dell'utente finale

    device_id: 'abc123-unique',   // identificativo univoco e stabile del dispositivo

    device_platform: 'ios',

    device_model: 'iPhone 15',

  },

});



console.log(verification.id);     // 'vrf_01...'

console.log(verification.status); // 'success' | 'blocked' | 'challenged'

Valori di stato

Prelude restituisce un insieme più ricco di stati durante la creazione di una verifica:

Stato

Significato

success

Nuova finestra di verifica aperta; codice inviato all'utente.

retry

Stesso numero di telefono richiamato entro la finestra temporale; nuovo tentativo inviato.

blocked

Richiesta contrassegnata come fraudolenta; nessun codice inviato, nessun addebito per il messaggio.

challenged

Traffico sospetto; consegna limitata ai soli canali non SMS (deve essere abilitata dal supporto di Prelude).

Controllo di un codice di verifica

Twilio Verify – prima

// Node.js – Twilio Verify check

const check = await client.verify.v2

  .services(verifySid)

  .verificationChecks

  .create({ to: '+14155552671', code: '123456' });




if (check.status === 'approved') {

  // consenti l'accesso

}

Prelude – dopo

// Node.js – Prelude check

const check = await client.verification.check({

  target: { type: 'phone_number', value: '+14155552671' },

  code: '123456',

});




if (check.status === 'success') {

  // consenti l'accesso

}




// Stati possibili: 'success' | 'failure' | ‘expired_or_not_found’

Gestione dei tentativi di rinvio

In Twilio Verify si avvia un nuovo tentativo creando una nuova verifica per lo stesso numero di telefono all'interno della finestra di rinvio del servizio. Prelude funziona allo stesso modo: chiama nuovamente POST /v2/verification con lo stesso numero di telefono e Prelude riconoscerà la finestra di verifica aperta, effettuando un nuovo tentativo invece di creare una nuova verifica da zero.

// Prelude – retry (stessa chiamata di create)

const retry = await client.verification.create({

  target: { type: 'phone_number', value: '+14155552671' },

});




// retry.status === 'retry' se all'interno della finestra temporale

// Restituisce 429 Too Many Requests se viene raggiunto il numero massimo di tentativi

// o se viene chiamato prima dell'intervallo minimo tra i rinvii

Puoi configurare il numero massimo di tentativi e la durata della finestra di verifica direttamente dalla Dashboard di Prelude.

Prevenzione delle frodi

Twilio Fraud Guard vs. Prevenzione integrata di Prelude

Twilio Fraud Guard è un add-on opzionale. La prevenzione delle frodi di Prelude è invece attiva di default per ogni richiesta, alimentata da modelli di ML ed euristiche addestrate su decine di milioni di data point in tutta la rete di Prelude.

Segnali da trasmettere

Più segnali fornisci, più efficace sarà il rilevamento delle frodi. La tabella seguente mostra l'aumento stimato della conversione per ciascun segnale:

Campo del segnale

Aumento stimato • Note

signals.ip

+50%  •  IPv4 o IPv6 pubblico del dispositivo dell'utente finale. Se si trova dietro un proxy, usa X-Forwarded-For / CF-Connecting-IP.

signals.device_id

+40%  •  ID univoco e stabile per dispositivo (Android: ANDROID_ID, iOS: identifierForVendor).

signals.device_platform

+35%  •  'ios' o 'android'.

signals.ja4_fingerprint

+30%  •  Rilevato automaticamente quando si usano gli SDK Frontend di Prelude; passalo manualmente se termini la connessione TLS.

signals.device_model

+20%  •  Stringa del modello del dispositivo.

signals.os_version

+20%  •  Versione del sistema operativo.

signals.app_version

+10%  •  Versione della tua applicazione.

Utilizzo degli SDK Frontend per segnali più ricchi e fingerprinting di rete

Installa uno degli SDK Frontend di Prelude (Android, iOS, Web, React Native, Flutter) per raccogliere automaticamente i segnali del dispositivo. L'SDK acquisisce i segnali in automatico e ti fornisce un dispatch_id da passare alla chiamata di verifica sul backend.

// Esempio Web SDK – ottieni il dispatch_id sul frontend

import { dispatchSignals } from "@prelude.so/js-sdk/signals";




const dispatchId = await dispatchSignals(<your-prelude-sdk-key>);




// Backend – passa il dispatch_id per collegare i segnali del dispositivo

const verification = await client.verification.create({

target: { type

Canali e Multi-Routing

Twilio Verify richiede di specificare esplicitamente un canale ('sms', 'whatsapp', 'call', 'email'). Prelude sceglie automaticamente il canale e la rotta migliori in base al costo, al tasso di conversione e ai segnali di frode, eliminando la necessità di gestire logiche di selezione dell'operatore o del canale.

Nessuna azione richiesta:  Rimuovi il campo channel dai tuoi payload. Il motore di multi-routing di Prelude gestisce la selezione del canale in modo automatico. Se necessario, puoi comunque configurare i canali preferiti dalla Dashboard.

Contenuto del messaggio e personalizzazione

Prelude invia l'OTP nel formato:

12345 è il tuo codice di verifica.

Il messaggio viene tradotto automaticamente in 32 lingue in base al prefisso internazionale del numero di telefono. Opzioni di personalizzazione disponibili (configurabili nella Dashboard o per singola richiesta):

  • Suffisso del brand – ad es. “12345 è il tuo codice di verifica per {nome azienda}.”

  • Suffisso di sicurezza – ad es. “Non condividerlo.”

  • Lingua personalizzata – tramite options.locale (formato BCP-47).

  • Lunghezza del codice – da 4 a 8 cifre impostata nella Dashboard, sovrascrivibile tramite options.code_size.

  • Codice OTP personalizzato – inserisci il tuo codice tramite options.custom_code (soggetto ad approvazione).

  • Template PSD2 – template integrato per le transazioni PSD2 tramite options.template_id: 'prelude:psd2'.

Webhook

Twilio – prima

Twilio invia una richiesta POST StatusCallback all'URL specificato nel Verify Service o per singola richiesta.

Prelude – dopo

Specifica un callback_url per ogni richiesta di verifica.

const verification = await client.verification.create({

  target: {

    type: 'phone_number',

    value: '+14155552671',

  },

  options: {

    callback_url: 'https://your-app.example.com/webhooks/prelude',

  },

});

Tipi di eventi

Tipo di evento

Descrizione

verify.authentication

Una verifica è stata creata e tariffata.

verify.attempt

Un tentativo OTP è stato inviato all'utente.

verify.delivery_status

Aggiornamento dello stato di consegna ricevuto dall'operatore.

Verifica della firma

Prelude firma ogni webhook con RSASSA-PSS sull'hash SHA-256 del payload. La firma è presente nell'header X-Webhook-Signature, preceduta da rsassa-pss-sha256=. Genera una chiave di firma nella Dashboard.

IP consentiti (allowlist)

Inserisci questi IP di uscita di Prelude nella whitelist del tuo firewall:

  • 34.252.67.209

  • 52.30.192.161

  • 34.248.153.151

Testare la tua integrazione

Numeri magici di Twilio vs. numeri di test di Prelude

Entrambe le piattaforme forniscono numeri di telefono speciali per test automatizzati che non generano costi. In Prelude, i numeri di test si configurano nella Dashboard sotto Verify API > Configure > Numbers.

Per ogni numero di test definisci un codice fisso. Solo quel codice verrà accettato dall'endpoint Check, consentendoti di creare script per scenari di successo/fallimento nella tua suite di test.

Best practice:  Usa i numeri di test nelle pipeline di CI/CD. Aggiungili alla tua Dashboard prima di eseguire i test di integrazione. 

Installazione e inizializzazione dell'SDK

Node.js

# Rimuovi Twilio

npm uninstall twilio




# Installa Prelude

npm add @prelude.so/sdk
import Prelude from '@prelude.so/sdk';




const client = new Prelude({

  apiToken: process.env.PRELUDE_API_KEY,

});

Python

# Rimuovi Twilio

pip uninstall twilio




# Installa Prelude

pip install prelude_python_sdk
from prelude_python_sdk import Prelude

import os




client = Prelude(api_token=os.environ['PRELUDE_API_KEY'])

Go

go get github.com/prelude-so/go-sdk
import (

  "github.com/prelude-so/go-sdk"

  "github.com/prelude-so/go-sdk/option"




client := prelude.NewClient(

  option.WithAPIToken(os.Getenv("PRELUDE_API_KEY")),

)

Java / Kotlin

// build.gradle

implementation("so.prelude.sdk:prelude-java:0.2.0")




// Inizializza

PreludeClient client = PreludeOkHttpClient.fromEnv();

// Imposta la variabile d'ambiente API_TOKEN

Ruby

# Gemfile

gem 'prelude_sdk'




# Inizializza

require 'prelude_sdk'

prelude = PreludeSDK::Client.new(api_token: ENV['API_TOKEN'])

Checklist di migrazione

Segui ogni passaggio riportato sotto per completare la migrazione:

Fase 1 – Configurazione

  • Crea un account Prelude su app.prelude.so e accedi alla Dashboard.

  • Genera una API key in Dashboard > Configure > API Keys.

  • Aggiungi PRELUDE_API_KEY al tuo gestore dei segreti / variabili d'ambiente.

  • Installa l'SDK di Prelude per il tuo linguaggio di programmazione (vedi Sezione 12).

  • Configura i numeri di test in Dashboard > Verify API > Configure > Numbers.

Fase 2 – Modifiche al codice

  • Sostituisci l'inizializzazione dell'SDK di Twilio con quello di Prelude (vedi Sezione 12).

  • Sostituisci verifications.create(...) con client.verification.create(...).

  • Sostituisci verificationChecks.create(...) con client.verification.check(...).

  • Aggiorna i controlli di stato da 'approved' a 'success' e da 'pending' a 'success'.

  • Rimuovi il parametro channel – Prelude seleziona automaticamente il canale migliore.

  • Rimuovi i riferimenti a ServiceSID.

  • Aggiungi i segnali di frode (signals.ip, signals.device_id, ecc.) alle chiamate di creazione della verifica.

  • Aggiorna il gestore dei webhook per i tipi di evento di Prelude (vedi Sezione 10.3).

  • Implementa la verifica della firma dei webhook (RSASSA-PSS, vedi Sezione 10.4).

Fase 3 – Test

  • Esegui un test end-to-end completo in ambiente di staging con un numero di telefono reale.

  • Verifica la consegna dei webhook e il corretto parsing dei payload.

  • Conferma che gli scenari bloccati o fraudolenti restituiscano lo stato previsto.

Fase 4 – Rilascio

  • Rilascia in produzione (si consiglia l'uso di un feature flag o di un rilascio canary).

  • Monitora i tassi di conversione e di blocco nella Dashboard di Prelude.

  • Rimuovi le vecchie credenziali di Twilio dal gestore dei segreti.

Riferimento codici di errore

Prelude utilizza i codici di stato HTTP standard. Il corpo della risposta contiene un oggetto JSON con i campi code e message.

Stato HTTP / Codice

Descrizione

429 too_many_attempts

Numero massimo di tentativi di rinvio raggiunto per questa finestra di verifica.

429 premature_retry

Tentativo di rinvio richiesto prima dell'intervallo minimo stabilito.

429 too_many_checks

Numero massimo di tentativi di controllo del codice raggiunto.

400 invalid_phone_number

Il numero di telefono non è un numero E.164 valido.

401 unauthorized

API key non valida o mancante.

Per vedere l'elenco completo degli errori di tipo 4xx

https://docs.prelude.so/introduction/errors

Supporto e risorse

Perché dovremmo migrare da Twilio a Prelude?

Ci sono quattro motivi principali per cui i team decidono di cambiare:

  • Costi inferiori. Le aziende registrano in genere una spesa mensile per gli SMS inferiore del 30-40%, soprattutto perché la prevenzione delle frodi di Prelude blocca il traffico fittizio prima che raggiunga gli operatori: in questo modo non paghi per i messaggi fraudolenti.

  • Conversioni più alte. Il routing multicanale automatizzato seleziona l'operatore e il canale migliori per ogni destinazione, migliorando i tassi di consegna. Di norma si osserva un aumento del 20-30% nelle conversioni degli OTP.

  • Prevenzione delle frodi inclusa. Twilio Fraud Guard è un add-on a pagamento. Il rilevamento delle frodi basato su ML di Prelude è invece attivo per impostazione predefinita su ogni richiesta, addestrato su decine di milioni di dati in tutta la rete.

  • Integrazione più semplice. Due servizi di Twilio (Programmable Messaging + Verify) si uniscono in una sola API di Prelude. Nessun ServiceSID, nessuna logica di selezione del canale, nessuna gestione degli operatori telefonici: la struttura dell'API è decisamente più snella.

La migrazione stessa è a basso rischio: l'API di Prelude si mappa direttamente sui concetti di Twilio Verify e la maggior parte dei team completa il passaggio a un'alternativa funzionante in un unico sprint con un rilascio tramite feature flag. Scopri come Finfrog, una fintech francese di prestiti, ha ridotto i costi degli SMS del 45% dopo il passaggio: Caso di studio Finfrog

Siamo soddisfatti di Twilio. Vale la pena affrontare questo cambiamento?

Il lavoro richiesto per la migrazione è minimo, solitamente pochi giorni di sviluppo, quindi anche un piccolo miglioramento in termini di conversione o riduzione dei costi si ripaga rapidamente. Il passaggio è fortemente raccomandato se riscontri una di queste situazioni:

  • Noti frodi o abusi significativi tramite SMS sul tuo flusso di verifica.

  • I tuoi tassi di consegna degli OTP variano sensibilmente a seconda del paese o dell'operatore.

  • Stai pagando Twilio Fraud Guard come componente aggiuntivo separato.

  • Vuoi supportare canali oltre agli SMS (WhatsApp, Viber, RCS, Zalo) senza dover gestire direttamente le logiche di routing.

Un rilascio graduale (canary rollout) ti consente di misurare l'impatto reale prima di completare il passaggio: indirizza il 5-10% del traffico su Prelude e confronta direttamente i tassi di conversione e di blocco nella Dashboard. Finfrog ha adottato proprio questo approccio, completando il passaggio in pochissimi giorni: leggi il caso di studio

Quanto tempo richiede la migrazione?

La maggior parte dei team di backend completa la migrazione in un singolo sprint. Le modifiche principali al codice (sostituzione dell'SDK, aggiornamento delle chiamate di invio e verifica e rimappatura dei valori di stato) richiedono solo poche ore. Sarà necessario dell'altro tempo per configurare la verifica della firma dei webhook e l'invio dei segnali di frode, ma si tratta di miglioramenti incrementali che puoi implementare anche dopo il passaggio iniziale.

Posso utilizzare Twilio e Prelude in parallelo durante una migrazione graduale?

Sì, ed è l'approccio consigliato. Gestisci la chiamata di verifica tramite un feature flag e indirizza inizialmente una piccola percentuale di traffico verso Prelude. Monitora i tassi di conversione e di blocco nella Dashboard di Prelude, quindi aumenta gradualmente la percentuale. Mantieni attive le tue credenziali Twilio fino a quando non avrai completato del tutto il passaggio e verificato che le metriche siano stabili.

La prevenzione delle frodi è attiva di default o devo abilitarla?

È attiva di default su ogni richiesta, a differenza di Twilio Fraud Guard che è un add-on opzionale. I modelli di ML di Prelude analizzano automaticamente ogni verifica. Non devi configurare nulla per usufruire della protezione di base. L'invio dei segnali del dispositivo (ipdevice_iddevice_platform) andrà a migliorare ulteriormente l'accuratezza del sistema.

È disponibile una dashboard in tempo reale per monitorare i tassi di consegna e di blocco?

Sì. La Dashboard di Prelude offre una visibilità in tempo reale su tassi di conversione, tassi di blocco, dettagli sugli stati di consegna e distribuzione dei canali. Durante e dopo il rilascio in produzione, potrai monitorare queste metriche per confermare che le prestazioni siano in linea con le aspettative prima di disattivare la configurazione di Twilio.

Inizia a ottimizzare il tuo flusso di Auth

Invia SMS di verifica in tutto il mondo al miglior prezzo, con la massima recapitabilità e senza spam.