Tutorial 23 Aug 2026 1 Kali Dibaca

Cara Membuat Sinkronisasi Stok Antar-Aplikasi Menggunakan Laravel API

Gugun Nurdiansyah
Penulis
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
      ↓
Marketplace

Ketika stok berubah di satu aplikasi, sistem dapat mengirimkan perubahan tersebut ke aplikasi lainnya.

Contoh:

Stok awal : 100
Penjualan : 5
Stok baru : 95

Aplikasi lain kemudian menerima stok terbaru:

POS        → 95
Inventory  → 95
Marketplace→ 95

Mengapa Sinkronisasi Stok Penting?

Tanpa sinkronisasi, data stok dapat berbeda.

Contohnya:

POS         : 5
Gudang      : 8
Marketplace : 3

Perbedaan tersebut dapat menyebabkan:

  1. Overselling.

  2. Pesanan gagal diproses.

  3. Stok tidak akurat.

  4. Kesalahan laporan.

  5. Pekerjaan manual bertambah.

Membuat API Stok Laravel

Buat controller:

php artisan make:controller Api/StockController

Route:

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-003

Jangan 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-001

SKU 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/sync

Gunakan 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 stok

Contoh 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-001

Dengan 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
OPNAME

Gunakan 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 5

Jika 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 : 10

Struktur data dapat menggunakan:

product_id
branch_id
stock

Sehingga sinkronisasi dapat dilakukan berdasarkan:

SKU + Branch

Contoh 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
↓
Inventory

Contohnya:

{
    "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
↓
Berhasil

Jika 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 Eksternal

Dengan 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:25

Data 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 data

Cocok untuk:

  • Sinkronisasi awal.

  • Recovery.

  • Rekonsiliasi data.

Incremental Sync

Hanya perubahan yang dikirim:

100 produk berubah
↓
Kirim 100 data

Lebih hemat untuk sistem yang sering mengalami perubahan.

Idealnya gunakan keduanya.

Full Sync → Recovery
Incremental → Operasional Harian

Rekonsiliasi Stok

Sistem juga sebaiknya memiliki proses pengecekan berkala.

Contohnya:

POS        : 95
Inventory  : 95
Marketplace: 94

Sistem menemukan perbedaan dan membuat laporan:

SKU-001
Expected : 95
Actual   : 94
Difference: -1

Kemudian administrator dapat melakukan koreksi.

Contoh Arsitektur

             ┌─────────────┐
             │   POS       │
             └──────┬──────┘
                    │
                    ↓
              Laravel API
                    │
          ┌─────────┴─────────┐
          ↓                   ↓
     Inventory            Marketplace
          │
          ↓
       Database

Untuk sistem yang lebih besar:

POS
 ↓
API Gateway
 ↓
Queue
 ↓
Stock Service
 ↓
Database
 ↓
Marketplace / ERP / Gudang

Monitoring Sinkronisasi

Pantau:

  1. Sinkronisasi berhasil.

  2. Sinkronisasi gagal.

  3. Data terlambat.

  4. API timeout.

  5. Duplicate event.

  6. Perbedaan stok.

  7. Queue gagal.

Contoh status:

✓ Synced
⏳ Processing
⚠ Retry
✗ Failed

Dengan 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:

  1. Point of Sales.

  2. Inventory.

  3. Marketplace.

  4. Gudang.

  5. ERP.

  6. Sistem multi-cabang.

  7. Laravel API.

  8. Webhook.

  9. Queue.

  10. 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
↓
Reconciliation

Untuk 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.

#Sinkronisasi Stok #Laravel API #Laravel Inventory #Stock Management Laravel #API Inventory #Sinkronisasi Inventory #Laravel Webhook #Laravel Queue #Stock Movement #Database Transaction Laravel #Laravel Multi-Cabang #Point of Sales #Inventory Management #Marketplace Integration #ERP Integration #Idempotency Laravel #Laravel REST API #Sistem Gudang #Web Development #Ovla Media #Jasa Laravel
Beranda Produk Artikel
Konsultasi
OVLA

Navigasi Utama

Hubungi Kami

Mulai Konsultasi Sekarang