# Event status pesan WhatsApp

Bird mencatat **event** untuk pesan WhatsApp masuk dan keluar. Lini masa keluar menunjukkan apa yang terjadi setelah pengiriman mengembalikan `202`: penerimaan, penyerahan ke WhatsApp, pengiriman, pembacaan, atau kegagalan. Lini masa masuk mencatat kapan Bird menerima pesan.

Halaman ini membahas cara membaca timeline tersebut melalui API. Agar Bird mengirim setiap event ke endpoint Anda saat terjadi, lihat [webhook status pesan](/docs/guides/whatsapp/webhooks/message-status). Reaksi memiliki riwayat tersendiri, yang dibahas di [Event reaksi](/docs/guides/whatsapp/events/reactions).

## Event siklus hidup

Event muncul dalam urutan kronologis. Pesan keluar dapat berhenti di [`whatsapp.failed` atau `whatsapp.rejected`](#event-kegagalan), dan event `whatsapp.read` muncul hanya jika penerima membuka pesan. Lini masa masuk dimulai dengan `whatsapp.received` dan dapat mencatat `whatsapp.read` setelah workspace Anda menandai pesan sebagai dibaca.

| Event                | Arti                                                               |
| -------------------- | ------------------------------------------------------------------ |
| `whatsapp.accepted`  | Bird menerima permintaan kirim. Ini yang dilaporkan `202`.         |
| `whatsapp.sent`      | Bird menyerahkan pesan ke jaringan WhatsApp.                       |
| `whatsapp.delivered` | WhatsApp mengonfirmasi pengiriman ke perangkat penerima.           |
| `whatsapp.read`      | Penerima membuka pesan.                                            |
| `whatsapp.failed`    | Pesan tidak terkirim. `error.code` menjelaskan penyebabnya.        |
| `whatsapp.rejected`  | Bird menolak pesan sebelum mengirimnya. Pesan tidak dikenai biaya. |
| `whatsapp.received`  | Bird menerima pesan masuk dari kontak.                             |

Callback `delivered` atau `read` yang berlaku dapat memicu bagian biaya Meta. Payload event WhatsApp tidak membawa informasi biaya. Baca kembali pesan dengan [`GET /v1/whatsapp/messages/{message_id}`](/docs/api/reference/get-whatsapp-message) untuk melihat biayanya. Lihat [Biaya dan penagihan](/docs/guides/whatsapp/sending-whatsapp#cost-and-billing).

[Menandai pesan masuk sebagai dibaca](/docs/guides/whatsapp/mark-message-as-read) mencatat `whatsapp.read` di lini masanya tetapi tidak mengirimkan webhook konfirmasi baca. Pesan masuk mempertahankan status `received` dan mencatat `read_at` setelah WhatsApp menerima konfirmasi tersebut.

`whatsapp.read` **tidak** mengubah `status` pesan. Pesan yang terkirim tetap `delivered`; pesan juga mencatat pembacaan di `read_at`.

**`whatsapp.delivered` dapat dilewati sepenuhnya.** Ketika penerima sudah membuka chat di perangkatnya, Meta melaporkan pembacaan tanpa pernah melaporkan pengiriman, sehingga lini masa terbaca `whatsapp.accepted` → `whatsapp.sent` → `whatsapp.read` tanpa `whatsapp.delivered` di antaranya. Perlakukan `read` sebagai bukti pengiriman: consumer yang menunggu `delivered` sebelum menganggap pesan sampai akan menggantung tepat pada penerima yang paling cepat melihatnya, dan consumer yang menghitung tingkat pengiriman hanya dari `delivered` akan melaporkan angka lebih rendah dari seharusnya. `status` pesan tetap `sent` dalam kasus ini, karena hanya tanda terima pengiriman yang memajukannya.

Callback hanya-baca tetap dapat memicu biaya Meta yang berlaku. Bird menggunakan satu identitas biaya untuk jalur terkirim dan terbaca; event pengiriman yang tidak ada tidak berarti komponen Meta gratis. Lihat [Biaya dan penagihan](/docs/guides/whatsapp/sending-whatsapp#cost-and-billing).

Daftar tipe event bersifat terbuka: tipe baru dapat ditambahkan seiring waktu, jadi perlakukan nilai yang tidak dikenali sebagai event masa depan, bukan kesalahan.

## Event kegagalan

`whatsapp.failed` dan `whatsapp.rejected` bersifat terminal. **Penolakan** berarti Bird menghentikan pesan sebelum mengirimnya ke WhatsApp, sehingga tidak dikenai biaya. Penyebabnya antara lain [penerima yang disupres atau memilih keluar](/docs/guides/whatsapp/opt-outs), saldo dompet tidak mencukupi, atau tujuan tanpa harga yang dikonfigurasi. **Kegagalan** berarti pesan tidak terkirim, dan `error.code` menjelaskan siapa yang memutuskan hal itu. Sebagian besar kode membawa keputusan WhatsApp, dipetakan dari kode yang dilaporkannya. `internal_error` adalah pengecualian: ia mencatat kredensial pengirim yang tidak tersedia atau percobaan ulang pemrosesan yang habis. Upaya transport yang tidak pasti tidak membuktikan Meta tidak pernah menerima permintaan tersebut. `meta_error_code` berisi kode WhatsApp jika tersedia, dan kegagalan `internal_error` tidak memilikinya secara desain.

Kedua event berisi objek `error` dengan Bird `code` yang stabil, `description` yang dapat dibaca manusia, `meta_error_code` opsional, dan `occurred_at`. Objek ini muncul di catatan API dan payload webhook hanya untuk tipe event ini.

## Membaca event dari API

`GET /v1/whatsapp/messages/{message_id}/events` mengembalikan lini masa dalam urutan kronologis. Daftar terbatas ini tidak dipaginasi. Membaca event memerlukan kunci API dengan `whatsapp:read`:

**TypeScript**

```typescript
const { data } = await bird.whatsapp.listEvents("wa_abc123");
for (const event of data) console.log(event.type, event.occurred_at);
```

Examples: [TypeScript](/id-id/dokumentasi/guides/whatsapp/events/message-status.ts.md) · [Python](/id-id/dokumentasi/guides/whatsapp/events/message-status.py.md) · [Go](/id-id/dokumentasi/guides/whatsapp/events/message-status.go.md) · [PHP](/id-id/dokumentasi/guides/whatsapp/events/message-status.php.md) · [CLI](/id-id/dokumentasi/guides/whatsapp/events/message-status.cli.md) · [MCP](/id-id/dokumentasi/guides/whatsapp/events/message-status.mcp.md) · [cURL](/id-id/dokumentasi/guides/whatsapp/events/message-status.curl.md)

Pesan yang diterima, dikirim, terkirim, dan dibaca mengembalikan empat event:

```json
{
  "data": [
    {
      "id": "ev_01ky7q6a1fejfbvs0myn41hj41",
      "occurred_at": "2026-07-23T14:48:34.71Z",
      "type": "whatsapp.accepted"
    },
    {
      "id": "ev_01ky7q6a2denvtd6jg1vqwmg13",
      "occurred_at": "2026-07-23T14:48:35.671Z",
      "type": "whatsapp.sent"
    },
    {
      "id": "ev_01ky7q6a2zff9r2qm74mmg1g6z",
      "occurred_at": "2026-07-23T14:48:36.642Z",
      "type": "whatsapp.delivered"
    },
    {
      "id": "ev_01ky7q6c21frssf0vj8h50qysw",
      "occurred_at": "2026-07-23T14:48:38.65Z",
      "type": "whatsapp.read"
    }
  ]
}
```

Berikan `type` untuk mengembalikan satu tipe event publik yang tepat, seperti `?type=whatsapp.failed` atau `?type=whatsapp.read`. Abaikan parameter ini untuk mendapatkan lini masa lengkap.

Lini masa yang sama adalah yang dirender halaman [log WhatsApp](/docs/guides/whatsapp/message-log) saat Anda membuka pesan.

![Lembar detail pesan WhatsApp di dasbor Bird, dibuka untuk pesan bird_delivery_update yang terkirim: tab Events menampilkan lini masa siklus hidup per pesan yaitu Accepted, Sent, Delivered, dan Read, masing-masing dengan waktu berlalu dan stempel waktunya, di atas daftar pesan yang diredupkan](/images/docs/dashboard-whatsapp-detail.png)

## Langkah selanjutnya

- [Webhook status pesan](/docs/guides/whatsapp/webhooks/message-status): menerima setiap event saat terjadi
- [Event reaksi](/docs/guides/whatsapp/events/reactions): membaca reaksi terkini dan log reaksi
- [Tandai pesan sebagai dibaca](/docs/guides/whatsapp/mark-message-as-read): mengonfirmasi pesan masuk dan menampilkan indikator mengetik
- [Log WhatsApp](/docs/guides/whatsapp/message-log): tampilan per pesan yang merender lini masa ini
- [Mengirim pesan WhatsApp](/docs/guides/whatsapp/sending-whatsapp): tempat siklus hidup pesan dimulai

## Related resources

- [Connecting WhatsApp to Bird: from buying a number to a live channel](/learn/whatsapp/connecting-whatsapp-to-bird) (video)
- [What is the 24-hour customer service window on WhatsApp?](/explained/whatsapp/what-is-the-24-hour-customer-service-window) (answer)
- [WhatsApp message builder](/tools/whatsapp-message-builder) (tool)
- [WhatsApp](/whatsapp-api) (product)

[Get an implementation brief](/learn/workspace?topic=whatsapp)
