Fulfillment & Inventory Intelligence Architecture

Version 2.0 — Architecture Document

31 Maret 2026



StackElixir / Phoenix / LiveView / PostgreSQL
Scale1.000 resi/hari, 300 SKU, multi-warehouse
DomainFrozen food e-commerce, Indonesia
PlatformsTikTok Shop, Shopee, Mengantar, POS
Industry RefShipBob, ShipHero, Cin7, A2X, Lokad

Daftar Isi

  1. Fulfillment Architecture — Outbound
  2. Fulfillment Architecture — Inbound (Supplier)
  3. Return Flows (Customer & Supplier)
  4. Entity Model — Complete
  5. Accountability & Anti-Fraud
  6. Inventory Intelligence — Overview
  7. Forecasting Deep Dive — Methods & References
  8. Demand Classification — ABC-XYZ Framework
  9. Campaign-Driven Demand Management
  10. New Product Introduction (NPI) Forecasting
  11. Industry Reference — Who Uses What
  12. Implementation Priority

1. Fulfillment Architecture — Outbound

Industry Pattern: Pick → Pack → Ship (ShipBob, ShipHero, Logiwa, Cin7, Manhattan Associates).
Semua WMS modern memisahkan 3 fase ini. LabaBersih mengadopsi pattern yang sama.

1.1 Flow Lengkap

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
Kenapa sort by ekspedisi, bukan by platform?
Driver JNE datang → ambil SEMUA paket JNE (dari Shopee, TikTok, Mengantar). 1 pile, 1 manifest. Kalau sort by platform, driver harus cari di 3 pile berbeda.

1.2 Stock Reservation

Industry Standard: Shopify, ShipBob, Amazon — semua menerapkan inventory reservation saat order masuk, sebelum fulfillment dimulai.
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
KonsepKeterangan
Physical StockTotal stok fisik di gudang
Reserved StockSudah di-claim oleh order, belum di-pick
Available StockPhysical - Reserved = yang bisa dijual
Allocated StockSudah di-assign ke fulfillment order / pick list

1.3 Partial Fulfillment

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

2. Fulfillment Architecture — Inbound (Supplier)

Industry Standard: Goods Receipt Note (GRN) — SAP, Oracle, NetSuite, Dear Inventory, Cin7. ISO 9001 requirement untuk manufacturing dan warehouse.

2.1 Flow Lengkap

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
Anti-Fraud — Kenapa GRN dengan TTD Kritis:
Tanpa GRN: sopir kirim 498, bilang 500. Pabrik catat 500, gudang terima 498. Selisih 2 gak ketahuan siapa yang ambil.
Dengan GRN: sopir TTD "serahkan 498" → pabrik bisa investigasi selisih → accountability jelas.

2.2 Dua Jenis Delivery

JenisSopir PabrikKurir Pihak Ketiga
GRN Copy Balik?WAJIB — sopir bawa copy ke pabrikGak perlu — kurir cuma antar
Risiko FraudTinggi — sopir bisa ambil stokRendah — kurir gak akses barang
TTDStaff gudang + SopirStaff gudang saja (+ bukti terima)

3. Return Flows

3.1 Customer Return (RTS — Return to Sender)

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

3.2 Supplier Return

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

3.3 Customer Refund / Replacement

SkenarioActionJurnal
Refund (uang kembali)Marketplace handle refundDr. Retur Penjualan / Cr. Kas
Ganti barangKirim baru tanpa paymentDr. Beban Ganti Barang / Cr. Persediaan

4. Entity Model — Complete

4.1 Outbound Entities

Fulfillment Order

"Surat Perintah Pengeluaran Barang" — batch of orders to fulfill

FieldTypeKeterangan
idstringFO2603-00012 (auto-generated)
org_idFKMulti-tenant
warehouse_idFKGudang mana yang fulfill
statusenumdraft → pick_requested → approved → picking → picked → packing → shipped → completed
requested_byFK userKepala packing
approved_byFK userKepala gudang (TTD digital)
approved_atdatetimeKapan di-approve
notestextCatatan

Fulfillment Order Item

FieldTypeKeterangan
fulfillment_order_idFK
order_idFKSales order
order_item_idFKSpecific item in order
qty_requestedintegerQty yang diminta
qty_fulfilledintegerQty aktual (bisa partial)
statusenumpending → fulfilled → partial → cancelled

Pick List

"Bon Pengeluaran Gudang" — aggregate per SKU per Area

FieldTypeKeterangan
idstringPL2603-00012
fulfillment_order_idFK
warehouse_idFK
assigned_toFK userPicker
approved_byFK userKepala gudang TTD
approved_atdatetime
statusenumpending → approved → picking → completed

Pick List Item

FieldTypeKeterangan
pick_list_idFK
product_idFK
skustring
warehouse_areastring"Area 1", "Area 2", dst
qty_neededintegerTotal dari semua order di batch
qty_pickedintegerAktual yang diambil
picked_atdatetime

Shipment

1 resi = 1 shipment. Track packer PIC.

FieldTypeKeterangan
idstringSHP-260331-00412
order_idFKSales order
fulfillment_order_idFK
no_resistringTracking number
courierstringJNE, J&T, SiCepat, dll
packed_byFK userPIC packer — accountability
packed_atdatetime
verified_itemsbooleanScan verification passed?
handover_idFKCourier handover manifest
statusenumcreated → packed → handed_over → in_transit → delivered

Courier Handover

Manifest serah terima — anti-fraud document

FieldTypeKeterangan
idstringHO-260331-JNT-001
org_id, warehouse_idFK
courierstringNama ekspedisi
total_packagesintegerJumlah paket diserahkan
handed_byFK userStaff gudang
received_by_namestringNama driver kurir
handed_atdatetime
statusenumprepared → handed_over
notestext

Packing Incident

FieldTypeKeterangan
shipment_idFK
packer_idFK userSiapa yang salah
typeenumwrong_item, wrong_qty, damaged_pack, wrong_label, missing_item
penalty_pointsinteger
reported_byFK user
evidencetextFoto/catatan

4.2 Inbound Entity

Goods Receipt Note (GRN)

FieldTypeKeterangan
idstringGRN-260331-001
org_id, warehouse_idFK
po_idFKReference PO
supplier_idFK
delivery_typeenumfactory_driver, third_party_courier
driver_namestringNama sopir/kurir
received_byFK userStaff gudang yang terima
inspected_byFK userYang cek kualitas
requires_return_copybooleantrue = sopir pabrik (perlu copy balik)
statusenumdraft → confirmed → completed
notestext

GRN Item

FieldTypeKeterangan
grn_idFK
product_idFK
qty_orderedintegerDari PO
qty_receivedintegerAktual diterima
qty_rejectedintegerDitolak (rusak/cacat)
rejection_reasonstring
expiry_datedateUntuk FEFO lot

4.3 Entity Relationship Diagram

                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

5. Accountability & Anti-Fraud

5.1 Chain of Custody

FasePenanggung JawabBukti
Barang di gudangKepala GudangPick List approved
Barang di-pickPicker (assigned)Pick confirmed + qty
Barang di-packPacker (PIC)Shipment.packed_by
Barang di area ekspedisiStaff gudangSort by courier
Diserahkan ke driverStaff + DriverHandover manifest (TTD)
In transitKurirTracking number
DeliveredKurirPOD (proof of delivery)
Kalau paket hilang:
• Sebelum handover → tanggung jawab gudang → cek packer (PIC), cek CCTV
• Sesudah handover → tanggung jawab kurir → klaim pakai manifest sebagai bukti serah terima

5.2 Inbound Anti-Fraud (GRN)

RisikoMitigasi
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 dilaporkanqty_rejected field + rejection_reason. Bukti tertulis.

6. Inventory Intelligence — Overview

Thesis: Fulfillment yang baik menghasilkan data yang bersih → data yang bersih menghasilkan keputusan stok yang cerdas → stok yang cerdas = gak terlalu over, gak keseringan habis, alokasi efektif & efisien.

6.1 Data Input → Analytics Output

Data dari FulfillmentAnalytics Output
Outbound per SKU per hari per gudangDemand 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 historyPromotional uplift per product per campaign type
New product sell-throughHot/normal/slow signal

6.2 Key Metrics

MetricFormulaTarget
Reorder Point(Daily Demand × Lead Time) + Safety StockGak pernah stockout untuk A-class products
Days of StockCurrent Stock / Daily Demand7-14 hari (frozen food constraint)
Inventory TurnoverHPP / Average Inventory>6× per tahun
Fill RateOrders fulfilled / Orders received>98%
Pick AccuracyCorrect picks / Total picks>99.5%
Supplier Lead TimeAvg days dari PO → GRNPer supplier tracking
Supplier Fulfillment RateQty received / Qty ordered>98%

6.3 Multi-Warehouse Allocation

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

7. Forecasting Deep Dive — Methods & References

Catatan: Section ini berisi referensi metode forecasting yang sudah mature di industri logistik. Belum semua perlu di-implement. Referensi ini untuk confident bahwa approach LabaBersih on the right track.

7.1 Exponential Smoothing (Holt-Winters)

AspekDetail
ApaTriple exponential smoothing — decompose demand jadi: level (baseline), trend (naik/turun), seasonality (pola berulang). Ada 2 variant: additive dan multiplicative.
Siapa pakaiShopify (built-in forecast), Inventory Planner (Shopify app), CPG companies (Unilever, P&G sebelum adopt ML)
Kapan pakaiProduk dengan demand stabil dan ada pola seasonal (mingguan, bulanan, tahunan). Butuh min 12 bulan data.
Relevansi LabaBersihTinggi 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.
LimitasiSpikes promosi dianggap noise dan di-smooth out. Butuh base+campaign separation.

7.2 Croston's Method

AspekDetail
ApaMetode 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 pakaiSAP IBP, Oracle Supply Chain, Blue Yonder. Awalnya dari militer/defense logistics (spare parts NATO).
Kapan pakaiSKU yang >50% hari punya zero demand. Long-tail products, niche items.
Relevansi LabaBersihModerate. 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.
PrioritasTier 3 — implement saat handle >500 SKU.

7.3 Demand Sensing

AspekDetail
ApaShort-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 LabaBersihSangat 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.
Demand Sensing versi LabaBersih (praktis):
1. Track daily order velocity per SKU
2. Detect velocity change >2× standard deviation
3. Alert: "SKU X demand spiking — consider restock"
Ini 80% value dari demand sensing enterprise tanpa complexity-nya.

7.4 Promotional Uplift Modeling

AspekDetail
ApaPisahkan 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 LabaBersihKritis. 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.

7.5 Safety Stock — Static vs Dynamic

AspekStatic Safety StockDynamic Safety Stock
KalkulasiMonthly/quarterlyDaily/weekly (rolling window)
Demand variabilityFixed σRolling or weighted σ
Lead timeFixed assumptionVariable, per supplier
Promo spikesCauses overstock setelah promoAdapt dalam 1-2 minggu
Siapa pakaiBasic ERP (Odoo, ERPNext)Amazon, Walmart, Blue Yonder, o9
Best forStable demand, few SKUVolatile demand, many SKU
Frozen Food Constraint: Safety stock yang expire lebih buruk dari stockout. Safety stock HARUS di-bound oleh shelf life. Kalau lead time 3 hari dan shelf life 30 hari, max useful safety stock = ~20 hari demand (sisakan 10 hari untuk jual sebelum expire).
Lokad's Insight (relevan untuk frozen food):
Cost function untuk perishables itu asimetris — overstock = total loss (expire), understock = lost margin saja. Asymmetry ini harus bias safety stock ke BAWAH. Better miss a few sales than waste expired product.

8. Demand Classification — ABC-XYZ Framework

Industry Standard: ABC-XYZ dipakai oleh Amazon (millions of SKU), Zalando, Tesco, Carrefour, Walmart. Tools: Lokad, Blue Yonder, EazyStock, Slimstock, Inventory Planner.

8.1 Dua Dimensi

ABC (Value contribution — Pareto 80/20):

ClassDefinisiPersentase SKUKontribusi Revenue
ATop performers~20% (60 SKU)~80% revenue
BMid-tier~30% (90 SKU)~15% revenue
CLong tail~50% (150 SKU)~5% revenue

XYZ (Demand predictability — Coefficient of Variation):

ClassCV RangeKarakteristikForecast Method
XCV < 0.5Stabil, predictableMoving Average / Holt-Winters
YCV 0.5-1.0Variable, seasonal/trendingDynamic safety stock + uplift
ZCV > 1.0Volatile, sporadicManual + demand sensing + Croston's

8.2 Combined Matrix (9 Cells)

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
Penting: Klasifikasi ABC-XYZ di-recalculate MONTHLY. Produk bisa pindah class — produk yang tadinya CX bisa jadi AZ kalau viral. Ini BUKAN fixed label.

8.3 Service Level per Class

ClassService LevelSafety Stock StrategyMonitoring
AX99%Low (demand predictable)Auto-replenish
AY95-99%Dynamic (seasonal adjust)Weekly review
AZ90-95%High tapi bounded by shelf lifeDaily monitoring
BX-BY90-95%ModerateBi-weekly
CX-CZ85-90%MinimalMonthly / on-demand

9. Campaign-Driven Demand Management

9.1 Dua Jenis Demand Event

TypePlanned (Manageable)Unplanned (Accept Risk)
ContohTikTok Live sendiri, Flash Sale Shopee, Promo harga, HarbolnasAffiliate random promote, FYP algoritma, Customer review viral, Kompetitor habis stok
Bisa diantisipasi?Ya — kita yang set tanggal + hargaTidak — terjadi tanpa warning
Stock planningPlan sebelum campaign berdasarkan historicalDetect cepat → respond
System responseCampaign planner + auto PO suggestionSpike detection + alert + decision support
Key Insight: SEMUA produk bisa kena campaign demand kapan saja. Di era TikTok, produk yang tadinya stabil bisa tiba-tiba viral karena affiliate random. Klasifikasi demand harus DYNAMIC, bukan fixed label per produk.

9.2 Planned Campaign — Flow

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

9.3 Unplanned Spike — Detection & Response

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

9.4 Produk Baru — Sinyal Organik

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

9.5 Database Entities

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

10. New Product Introduction (NPI) Forecasting

Industry Methods: Dipakai oleh Amazon, Zara, P&G, Blue Yonder ("Like Modeling").

10.1 Methods

MethodCara KerjaSiapa PakaiRelevansi
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.

10.2 Implementasi LabaBersih

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

11. Industry Reference — Who Uses What

11.1 Pattern Validation

Setiap pattern dalam dokumen ini di-cross-reference dengan SaaS/tools yang sudah proven:

Pattern LabaBersihIndustry ReferenceConfidence
Pick → Pack → Ship separationShipBob, ShipHero, Logiwa, Cin7, Manhattan AssociatesStandard
Batch/Wave pickingShipBob, ShipHero, Manhattan AssociatesStandard
Fulfillment Order terpisah dari Sales OrderShopify (Fulfillment entity), ShipBob (Work Order)Standard
Shipment entity terpisahShipStation (Shipment), Shopify (Fulfillment)Standard
Packer tracking (PIC)ShipHero (packer performance dashboard)Standard
Pick list grouped by zone/areaSkuVault, Logiwa, ShipHero — "zone picking"Standard
Barcode scan verificationShipHero, ShipBobStandard
Carrier manifest / end-of-dayShipStation, EasyPost, ShippoStandard
Partial fulfillmentShopify, ShipBob, Cin7Standard
Goods Receipt Note (GRN)SAP, Dear Inventory, Cin7, NetSuite — ISO 9001Standard
Stock reservationShopify, ShipBob, AmazonStandard
ABC-XYZ classificationAmazon, Zalando, Tesco, Lokad, Blue YonderStandard
Dynamic safety stockAmazon, Walmart, Blue Yonder, o9Standard
Promotional uplift modelingWalmart Labs, Tesco/dunnhumby, Blue YonderStandard
Demand sensing (lightweight)Amazon, Walmart, P&G, Coca-ColaStandard
NPI via analogous productP&G, Blue Yonder ("Like Modeling"), AmazonStandard
Kepala gudang approval (TTD digital)SAP WMS (enterprise). Bukan standard di mid-market SaaS.Custom (valid)
TTD digital driver kurirStandard di 3PL Indonesia. Bukan standard di SaaS barat.Custom (valid)
Penalty point system packerShipHero track accuracy %, tapi bukan formal "penalty point".Custom (valid)

11.2 Tool Comparison

ToolFocusPricingRelevansi LabaBersih
Inventory PlannerDemand forecast + reorder for Shopify$99-249/moClosest competitor in concept. Tapi: single-channel, no FEFO, no marketplace-specific. LabaBersih advantage: multi-platform, Indonesian market, integrated accounting, FEFO.
LokadProbabilistic forecasting + supply chain optimization$2K-10K+/moIntellectually superior (probabilistic > point forecast). Terlalu complex untuk target market. Tapi konsep probabilistic patut dipinjam: show range bukan single number.
Blue YonderFull demand planning suite (enterprise)$100K+/yrReference architecture. Fitur yang bisa di-simplify: demand sensing, Like Modeling, promo optimization, ABC-XYZ.
ShipBob3PL + WMS for DTC e-commercePer order pricingFulfillment flow reference (Pick → Pack → Ship). Packer tracking. Multi-warehouse.
ShipHeroWMS for e-commerce$1,850+/moClosest WMS reference. Batch picking, pack station, packer performance, carrier manifest.
Cin7Inventory + order management$349+/moFeature set paling mirip LabaBersih scope. Multi-warehouse, PO, returns, basic forecasting.

11.3 Forecasting Method per Tool

MethodInventory PlannerLokadBlue YonderLabaBersih (target)
Holt-Winters✅ Tier 2
Croston's○ Tier 3
Demand Sensing✅ Tier 1 (lightweight)
Promotional Uplift✅ Tier 1
ABC-XYZSimplified✅ Tier 1
Dynamic Safety Stock✅ Tier 1
NPI (analogous)✅ Like Modeling✅ Tier 2
Probabilistic✅ (core)○ Tier 3
FEFO-aware✅ MOAT
LabaBersih's Moat: Setiap rekomendasi restock di-cross-check dengan FEFO lot expiry. "Restock now" alert yang ignore existing lots dengan 5 hari shelf life = berbahaya. Integrated FEFO + forecasting = differentiator vs standalone forecasting tools.

12. Implementation Priority

12.1 Fulfillment

LevelFeatureReferenceEffort
MUSTFulfillment Order entity (terpisah dari Sales Order)Shopify, ShipBobMedium
MUSTPick List generation (group by Area + SKU)ShipHero, LogiwaMedium
MUSTShipment entity (1 resi = 1 shipment, track PIC packer)ShipStation, ShipHeroMedium
MUSTCourier Handover manifest (anti-fraud)ShipStation end-of-day, 3PL standardLow
MUSTGoods Receipt Note / GRN (inbound with TTD)SAP, Dear Inventory, ISO 9001Medium
MUSTStock Reservation (prevent oversell)Shopify, AmazonMedium
SHOULDPartial fulfillmentShopify, Cin7Medium
SHOULDPacking Incident trackingShipHero accuracy metricsLow
NICEWave planning (advanced batch grouping)Manhattan AssociatesLow
NICEPack verification (scan item, bukan scan order)ShipBob, ShipHeroLow

12.2 Inventory Intelligence

TierFeatureReferenceEffort
Tier 1ABC-XYZ Classification (auto-classify monthly)Amazon, Lokad, Blue YonderMedium
Tier 1Dynamic Safety Stock + Reorder Points (FEFO-aware)Amazon, o9 SolutionsMedium
Tier 1Spike Detection (lightweight demand sensing)Amazon, Walmart concept simplifiedLow
Tier 1Campaign Planner (planned promo stock preparation)Blue Yonder Promo OptimizationMedium
Tier 1New Product Hot Signal detectionAmazon test-and-learn, ZaraLow
Tier 2Holt-Winters baseline forecast (seasonal)Shopify, Inventory PlannerMedium
Tier 2NPI via Analogous ProductP&G, Blue Yonder Like ModelingLow
Tier 2Supplier Scorecard (lead time, reliability)SAP, Oracle, CoupaLow
Tier 2Multi-warehouse demand allocationShipBob, Cin7Medium
Tier 3Croston's Method (intermittent demand)SAP IBP, Blue YonderLow
Tier 3Probabilistic forecasting (ranges vs point)Lokad (core approach)High

12.3 Frozen Food Differentiator

Kenapa LabaBersih beda dari kompetitor:

1. Integrated FEFO + Forecasting
Standalone forecasting tools (Inventory Planner, dll) TIDAK punya data FEFO lot. Mereka recommend restock tanpa tau stok yang ada mau expire kapan. LabaBersih punya data lot + expiry + cost per unit — setiap restock recommendation di-cross-check dengan shelf life.

2. Multi-platform Indonesia
TikTok Shop + Shopee + Mengantar + POS dalam 1 system. Demand sensing bisa detect spike per platform. Gak ada tool internasional yang cover marketplace Indonesia.

3. Accounting integrated
Fulfillment → stock movement → journal → financial report. Satu alur. Gak perlu 3 app terpisah.

4. Campaign-aware reorder
"Kamu mau TikTok Live Sabtu — sistem suggest PO hari ini berdasarkan historical campaign serupa." Gak ada di Inventory Planner.

5. Perishable-aware safety stock
Safety stock bounded by shelf life. Overstock = expire = loss. Asymmetric cost function built-in. Ini insight dari Lokad yang LabaBersih bisa implement lebih baik karena punya FEFO data native.



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)