Açık konuşayım: manuel sipariş karşılama ölçeklenmez, nokta. WooCommerce mağazan günde 50 siparişi geçtiğinde, o alışıldık iş akışı — WooCommerce’i kontrol et, siparişi ERP’ye gir, topla ve paketle, takibi elle güncelle — sessizce bir darboğaza dönüşür. Ve darboğaz seni değil, ekibinin en yorgun olduğu cuma akşamını vurur. ERP odaklı otomasyon, “sipariş verildi”den “teslim edildi”ye kesintisiz bir pipeline kurarak bu darboğazı ortadan kaldırır. Aşağıda parçaları sırayla, gerçekte nerede kırıldıklarını da söyleyerek anlatıyorum.
Otomatik Karşılama Pipeline’ı
Order Placed (WooCommerce)
→ Fraud Check
→ Payment Verification
→ Order Created in ERP
→ Inventory Reserved
→ Pick List Generated
→ Warehouse Picks & Packs
→ Shipping Label Created
→ Tracking Number → WooCommerce
→ Customer Notification
→ Order Marked "Completed"
Her adım otomatik gerçekleşir. İnsan müdahalesi yalnızca istisnalar için gerekir (dolandırıcılık flagleri, stok tükenmesi, adres sorunları). Sağlam bir pipeline’ın ölçütü de zaten bu: mutlu yol tamamen sessizdir, insan sadece gerçekten karar gereken yerde devreye girer.
Adım 1: Sipariş Yakalama
WooCommerce webhook’ları pipeline’ı gerçek zamanlı tetikler. Dikkat et: webhook’u işleyen uç, işi hemen yapmaz — kuyruğa atar ve anında 200 döner. Bunu erken öğrenmek önemli, çünkü webhook’un içinde ağır iş yaparsan WooCommerce zaman aşımına düşüp aynı siparişi tekrar tekrar gönderir.
// Webhook handler
app.post('/webhooks/order-created', async (req, res) => {
const order = req.body;
// Quick validation
if (order.status !== 'processing') {
return res.status(200).send('Skipped: not processing');
}
// Queue for processing
await orderQueue.add('process-order', {
orderId: order.id,
orderData: order,
receivedAt: new Date().toISOString()
});
res.status(200).send('Queued');
});
Adım 2: Dolandırıcılık ve Doğrulama Kontrolü
ERP’ye göndermeden önce siparişi doğrula. Buradaki yinelenen sipariş kontrolünü küçümseme — çift tıklayan bir müşteri ya da tekrar eden bir webhook, aynı siparişi ERP’ye iki kez düşürüp depoya iki koli hazırlatabilir.
async function validateOrder(order) {
const issues = [];
// Address validation
if (!order.shipping.postcode || order.shipping.postcode.length < 3) {
issues.push('Invalid shipping postcode');
}
// High-value order flag
if (parseFloat(order.total) > 1000) {
issues.push('High-value order - manual review');
}
// Duplicate order check (same customer, same items, within 5 minutes)
const recentOrders = await db.query(
'SELECT * FROM processed_orders WHERE customer_email = ? AND created_at > DATE_SUB(NOW(), INTERVAL 5 MINUTE)',
[order.billing.email]
);
if (recentOrders.length > 0) {
issues.push('Possible duplicate order');
}
return { valid: issues.length === 0, issues };
}
Adım 3: ERP Sipariş Oluşturma
Siparişi dönüştür ve ERP’ne gönder. WooCommerce ile ERP eşleşmesini bir tabloda saklaman kritik — o eşleşme, yarın “bu ERP siparişi hangi WC siparişi?” diye baktığında elindeki tek ipin ucu.
async function createERPOrder(wcOrder) {
// Find or create customer
let customer = await erp.findCustomer({ email: wcOrder.billing.email });
if (!customer) {
customer = await erp.createCustomer({
name: ${wcOrder.billing.first_name} ${wcOrder.billing.last_name},
email: wcOrder.billing.email,
phone: wcOrder.billing.phone,
address: mapAddress(wcOrder.shipping)
});
}
// Create sales order
const salesOrder = await erp.createSalesOrder({
customerId: customer.id,
externalRef: WC-${wcOrder.id},
orderDate: wcOrder.date_created,
lines: wcOrder.line_items.map(item => ({
sku: item.sku,
quantity: item.quantity,
unitPrice: parseFloat(item.price),
discount: parseFloat(item.total) < (item.quantity * parseFloat(item.price))
? (item.quantity * parseFloat(item.price)) - parseFloat(item.total)
: 0
})),
shippingMethod: wcOrder.shipping_lines[0]?.method_title,
shippingCost: parseFloat(wcOrder.shipping_total),
notes: wcOrder.customer_note || ''
});
// Store mapping
await db.query(
'INSERT INTO order_mapping (wc_order_id, erp_order_id, status) VALUES (?, ?, ?)',
[wcOrder.id, salesOrder.id, 'created']
);
return salesOrder;
}
Adım 4: Envanter Rezervasyonu
ERP, satış siparişi oluşturulduğunda envanteri hemen rezerve etmeli (ayırmalı). Bu, sipariş oluşturma ile fiziksel toplama arasında fazla satışı önler — yani “sitede stokta göründü ama depoda kalmadı” telefonunu.
Çoğu ERP, bir satış siparişi oluşturulduğunda bunu otomatik halleder. Ama varsayma; ERP’nle doğrula, çünkü bazıları açık rezervasyon çağrısı ister. Bu tek satırlık farkı atlamak, sezon indiriminde iki müşteriye aynı son ürünü satmak demektir.
Adım 5: Kargo Etiketi Oluşturma
Etiketleri otomatik üretmek için kargo taşıyıcının API’siyle entegre ol:
async function generateShippingLabel(erpOrder, shippingAddress) {
// Example: ShipStation API
const shipment = await shipstation.createShipment({
orderId: erpOrder.externalRef,
carrierCode: selectCarrier(shippingAddress, erpOrder.totalWeight),
serviceCode: selectService(shippingAddress),
shipTo: {
name: ${shippingAddress.first_name} ${shippingAddress.last_name},
street1: shippingAddress.address_1,
street2: shippingAddress.address_2,
city: shippingAddress.city,
state: shippingAddress.state,
postalCode: shippingAddress.postcode,
country: shippingAddress.country
},
weight: { value: erpOrder.totalWeight, units: 'grams' },
dimensions: calculatePackageDimensions(erpOrder.lines)
});
return {
trackingNumber: shipment.trackingNumber,
labelUrl: shipment.labelData,
carrier: shipment.carrierCode
};
}
Adım 6: Takip Numarasını WooCommerce’e Geri Gönderme
WooCommerce siparişini takip bilgileriyle güncelle. Müşteri döngüyü ancak burada kapanmış hisseder — takip numarası düşmezse, pipeline’ının geri kalanı ne kadar temiz olursa olsun müşteri için “hâlâ bir şey olmadı”.
async function updateWooCommerceTracking(wcOrderId, tracking) {
// Update order meta with tracking info
await wooApi.put(orders/${wcOrderId}, {
status: 'completed',
meta_data: [
{ key: '_tracking_number', value: tracking.trackingNumber },
{ key: '_tracking_carrier', value: tracking.carrier },
{ key: '_tracking_url', value: tracking.trackingUrl }
]
});
// Add order note
await wooApi.post(orders/${wcOrderId}/notes, {
note: Order shipped via ${tracking.carrier}. Tracking: ${tracking.trackingNumber},
customer_note: true // Visible to customer
});
}
Idempotency ve tekrar denemeler: pipeline’ı ayakta tutan sıkıcı kısım
Şimdi kimsenin sunumda göstermediği ama üç yıl sonra da işini yürüten kısım. Her dağıtık pipeline’ın ilk kanunu şu: her adım, iki kez çağrılsa bile tek kez olmuş gibi davranmalı. Ağlar takılır, webhook’lar tekrar gelir, bir servis 200 dönmeden önce çöker — ve o an, aynı siparişi ERP’ye ikinci kez düşürmediğinden emin olman gerekir.
Pratikte bunu üç alışkanlıkla çözerim. Bir: her siparişe, WooCommerce sipariş ID’sinden türeyen kararlı bir idempotency anahtarı ver ve ERP çağrısında bu anahtarı kullan; ERP “bu ref zaten var” derse hatayı sessizce yut, yeni bir sipariş yaratma. İki: adım durumlarını (received, created, reserved, shipped) order_mapping tablosuna yaz, böylece bir iş yeniden denendiğinde kaldığı yerden devam eder, baştan başlamaz. Üç: tekrar denemeleri üstel geri çekilmeyle (exponential backoff) yap ve belli bir sınırdan sonra siparişi bir dead-letter kuyruğuna al — sessizce sonsuza kadar denemektense, bir insanın bakması için görünür kıl. Ben olsam bu üç maddeyi, güzel görünen webhook kodundan önce yazardım; çünkü demoyu webhook geçirir, üretimi idempotency ayakta tutar.
İstisna İşleme
Her sipariş sorunsuz akmaz — ve iyi bir pipeline, mükemmel olduğu için değil, kötü günü öngördüğü için güvenilirdir. Yaygın istisnalar için baştan işleyiciler kur:
| İstisna | Eylem |
|---|---|
| Ürün stokta yok | Siparişi beklet, müşteriye bildir, alternatif sun |
| Adres teslim edilemez | Siparişi beklet, müşteriye adresi güncellemesi için bildir |
| Yetkilendirme sonrası ödeme başarısız | ERP siparişini iptal et, envanteri serbest bırak |
| Dolandırıcılık flagı | Manuel inceleme için beklet, gönderme |
| Kargo etiketi hatası | Alternatif taşıyıcıyla yeniden dene |
| ERP çalışmıyor | Siparişi kuyruğa al, ERP iyileştiğinde yeniden dene |
İzleme
Pipeline sağlığını takip et. Görmediğin şeyi yönetemezsin; ve bu pipeline sessiz çalıştığı için, bozulduğunu ilk fark eden kişi sen değil müşteri olabilir — o yüzden metrikleri baştan kur:
// Hourly pipeline metrics
const metrics = {
ordersReceived: await countOrders('received', lastHour),
ordersProcessed: await countOrders('processed', lastHour),
ordersShipped: await countOrders('shipped', lastHour),
ordersFailed: await countOrders('failed', lastHour),
avgProcessingTime: await avgTime('received', 'shipped', lastHour),
pendingOrders: await countOrders('pending')
};
Uyarı eşikleri:
- İşlem süresi > 30 dakika: araştır
- Başarısız siparişler > toplam %5: kritik uyarı
- Bekleyen kuyruk > 100 sipariş: kapasite sorunu
Sonuç
ERP odaklı sipariş otomasyonu, karşılamayı manuel ve hata açısından riskli bir süreçten güvenilir bir pipeline’a dönüştürür. Bu pipeline’ı kurma yatırımı kendini hızlıca amorti eder — daha az hata, daha hızlı kargo, daha mutlu müşteri ve ekip zamanının veri girişinden kurtulması. Ama tavsiyem şu: hepsini birden kurmaya kalkma. Temel akışla başla (sipariş ERP’ye, takip WooCommerce’e geri), o akışın gerçek trafikte oturduğunu gör, sonra kargo etiketi üretimini ve istisna işlemeyi aşama aşama ekle. Sıkıcı biçimde, tek adımda bir. Bu işte hafta sonunu kurtaran şey de tam olarak o sıkıcılık.
Last modified: Ağustos 2, 2026
United States / English
Slovensko / Slovenčina
Canada / Français
Türkiye / Türkçe