📌 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
-
Cek Produk & Variasi
-
Pastikan Manage stock aktif baik di level produk maupun variasi.
-
-
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.
-
-
Cek Sistem & Tools WooCommerce
-
Masuk ke WooCommerce → Status → Tools.
-
Jalankan:
-
Clear cache/transients
-
Regenerate product lookup tables
✅ Tidak menyelesaikan masalah. Lanjut kebawah.
-
-
-
Tes Konflik Plugin
-
Nonaktifkan semua plugin kecuali WooCommerce.
-
Coba checkout ulang.
✅ Jika masalah masih terjadi. Lanjut kebawah.
-
-
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
-
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.
-
-
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_stocksaat 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