# Produk dan Checkout

Biver memisahkan katalog produk dari pesanan. Satu produk bisa dipasang di banyak landing page. Satu pesanan mencatat satu pembelian dari satu pembeli.

## Bagian aplikasi yang terlibat

| Area | Fungsi |
| --- | --- |
| Menu **Produk** | Kelola katalog produk per workspace. Salin tautan beli tiap produk. |
| Menu **Pesanan** | Baca dan kelola pesanan yang masuk. |
| Menu **Kupon** | Buat kode potongan harga. |
| Builder | Pasang bagian **Daftar produk** di landing page. |
| Halaman checkout | Menerima pesanan dari pembeli. |

## Data produk

Setiap produk punya:

- Nama
- Slug (nama pendek untuk alamat)
- Deskripsi
- Harga
- Harga coret (harga pembanding)
- Gambar
- Status aktif atau nonaktif
- Penanda barang fisik dan berat dalam gram. Berat wajib diisi untuk barang fisik.

Menambah produk tidak membuat pesanan. Pesanan baru muncul setelah pembeli menyelesaikan checkout.

## Cara pembeli sampai ke checkout

Ada dua jalan. Keduanya membuka halaman checkout toko Anda dengan produk yang dipilih.

1. **Tombol Beli Sekarang di landing page.** Pasang bagian **Daftar produk** dan pilih produk dari katalog. Setiap produk katalog punya tombol **Beli Sekarang**. Pembeli menekan tombol itu dan masuk ke checkout dengan produk tersebut.
2. **Tautan beli dari menu Produk.** Buka menu **Produk**, lalu tekan **Salin tautan beli** pada produk yang Anda pilih. Tempel tautan itu di WhatsApp, iklan, profil media sosial, atau tombol di landing page.

Pembeli tidak perlu punya akun. Produk harus aktif. Atur minimal satu metode pembayaran di **Pengaturan > Pembayaran** sebelum Anda membagikan tautan.

## Data pesanan

Setiap pesanan memuat:

| Data | Fungsi |
| --- | --- |
| Kode pesanan | Nomor unik pesanan. Tampil di daftar pesanan dan di email. |
| Halaman | Landing page tempat pembeli memulai checkout, bila ada. |
| Data pembeli | Nama, email, nomor telepon, dan isian tambahan dari checkout. |
| Item | Produk yang dibeli, harga, dan jumlah. Order bump ikut di sini. |
| Rincian total | Subtotal, diskon kupon, ongkir, biaya COD, dan total. |
| Cara bayar | Transfer Manual, Pembayaran Otomatis, Pembayaran Online, atau Bayar di Tempat (COD). |
| Alamat dan nomor resi | Hanya untuk barang fisik. |
| Status | Salah satu status di bagian Status pesanan. |
| Mata uang | Rupiah (`IDR`). |

Klik kode pesanan di menu **Pesanan** untuk membuka detail pesanan.

## Produk lewat integrasi

Anda bisa mengelola produk dari sistem lain memakai kunci API workspace. Lihat [REST API](/docs/rest-api) atau [Hubungkan ke Asisten AI](/docs/mcp-ai-assistant).

## Alur checkout publik

1. Pembeli membuka checkout lewat tombol **Beli Sekarang** atau lewat tautan beli.
2. Pembeli mengisi data dan memilih cara bayar, lalu mengirim pesanan.
3. Biver membuat pesanan dan menghitung total di server.
4. Pesanan muncul di menu **Pesanan**.

## Kaitan dengan pembayaran

Checkout penjual memakai DOKU atau doit.id untuk pembayaran online. Pembeli juga bisa memilih transfer manual atau bayar di tempat (COD). Cara memasang doit.id ada di [Pembayaran dengan doit.id](/docs/doit-id). Pesanan dan pembayaran dicatat terpisah:

- Pesanan adalah pembelian yang masuk.
- Status pembayaran berubah lewat kabar dari DOKU atau doit.id, atau lewat konfirmasi penjual.

Jadi menu **Pesanan** menampilkan pesanan beserta statusnya, bukan daftar faktur.

## Halaman checkout pembeli

Tombol **Beli Sekarang** dan tautan beli membuka halaman `/checkout/{slug-workspace}`. Tautannya membawa produk dan jumlahnya, misalnya `?products={id}:2`.

1. Halaman memuat toko, metode pembayaran, dan produk aktif dari satu permintaan.
2. Pembeli mengisi nama, email, dan nomor telepon, lalu memilih metode pembayaran.
3. Server membuat pesanan. Harga selalu diambil dari katalog produk, bukan dari browser pembeli.
4. Metode `Pembayaran Otomatis` dan `Pembayaran Online` mengarahkan pembeli ke halaman DOKU. Metode `QRIS dan Virtual Account` mengarahkan pembeli ke halaman doit.id, lalu kembali ke halaman status pesanan di Biver. Metode `Transfer Manual` menampilkan rekening penjual. Metode `Bayar di Tempat (COD)` membuat pesanan yang menunggu konfirmasi penjual.

Barang fisik meminta alamat bila penjual mengaktifkan ongkir. Lihat [Ongkir & Pengiriman](/docs/shipping).

### Rincian total

Total dihitung hanya di server:

```
total = subtotal - diskon kupon + ongkir + biaya COD
```

- Semua angka dalam Rupiah bulat. Diskon persen dibulatkan ke bawah.
- Harga, ongkir, dan diskon dari browser tidak pernah dipakai. Browser hanya mengirim total yang dilihat pembeli, supaya server bisa mendeteksi perubahan (galat `409 TOTAL_CHANGED`).
- Total di bawah Rp1 ditolak.
- Produk yang nonaktif atau tidak ditemukan membuat pesanan ditolak.
- Pengiriman ulang dengan `clientRequestId` yang sama mengembalikan pesanan yang sudah ada, bukan pesanan baru.

### Batas pesanan per hari

Plan membatasi jumlah pesanan per hari (hari kalender WIB). Pesanan berstatus dibatalkan, gagal, atau kedaluwarsa tidak dihitung. Saat batas tercapai, pembeli melihat "Toko ini sedang tidak menerima pesanan baru. Silakan coba lagi besok." Pembeli tidak melihat angka batasnya.

## Kupon

Penjual membuat kupon di menu **Kupon**.

- **Jenis:** persen (1 sampai 100, dengan batas diskon maksimal opsional) atau nominal tetap.
- **Syarat:** belanja minimal, kuota pemakaian, batas per pembeli (menurut nomor telepon), tanggal mulai dan berakhir, dan cakupan produk.
- Kode disimpan huruf besar, 3 sampai 32 karakter (`A-Z`, `0-9`, `_`, `-`). Pembeli boleh mengetik huruf kecil.
- Satu kupon per pesanan. Kupon hanya memotong harga produk. Kupon tidak memotong ongkir, biaya COD, atau order bump.
- Pemakaian dicatat saat pesanan dibuat dan aman terhadap pembelian yang bersamaan: kuota tidak pernah terlampaui.
- Pesanan yang dibatalkan, gagal, atau kedaluwarsa melepas kuponnya. Pesanan COD yang diretur **tidak** melepas kupon.
- Kode yang salah, nonaktif, kedaluwarsa, atau belum mulai menampilkan pesan yang sama: "Kode kupon tidak valid atau sudah tidak berlaku."
- Kupon yang sudah pernah dipakai tidak dihapus. Kupon itu dinonaktifkan.

## Order bump

Order bump adalah satu penawaran produk tambahan di checkout, berupa kotak centang "Ya, tambahkan {produk} hanya {harga}".

- Penjual mengatur satu bump aktif di Pengaturan > Pembayaran: produk bump, produk pemicu (kosong berarti semua produk), judul, deskripsi, dan harga bump (kosong berarti harga katalog).
- Harga bump diambil dari server. Bump yang dicentang masuk ke total, berat ongkir (bila barang fisik), dan daftar item dengan penanda `kind: "bump"`.
- Bump tidak ikut dasar diskon kupon.
- Pembeli yang tidak mencentang bump membeli seperti biasa.

Pesanan yang dibuat lewat halaman ini muncul di menu **Pesanan**.

## Status pesanan

Setiap perubahan status lewat satu aturan transisi. Pesanan non-COD:

| Dari | Ke | Oleh |
| --- | --- | --- |
| Menunggu Bayar | Dibayar | Webhook DOKU atau doit.id (online), atau penjual lewat Konfirmasi Pembayaran (transfer manual) |
| Menunggu Bayar | Gagal, Kedaluwarsa | Webhook DOKU atau doit.id |
| Kedaluwarsa | Dibayar | Webhook doit.id, bila pembeli membayar setelah batas waktu |
| Menunggu Bayar | Dibatalkan | Penjual |
| Dibayar | Diproses, Dikirim | Penjual |
| Dibayar | Dibatalkan | Penjual (transfer manual, DOKU milik sendiri, dan doit.id) |
| Dibayar | Dibatalkan | Webhook doit.id, setelah Anda mengembalikan seluruh dana |
| Diproses | Dikirim, Selesai | Penjual |
| Dikirim | Diterima Pembeli | Penjual |
| Diterima Pembeli | Selesai | Penjual |

Pesanan COD:

| Dari | Ke | Oleh |
| --- | --- | --- |
| Menunggu Konfirmasi | Dikonfirmasi, Dibatalkan | Penjual |
| Dikonfirmasi | Dikirim, Dibatalkan | Penjual |
| Dikirim | Diterima Pembeli, Retur | Penjual |
| Diterima Pembeli | Dana COD Diterima | Penjual |

Status akhir tidak punya transisi keluar: Selesai, Dana COD Diterima, Retur, Dibatalkan, Gagal, dan Kedaluwarsa.

Aturan lain:

- Status `Dibayar` tidak bisa diisi lewat pengubahan status biasa. Pakai tombol **Konfirmasi Pembayaran** untuk transfer manual.
- Pesanan `Biver Gateway` yang sudah dibayar tidak bisa dibatalkan, karena Biver tidak melakukan refund otomatis.
- Pesanan COD tidak memakai dompet Biver dan tidak kena fee Biver. Tidak ada baris dompet untuk pesanan COD.
- Kabar pembayaran yang datang terlambat tidak mengubah pesanan yang sudah diproses atau selesai.
- Setiap perubahan status tercatat di Riwayat Status pada detail pesanan.

## API eksternal

Integrasi dengan kunci API bisa membaca pesanan lengkap dengan subtotal, diskon, ongkir, biaya COD, kupon, dan kurir. Integrasi juga bisa menyaring pesanan berdasarkan status dan cara bayar.

Integrasi bisa mengubah status pesanan, menambah catatan, dan mengisi nomor resi. Biver menolak status yang tidak cocok dengan cara bayar pesanan itu.

Detailnya ada di [REST API](/docs/rest-api).

## Notifikasi

Pesanan memicu email ke tim dan ke pembeli. Pengaturannya ada di **Pengaturan > Notifikasi**.

| Kejadian | Penerima |
|---|---|
| Pesanan baru dengan transfer manual | Tim: owner, admin, dan staf |
| Pesanan baru dengan bayar di tempat (COD) | Tim: owner, admin, dan staf |
| Pesanan dibayar (lewat gateway atau konfirmasi manual) | Tim, kecuali orang yang melakukan konfirmasi |
| Pesanan diterima | Pembeli, untuk semua metode pembayaran. Pembeli COD yang tidak mengisi email tidak menerima email. |
| Pembayaran diterima | Pembeli |

- Satu saklar **Pesanan baru (transfer manual dan bayar di tempat)** mengatur email pesanan baru untuk kedua cara bayar.
- Pesanan gateway yang belum dibayar tidak dikirim ke tim, supaya kotak masuk tidak penuh.
- Email pembeli memuat rincian pesanan. Untuk transfer manual, email memuat rekening dan instruksi Anda. Untuk gateway, email memuat tautan bayar DOKU atau doit.id.
- Isi **Email kontak penjual** dan **WhatsApp penjual** di **Pengaturan > Notifikasi** agar pembeli bisa bertanya. Email kontak menjadi alamat balasan.
- Pengaturan > Pembayaran juga meminta nomor WhatsApp penjual, untuk tombol konfirmasi pesanan COD. Kolom di Notifikasi terisi dari nomor itu saat masih kosong. Kedua nomor disimpan terpisah.
- Email pembeli adalah pemberitahuan, bukan faktur pajak. Teks yang Anda isi tidak diubah menjadi tautan.
- Webhook yang diulang tidak menambah email. Setiap kejadian hanya dikirim sekali per penerima.
- Paket Usaha ke atas dapat menambah notifikasi WhatsApp lewat WhatsApp Business Cloud API milik Anda sendiri. Biaya pesan ditagih Meta, dan template harus disetujui Meta lebih dulu.

## Tips

- Jangan ubah slug produk setelah produk dipakai di otomasi atau integrasi.
- Pastikan produk yang dipasang di halaman berasal dari workspace halaman itu.
- Pisahkan page promosi dan katalog besar ke workspace berbeda supaya laporan order lebih mudah dibaca.

## Pasang notifikasi WhatsApp untuk tim

Cara termudah menerima kabar lead dan pesanan adalah email. Email sudah aktif tanpa persiapan.

WhatsApp butuh akun WhatsApp Business milik Anda sendiri dari Meta. Ikuti langkah ini:

1. Siapkan akun WhatsApp Business di Meta dan satu nomor telepon untuk mengirim pesan.
2. Salin ID nomor telepon dan token akses dari akun Meta Anda.
3. Buat template pesan di Meta. Pilih kategori **utility** dan bahasa Indonesia.
4. Isi template dengan tiga variabel: jenis kabar, rujukan, dan tautan dasbor.
5. Tunggu Meta menyetujui template.
6. Buka **Pengaturan > Notifikasi**. Isi ID nomor telepon, token akses, nomor tujuan, dan nama template.
7. Simpan, lalu tekan **Kirim tes**.

Meta menagih biaya pesan ke akun Anda.
