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

  • 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 inventoryAdjustQuantities mutasyonu
  • 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ış

  1. ERP → Ara Katman
    • INNSOF ERP, HTTP POST aracılığıyla JSON yükünü StockController'a gönderir.
  2. 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_id ve inventory_item_id (önbelleklenmiş tablolardan) ile zenginleştiriyoruz.
  3. Mevcut Stokları Al
    • Mevcut stok seviyelerini GraphQL aracılığıyla alın (konum ve SKU başına).
  4. Deltaları Hesapla
    • ERP stokunu Shopify stoku ile karşılaştırarak delta'yı belirleyin.
  5. Stok Ayarlama
    • Her bir parti için tek bir GraphQL mutasyonu gönderin (en fazla 100 SKU).
  6. Yanıt Yönetimi
    • Başarıları/başarısızlıkları kaydedin ve güncelleme durumunu ERP'ye geri gönderin.
  7. 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_id ve location_id değ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_log ve stock_update_log tablolarında kaydedilir.

7. Performans Karşılaştırması

MetrikREST APIGraphQL 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ıkNadir
Gerçek zamanlı doğrulukIlımlıYüksek
ERP geri bildirim entegrasyonuKısmiTam, kaydedildi

8. Teknolojiler & Araçlar

  • Shopify GraphQL Yönetici API'si
  • PHP (StockController) ile ShopifyServiceLogManagerDBOpsApiService
  • 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

  1. 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.
  2. 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.
  3. REST ve GraphQL'ü karıştırabilir miyim?
    Evet. GraphQL yavaşladığında kritik güncellemeler için REST'i bir yedek olarak tutuyoruz.
  4. Çoklu konum envanteri çalışır mı?
    Kesinlikle. Her konum için seviyeleri sorguluyor ve güncelliyoruz locationId.
  5. 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.