Version 2.0 — Architecture Document
31 Maret 2026
| Stack | Elixir / Phoenix / LiveView / PostgreSQL |
| Scale | 1.000 resi/hari, 300 SKU, multi-warehouse |
| Domain | Frozen food e-commerce, Indonesia |
| Platforms | TikTok Shop, Shopee, Mengantar, POS |
| Industry Ref | ShipBob, ShipHero, Cin7, A2X, Lokad |
STEP 1: FULFILLMENT ORDER (Kepala Packing) │ Pilih order yang mau dikirim → pilih gudang │ System auto-generate: Pick List (group by Area + SKU) │ Status: pick_requested │ STEP 2: APPROVAL (Kepala Gudang) │ Review Pick List → Approve pengeluaran barang │ TTD digital sebagai bukti otoritas │ Status: approved │ → Print Pick List untuk dibawa ke area │ STEP 3: PICKING (Picker/Staff Gudang) │ Ambil barang per Area sesuai Pick List │ Confirm qty yang diambil (actual vs requested) │ Catat discrepancy jika ada │ Status: picked │ STEP 4: PACKING (Packer — PIC Assigned) │ Scan order → verify items cocok │ Tempel resi → pack │ SETIAP RESI DI-TRACK SIAPA YANG PACK │ → Kalau salah packing = penalty ke packer │ Status: packed │ STEP 5: SORT BY EKSPEDISI │ Group paket by kurir (JNE, J&T, SiCepat, dll) │ BUKAN by platform (Shopee/TikTok/Mengantar) │ → Driver kurir datang, ambil 1 pile saja │ STEP 6: COURIER HANDOVER (Anti-Fraud) │ Manifest serah terima per kurir │ TTD staff gudang + TTD driver kurir │ → Sebelum handover = tanggung jawab gudang │ → Sesudah handover = tanggung jawab kurir │ Status: handed_over │ STEP 7: SIDE EFFECTS (System) │ → Stock deduction (FEFO lot consumption) │ → Journal generation (penjualan + HPP) │ → Audit trail │ → Order status: dikirim
TANPA RESERVATION: 09:00 — Stok Ayam: 50 09:01 — 30 order masuk (butuh 30) 09:02 — 25 order lagi masuk (butuh 25) 09:03 — Total butuh 55, stok cuma 50 → 5 order gagal DENGAN RESERVATION: 09:00 — Stok Ayam: 50 (available: 50) 09:01 — 30 order → reserve 30 (available: 20) 09:02 — 25 order → reserve 20, TOLAK 5 (sold out) → Gak ada false promise ke customer
| Konsep | Keterangan |
|---|---|
| Physical Stock | Total stok fisik di gudang |
| Reserved Stock | Sudah di-claim oleh order, belum di-pick |
| Available Stock | Physical - Reserved = yang bisa dijual |
| Allocated Stock | Sudah di-assign ke fulfillment order / pick list |
Order 3 item, item C habis: → Opsi 1: Ship item A+B (partial), item C jadi backorder → Opsi 2: Hold semua sampai item C tersedia → Owner/admin decide (bukan auto) Entity: FulfillmentOrderItem.qty_fulfilled bisa < qty_requested
STEP 1: PO Created (sudah ada) │ STEP 2: Supplier Deliver ke Gudang │ Bisa via: sopir pabrik ATAU kurir pihak ketiga │ STEP 3: RECEIVE & INSPECT (Goods Receipt Note) │ ┌──────────────────────────────────────────┐ │ │ GOODS RECEIPT NOTE (GRN) │ │ │ GRN-260331-001 │ │ │ │ │ │ Supplier: PT Frozen Food Indo │ │ │ PO Ref: PO2603-00005 │ │ │ Driver: Pak Joko (sopir pabrik) │ │ │ │ │ │ Item PO Diterima Selisih │ │ │ Forbest Ayam 1kg 500 498 -2 │ │ │ Nugget Original 200 200 0 │ │ │ │ │ │ Catatan: 2 pcs kemasan bocor │ │ │ │ │ │ [TTD Staff Gudang] [TTD Sopir/Kurir] │ │ │ │ │ │ Copy 1: Gudang simpan │ │ │ Copy 2: Sopir bawa balik ke pabrik │ │ └──────────────────────────────────────────┘ │ STEP 4: Stock In │ → Lot created (FEFO: cost + expiry date) │ → product.stok += qty_received │ → stock_transaction: inbound │ → Journal: Dr. Persediaan / Cr. Hutang (atau Kas) │ STEP 5: Shelve ke Area → Staff taruh barang di Area yang ditentukan
| Jenis | Sopir Pabrik | Kurir Pihak Ketiga |
|---|---|---|
| GRN Copy Balik? | WAJIB — sopir bawa copy ke pabrik | Gak perlu — kurir cuma antar |
| Risiko Fraud | Tinggi — sopir bisa ambil stok | Rendah — kurir gak akses barang |
| TTD | Staff gudang + Sopir | Staff gudang saja (+ bukti terima) |
Notification masuk → Paket tiba di gudang → Inspect kondisi BAIK (bisa dijual lagi): → Stok masuk + lot restore → Reverse piutang + reverse fee → Dr. Retur Penjualan / Cr. Piutang + Cr. Fee RUSAK (gak bisa dijual): → Stok masuk ke area "rusak" → Jurnal kerugian → Dr. Kerugian Barang Rusak / Cr. Persediaan HILANG (paket gak sampai): → Gak ada stok masuk → Klaim ke kurir → Dr. Piutang Klaim Kurir / Cr. Persediaan
Alasan: Cacat, expired, salah kirim, kelebihan
KALAU PO = UTANG (belum bayar):
→ Potong hutang
→ Dr. Hutang Usaha / Cr. Persediaan
KALAU PO = CASH (sudah bayar):
Opsi 1 — Refund uang:
→ Dr. Kas / Cr. Persediaan
Opsi 2 — Ganti barang:
→ Supplier kirim replacement → receive sebagai inbound baru
| Skenario | Action | Jurnal |
|---|---|---|
| Refund (uang kembali) | Marketplace handle refund | Dr. Retur Penjualan / Cr. Kas |
| Ganti barang | Kirim baru tanpa payment | Dr. Beban Ganti Barang / Cr. Persediaan |
"Surat Perintah Pengeluaran Barang" — batch of orders to fulfill
| Field | Type | Keterangan |
|---|---|---|
| id | string | FO2603-00012 (auto-generated) |
| org_id | FK | Multi-tenant |
| warehouse_id | FK | Gudang mana yang fulfill |
| status | enum | draft → pick_requested → approved → picking → picked → packing → shipped → completed |
| requested_by | FK user | Kepala packing |
| approved_by | FK user | Kepala gudang (TTD digital) |
| approved_at | datetime | Kapan di-approve |
| notes | text | Catatan |
| Field | Type | Keterangan |
|---|---|---|
| fulfillment_order_id | FK | |
| order_id | FK | Sales order |
| order_item_id | FK | Specific item in order |
| qty_requested | integer | Qty yang diminta |
| qty_fulfilled | integer | Qty aktual (bisa partial) |
| status | enum | pending → fulfilled → partial → cancelled |
"Bon Pengeluaran Gudang" — aggregate per SKU per Area
| Field | Type | Keterangan |
|---|---|---|
| id | string | PL2603-00012 |
| fulfillment_order_id | FK | |
| warehouse_id | FK | |
| assigned_to | FK user | Picker |
| approved_by | FK user | Kepala gudang TTD |
| approved_at | datetime | |
| status | enum | pending → approved → picking → completed |
| Field | Type | Keterangan |
|---|---|---|
| pick_list_id | FK | |
| product_id | FK | |
| sku | string | |
| warehouse_area | string | "Area 1", "Area 2", dst |
| qty_needed | integer | Total dari semua order di batch |
| qty_picked | integer | Aktual yang diambil |
| picked_at | datetime |
1 resi = 1 shipment. Track packer PIC.
| Field | Type | Keterangan |
|---|---|---|
| id | string | SHP-260331-00412 |
| order_id | FK | Sales order |
| fulfillment_order_id | FK | |
| no_resi | string | Tracking number |
| courier | string | JNE, J&T, SiCepat, dll |
| packed_by | FK user | PIC packer — accountability |
| packed_at | datetime | |
| verified_items | boolean | Scan verification passed? |
| handover_id | FK | Courier handover manifest |
| status | enum | created → packed → handed_over → in_transit → delivered |
Manifest serah terima — anti-fraud document
| Field | Type | Keterangan |
|---|---|---|
| id | string | HO-260331-JNT-001 |
| org_id, warehouse_id | FK | |
| courier | string | Nama ekspedisi |
| total_packages | integer | Jumlah paket diserahkan |
| handed_by | FK user | Staff gudang |
| received_by_name | string | Nama driver kurir |
| handed_at | datetime | |
| status | enum | prepared → handed_over |
| notes | text |
| Field | Type | Keterangan |
|---|---|---|
| shipment_id | FK | |
| packer_id | FK user | Siapa yang salah |
| type | enum | wrong_item, wrong_qty, damaged_pack, wrong_label, missing_item |
| penalty_points | integer | |
| reported_by | FK user | |
| evidence | text | Foto/catatan |
| Field | Type | Keterangan |
|---|---|---|
| id | string | GRN-260331-001 |
| org_id, warehouse_id | FK | |
| po_id | FK | Reference PO |
| supplier_id | FK | |
| delivery_type | enum | factory_driver, third_party_courier |
| driver_name | string | Nama sopir/kurir |
| received_by | FK user | Staff gudang yang terima |
| inspected_by | FK user | Yang cek kualitas |
| requires_return_copy | boolean | true = sopir pabrik (perlu copy balik) |
| status | enum | draft → confirmed → completed |
| notes | text |
| Field | Type | Keterangan |
|---|---|---|
| grn_id | FK | |
| product_id | FK | |
| qty_ordered | integer | Dari PO |
| qty_received | integer | Aktual diterima |
| qty_rejected | integer | Ditolak (rusak/cacat) |
| rejection_reason | string | |
| expiry_date | date | Untuk FEFO lot |
OUTBOUND
Sales Order ──→ Fulfillment Order ──→ Pick List ──→ Shipment ──→ Courier Handover
│ │ │
└── FO Items └── PL Items ├── packed_by (PIC)
(per order item) (per SKU/Area) ├── no_resi
└── Packing Incident
INBOUND
Purchase Order ──→ Goods Receipt Note ──→ Stock In ──→ Lot Created (FEFO)
│
└── GRN Items (qty_ordered vs qty_received vs qty_rejected)
RETURNS
Return Record ──→ Inspect ──→ Baik (stock in + reverse) / Rusak (loss) / Hilang (claim)
Supplier Return ──→ Stock Out ──→ Potong hutang / Refund / Replacement
| Fase | Penanggung Jawab | Bukti |
|---|---|---|
| Barang di gudang | Kepala Gudang | Pick List approved |
| Barang di-pick | Picker (assigned) | Pick confirmed + qty |
| Barang di-pack | Packer (PIC) | Shipment.packed_by |
| Barang di area ekspedisi | Staff gudang | Sort by courier |
| Diserahkan ke driver | Staff + Driver | Handover manifest (TTD) |
| In transit | Kurir | Tracking number |
| Delivered | Kurir | POD (proof of delivery) |
| Risiko | Mitigasi |
|---|---|
| Sopir pabrik ambil stok (kirim 498, bilang 500) | GRN dengan TTD sopir. Copy balik ke pabrik. Selisih terdeteksi. |
| Staff gudang catat lebih (terima 498, catat 500) | Dual sign-off (receiver + inspector). Cek silang dengan PO. |
| Barang rusak gak dilaporkan | qty_rejected field + rejection_reason. Bukti tertulis. |
| Data dari Fulfillment | Analytics Output |
|---|---|
| Outbound per SKU per hari per gudang | Demand rate, days of stock, reorder point |
| Inbound (PO → GRN → receive) | Supplier lead time, supplier reliability, damage rate |
| Returns (RTS inspect results) | Return rate per SKU, return rate per courier |
| Stock levels (per SKU per gudang) | ABC-XYZ classification, inventory turnover |
| Campaign history | Promotional uplift per product per campaign type |
| New product sell-through | Hot/normal/slow signal |
| Metric | Formula | Target |
|---|---|---|
| Reorder Point | (Daily Demand × Lead Time) + Safety Stock | Gak pernah stockout untuk A-class products |
| Days of Stock | Current Stock / Daily Demand | 7-14 hari (frozen food constraint) |
| Inventory Turnover | HPP / Average Inventory | >6× per tahun |
| Fill Rate | Orders fulfilled / Orders received | >98% |
| Pick Accuracy | Correct picks / Total picks | >99.5% |
| Supplier Lead Time | Avg days dari PO → GRN | Per supplier tracking |
| Supplier Fulfillment Rate | Qty received / Qty ordered | >98% |
Per SKU per gudang, track:
• Demand rate (berapa terjual per hari di gudang ini)
• Current stock
• Days remaining
Rekomendasi:
• Next PO alokasi proporsional:
Gudang A demand 60% → alokasi 60% dari PO
Gudang B demand 40% → alokasi 40%
• Transfer inter-gudang kalau 1 gudang kritis, yang lain surplus
| Aspek | Detail |
|---|---|
| Apa | Triple exponential smoothing — decompose demand jadi: level (baseline), trend (naik/turun), seasonality (pola berulang). Ada 2 variant: additive dan multiplicative. |
| Siapa pakai | Shopify (built-in forecast), Inventory Planner (Shopify app), CPG companies (Unilever, P&G sebelum adopt ML) |
| Kapan pakai | Produk dengan demand stabil dan ada pola seasonal (mingguan, bulanan, tahunan). Butuh min 12 bulan data. |
| Relevansi LabaBersih | Tinggi untuk baseline. Frozen food Indonesia punya seasonal: Ramadan (spike), Lebaran (drop), weekend (naik), payday 25-1 (naik). Tapi TIDAK bisa handle TikTok Live spikes — butuh promotional uplift di atasnya. |
| Limitasi | Spikes promosi dianggap noise dan di-smooth out. Butuh base+campaign separation. |
| Aspek | Detail |
|---|---|
| Apa | Metode untuk intermittent demand — estimasi terpisah antara ukuran demand (saat terjadi) dan interval antar demand. Menghindari masalah rata-rata yang ditarik turun oleh banyak hari zero-demand. |
| Siapa pakai | SAP IBP, Oracle Supply Chain, Blue Yonder. Awalnya dari militer/defense logistics (spare parts NATO). |
| Kapan pakai | SKU yang >50% hari punya zero demand. Long-tail products, niche items. |
| Relevansi LabaBersih | Moderate. Dengan 300 SKU dan 1000 order/hari, rata-rata SKU jual ~3.3/hari. Tapi 50-80 SKU di bottom tier kemungkinan jual 0-1/hari — Croston's relevan untuk ini. |
| Prioritas | Tier 3 — implement saat handle >500 SKU. |
| Aspek | Detail |
|---|---|
| Apa | Short-horizon forecasting (1-14 hari) yang ingest real-time signals: POS data, web traffic, social media trends, cuaca. Adjust demand plan secara dinamis, bukan monthly/weekly. |
| Siapa pakai |
Amazon: Anticipatory shipping — kirim produk ke warehouse SEBELUM customer order, based on browsing behavior. Walmart: "One Version of Truth" — POS data dari 4.700 toko real-time. Reduce forecast error 15-20%. P&G: Early adopter, reduce error 35% untuk top SKU. Coca-Cola: Demand sensing + weather data (hari panas = lebih banyak minuman). |
| Tools |
Blue Yonder Luminate Demand Edge (gold standard). Clients: Starbucks, PepsiCo. o9 Solutions "Digital Brain". Clients: Google, Walmart, Estee Lauder. SAP IBP. Clients: Nestlé, BASF. Lokad (mid-market, probabilistic). |
| Relevansi LabaBersih | Sangat tinggi secara konsep, tapi harus right-sized. LabaBersih bukan Fortune 500. Tapi sinyal yang available sangat valuable: TikTok trending, add-to-cart rates, campaign calendar, payday cycle. Lightweight version: monitor daily velocity per SKU, detect anomaly >2σ, alert seller. |
| Aspek | Detail |
|---|---|
| Apa | Pisahkan observed sales jadi base demand (tanpa promo) + promotional uplift (demand tambahan dari promo). Kritis karena promo yang gak di-account bikin baseline forecast noisy. |
| Siapa pakai |
Walmart Labs: Causal forecasting — attribute sales lift ke specific promo mechanics. Tesco (dunnhumby): Pioneer promotional effectiveness modeling. Predict uplift per promo type per category. Blue Yonder: "Promotion Optimization" module. Nielsen/IRI: Trade promotion optimization untuk CPG. |
| Key concepts |
Cannibalization: Promo Ayam 1kg steal sales dari Ayam 500g. Halo effect: Promo 1 produk lift traffic → beli produk lain. Forward buying: Customer beli banyak saat promo → demand turun setelahnya. Price elasticity: Seberapa besar demand change per % discount. |
| Relevansi LabaBersih | Kritis. TikTok Live + Shopee flash sale = promo-heavy. Demand during Live bisa 10-50× normal. Tanpa separation, forecast akan overstock di hari biasa dan understock di hari promo. |
| Aspek | Static Safety Stock | Dynamic Safety Stock |
|---|---|---|
| Kalkulasi | Monthly/quarterly | Daily/weekly (rolling window) |
| Demand variability | Fixed σ | Rolling or weighted σ |
| Lead time | Fixed assumption | Variable, per supplier |
| Promo spikes | Causes overstock setelah promo | Adapt dalam 1-2 minggu |
| Siapa pakai | Basic ERP (Odoo, ERPNext) | Amazon, Walmart, Blue Yonder, o9 |
| Best for | Stable demand, few SKU | Volatile demand, many SKU |
ABC (Value contribution — Pareto 80/20):
| Class | Definisi | Persentase SKU | Kontribusi Revenue |
|---|---|---|---|
| A | Top performers | ~20% (60 SKU) | ~80% revenue |
| B | Mid-tier | ~30% (90 SKU) | ~15% revenue |
| C | Long tail | ~50% (150 SKU) | ~5% revenue |
XYZ (Demand predictability — Coefficient of Variation):
| Class | CV Range | Karakteristik | Forecast Method |
|---|---|---|---|
| X | CV < 0.5 | Stabil, predictable | Moving Average / Holt-Winters |
| Y | CV 0.5-1.0 | Variable, seasonal/trending | Dynamic safety stock + uplift |
| Z | CV > 1.0 | Volatile, sporadic | Manual + demand sensing + Croston's |
| X (Stabil) | Y (Variable) | Z (Volatile) | |
|---|---|---|---|
| A (High value) | AX: Stars Auto-replenish High service level 99% Holt-Winters Contoh: Forbest Ayam 1kg |
AY: Seasonal stars Dynamic safety stock Promo uplift modeling 95-99% service Contoh: Sapi Premium (weekend spike) |
AZ: Problem children Manual oversight Demand sensing Very high safety stock Contoh: Produk viral aktif |
| B (Medium) | BX: Reliable Auto-replenish Moderate SS |
BY: Seasonal mid Periodic review |
BZ: Unpredictable Consider bundling/dropping |
| C (Low value) | CX: Staples Simple reorder rules |
CY: Occasional Accept stockouts |
CZ: Drop candidates Croston's or discontinue |
| Class | Service Level | Safety Stock Strategy | Monitoring |
|---|---|---|---|
| AX | 99% | Low (demand predictable) | Auto-replenish |
| AY | 95-99% | Dynamic (seasonal adjust) | Weekly review |
| AZ | 90-95% | High tapi bounded by shelf life | Daily monitoring |
| BX-BY | 90-95% | Moderate | Bi-weekly |
| CX-CZ | 85-90% | Minimal | Monthly / on-demand |
| Type | Planned (Manageable) | Unplanned (Accept Risk) |
|---|---|---|
| Contoh | TikTok Live sendiri, Flash Sale Shopee, Promo harga, Harbolnas | Affiliate random promote, FYP algoritma, Customer review viral, Kompetitor habis stok |
| Bisa diantisipasi? | Ya — kita yang set tanggal + harga | Tidak — terjadi tanpa warning |
| Stock planning | Plan sebelum campaign berdasarkan historical | Detect cepat → respond |
| System response | Campaign planner + auto PO suggestion | Spike detection + alert + decision support |
SEBELUM CAMPAIGN:
1. Pilih produk + set harga campaign
2. System cek historical campaign serupa:
"Live terakhir harga 39rb → sold 250 pcs"
3. System suggest stock preparation:
"Butuh 330 pcs, available 150, PO 200 pcs"
"Supplier lead time 5 hari → PO paling lambat [tanggal]"
4. Auto-create PO suggestion
SAAT CAMPAIGN:
5. Monitor actual vs estimated real-time
6. Alert kalau actual >> estimated (butuh emergency PO?)
SETELAH CAMPAIGN:
7. Record actual volume, duration, platform
8. Calculate accuracy (actual/estimated)
9. Feed back ke future campaign estimates
DETECT (Realtime):
current_demand = orders hari ini untuk SKU X
expected_demand = moving average 14 hari
IF current_demand > expected_demand × 2:
→ SPIKE DETECTED → Alert
ANALYZE (System bantu):
Platform breakdown: "TikTok +407%, Shopee +87%"
Cek campaign calendar: "Gak ada campaign hari ini"
→ Kesimpulan: UNPLANNED spike
DECIDE (Owner — BUKAN auto):
Scenario planner:
• Beli 300 pcs → Rp 13.5jt → cover 1.5 hari
• Beli 700 pcs → Rp 31.5jt → cover 4 hari
• Monitor besok → zero cost → risk stockout
FROZEN FOOD CONSTRAINT:
Overstock = expire = RUGI
→ System harus kasih warning shelf life
LEARN (Setelah spike selesai):
Record: duration, peak, total volume, source
→ Improve scenario planner untuk spike berikutnya
STAGED APPROACH:
Batch 1 (Test): 100 pcs
Monitor sell-through rate vs benchmark produk baru
Benchmark: produk baru rata-rata jual 8% stock in 3 hari
IF actual > benchmark × 3:
→ HOT SIGNAL → Alert: "Produk ini 7.7× di atas rata-rata"
→ Suggest immediate reorder
IF actual < benchmark × 0.5:
→ SLOW SIGNAL → "Pertimbangkan stop restock"
Batch 2 (Scale — kalau hot):
Qty = actual run rate × 14-30 hari
Batch 3 (Sustain):
Sudah ada cukup data → switch ke standard forecast
campaign_plans:
id, org_id, product_id
campaign_type: "tiktok_live" | "flash_sale" | "ads_push" | "price_cut" | "bundle"
campaign_date, duration_days
campaign_price, normal_price
estimated_volume (auto-suggest dari historical)
actual_volume (post-campaign)
po_id (PO yang dibuat untuk campaign)
status: planning → stock_ready → active → completed
accuracy_pct (actual/estimated × 100)
demand_snapshots (daily, per SKU per warehouse):
product_id, warehouse_id, date
qty_ordered, qty_shipped
source_breakdown: jsonb {tiktok: N, shopee: N, mengantar: N}
is_spike: boolean
spike_event_id: FK
spike_events:
product_id
detected_at, started_at, ended_at
peak_demand, total_volume, duration_days
source: "planned_campaign" | "organic_surge" | "unknown"
campaign_id: FK (kalau planned)
response: "po_created" | "monitored" | "dismissed"
po_id: FK
outcome_notes
new_product_tracking:
product_id
first_po_date, initial_stock
benchmark_sell_through
actual_sell_through
signal: "hot" | "normal" | "slow"
signal_detected_at
| Method | Cara Kerja | Siapa Pakai | Relevansi |
|---|---|---|---|
| Analogous Product | Cari produk existing yang mirip (kategori, harga, target customer). Pakai demand history produk itu sebagai proxy. Adjust untuk perbedaan. | P&G, Blue Yonder ("Like Modeling"), Amazon | Tinggi — paling praktis untuk LabaBersih. "Mochi baru ini mirip Nugget Original" → pakai demand Nugget sebagai baseline × adjustment factor. |
| Test-and-Learn | Launch dengan stock kecil di channel terbatas. Ukur actual demand 2-4 minggu. Scale based on observed velocity. | Amazon (private label), Zara (small batch → measure → scale/kill in 2-3 weeks) | Sangat tinggi — cocok untuk frozen food (risk expire kalau over-order). Batch 1 kecil, scale kalau hot. |
| Attribute-based | Decompose produk jadi atribut (kategori, price point, brand, berat). Build regression: demand = f(attributes). | Nielsen, Amazon (at scale) | Moderate — butuh banyak data history. Nanti kalau LabaBersih punya 50+ product launches. |
Saat seller tambah produk baru: 1. Prompt: "Produk ini mirip dengan produk mana?" → dropdown existing products 2. Show reference product's daily demand 3. Seller input adjustment: "Lebih laku / Sama / Kurang laku" 4. System suggest: initial batch = reference demand × adjustment × 14 hari 5. After 2-4 minggu real data → switch ke actual demand-based forecast 6. Hot signal detection active dari hari pertama
Setiap pattern dalam dokumen ini di-cross-reference dengan SaaS/tools yang sudah proven:
| Pattern LabaBersih | Industry Reference | Confidence |
|---|---|---|
| Pick → Pack → Ship separation | ShipBob, ShipHero, Logiwa, Cin7, Manhattan Associates | Standard |
| Batch/Wave picking | ShipBob, ShipHero, Manhattan Associates | Standard |
| Fulfillment Order terpisah dari Sales Order | Shopify (Fulfillment entity), ShipBob (Work Order) | Standard |
| Shipment entity terpisah | ShipStation (Shipment), Shopify (Fulfillment) | Standard |
| Packer tracking (PIC) | ShipHero (packer performance dashboard) | Standard |
| Pick list grouped by zone/area | SkuVault, Logiwa, ShipHero — "zone picking" | Standard |
| Barcode scan verification | ShipHero, ShipBob | Standard |
| Carrier manifest / end-of-day | ShipStation, EasyPost, Shippo | Standard |
| Partial fulfillment | Shopify, ShipBob, Cin7 | Standard |
| Goods Receipt Note (GRN) | SAP, Dear Inventory, Cin7, NetSuite — ISO 9001 | Standard |
| Stock reservation | Shopify, ShipBob, Amazon | Standard |
| ABC-XYZ classification | Amazon, Zalando, Tesco, Lokad, Blue Yonder | Standard |
| Dynamic safety stock | Amazon, Walmart, Blue Yonder, o9 | Standard |
| Promotional uplift modeling | Walmart Labs, Tesco/dunnhumby, Blue Yonder | Standard |
| Demand sensing (lightweight) | Amazon, Walmart, P&G, Coca-Cola | Standard |
| NPI via analogous product | P&G, Blue Yonder ("Like Modeling"), Amazon | Standard |
| Kepala gudang approval (TTD digital) | SAP WMS (enterprise). Bukan standard di mid-market SaaS. | Custom (valid) |
| TTD digital driver kurir | Standard di 3PL Indonesia. Bukan standard di SaaS barat. | Custom (valid) |
| Penalty point system packer | ShipHero track accuracy %, tapi bukan formal "penalty point". | Custom (valid) |
| Tool | Focus | Pricing | Relevansi LabaBersih |
|---|---|---|---|
| Inventory Planner | Demand forecast + reorder for Shopify | $99-249/mo | Closest competitor in concept. Tapi: single-channel, no FEFO, no marketplace-specific. LabaBersih advantage: multi-platform, Indonesian market, integrated accounting, FEFO. |
| Lokad | Probabilistic forecasting + supply chain optimization | $2K-10K+/mo | Intellectually superior (probabilistic > point forecast). Terlalu complex untuk target market. Tapi konsep probabilistic patut dipinjam: show range bukan single number. |
| Blue Yonder | Full demand planning suite (enterprise) | $100K+/yr | Reference architecture. Fitur yang bisa di-simplify: demand sensing, Like Modeling, promo optimization, ABC-XYZ. |
| ShipBob | 3PL + WMS for DTC e-commerce | Per order pricing | Fulfillment flow reference (Pick → Pack → Ship). Packer tracking. Multi-warehouse. |
| ShipHero | WMS for e-commerce | $1,850+/mo | Closest WMS reference. Batch picking, pack station, packer performance, carrier manifest. |
| Cin7 | Inventory + order management | $349+/mo | Feature set paling mirip LabaBersih scope. Multi-warehouse, PO, returns, basic forecasting. |
| Method | Inventory Planner | Lokad | Blue Yonder | LabaBersih (target) |
|---|---|---|---|---|
| Holt-Winters | ✅ | ✅ | ✅ | ✅ Tier 2 |
| Croston's | — | ✅ | ✅ | ○ Tier 3 |
| Demand Sensing | — | ✅ | ✅ | ✅ Tier 1 (lightweight) |
| Promotional Uplift | — | ✅ | ✅ | ✅ Tier 1 |
| ABC-XYZ | Simplified | ✅ | ✅ | ✅ Tier 1 |
| Dynamic Safety Stock | ✅ | ✅ | ✅ | ✅ Tier 1 |
| NPI (analogous) | — | — | ✅ Like Modeling | ✅ Tier 2 |
| Probabilistic | — | ✅ (core) | ✅ | ○ Tier 3 |
| FEFO-aware | — | ✅ | — | ✅ MOAT |
| Level | Feature | Reference | Effort |
|---|---|---|---|
| MUST | Fulfillment Order entity (terpisah dari Sales Order) | Shopify, ShipBob | Medium |
| MUST | Pick List generation (group by Area + SKU) | ShipHero, Logiwa | Medium |
| MUST | Shipment entity (1 resi = 1 shipment, track PIC packer) | ShipStation, ShipHero | Medium |
| MUST | Courier Handover manifest (anti-fraud) | ShipStation end-of-day, 3PL standard | Low |
| MUST | Goods Receipt Note / GRN (inbound with TTD) | SAP, Dear Inventory, ISO 9001 | Medium |
| MUST | Stock Reservation (prevent oversell) | Shopify, Amazon | Medium |
| SHOULD | Partial fulfillment | Shopify, Cin7 | Medium |
| SHOULD | Packing Incident tracking | ShipHero accuracy metrics | Low |
| NICE | Wave planning (advanced batch grouping) | Manhattan Associates | Low |
| NICE | Pack verification (scan item, bukan scan order) | ShipBob, ShipHero | Low |
| Tier | Feature | Reference | Effort |
|---|---|---|---|
| Tier 1 | ABC-XYZ Classification (auto-classify monthly) | Amazon, Lokad, Blue Yonder | Medium |
| Tier 1 | Dynamic Safety Stock + Reorder Points (FEFO-aware) | Amazon, o9 Solutions | Medium |
| Tier 1 | Spike Detection (lightweight demand sensing) | Amazon, Walmart concept simplified | Low |
| Tier 1 | Campaign Planner (planned promo stock preparation) | Blue Yonder Promo Optimization | Medium |
| Tier 1 | New Product Hot Signal detection | Amazon test-and-learn, Zara | Low |
| Tier 2 | Holt-Winters baseline forecast (seasonal) | Shopify, Inventory Planner | Medium |
| Tier 2 | NPI via Analogous Product | P&G, Blue Yonder Like Modeling | Low |
| Tier 2 | Supplier Scorecard (lead time, reliability) | SAP, Oracle, Coupa | Low |
| Tier 2 | Multi-warehouse demand allocation | ShipBob, Cin7 | Medium |
| Tier 3 | Croston's Method (intermittent demand) | SAP IBP, Blue Yonder | Low |
| Tier 3 | Probabilistic forecasting (ranges vs point) | Lokad (core approach) | High |
LabaBersih v2 — Fulfillment & Inventory Intelligence Architecture
Document version 1.0 | 31 Maret 2026
Industry references: ShipBob, ShipHero, ShipStation, Cin7, Lokad, Blue Yonder, Inventory Planner, Amazon, Walmart, SAP IBP, o9 Solutions
Forecasting references: Holt-Winters (1960), Croston (1972), ABC-XYZ Analysis, Demand Sensing (2010s)