Cara Membuat Sinkronisasi Stok Antar-Aplikasi Menggunakan Laravel API
Apa Itu Sinkronisasi Stok?
Sinkronisasi stok adalah proses menyamakan data persediaan antara dua atau lebih aplikasi.
Contohnya:
Aplikasi POS
↓
Laravel API
↓
Inventory Server
↓
MarketplaceKetika stok berubah di satu aplikasi, sistem dapat mengirimkan perubahan tersebut ke aplikasi lainnya.
Contoh:
Stok awal : 100
Penjualan : 5
Stok baru : 95Aplikasi lain kemudian menerima stok terbaru:
POS → 95
Inventory → 95
Marketplace→ 95Mengapa Sinkronisasi Stok Penting?
Tanpa sinkronisasi, data stok dapat berbeda.
Contohnya:
POS : 5
Gudang : 8
Marketplace : 3Perbedaan tersebut dapat menyebabkan:
Overselling.
Pesanan gagal diproses.
Stok tidak akurat.
Kesalahan laporan.
Pekerjaan manual bertambah.
Membuat API Stok Laravel
Buat controller:
php artisan make:controller Api/StockControllerRoute:
Route::get(
'/products/{product}/stock',
[StockController::class, 'show']
);Controller:
public function show(Product $product)
{
return response()->json([
'product_id' => $product->id,
'sku' => $product->sku,
'stock' => $product->stock,
]);
}Contoh response:
{
"product_id": 10,
"sku": "SKU-001",
"stock": 95
}Sinkronisasi Berdasarkan SKU
Gunakan SKU sebagai identifier produk yang konsisten.
Contohnya:
SKU-001
SKU-002
SKU-003Jangan hanya mengandalkan ID database karena ID pada masing-masing aplikasi dapat berbeda.
Contoh:
POS
Product ID : 10
SKU : SKU-001
Inventory
Product ID : 250
SKU : SKU-001SKU yang sama menunjukkan produk yang sama.
Membuat Endpoint Update Stok
Contohnya:
Route::post(
'/stock/sync',
[StockController::class, 'sync']
);Controller:
public function sync(Request $request)
{
$data = $request->validate([
'sku' => ['required', 'string'],
'stock' => ['required', 'integer', 'min:0'],
]);
$product = Product::where(
'sku',
$data['sku']
)->firstOrFail();
$product->update([
'stock' => $data['stock'],
]);
return response()->json([
'message' => 'Stock synchronized',
'stock' => $product->stock,
]);
}Gunakan API Authentication
Jangan membuat endpoint stok terbuka:
POST /api/stock/syncGunakan authentication seperti Laravel Sanctum atau mekanisme API authentication lainnya.
Contoh:
Route::middleware('auth:sanctum')
->post(
'/stock/sync',
[StockController::class, 'sync']
);Dengan demikian, hanya aplikasi yang memiliki akses yang dapat melakukan sinkronisasi.
Sinkronisasi Berdasarkan Perubahan
Lebih efisien mengirim stok ketika terjadi perubahan daripada mengirim seluruh database secara terus-menerus.
Contohnya:
Penjualan
↓
Stok berubah
↓
Laravel mendeteksi perubahan
↓
Kirim API
↓
Aplikasi tujuan update stokContoh payload:
{
"sku": "SKU-001",
"stock": 95,
"updated_at": "2026-08-23T12:30:00+07:00"
}Gunakan Stock Movement
Untuk sistem yang lebih aman, jangan hanya menyimpan angka stok.
Buat juga riwayat pergerakan stok.
Contohnya:
Stock Movement
SKU : SKU-001
Sebelum : 100
Perubahan : -5
Sesudah : 95
Jenis : SALE
Reference : INV-001Dengan begitu, perubahan stok dapat ditelusuri.
Contoh Tabel Stock Movement
Schema::create('stock_movements', function (Blueprint $table) {
$table->id();
$table->foreignId('product_id');
$table->integer('quantity');
$table->integer('stock_before');
$table->integer('stock_after');
$table->string('type');
$table->string('reference')->nullable();
$table->timestamps();
});Jenis movement dapat berupa:
SALE
PURCHASE
RETURN
ADJUSTMENT
TRANSFER
OPNAMEGunakan Database Transaction
Perubahan stok dan pencatatan movement sebaiknya dilakukan dalam satu transaction.
DB::transaction(function () use ($product, $quantity) {
$before = $product->stock;
$product->decrement(
'stock',
$quantity
);
$product->refresh();
StockMovement::create([
'product_id' => $product->id,
'quantity' => -$quantity,
'stock_before' => $before,
'stock_after' => $product->stock,
'type' => 'SALE',
]);
});Jika terjadi error, perubahan dapat dibatalkan.
Hindari Race Condition
Masalah dapat terjadi ketika dua transaksi mengurangi stok hampir bersamaan.
Contohnya:
Stok = 10
Request A → beli 7
Request B → beli 5Jika tidak dikontrol, kedua transaksi dapat membaca stok 10 dan menghasilkan stok yang salah.
Gunakan locking:
DB::transaction(function () use ($productId, $quantity) {
$product = Product::where(
'id',
$productId
)
->lockForUpdate()
->firstOrFail();
if ($product->stock < $quantity) {
throw new Exception(
'Stock tidak mencukupi'
);
}
$product->decrement(
'stock',
$quantity
);
});Lock membantu mencegah dua proses mengubah stok yang sama secara bersamaan.
Sinkronisasi Antar-Cabang
Untuk aplikasi multi-cabang, stok sebaiknya memiliki lokasi.
Contohnya:
Produk
↓
Cabang Bekasi : 20
Cabang Karawang: 15
Cabang Bandung : 10Struktur data dapat menggunakan:
product_id
branch_id
stockSehingga sinkronisasi dapat dilakukan berdasarkan:
SKU + BranchContoh API Multi-Cabang
{
"sku": "SKU-001",
"branch_code": "BKS",
"stock": 20
}Aplikasi tujuan dapat mengetahui stok produk dan lokasi yang tepat.
Gunakan Webhook untuk Sinkronisasi Realtime
Jika ingin mendekati realtime:
POS
↓
Stok berubah
↓
Webhook
↓
InventoryContohnya:
{
"event": "stock.updated",
"sku": "SKU-001",
"branch": "BKS",
"stock": 20
}Aplikasi tujuan menerima event dan memperbarui stok.
Jangan Hanya Mengandalkan Webhook
Webhook dapat gagal atau tertunda.
Karena itu, sistem sebaiknya memiliki mekanisme retry.
Contohnya:
Stock Updated
↓
Send Webhook
↓
Gagal?
↓
Retry
↓
BerhasilJika tetap gagal, event dapat masuk ke daftar failed synchronization.
Gunakan Queue Laravel
Untuk sinkronisasi ke aplikasi eksternal, gunakan queue.
Contohnya:
SyncStockJob::dispatch(
$product->sku
);Alurnya:
Transaksi
↓
Update Stok
↓
Queue
↓
Laravel Worker
↓
API EksternalDengan cara ini proses transaksi tidak harus menunggu API eksternal selesai.
Gunakan Idempotency
Jika API menerima request yang sama beberapa kali, jangan sampai stok berubah berulang kali.
Gunakan event_id atau sync_id.
Contohnya:
{
"sync_id": "SYNC-20260823-001",
"sku": "SKU-001",
"stock": 95
}Aplikasi tujuan menyimpan sync_id dan menolak event yang sudah pernah diproses.
Gunakan Timestamp
Tambahkan:
{
"sku": "SKU-001",
"stock": 95,
"updated_at": "2026-08-23T12:30:00+07:00"
}Aplikasi tujuan dapat membandingkan data terbaru.
Contohnya:
Data A → 12:30
Data B → 12:25Data 12:25 tidak boleh menimpa data yang lebih baru.
Full Sync dan Incremental Sync
Ada dua pendekatan utama.
Full Sync
Semua stok dikirim:
10.000 produk
↓
10.000 dataCocok untuk:
Sinkronisasi awal.
Recovery.
Rekonsiliasi data.
Incremental Sync
Hanya perubahan yang dikirim:
100 produk berubah
↓
Kirim 100 dataLebih hemat untuk sistem yang sering mengalami perubahan.
Idealnya gunakan keduanya.
Full Sync → Recovery
Incremental → Operasional HarianRekonsiliasi Stok
Sistem juga sebaiknya memiliki proses pengecekan berkala.
Contohnya:
POS : 95
Inventory : 95
Marketplace: 94Sistem menemukan perbedaan dan membuat laporan:
SKU-001
Expected : 95
Actual : 94
Difference: -1Kemudian administrator dapat melakukan koreksi.
Contoh Arsitektur
┌─────────────┐
│ POS │
└──────┬──────┘
│
↓
Laravel API
│
┌─────────┴─────────┐
↓ ↓
Inventory Marketplace
│
↓
DatabaseUntuk sistem yang lebih besar:
POS
↓
API Gateway
↓
Queue
↓
Stock Service
↓
Database
↓
Marketplace / ERP / GudangMonitoring Sinkronisasi
Pantau:
Sinkronisasi berhasil.
Sinkronisasi gagal.
Data terlambat.
API timeout.
Duplicate event.
Perbedaan stok.
Queue gagal.
Contoh status:
✓ Synced
⏳ Processing
⚠ Retry
✗ FailedDengan monitoring, masalah sinkronisasi dapat segera diketahui.
Kesalahan yang Perlu Dihindari
Menggunakan ID Database sebagai Identifier
Gunakan SKU atau kode produk yang konsisten.
Tidak Menggunakan Authentication
API stok jangan dibiarkan terbuka.
Tidak Menggunakan Transaction
Perubahan stok dan movement dapat menjadi tidak konsisten.
Tidak Menangani Concurrent Request
Gunakan database locking untuk transaksi stok yang kritis.
Tidak Menggunakan Idempotency
Request yang sama dapat menyebabkan perubahan stok berulang.
Hanya Mengandalkan Realtime Sync
Tetap sediakan full sync atau reconciliation untuk memperbaiki perbedaan data.
Sinkronisasi Stok Bersama Ovla Media
Ovla Media dapat membantu membangun sistem integrasi stok untuk:
Point of Sales.
Inventory.
Marketplace.
Gudang.
ERP.
Sistem multi-cabang.
Laravel API.
Webhook.
Queue.
Aplikasi bisnis custom.
Sistem dapat dibuat dengan sinkronisasi realtime maupun batch sesuai kebutuhan bisnis dan jumlah transaksi.
Kesimpulan
Sinkronisasi stok antar-aplikasi membutuhkan lebih dari sekadar mengirim angka stok melalui API.
Komponen pentingnya adalah:
SKU
↓
Laravel API
↓
Authentication
↓
Transaction
↓
Stock Movement
↓
Queue / Webhook
↓
Idempotency
↓
ReconciliationUntuk aplikasi sederhana, API dapat digunakan untuk mengirim stok terbaru.
Untuk sistem dengan banyak transaksi dan cabang, gunakan kombinasi API, queue, webhook, database locking, idempotency, dan rekonsiliasi agar data stok tetap konsisten.
Dengan arsitektur yang tepat, POS, inventory, marketplace, dan sistem gudang dapat menggunakan data stok yang lebih akurat tanpa harus melakukan input secara manual.
Artikel Terkait
Cara Membuat Login Menggunakan Email atau Username di Laravel
Laravel dapat dibuat agar pengguna login menggunakan email atau username dalam satu form. Dengan validasi yang tepat, sistem dapat mencari akun berdasarkan salah satu identitas tersebut tanpa membuat halaman login terpisah.
Cara Membuat Audit Log Aktivitas Pengguna di Laravel
Audit log Laravel digunakan untuk mencatat aktivitas pengguna di dalam aplikasi, seperti login, logout, membuat data, mengubah data, dan menghapus data. Dengan audit log, administrator dapat mengetahui siapa yang melakukan perubahan, kapan aktivitas terjadi, dan data apa yang terpengaruh.
Cara Membuat Sistem Approval Bertingkat di Laravel
Sistem approval bertingkat pada Laravel memungkinkan sebuah pengajuan melewati beberapa tahap persetujuan sebelum dinyatakan selesai. Sistem ini cocok untuk pengajuan cuti, pembelian, reimbursement, dokumen, anggaran, hingga proses bisnis yang membutuhkan persetujuan beberapa level.