📝Tracing Issue – Stok Produk 1 Tidak Bisa Checkout

📌 Deskripsi Masalah

Customer tidak bisa melakukan checkout pada produk variable dengan stok tersisa 1. WooCommerce menampilkan error:

“Sorry, we do not have enough [Product Name – Variation] in stock to fulfill your order (0 available). We apologize for any inconvenience caused.”

Padahal di dashboard, stok produk masih tersisa 1.

🔎 Langkah Investigasi

  1. Cek Produk & Variasi

    • Pastikan Manage stock aktif baik di level produk maupun variasi.

  2. Cek Orders

    • Buka WooCommerce → Orders.

    • Cari order dengan status Pending payment yang menggunakan produk tersebut.

    • Pada order notes terlihat:

      Stock levels reduced: Product Variation X → from 3 → 2.

  3. Cek Sistem & Tools WooCommerce

    • Masuk ke WooCommerce → Status → Tools.

    • Jalankan:

      • Clear cache/transients

      • Regenerate product lookup tables
        ✅ Tidak menyelesaikan masalah. Lanjut kebawah.

  4. Tes Konflik Plugin

    • Nonaktifkan semua plugin kecuali WooCommerce.

    • Coba checkout ulang.
      ✅ Jika masalah masih terjadi. Lanjut kebawah.

  5. Cek Database

    • Query stok langsung di database (wp_postmeta / _stock).

      SELECT product_id, stock_quantity FROM wp_wc_product_meta_lookup WHERE product_id = {variation_id};
    • Query reserved stock:

      SELECT * FROM wp_wc_reserved_stock WHERE product_id = {variation_id};

🛠 Solusi yang Diuji

  1. Delete Reserved Stock Manual (SQL)

    • SQL digunakan untuk menghapus entry reserved:

      DELETE FROM wp_wc_reserved_stock WHERE product_id = {variation_id};
      
    • Setelah itu checkout kembali berjalan normal.

  2. Analisis Penyebab

    • Issue bukan dari stok utama, melainkan dari stok yang ditahan (reserved stock) karena adanya order pending payment.

    • Reserved stock semestinya dilepas otomatis sesuai setting Hold stock.

    • Karena Hold stock kosong, sistem tidak pernah melepas reserved stock → produk tetap terbaca habis.


✅ Solusi Akhir

  • Pastikan auto-cancel pending order berjalan setelah hold stock habis → stok dilepas.

  • Opsional: Tambahkan snippet(Ada dibawah) untuk memastikan reserved stock dilepas ketika order di-cancel.


📚 Catatan Penting

  • Simple product & variable product → keduanya sama-sama pakai reserved stock.

  • Jika Hold stock(Setting Woocommerce) dikosongkan, reserved stock tidak pernah dilepas otomatis.

  • Untuk mencegah stok “nyangkut”, selalu:

    • Isi Hold stock (10–20 menit).

    • Gunakan auto-cancel unpaid orders.

    • Pantau table wp_wc_reserved_stock saat terjadi error stok tidak valid.

⌨️ Snippet

<?php
// Hapus reserved stock setelah order dibatalkan
add_action('woocommerce_order_status_cancelled', function ($order_id) {
global $wpdb;

// Hapus semua reserved stock untuk order ini
$wpdb->delete(
$wpdb->prefix . 'wc_reserved_stock',
['order_id' => $order_id],
['%d']
);
}, 20);

 

NB : Pernah terjadi di Nokha