La WhatsApp Business API, senza il labirinto dei BSP.
Official Meta Business Solution Provider since the API existed. Template approval, session windows, media, interactive messages, all handled. Two billion-plus monthly WhatsApp users, addressable from a single endpoint that looks like every other Bird channel.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.whatsapp.send({
to: "+15005550009",
template: "order_shipped",
locale: "en_US",
variables: {
customer_name: "Ada",
order_id: "BRD-49217",
tracking_url: "https://track.bird.dev/49217",
eta: "Thursday, May 21",
},
}).safe();
if (error) throw error;
console.log(data.id);
// → "wa_msg_8nB91Yk3p..."
5 minuti da npm install al primo invio
Invia un messaggio WhatsApp dal linguaggio che già utilizzi.
SDK per ogni runtime principale. Il primo invio va a un destinatario di test autorizzato (+15005550009) con un template pre-approvato, così puoi integrare un check CI prima ancora di sottoporre il tuo primo template per l'approvazione.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.whatsapp.send({
to: "+15005550009",
template: "hello_world",
locale: "en_US",
}).safe();Dieci cose che il filtro del BSP ti nasconde. Noi no.
WhatsApp è controllato da Meta. La scelta del BSP si riduce a questo: i vincoli compaiono nel codice o vengono nascosti in una dashboard. Noi abbiamo scelto il codice.
- 01
Meta Business Solution Provider (BSP) ufficiale
Rapporto diretto con Meta da quando esiste l'API. Nessun transito rivenduto, nessun passaggio tramite terzi.
- 02
Gestione dei template
Invia, monitora lo stato di approvazione e ricevi un webhook non appena Meta approva o rifiuta.
- 03
Gestione della finestra di sessione
L'SDK ti indica se è consentito il formato libero o il template prima dell'invio.
- 04
Messaggi interattivi
Buttons, lists, product cards, and WhatsApp Flows, declared in the same payload.
- 05
Media e contenuti rich
Immagini, video, documenti, posizione, contatti, anteprime link, reazioni e risposte.
- 06
WhatsApp Flows
Form in-app a più passaggi con validazione backend, definiti in JSON, eseguiti da Meta.
- 07
Click-to-WhatsApp Ads
Integrazione con Meta Ads Manager: i clic sugli annunci aprono una conversazione a cui puoi rispondere.
- 08
Fallback cross-channel
Add fallback: "sms" to any send. Session expiry routes through SMS automatically.
- 09
Webhook per messaggi in entrata
Eventi firmati HMAC per messaggi in entrata, conferme di lettura, reazioni e stato dei template.
- 10
2B+ utenti su un unico endpoint
Oltre due miliardi di utenti WhatsApp al mese raggiungibili con una singola chiamata bird.whatsapp.send.
Perché sviluppiamo WhatsApp
Siamo stati tra i primi BSP di WhatsApp. Siamo ancora tra i pochi che scrivono codice insieme a te.
WhatsApp is gated. You need an approved template; you need an opted-in session window; you need a Meta business verification. That part doesn't change, and won't. What changes is whether your BSP makes those gates easier or harder to walk through: by exposing them in your code, on webhooks you can subscribe to, in errors that say exactly what's wrong. We chose the first.
import { BirdClient } from "@messagebird/sdk";
const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });
const { data, error } = await bird.whatsapp.send({
to: "+15005550009",
template: "order_shipped",
locale: "en_US",
variables: {
customer_name: "Ada",
order_id: "BRD-49217",
tracking_url: "https://track.bird.dev/49217",
eta: "Thursday, May 21",
},
}).safe();
if (error) throw error;
console.log(data.id);
// → "wa_msg_8nB91Yk3p..."
Ogni cambio di stato è un webhook.
HMAC-signed payloads, replay-protected, idempotent. The same envelope on every Bird channel: learn one, you've learned them all.
{
"type": "whatsapp.read",
"id": "evt_7kQ02v...",
"created_at": "2026-05-19T15:42:08.114Z",
"data": {
"wa_msg_id": "wa_msg_8nB91Yk3p",
"from": "+15551234567",
"to": "+15005550009",
"conversation_id": "wa_conv_3pX1g7t",
"template": "order_shipped",
"delivered_at": "2026-05-19T15:42:01.802Z",
"read_at": "2026-05-19T15:42:08.020Z"
}
}
Programma di retry: 5s, 30s, 5m, 30m, 2h, 6h, 12h. Dead-letter dopo l'ultimo tentativo; ogni evento dead-letter è riproducibile dalla dashboard o dall'API.
whatsapp.queuedAccettato dall'API e in coda per l'invio a Meta.whatsapp.sentConsegnato alla Cloud API di Meta.whatsapp.deliveredMeta conferma che il messaggio è arrivato sul dispositivo del destinatario.whatsapp.readIl destinatario ha aperto il messaggio (se le conferme di lettura sono attive).whatsapp.failedPermanent failure: reason code in the payload.whatsapp.receivedMessaggio in entrata da un utente all'interno della finestra di sessione di 24 ore.whatsapp.template.approvedMeta ha approvato un template che hai inviato.whatsapp.template.rejectedMeta rejected a template: rejection reason in the payload.
Il fallback su SMS è un attributo, non una seconda integrazione.
Se WhatsApp non riesce a consegnare — sessione scaduta, destinatario senza opt-in, template non ancora approvato — Bird instrada lo stesso messaggio via SMS nella stessa richiesta. Stessa autenticazione, stesso contratto di idempotenza, stesso formato webhook dall'altra parte.
WhatsApp con fallback.
await bird.whatsapp.send({
to: "+15005550009",
template: "order_shipped",
variables: { order_id: "BRD-49217" },
fallback: "sms",
});
One payload, one auth. Session expiry, opt-in gap, unapproved template: all route through SMS automatically.
SMS diretto.
await bird.sms.send({
from: "Bird",
to: "+15005550006",
text: `Your order BRD-49217 has shipped.`,
category: "transactional",
});
Gli stessi canali, indirizzati direttamente. Usalo quando vuoi il percorso SMS in modo esplicito.