WhatsApp si sta aggiornando

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.

order-shipped.ts
200 · 480ms
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.

1
2
3
4
5
6
7
8
9
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.

  1. 01

    Meta Business Solution Provider (BSP) ufficiale

    Rapporto diretto con Meta da quando esiste l'API. Nessun transito rivenduto, nessun passaggio tramite terzi.

  2. 02

    Gestione dei template

    Invia, monitora lo stato di approvazione e ricevi un webhook non appena Meta approva o rifiuta.

  3. 03

    Gestione della finestra di sessione

    L'SDK ti indica se è consentito il formato libero o il template prima dell'invio.

  4. 04

    Messaggi interattivi

    Buttons, lists, product cards, and WhatsApp Flows, declared in the same payload.

  5. 05

    Media e contenuti rich

    Immagini, video, documenti, posizione, contatti, anteprime link, reazioni e risposte.

  6. 06

    WhatsApp Flows

    Form in-app a più passaggi con validazione backend, definiti in JSON, eseguiti da Meta.

  7. 07

    Click-to-WhatsApp Ads

    Integrazione con Meta Ads Manager: i clic sugli annunci aprono una conversazione a cui puoi rispondere.

  8. 08

    Fallback cross-channel

    Add fallback: "sms" to any send. Session expiry routes through SMS automatically.

  9. 09

    Webhook per messaggi in entrata

    Eventi firmati HMAC per messaggi in entrata, conferme di lettura, reazioni e stato dei template.

  10. 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.

order-shipped.ts
200 · 480ms
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.

POST /webhooks/bird
signed
{
  "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.

whatsapp + 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.

sms
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.

Una tariffa per messaggio, commissione Meta inclusa.

Prezzi in base all'utilizzo. Ogni tariffa comprende la commissione di Meta e la nostra in un unico importo e varia in base al paese di destinazione e alla categoria di messaggio. Nessun costo per utente e nulla che richieda un impegno annuale.

Inizia con un canale.
Aggiungi gli altri quando sei pronto.

Una chiave API di test è subito tua. La produzione si sblocca quando aggiungi un metodo di pagamento e verifichi un mittente.

Usi Claude Code, Cursor o Codex? Copia un prompt di configurazione e il tuo agente installerà la CLI e le skill di Bird per te. Scegli il tuo:

Cursor