# Ongkir & Pengiriman

Biver menghitung ongkir domestik lewat RajaOngkir API, dengan tarif yang diambil saat perhitungan berjalan. Hasilnya bisa masuk ke total checkout.

## Yang tersedia

- **Ongkir di checkout.** Ongkir masuk ke total pesanan di semua metode bayar. Total selalu dihitung di server.
- Bagian **Cek ongkir** di landing page. Pengunjung memakainya untuk melihat perkiraan ongkir. Hasilnya tidak mengubah total checkout.
- Pelacakan resi lewat bagian yang sama.
- Hitung ongkir dan lacak resi dari integrasi API dan agen AI.

## Ongkir di Checkout

Penjual mengatur pengiriman di **Pengaturan > Pembayaran**, kartu **Pengiriman**. Ada empat mode:

| Mode | Perilaku |
|------|----------|
| Tanpa ongkir | Ongkir 0. Checkout tidak meminta alamat. COD tidak tersedia. |
| Gratis | Ongkir 0. Checkout tetap meminta alamat untuk barang fisik. |
| Tarif tetap | Satu tarif per pesanan, berapa pun jumlah dan beratnya. |
| Hitung otomatis | Ongkir dihitung dari kota asal, tujuan pembeli, berat barang, dan kurir yang penjual izinkan. |

Pengaturan lain di kartu itu:

- **Asal pengiriman.** Dipakai mode Hitung otomatis.
- **Kurir.** Daftar kurir yang boleh dipilih pembeli.
- **Batas gratis ongkir.** Bila subtotal setelah diskon mencapai batas ini, ongkir menjadi 0 untuk mode Tarif tetap dan Hitung otomatis. Kurir yang dipilih tetap tercatat.
- **Ongkir cadangan.** Dipakai bila layanan tarif sedang tidak bisa dihubungi. Pembeli melihat tulisan "Ongkir estimasi". Tanpa ongkir cadangan, pesanan ditolak dengan pesan galat.
- **Nomor WhatsApp penjual.** Dipakai untuk tombol konfirmasi COD.

### Berat produk

Setiap produk punya pengaturan **Barang fisik** dan **Berat (gram)**. Berat wajib diisi (1 sampai 50.000 gram) untuk barang fisik. Produk digital tidak kena ongkir. Pesanan campuran membayar ongkir untuk barang fisik saja.

Server menjumlahkan berat semua barang fisik, lalu membulatkannya ke atas ke kelipatan 100 gram. Berat di atas 50.000 gram ditolak.

### Alur pembeli

1. Pembeli mengetik nama kota atau kecamatan (minimal 3 karakter) dan memilih tujuan dari daftar.
2. Pembeli mengisi alamat jalan dan patokan.
3. Checkout menampilkan pilihan kurir dan harganya. Angka total berubah mengikuti pilihan.
4. Server menghitung ulang ongkir saat pesanan dibuat. Harga dari browser tidak dipakai.

Bila total berubah antara layar dan server, pembeli melihat rincian baru dan menekan tombol lagi.

Tarif disimpan sementara (cache) selama 6 jam. Karena itu tarif di checkout bisa berbeda tipis dari tarif kurir saat itu.

## COD (Bayar di Tempat)

COD adalah metode bayar keempat, selain Transfer Manual, Biver Gateway, dan gateway milik sendiri. COD dinyalakan di kartu **COD** pada Pengaturan > Pembayaran, dan hanya bisa aktif bila mode pengiriman bukan Tanpa ongkir.

Syarat pesanan COD:

- Semua barang adalah barang fisik.
- Pembeli memberi alamat dan nomor ponsel Indonesia yang valid.
- Total tidak melebihi **nilai maksimum COD** bila penjual mengisinya.
- Provinsi tujuan ada di daftar provinsi yang dilayani, bila penjual mengisinya.
- Batas per nomor telepon: jumlah pesanan COD yang masih menunggu, jumlah pesanan COD dalam 24 jam, dan jumlah retur sebelumnya.

Bila salah satu tidak terpenuhi, pembeli melihat "COD tidak tersedia untuk pesanan ini. Silakan pilih metode pembayaran lain." Alasan rincinya tidak ditampilkan ke pembeli.

Penjual bisa menambah **biaya COD** tetap. Biaya itu masuk ke total, tetapi tidak ikut nilai barang untuk pelacakan iklan.

Biver tidak memegang uang COD dan tidak memotong fee dari pesanan COD. Uang COD tidak masuk ke dompet Biver. Penjual menerimanya dari kurir. Pastikan kurir yang Anda pakai melayani COD ke area tujuan. Biver tidak menyaring kurir menurut dukungan COD.

### Alur status COD

| Status | Arti |
|--------|------|
| Menunggu Konfirmasi | Pesanan masuk. Penjual menghubungi pembeli lewat WhatsApp. |
| Dikonfirmasi | Penjual menekan **Konfirmasi pesanan**. |
| Dikirim | Penjual menandai dikirim. Nomor resi boleh diisi. |
| Diterima Pembeli | Kurir menyerahkan barang dan menerima uang tunai. |
| Dana COD Diterima | Uang sudah sampai ke penjual dari kurir. |
| Retur | Pembeli menolak barang. Pesanan dikembalikan. |

Penjual juga bisa **Tolak** atau **Batalkan** pesanan sebelum dikirim. Pembatalan wajib memakai catatan. Pesanan COD tidak kedaluwarsa sendiri. Penjual membatalkannya bila perlu.

Event pelacakan: `add_payment_info` terkirim saat pesanan COD dibuat. `purchase` terkirim saat pesanan **Dikonfirmasi**, bukan saat masuk.

## Cek ongkir di landing page

Penjual menambahkan bagian **Cek ongkir** dari grup **Penjualan** di builder. Lalu penjual mengatur kota asal, kurir yang boleh dipakai, dan berat bawaan dalam gram. Asal pengiriman disimpan di bagian itu, bukan di pengaturan workspace. Bagian ini hanya memberi perkiraan. Ongkir di checkout memakai pengaturan di **Pengaturan > Pembayaran**.

### Cara Menggunakan

1. Pilih **kota tujuan** pengiriman
2. Cek **berat** barang dalam gram
3. Klik **Hitung Ongkir**

Setelah lokasi dipilih, ringkasan rutenya muncul, misalnya "Jakarta → Surabaya".

### Hasil Perhitungan

Semua layanan kurir yang tersedia muncul sekaligus: nama kurir (JNE, TIKI, POS Indonesia, dll.), tipe layanan (REG, YES, OKE, dll.), perkiraan hari pengiriman, dan biayanya dalam Rupiah.

Klik layanan untuk memilihnya. Yang terpilih ditandai highlight dan ikon centang.

## Pencarian Lokasi

Kolom kota memakai autocomplete.

1. Ketik minimal 3 karakter nama kota/kabupaten
2. Dropdown akan menampilkan hasil pencarian
3. Pilih lokasi yang sesuai

Selagi hasil dimuat, dropdown menampilkan skeleton loading.

## Penanganan Error

Pesan yang muncul kalau perhitungan gagal:

| Kondisi | Pesan |
|---------|-------|
| Tidak ada koneksi | "Gagal terhubung ke server. Periksa koneksi internet Anda dan coba lagi." |
| Data tidak valid | "Data pengiriman tidak valid. Periksa kembali lokasi asal, tujuan, dan berat." |
| Rute tidak ditemukan | "Rute pengiriman tidak ditemukan. Coba lokasi lain." |
| Terlalu banyak request | "Terlalu banyak permintaan. Tunggu beberapa saat dan coba lagi." |
| Server error | "Server sedang bermasalah. Coba lagi dalam beberapa menit." |

Ada tombol **Coba Lagi** untuk mengulang perhitungan.

## API Ongkir

Integrasi dengan kunci API bisa:

- Mencari tujuan dari nama kota atau kecamatan.
- Menghitung tarif kurir dari asal, tujuan, dan berat.
- Melacak resi.

Perhitungan lewat integrasi hanya memberi angka. Hasilnya tidak mengubah pesanan atau total checkout. Pesanan dengan ongkir memuat nominal ongkir, kurir, dan layanan yang dipilih. Detailnya ada di [REST API](/docs/rest-api).
