Stokların doğru ve güncel tutulması, yüksek hacimli perakendeciler için son derece önemlidir. Wellcare ve Raf Pharmacy için—Katar'daki 10,000'den fazla SKU, 100'den fazla fiziksel mağaza ve Shopify web mağazaları, mobil uygulamalar ve POS sistemleri üzerinden aktif satış yapan iki önde gelen eczane zinciri—güçlü, gerçek zamanlı bir ERP'den Shopify'a stok güncelleme çözümü geliştirdik. Aşağıda, uçtan uca mimarimizi, kod parçacıklarımızı ve performans sonuçlarımızı paylaşıyoruz.
- Proje Kapsamı & Zorluklar
- 1. İlk Yaklaşım: Shopify REST API
- 2. Shopify GraphQL API'ye Geçiş
- 3. Architectural Overview
- 4. Fetching Current Stock with GraphQL
- 5. GraphQL ile Stok Ayarlama
- 6. Optimization Highlights
- 7. Performance Comparison
- 8. Technologies & Tools
- 9. Wellcare and Raf Eczanesi için Faydalar
- 10. SSS
Proje Kapsamı & Zorluklar
- Müşteriler: Wellcare Eczanesi ve Raf Eczanesi, Katar
- Katalog Boyutu: 10,000+ SKU'lar
- Satış Kanalları: Shopify vitrin, başsız mobil uygulamalar, 100'den fazla fiziksel konum
- ERP: INNSOF ERP stok güncellemelerini itiyor
- Gereksinimler:
- Fazla satışları önlemek için gerçek zamanlı senkronizasyon
- Yüksek güncelleme hacmi için ölçeklenebilir
- Minimal API gecikmesi ve hataları
- Doğru çoklu konum stok yönetimi
1. İlk Yaklaşım: Shopify REST API
Öncelikle stok güncellemelerini göndermek için Shopify’ın REST Admin API uç noktasını /admin/api/2024‑01/inventory_levels/set.json kullandık.
// Sample REST payload
$payload = [
'location_id' => $locationId,
'inventory_item_id'=> $inventoryItemId,
'available' => $newStock
];
$response = $this->shopifyService->restRequest('POST', "/inventory_levels/set.json", $payload);
REST API Sınırlamaları
- Toplu güncellemeler yok: Her istek için bir SKU
- Katı oran sınırlamaları: ~2 çağrı/saniye başına mağaza → binlerce SKU için darboğaz
- Yüksek gecikme: 50–100 ms başına istek, biriken gecikmeler
- Hata yapmaya meyilli: Yük altında sık sık oran sınırlama hataları
2. Shopify GraphQL API'ye Geçiş Yapmak
REST sınırlamalarını aşmak için, Shopify’ın GraphQL Admin API'sine geçtik ve şunları açtık:
- Toplu güncellemeler
inventoryAdjustQuantitiesmutasyonu - Maliyet temelli kısıtlama (REST'ten daha esnek)
- Ağ yükünü azaltın sadece gerekli alanları talep ederek
- Delta'ya dayalı ayarlamalar (stok gerçekten değiştiğinde yalnızca güncelle)
3. Mimari Genel Bakış
- ERP → Ara Katman
- INNSOF ERP, HTTP POST aracılığıyla JSON yükünü
StockController'a gönderir.
- INNSOF ERP, HTTP POST aracılığıyla JSON yükünü
- Zenginleştirme & Günlükleme
- İsteği yerel bir DB'de (
api_request_log) ayrıştırıyor, doğruluyor ve kaydediyoruz. - Her SKU'yu
location_idveinventory_item_id(önbelleklenmiş tablolardan) ile zenginleştiriyoruz.
- İsteği yerel bir DB'de (
- Mevcut Stokları Al
- Mevcut stok seviyelerini GraphQL aracılığıyla alın (konum ve SKU başına).
- Deltaları Hesapla
- ERP stokunu Shopify stoku ile karşılaştırarak
delta'yı belirleyin.
- ERP stokunu Shopify stoku ile karşılaştırarak
- Stok Ayarlama
- Her bir parti için tek bir GraphQL mutasyonu gönderin (en fazla 100 SKU).
- Yanıt Yönetimi
- Başarıları/başarısızlıkları kaydedin ve güncelleme durumunu ERP'ye geri gönderin.
- Yeniden Denemeler & Yedekleme
- Otomatik cron görevleri başarısız olan partileri yeniden dener; gerekirse REST'e geri döner.
4. GraphQL ile Güncel Stok Alma
Doğru delta hesaplaması, mevcut miktarların alınmasıyla başlar. Sorgu başına 60 öğe grupluyoruz:
query inventoryItems {
item1: inventoryItem(id: "gid://shopify/InventoryItem/123456789") {
id
tracked
sku
inventoryLevels(first: 10) {
edges {
node {
location { id name }
quantities(names: "available") {
quantity
}
}
}
}
}
# item2, item3… up to 60
}
PHP yöntemimiz bunları bir diziye toplar:
private function getCurrentStock(array $products): array {
$batches = array_chunk($products, 60);
$results = [];
foreach ($batches as $batch) {
// Build GraphQL query dynamically…
$response = $this->shopifyService->executeGraphQl($query, []);
// Parse `$response['data']` into $results[]
}
return $results; // [ ['inventory_item_id'=>…, 'location_id'=>…, 'quantity'=>…], … ]
}
5. GraphQL ile Stok Ayarlama
Mevcut stoğu bildiğimizde, delta güncelleme yükünü hazırlarız:
Mutasyon Şablonu
mutation AdjustMultipleInventoryQuantities($input: InventoryAdjustQuantitiesInput!) {
inventoryAdjustQuantities(input: $input) {
inventoryAdjustmentGroup {
createdAt
changes { name delta }
}
userErrors { field message }
}
}
PHP Değişkenleri Formatı
$changes = [];
foreach ($updatedProducts as $p) {
$changes[] = [
'inventoryItemId'=> "gid://shopify/InventoryItem/{$p['inventory_item_id']}",
'locationId' => "gid://shopify/Location/{$p['location_id']}",
'delta' => $p['erp_stock'] - $p['current_stock']
];
}
$variables = [
'input' => [
'reason' => 'correction',
'name' => 'available',
'referenceDocumentUri' => 'logistics://erp/batch-2025-07-29',
'changes' => $changes
]
];
$response = $this->shopifyService->executeGraphQl($mutation, $variables);
Bu tek çağrı, ağ gürültüsünü önemli ölçüde azaltarak bir seferde 100 SKUs'a kadar günceller.
6. Optimizasyon Vurguları
- Gruplama & Parçalama: Okumalar için 60 öğe/sorgu; Yazmalar için 100 öğe/mutasyon.
- Yerel Önbellekleme:
inventory_item_idvelocation_iddeğerlerini tekrar eden sorgulardan kaçınmak için MySQL'de saklayın. - Delta Logic: Sadece mevcut stoğu ERP stoğundan farklı olan SKU'ları güncelleyin.
- Rate‑limit Farkındalığı: Stratejik olarak
sleep()/usleep()ekleyin ve acil tekrarlar için REST'e geri dönün. - Sağlam Günlükleme: Her istek ve yanıt
api_request_logvestock_update_logtablolarında kaydedilir.
7. Performans Karşılaştırması
| Metrik | REST API | GraphQL API |
|---|---|---|
| Toplu güncelleme desteği | ||
| 100 SKU başına ortalama süre | ~60 s | ~5 s |
| Rate-limit hataları (yük altında) | Sık | Nadir |
| Gerçek zamanlı doğruluk | Ilımlı | Yüksek |
| ERP geri bildirim entegrasyonu | Kısmi | Tam, kaydedildi |
8. Teknolojiler & Araçlar
- Shopify GraphQL Yönetici API'si
- PHP (StockController) ile
ShopifyService,LogManager,DBOps,ApiService - MySQL yerel önbellekleme ve günlükler için
- INNSOF ERP webhook'ları
- Cron İşleri denemeler ve ERP geri çağırmaları için
9. Wellcare ve Raf Eczanesi'ne Faydalar
Gerçek zamanlı hisse senedi doğruluğu 100'den fazla mağaza ve kanal boyunca
Sıfır aşım ve kesintisiz müşteri deneyimi
Yüksek verimlilik: saatte binlerce SKU güncellemesi
Uyum ve hata ayıklama için ayrıntılı denetim izi
Geliştirilmiş SEO & UX web ve mobil mağazalarda
10. SSS
- Neden güncellemeden önce mevcut stoğu almak önemlidir?
Doğru delta'yı hesaplamamızı sağlar, kazara üzerine yazma veya çift ayarlama yapılmasını önler. - GraphQL bir partide kaç SKU işleyebilir?
Her mutasyon için 100 SKU'ya kadar ve her sorgu için 60 SKU, mağaza planına göre yapılandırılabilir. - REST ve GraphQL'ü karıştırabilir miyim?
Evet. GraphQL yavaşladığında kritik güncellemeler için REST'i bir yedek olarak tutuyoruz. - Çoklu konum envanteri çalışır mı?
Kesinlikle. Her konum için seviyeleri sorguluyor ve güncelliyoruzlocationId. - Bu yaklaşım diğer ERP'lere uyarlanabilir mi?
Evet. Modüler tasarımımız Odoo, SAP, Oracle 6i ve daha fazlası ile entegre olabilir.
Seamedia E‑ticaret Çözümlerini Neden Seçmelisiniz?
Seamedia'da, derin Shopify uzmanlığını sağlam ERP entegrasyon bilgisiyle birleştirerek gerçek iş sonuçları elde eden özel, yüksek performanslı çözümler sunuyoruz. Ekibimiz—deneyimli danışmanlar olan Prajosh VM gibi—çoklu konum envanteri, yüksek SKU hacimleri ve çok kanallı perakendeciliğin karmaşıklıklarını anlıyor. Stoklarınızı doğru tutan, müşterilerinizi mutlu eden ve operasyonlarınızı sorunsuz yürüten ölçeklenebilir, API destekli iş akışları tasarlıyoruz. Hızla büyüyen bir eczane zinciri, ulusal bir perakendeci veya bir kurumsal üretici olsanız da, Seamedia uçtan uca geliştirme, kesintisiz ERP bağlantısı ve 7/24 destek sunmaktadır.
Envanterinizi düzene sokmaya ve satışlarınızı artırmaya hazır mısınız?
Bugün bizimle iletişime geçin: hello@seamedia.in veya www.seamedia.in adresini ziyaret ederek işiniz için özel bir gerçek zamanlı stok senkronizasyon çözümü nasıl oluşturabileceğimizi tartışalım.