Birden fazla depo işletmek, WooCommerce’in doğal olarak ele almak üzere tasarlanmadığı karmaşıklığı beraberinde getirir. WooCommerce ürün başına tek bir stok miktarını takip eder. ERP’niz 3, 5 veya 20 lokasyonda stok takip eder. Bu açığı kapatmak, envanterin nasıl toplandığı, siparişlerin nasıl yönlendirildiği ve müşterilerin kullanılabilirliği nasıl gördüğü hakkında dikkatli mimari kararlar gerektirir.
Çok Depolu Depo Zorluğu
ERP’niz şunu gösterir:
Product: SKU-1234 "Blue Widget"
├── Warehouse A (New York): 50 units
├── Warehouse B (Los Angeles): 30 units
├── Warehouse C (Chicago): 0 units
└── Total Available: 80 units
WooCommerce ne göstermeli? Seçenekler:
- Toplam kullanılabilir (80) — en basit, ancak başka yerde taahhüt edilmiş stoğu vaat edebilir
- En yakın depo — sepete eklemeden önce müşteri konumunu bilmeyi gerektirir
- Yalnızca karşılama deposu — sadece çevrimiçi siparişler için belirlenmiş depodan stoğu göster
- Kullanılabilir eksi tampon — toplam eksi güvenlik marjı (örn. 72 = 80 – %10)
Mimari
ERP (multi-warehouse stock)
→ Aggregation Logic (middleware)
→ WooCommerce (single stock number per product)
WooCommerce (order placed)
→ Routing Logic (middleware)
→ ERP (assign to optimal warehouse)
Middleware, ERP’nin çok lokasyonlu modeli ile WooCommerce’in tek lokasyonlu modeli arasındaki uyumsuzluğu ele alır.
Envanter Toplama Stratejileri
Strateji 1: Tüm Depoları Topla
function aggregateStock(erpItem) {
const totalStock = erpItem.warehouses.reduce(
(sum, wh) => sum + wh.available, 0
);
return {
sku: erpItem.sku,
stock_quantity: totalStock,
stock_status: totalStock > 0 ? 'instock' : 'outofstock'
};
}
Artıları: Satılabilir envanteri maksimize eder
Eksileri: Depoya özel taahhütler takip edilmiyorsa aşırı satış yapabilir
Strateji 2: Ana Depo + Taşma
Çevrimiçi siparişler için ana karşılama merkezi olarak bir depo belirleyin. Stokunu gösterin, ancak ikincil depolardan taşmaya izin verin:
function aggregateStock(erpItem, primaryWarehouseId) {
const primary = erpItem.warehouses.find(w => w.id === primaryWarehouseId);
const overflow = erpItem.warehouses
.filter(w => w.id !== primaryWarehouseId)
.reduce((sum, w) => sum + w.available, 0);
// Show primary stock + 50% of overflow (buffer for retail/wholesale)
const displayStock = (primary?.available || 0) + Math.floor(overflow * 0.5);
return {
sku: erpItem.sku,
stock_quantity: displayStock,
stock_status: displayStock > 0 ? 'instock' : 'outofstock'
};
}
Strateji 3: Bölgesel Gösterim (İleri Seviye)
Müşterinin tespit edilen bölgesine göre farklı stok seviyelerini gösterin:
async function getRegionalStock(erpItem, customerRegion) {
const regionWarehouseMap = {
'east': ['WH-NYC', 'WH-ATL'],
'west': ['WH-LAX', 'WH-SEA'],
'central': ['WH-CHI', 'WH-DAL']
};
const relevantWarehouses = regionWarehouseMap[customerRegion] || Object.values(regionWarehouseMap).flat();
const regionalStock = erpItem.warehouses
.filter(w => relevantWarehouses.includes(w.id))
.reduce((sum, w) => sum + w.available, 0);
return { stock_quantity: regionalStock };
}
Bu, frontend’de dinamik stok gösterimi gerektirir — genellikle müşterinin konumunu tespit ettikten sonra bir AJAX çağrısı aracılığıyla.
Sipariş Yönlendirme
Bir sipariş geldiğinde, middleware’iniz hangi deponun onu karşılayacağına karar vermelidir:
function routeOrder(order, warehouseStock) {
const shippingState = order.shipping.state;
const items = order.line_items;
// 1. Find warehouses that can fulfill the entire order
const candidates = warehouseStock.filter(wh =>
items.every(item =>
wh.inventory[item.sku] >= item.quantity
)
);
if (candidates.length === 0) {
// No single warehouse can fulfill — need split shipment
return splitShipment(order, warehouseStock);
}
// 2. Score candidates
const scored = candidates.map(wh => ({
warehouse: wh,
score: calculateScore(wh, shippingState, items)
}));
// 3. Select best warehouse
return scored.sort((a, b) => b.score - a.score)[0].warehouse;
}
function calculateScore(warehouse, customerState, items) {
let score = 0;
// Proximity (shipping zone distance)
const distance = getDistance(warehouse.state, customerState);
score += (1000 - distance) * 2; // Closer = higher score
// Stock depth (prefer warehouses with more stock)
const minStockRatio = Math.min(
...items.map(item => warehouse.inventory[item.sku] / item.quantity)
);
score += minStockRatio * 100;
// Workload (prefer less busy warehouses)
score -= warehouse.pendingOrders * 5;
return score;
}
Bölünmüş Kargolar
Hiçbir depo tek başına tüm siparişi karşılayamadığında:
function splitShipment(order, warehouses) {
const shipments = [];
const remaining = [...order.line_items];
// Greedy algorithm: assign items to nearest warehouse with stock
while (remaining.length > 0) {
const item = remaining[0];
const warehouse = warehouses
.filter(wh => wh.inventory[item.sku] >= item.quantity)
.sort((a, b) =>
getDistance(a.state, order.shipping.state) -
getDistance(b.state, order.shipping.state)
)[0];
if (!warehouse) {
throw new Error(Cannot fulfill ${item.sku}: insufficient stock across all warehouses);
}
// Find or create shipment for this warehouse
let shipment = shipments.find(s => s.warehouseId === warehouse.id);
if (!shipment) {
shipment = { warehouseId: warehouse.id, items: [] };
shipments.push(shipment);
}
shipment.items.push(item);
warehouse.inventory[item.sku] -= item.quantity;
remaining.shift();
}
return shipments;
}
Bölünmüş kargolar için müşteri iletişimi:
- Müşteriye siparişlerinin birden fazla pakette geleceğini bildir
- Kargo başına ayrı takip numaraları sağla
- Ekstra kargo ücreti alma (maliyeti karşıla)
WooCommerce Uygulaması
Plugin Yaklaşımı
WooCommerce’e depo başına stok takibi ekleyen bir çok depolu plugin (ATUM veya WooCommerce Multi-Warehouse gibi) kullanın. ERP senkronizasyonunuz her deponun stok seviyesini günceller.
Özel Meta Yaklaşımı
Depo seviyesindeki verileri ürün meta’sında saklayın:
// Store per-warehouse stock in product meta
update_post_meta($product_id, '_warehouse_stock', json_encode([
'WH-NYC' => 50,
'WH-LAX' => 30,
'WH-CHI' => 0
]));
// Display stock is the aggregated number
update_post_meta($product_id, '_stock', 80);
update_post_meta($product_id, '_stock_status', 'instock');
Çok Depolu Operasyonları İzleme
| Metrik | Neyi Takip Etmeli |
|---|---|
| Stok doğruluğu | ERP stoku vs WooCommerce gösterilen stok |
| Yönlendirme verimliliği | En yakın depodan karşılanan siparişlerin % oranı |
| Bölünmüş kargo oranı | Bölünmüş kargo gerektiren siparişlerin % oranı (hedef: < %5) |
| Depoya göre karşılama süresi | Yavaş depoları tespit et |
| Stok tükenmesi olayları | Toplam stok sıfıra düştüğünde |
Sonuç
Çok depolu WooCommerce temelde middleware aracılığıyla çözülen bir ERP problemidir. WooCommerce basitleştirilmiş bir görünüm sergiler; ERP’niz karmaşıklığı yönetir. Temel kararlar — toplama stratejisi, yönlendirme mantığı ve bölünmüş kargo işleme — spesifik lojistik kurulumunuza bağlıdır. En basit toplama ile başlayın (toplam veya ana depo), temel yönlendirme uygulayın ve karmaşıklığı yalnızca veriler buna ihtiyacınız olduğunu gösterdiğinde ekleyin. Bunu haklı çıkaracak sipariş hacmine sahip olmadan önce depo mantığını aşırı mühendislik yapmak geliştirme zamanını boşa harcar.
Last modified: Mart 25, 2026
United States / English
Slovensko / Slovenčina
Canada / Français
Türkiye / Türkçe