Dokumentasi ini merinci spesifikasi teknis untuk mengintegrasikan sistem Quinos POS dengan backend Raeye. Data dalam dokumen ini adalah spesifikasi final yang sudah diimplementasikan pada server produksi.
Semua request wajib menggunakan protokol keamanan Bearer Token. Tanpa header ini, permintaan akan ditolak
dengan status 401 Unauthorized.
Authorization: Bearer RAEYE_MAPI_2526
| Parameter | Type | Description |
|---|---|---|
user_id |
string | Unique UID member dari Firebase / lookup handshake. |
subtotal |
int | Wajib. Nilai Sub Bill (tagihan murni makanan & minuman SETELAH DISKON ITEM, SEBELUM pajak dan service charge). Menjadi acuan mutlak batas maksimal pemotongan poin (maksimal 50% dari subtotal) dan dasar perhitungan cashback poin. |
total_bill |
int | Total tagihan akhir yang dibayarkan customer (termasuk pajak & service). Digunakan untuk akumulasi total spending member (syarat naik tier). |
amount |
int | Nominal rupiah/poin yang ingin dipotong pada request SPENT. |
points_used / points_spent |
int | Nominal poin yang dipotong pada bill tersebut. Maksimal 50% dari subtotal. Bagian yang dibayar pakai poin tidak mendapat cashback. |
wallet_used / wallet_spent |
int | Nominal saldo deposit Wallet yang digunakan. Pembayaran via Wallet (hingga 100%) TIDAK MENDAPATKAN CASHBACK POIN (0 Pts), namun TETAP MENAMBAH TOTAL SPENDING MEMBER untuk syarat kenaikan tier. |
wallet_balance |
int | Saldo deposit uang riil member di Wallet (IDR). |
current_points |
int | Saldo reward poin aktif milik member. |
tier_name |
string | Nama tier member (SETH, ANUBIS, HORUS, AMUN RA, RA). |
discount_rate |
float | Besaran diskon langsung (0.00 - 1.00). Contoh: 0.05 untuk 5% diskon. |
type |
string | Wajib. Jenis transaksi: SPENT (potong saldo), EARN (tambah poin/tutup bill), atau TOPUP (isi saldo). |
method |
string | Wajib. Metode loyalty: points (Loyalty Points) atau wallet (Deposit Saldo). |
receipt_number |
string | Nomor struk/invoice unik dari mesin Quinos POS. |
items |
array | Daftar rincian item pesanan (nama menu, qty, price) untuk disimpan ke histori aplikasi member. |
Cashback poin dihitung otomatis berdasarkan Bill Total (Closed Bill) sesuai Tier Member:
| Rank | Discount | Cashback | Calculation |
|---|---|---|---|
| SETH | 0% | 5% | (Subtotal) x 0.05 |
| ANUBIS | 0% | 10% | (Subtotal) x 0.10 — Spend ≥ 20 Juta / 3 bulan |
| HORUS | 0% | 12.5% | (Subtotal) x 0.125 — Spend ≥ 100 Juta / 6 bulan |
| AMUN RA | 0% | 15% | (Subtotal) x 0.15 |
| RA | 5% | 15% | (Subtotal - 5%) x 0.15 |
Untuk memberikan kejelasan menyeluruh bagi developer pihak ketiga (Third Party POS), berikut adalah alur kerja mutlak (lifecycle) dari saat Bill dibuka hingga ditutup (Closed Bill).
POS kasir menginput nomor WhatsApp customer. POS memanggil endpoint
GET /v1/members/lookup untuk menarik user_id, sisa saldo Wallet, sisa
Poin, dan Tier member. Data ini disimpan sementara di dalam memory POS untuk Bill tersebut.
Jika customer menggunakan saldo Wallet atau Poin sebagai pemotong tagihan,
POS WAJIB memanggil endpoint POST /v1/pos/transaction dengan parameter
"type": "SPENT". POS harus memverifikasi bahwa respons dari API Raeye adalah sukses
sebelum struk dicetak.
Setelah pembayaran dilunasi sepenuhnya dan Bill berstatus
Closed, POS WAJIB memanggil POST /v1/pos/transaction
dengan parameter "type": "EARN". Pada fase ini, POS mengirimkan nominal pembelanjaan (untuk dihitung cashback-nya) sekaligus dapat mengirimkan array items (daftar pesanan menu) dalam satu payload yang sama agar tersimpan di histori member.
{
"status": "success",
"data": {
"user_id": "UID88",
"full_name": "ERICK J",
"tier_name": "RA",
"wallet_balance": 5000000,
"current_points": 1200000,
"max_point_usage": 600000,
"cashback_rate": 0.15,
"discount_rate": 0.05
}
}
Endpoint ini digunakan Quinos untuk memotong saldo Poin Loyalty atau saldo Wallet (Deposit) member saat proses pembayaran di kasir.
Pada transaksi pemotongan poin (method: "points", type: "SPENT"), mohon menyertakan parameter subtotal (nilai Sub Bill sebelum tax & service). Parameter ini digunakan oleh sistem Raeye untuk memvalidasi batas pemotongan poin (maksimal 50% dari nilai subtotal tagihan).
| Parameter | Type | Status | Penjelasan & Aturan |
|---|---|---|---|
user_id |
string | Wajib | ID unik member dari hasil handshake/lookup. |
method |
string | Wajib | Pilih "points" untuk Loyalty Points, atau "wallet" untuk Saldo Deposit. |
type |
string | Wajib | Isi dengan "SPENT" untuk pemotongan saldo. |
amount |
int | Wajib | Nominal poin / rupiah yang ingin dipotong dari saldo member. |
subtotal |
int | Wajib (Khusus Poin) | Nilai Sub Bill makanan & minuman (setelah diskon item, sebelum tax & service). Poin yang dipotong maksimal 50% dari nilai subtotal ini. |
receipt_number |
string | Wajib | Nomor struk / invoice kasir POS Quinos. |
Contoh format JSON untuk pemotongan poin member:
{
"user_id": "UID88",
"method": "points",
"type": "SPENT",
"amount": 50000, // Nominal poin yang ingin dipotong (Maksimal 50% dari subtotal)
"subtotal": 200000, // Wajib (Khusus Poin): Nilai Sub Bill setelah diskon item, sebelum tax & service
"receipt_number": "QS-INV-001"
}
{
"status": "success",
"message": "Transaction Processed Successfully",
"data": {
"type": "SPENT",
"method": "points",
"value": 50000,
"receipt": "QS-INV-001",
"updated_user": {
"user_id": "UID88",
"full_name": "ERICK J",
"tier_name": "SETH",
"current_points": 1200000,
"wallet_balance": 5000000
}
}
}
Format JSON untuk pemotongan saldo deposit Wallet member (bisa hingga 100% tagihan):
{
"user_id": "UID88",
"method": "wallet",
"type": "SPENT",
"amount": 250000, // Nominal rupiah saldo wallet yang dipotong
"receipt_number": "QS-INV-001"
}
{
"status": "success",
"message": "Transaction Processed Successfully",
"data": {
"type": "SPENT",
"method": "wallet",
"value": 250000,
"receipt": "QS-INV-001",
"updated_user": {
"user_id": "UID88",
"full_name": "ERICK J",
"tier_name": "SETH",
"current_points": 1250000,
"wallet_balance": 4750000
}
}
}
Wajib dipanggil saat Bill di Quinos ditutup (Closed). Endpoint ini berfungsi ganda: menghitung cashback secara otomatis berdasarkan subtotal (jika tidak menggunakan wallet), dan (opsional) menerima array items daftar pesanan menu untuk disimpan ke dalam history aplikasi member Raeye.
Fasilitas Khusus: Parameter total_bill bersifat opsional. Jika Quinos tidak mengirimkannya, sistem akan otomatis menyamakannya dengan subtotal agar perhitungan tier member berjalan akurat.
{
"user_id": "UID88",
"method": "points",
"type": "EARN",
"total_bill": 1110000, // Total tagihan akhir (termasuk tax/service)
"subtotal": 1000000, // Net sales setelah diskon item, sebelum tax/service
"points_used": 50000, // Poin yang digunakan memotong bill (isi 0 jika tidak pakai poin)
"wallet_used": 0, // Saldo wallet yang digunakan (jika > 0, cashback poin otomatis 0)
"receipt_number": "QS-INV-001",
"items": [
{
"name": "Wagyu Steak",
"qty": 1,
"price": 150000
},
{
"name": "Ice Lemon Tea",
"qty": 2,
"price": 25000
}
]
}
{
"status": "success",
"message": "Transaction Processed Successfully",
"data": {
"type": "EARN",
"method": "points",
"value": 50000,
"receipt": "QS-INV-001",
"updated_user": {
"user_id": "UID88",
"full_name": "ERICK J",
"tier_name": "SETH",
"current_points": 1250000,
"max_point_usage": 625000,
"wallet_balance": 5000000
}
}
}
| Category | Rule | POS Implementation |
|---|---|---|
| Wallet Spending | Full Usage (100% incl. Tax) | Boleh dipotong sampai saldo Wallet Rp 0. Pembayaran belanja menggunakan Wallet TIDAK MENDAPATKAN CASHBACK POIN (0 Pts), namun TETAP MENAMBAH AKUMULASI SPENDING MEMBER untuk syarat kenaikan tier. |
| Points Spending | Maksimal 50% Subtotal | Maksimal potong poin adalah 50% dari nilai Subtotal tagihan (setelah diskon, sebelum tax & service). Porsi yang dibayar menggunakan poin TIDAK mendapatkan cashback lagi. Cashback dihitung murni dari: (subtotal - points_used) * cashback_rate. |
| Wallet Top-Up | Admin Only | POS dilarang melakukan penambahan saldo Wallet secara mandiri. |
Member Tier: SETH (Cashback 5%)
Subtotal Belanja (Setelah Diskon, Sblm Tax): Rp 1.000.000
Step 1: Tamu potong poin maksimal (Rp 500.000 = 50% dari Subtotal).
Step 2: Tamu bayar sisa Cash Rp 500.000 + Tax.
Step 3: Quinos lapor penambahan poin dengan data: subtotal: 1000000,
points_used: 500000, wallet_used: 0.
Hasil Akhir: Poin baru tamu adalah (1.000.000 - 500.000) x 5% = 25.000 Poin.
Member Tier: ANUBIS (Cashback 10%)
Subtotal Belanja (Setelah Diskon, Sblm Tax): Rp 1.000.000
Step 1: Tamu bayar full Cash Rp 1.000.000 + Tax.
Step 2: Quinos lapor penambahan poin dengan data: subtotal: 1000000,
points_used: 0, wallet_used: 0.
Hasil Akhir: Poin baru tamu adalah (1.000.000 - 0) x 10% = 100.000 Poin.
Member Tier: HORUS (Cashback 12.5%)
Saldo Wallet: Rp 2.000.000
Subtotal Belanja (Setelah Diskon, Sblm Tax): Rp 1.000.000
Step 1: Tamu bayar full pakai Wallet (bisa cover 100% tagihan beserta tax).
Step 2: Quinos lapor penambahan poin dengan data: subtotal: 1000000,
points_used: 0, wallet_used: 1000000.
Hasil Akhir: Sesuai aturan bisnis, transaksi menggunakan saldo Wallet TIDAK MENDAPATKAN CASHBACK POIN (0 Poin). Namun, nominal belanja Rp 1.000.000 TETAP MENAMBAH AKUMULASI SPENDING MEMBER untuk syarat kenaikan tier.
Member Tier: RA (Discount 5%, Cashback 15%)
Subtotal Awal: Rp 1.000.000
Step 1 (POS Side): Quinos memberikan diskon langsung 5% (Rp 50.000).
Step 2 (POS Side): Tamu membayar tagihan berdasarkan subtotal baru: Rp 950.000 + Tax.
Step 3 (API Report): Quinos lapor ke Raeye dengan subtotal: 950000, wallet_used: 0.
Hasil Akhir (Raeye Backend): Member mendapatkan 15% dari 950rb = 142.500 Poin.
Sistem akan mengembalikan pesan error dalam JSON saat gagal. Berikut kodenya:
| HTTP Status | Kategori | Penjelasan Umum |
|---|---|---|
400 Bad Request |
Transaction Error | Poin melebihi limit 50% Subtotal, saldo Wallet/Poin tidak cukup, atau parameter kurang (misal subtotal kosong). |
401 Unauthorized |
Security | Header `Authorization: Bearer` kosong atau salah/expired. |
404 Not Found |
Data Missing | Nomor HP tidak ditemukan atau user_id tidak valid di database. |
500 Internal Server Error |
System Crash | Kesalahan sistem di Backend Raeye (wajib lapor ke tim Raeye). |
Daftar periksa teknis untuk memastikan integrasi berjalan sempurna sebelum Go-Live:
| Handshake Success: Bisa narik data member via nomor WhatsApp di awal transaksi. | |
| Safety Validation: Sistem POS memblokir jika input pemotongan Poin > 50% dari Subtotal tagihan. | |
| Double-Debit Prevention: Request pemotongan hanya dikirim 1x per Bill. | |
Final Report: Endpoint /pos/transaction dengan type
EARN wajib dipanggil di
akhir agar user dapet cashback.
|
|
Bearer Token: Semua header request mengandung
Authorization: Bearer ...
|