SOP yang baik harus singkat, jelas, dapat diuji, dan punya indikator keberhasilan. Dokumen ini merangkum alur, tanggung jawab, bukti (evidence), serta metrik pengendalian untuk area POS yang paling rawan: harga, stok, refund/void, promo, dan kas. Seluruh contoh artefak di bawah bisa diimpor ke spreadsheet/BI atau sistem Anda.
1. Tata Kelola & Kontrol Internal
- Segregation of Duties (SoD): peminta ≠ penyetuju ≠ eksekutor ≠ reviewer.
- Evidence: setiap perubahan berdampak finansial wajib punya log + lampiran (CSV/JSON, notulen, screenshot, atau tanda tangan digital).
- Cut-off: tetapkan jam cut-off harian (harga, stok, kas) untuk konsistensi laporan.
- Sampling audit: gunakan risk-based sampling (nilai tinggi, kasir/sku outlier).
2. SOP Perubahan Harga (Price Change)
2.1. Alur Singkat
1) Inisiasi: Pricing Manager mengusulkan perubahan (alasan, kategori, target margin).
2) Penelaahan: Finance & Store Ops cek dampak margin & label rak.
3) Persetujuan: Head Retail setujui, beri tanggal efektif & prioritas.
4) Eksekusi: Import pricebook/promo ke backend; sinkron POS sebelum buka.
5) Verifikasi: Uji 5 SKU acak di kasir; foto label rak & capture POS screen.
6) Arsip: Simpan CSV, bukti uji, & ringkasan dampak margin di drive audit.2.2. Template CSV — Log Perubahan Harga
change_id,effective_from,effective_to,sku,old_price,new_price,location,priority,reason,requested_by,approved_by,executed_by,verification_status
PC-2025-11-25,2025-12-01,,GRY-SNCK-INDO-CHIT-68G-0012,4900,4500,STORE-001,90,"Promo awal bulan",mgr_pricing,head_retail,ops_backend,PASSED
2.3. SQL Audit — Harga Berubah Tanpa Otorisasi
-- price_changes(change_id, sku, new_price, effective_from, approved_by)
-- pricebook_current(sku, price, source_change_id)
SELECT pb.sku, pb.price, pb.source_change_id
FROM pricebook_current pb
LEFT JOIN price_changes pc ON pc.change_id = pb.source_change_id
WHERE pc.approved_by IS NULL OR pc.approved_by = '';2.4. Kebijakan
- Setiap perubahan harga normal wajib bertanggal efektif & dapat ditelusuri (traceable).
- Label rak diganti sebelum toko buka; mismatch ditangani dengan honor lowest policy (opsional, sesuai kebijakan perusahaan).
3. SOP Stock Opname & Penyesuaian
3.1. Tahap Opname
Pra-Opname: beku transaksi / tetapkan cut-off; cetak daftar hitung; segel area.
Hitung: dua tim, silang; tanda tangan petugas & supervisor.
Rekonsiliasi: telusuri selisih > ambang; foto bukti; investigasi shrink root cause.
Penyesuaian: jurnal adjustment (kode sebab); persetujuan manajer.
Rilis: buka kembali transaksi; laporan shrink% & tindakan perbaikan.3.2. Template CSV — Hasil Opname
count_batch,date,location,sku,system_qty,physical_qty,uom,counter,supervisor,delta_reason,evidence_link
STK-2025-W48,2025-11-30,STORE-001,GRY-DRNK-UHT-INDO-250-0007,240,238,PCS,team_a,spv_1,"selisih rak bawah",https://drive.link/bukti3.3. SQL Audit — Shrink Outlier
-- stock_count & stock_balance_view seperti sesi sebelumnya
SELECT c.location, c.sku,
b.system_qty, c.physical_qty,
(c.physical_qty - b.system_qty) AS diff_qty,
100.0*(c.physical_qty - b.system_qty)/NULLIF(b.system_qty,0) AS diff_pct
FROM stock_count c
JOIN stock_balance_view b USING(location, sku)
WHERE ABS(100.0*(c.physical_qty - b.system_qty)/NULLIF(b.system_qty,0)) > 5
ORDER BY ABS(diff_pct) DESC;3.4. Kode Alasan Adjustment
EXP = Expired/FEFO
BRK = Breakage/Rusak
WST = Waste/Sampah
MSC = Miscellaneous (jelaskan)4. SOP Refund, Return & Void
4.1. Keputusan Singkat
Refund/Return: barang & uang kembali (set stok + jurnal refund).
Exchange: barang diganti (stok bertambah/berkurang sesuai selisih).
Void: batalkan sebelum pembayaran (jejak audit tetap wajib).
Otorisasi: kasir tidak boleh refund/void tanpa PIN supervisor.4.2. Template CSV — Register Refund/Void
event_id,event_time,cashier_id,store_id,type,order_id,ref_order_id,sku,qty,amount,reason,approved_by,attachments
EVT-2025-11-23-010,2025-11-23T14:22,USR-CA01,STORE-001,REFUND,SO-2025-11-23-010,SO-2025-11-23-004,GRY-SNCK-INDO-CHIT-68G-0012,1,4900,"Salah ukuran",USR-SPV1,gs://drive/bukti.jpg
EVT-2025-11-23-011,2025-11-23T15:02,USR-CA02,STORE-001,VOID,SO-2025-11-23-012,,,0,0,"Scan ganda",USR-SPV1,4.3. SQL Audit — Kasir dengan Void Berlebih
SELECT cashier_id, COUNT(*) AS voids_today
FROM events
WHERE event_time::date = CURRENT_DATE AND type = 'VOID'
GROUP BY cashier_id
ORDER BY voids_today DESC;5. SOP Promo & Loyalty
5.1. Alur Eksekusi
1) Brief tujuan & KPI (lift, basket, ROI).
2) Draft rules (conditions/benefits), prioritas, stacking.
3) UAT sandbox: 5 skenario + konflik.
4) Publikasi: sinkron POS; label rak; pelatihan kasir.
5) Monitoring harian: redeem rate, margin, customer complaint.
6) Post-mortem: hitung lift & ROI; arsip CSV/JSON & evaluasi.5.2. JSON — Berita Acara Aktivasi Promo
{
"promo_id": "RUL-0003",
"name": "Mix&Match 3 Chips",
"approved_by": "head_retail",
"effective": {"from": "2025-12-10T00:00:00+07:00", "to": "2025-12-24T23:59:59+07:00"},
"priority": 80,
"stackable": true,
"uat_evidence": ["gs://drive/uat_case1.png","gs://drive/uat_case2.png"],
"go_live_check": ["price_check_pos","label_rak","kasir_briefing"],
"kpi": {"target_lift_pct": 12, "max_margin_erosion_pct": 2.5}
}5.3. SQL Audit — Promo Stacking di Luar Kebijakan
-- sales_discounts(order_id, rule_id, discount_value, stack_flag)
SELECT order_id, COUNT(*) AS n_rules, SUM(discount_value) AS total_disc
FROM sales_discounts
GROUP BY order_id
HAVING MAX(stack_flag) = false AND COUNT(*) > 1;6. SOP Kontrol Kasir & Penutupan Shift
6.1. Alur
Open Shift: input kas awal; cek perangkat (printer, scanner).
Operasi: X report tengah hari; pantau void/diskon outlier.
Close Shift (Z): hitung kas fisik; rekonsiliasi tender; setoran bank; arsipkan Z report.6.2. Rumus Selisih Kas
# over_short = cash_physical_end - (cash_start + cash_sales - cash_payouts - cash_refunds)6.3. Kebijakan Ambang (Threshold)
Ambang selisih kas (per shift): ±0.3% dari penjualan tunai atau Rp 25.000 (ambil yang lebih besar).
Di atas ambang = investigasi wajib + pembinaan sesuai aturan perusahaan.6.4. CSV — Rekap Z Report Harian
store_id,shift_id,cashier_id,open_time,close_time,cash_start,cash_sales,card_sales,qr_sales,voucher_sales,cash_payouts,cash_refunds,cash_physical_end,over_short,bank_deposit,reviewer
STORE-001,SF-2025-11-23-1,USR-CA01,2025-11-23T08:00,2025-11-23T16:00,500000,5200000,4600000,1500000,230000,120000,0,5705000,55000,5650000,aud_ops7. Audit Trail, Retensi Data, & Kepatuhan
7.1. Skema Event Minimal
{
"event_id":"EVT-...","time":"2025-11-23T16:05:00+07:00",
"actor":{"user_id":"USR-CA01","role":"cashier"},
"type":"PRICE_OVERRIDE|MANUAL_DISCOUNT|VOID|REFUND|LOGIN|PROMO_APPLY|PAYMENT_CHANGE",
"context":{"order_id":"SO-...", "sku":"...", "amount":500, "reason":"..."},
"ip":"10.10.10.5","device":"POS-01","signature":"sha256:..."
}7.2. Retensi Data (Rekomendasi)
- Transaksi & Z report: lima tahun (atau mengikuti regulasi pajak setempat).
- Event audit trail: dua tahun minimum.
- Data pelanggan: sesuai kebijakan privasi; minimisasi & enkripsi saat istirahat (at-rest).
8. Matriks RACI (Tanggung Jawab)
| Proses | Owner (R) | Approver (A) | Support (C) | Reviewer (I) |
|---|---|---|---|---|
| Perubahan Harga | Mgr Pricing | Head Retail | Finance, Store Ops | Internal Audit |
| Opname & Adjustment | Store Ops | Head Ops | IT/Inventory | Finance |
| Refund/Void | Supervisor Kasir | Store Manager | Customer Service | Internal Audit |
| Promo & Loyalty | Marketing | Head Retail | Pricing, IT | Finance |
| Penutupan Shift | Kasir | Supervisor | Store Ops | Finance |
9. Risk Register Mini (Likelihood × Impact)
| Risiko | Dampak | Likelihood | Kontrol Utama | Indikator Dini |
|---|---|---|---|---|
| Harga salah | Margin turun, komplain | Sedang | Pricebook bertanggal efektif; uji POS | Diskon manual melonjak |
| Shrink tinggi | Kerugian persediaan | Sedang | FEFO, cycle count mingguan | Selisih opname > ambang |
| Void/Refund disalahgunakan | Kehilangan pendapatan | Rendah–Sedang | PIN supervisor; audit event | Void rate kasir outlier |
| Fraud promo | Erosi margin | Rendah | Limit redeem; non-stackable kritis | Redeem rate anomali |
| Selisih kas | Temuan audit | Sedang | Threshold & pembinaan | Over/short berulang |
10. Checklist Audit Bulanan & Triwulanan
10.1. Bulanan
□ Sampling price change vs label rak
□ Evaluasi shrink% per kategori & supplier
□ Review top 10 kasir: void/refund/diskon manual
□ Rekonsiliasi tender EDC/QR vs POS
□ Uji restore data & backup laporan10.2. Triwulanan
□ Uji SoD & akses user (aktif/non-aktif)
□ Audit promo: lift, ROI, breakage
□ Stress test opname (surprise count)
□ Refresh SOP & pelatihan singkat
□ Peninjauan retensi & kebijakan privasi11. Template Form & Dokumen
11.1. Form Persetujuan Perubahan Harga (ringkas)
Judul: Persetujuan Perubahan Harga
Alasan: ....................................................
SKU/Produk: ................................................
Harga Lama → Baru: Rp .... → Rp ....
Lokasi & Tanggal Efektif: ..................................
Dampak Margin (estimasi): .................................%
Lampiran: CSV pricebook, label rak, bukti uji POS
Pemohon (R): ............ Tanggal: ......
Penyetuju (A): .......... Tanggal: ......
Reviewer (I): ........... Tanggal: ......11.2. Form Insiden Selisih Kas (ringkas)
Shift/Store: .................... Kasir: ...............
Over/Short: Rp .......... Ambang: Rp ..........
Penyebab Sementara: .......................................
Tindakan Korektif: ........................................
Supervisor: ............. Tanggal: .......................Kesimpulan
Dengan SOP yang tegas, RACI yang jelas, log dan retensi data yang disiplin, serta audit berbasis metrik, operasional retail dapat bergerak cepat tanpa kehilangan kendali. Terapkan artefak CSV/JSON/SQL di atas sebagai bukti dan tulang punggung kontrol — maka laporan akurat, margin terlindungi, dan audit menjadi proses rutin yang tertib, bukan “pemadaman kebakaran”.