Maintenir un inventaire précis et à jour est primordial pour tout détaillant à fort volume. Pour Wellcare et Raf Pharmacy—deux chaînes de pharmacies leaders au Qatar avec plus de 10 000 SKU100+ magasins physiques, et des ventes actives sur des boutiques web Shopifydes applications mobiles, et des systèmes de point de vente—nous avons construit une solution robuste de mise à jour des stocks en temps réel entre ERP et Shopify. Ci-dessous, nous partageons notre architecture de bout en bout, des extraits de code, et des résultats de performance.

Portée du projet & Défis

  • Clients : Wellcare Pharmacy et Raf Pharmacy, Qatar
  • Taille du catalogue : 10 000+ SKU
  • Canaux de vente : Boutique Shopify, applications mobiles headless, 100+ emplacements physiques
  • ERP : INNSOF ERP poussant les mises à jour de stock
  • Exigences :
    • Synchronisation en temps réel pour éviter la survente
    • Scalable pour un volume de mises à jour élevé
    • Latence API minimale et erreurs
    • Gestion précise des stocks multi-emplacements

1. Approche initiale : API REST Shopify

Nous avons d'abord utilisé le point de terminaison de l'API REST Admin de Shopify /admin/api/2024‑01/inventory_levels/set.json pour envoyer des mises à jour de stock.

// Sample REST payload
$payload = [
  'location_id'      => $locationId,
  'inventory_item_id'=> $inventoryItemId,
  'available'        => $newStock
];
$response = $this->shopifyService->restRequest('POST', "/inventory_levels/set.json", $payload);

Limitations de l'API REST

  • Aucune mise à jour par lot : Un SKU par demande
  • Limites de taux strictes : ~2 appels/sec par magasin → goulot d'étranglement pour des milliers de SKU
  • Latence élevée : 50–100 ms par requête, retards cumulés
  • Erreur fréquente : Erreurs de limite de taux fréquentes sous charge

2. Migration vers l'API GraphQL de Shopify

Pour surmonter les limitations de REST, nous sommes passés à l' API Admin GraphQL de Shopify, débloquant :

  • Mises à jour par lots avec inventoryAdjustQuantities mutation
  • Limitation basée sur le coût (plus flexible que REST)
  • Réduire la surcharge réseau en demandant uniquement les champs nécessaires
  • Ajustements basés sur Delta (mettre à jour uniquement lorsque le stock change réellement)

3. Vue d'ensemble de l'architecture

  1. ERP → Middleware
    • INNSOF ERP envoie une charge utile JSON via HTTP POST à notre StockController.
  2. Enrichissement & Journalisation
    • Nous analysons, validons et journalisons la demande dans une base de données locale (api_request_log).
    • Nous enrichissons chaque SKU avec location_id et inventory_item_id (à partir des tables mises en cache).
  3. Obtenir le stock actuel
    • Récupérer les niveaux de stock existants via GraphQL (par emplacement et SKU).
  4. Calculer les Deltas
    • Comparer le stock ERP avec le stock Shopify pour déterminer delta.
  5. Ajuster l'inventaire
    • Envoyer une seule mutation GraphQL par lot (jusqu'à 100 SKU).
  6. Gestion des réponses
    • Enregistrer les succès/échecs et renvoyer l'état de mise à jour à l'ERP.
  7. Réessais & Repli
    • Les tâches cron automatisées réessaient les lots échoués ; repli sur REST si nécessaire.

4. Récupération des actions actuelles via GraphQL

Le calcul précis des deltas commence par la récupération des quantités existantes. Nous regroupons jusqu'à 60 articles par requête :

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
}

Notre méthode PHP les collecte dans un tableau :

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. Ajustement des stocks via GraphQL

Une fois que nous connaissons le stock actuel, nous préparons la delta charge utile de mise à jour :

Modèle de Mutation

mutation AdjustMultipleInventoryQuantities($input: InventoryAdjustQuantitiesInput!) {
  inventoryAdjustQuantities(input: $input) {
    inventoryAdjustmentGroup {
      createdAt
      changes { name delta }
    }
    userErrors { field message }
  }
}

Format des variables PHP

$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);

Cet appel unique met à jour jusqu'à 100 SKUs à la fois, réduisant ainsi considérablement le bruit réseau.

6. Points forts de l'optimisation

  • Batching & Chunking : 60 éléments/requête pour les lectures ; 100 éléments/mutation pour les écritures.
  • Mise en cache locale : Stockez inventory_item_id et location_id dans MySQL pour éviter des recherches répétées.
  • Delta Logic : Mettre à jour uniquement les SKU dont le stock actuel diffère du stock ERP.
  • Connaissance de la limitation de taux : Insérez sleep()/usleep() stratégiquement et revenez à REST pour des réessais urgents.
  • Journalisation Robuste : Chaque requête et réponse est enregistrée dans les tables api_request_log et stock_update_log.

7. Comparaison de performance

MétriqueAPI RESTAPI GraphQL
Mise à jour par lot prise en charge❌✅
Temps moyen par 100 SKU~60 s~5 s
Erreurs de limitation de taux (sous charge)FréquentRare
Précision en temps réelModéréÉlevé
Intégration des retours ERPPartielComplet, enregistré

8. Technologies & Outils

  • API Admin GraphQL de Shopify
  • PHP (StockController) avec ShopifyServiceLogManagerDBOpsApiService
  • MySQL pour le cache local et les journaux
  • INNSOF ERP webhooks
  • Cron Jobs pour les tentatives et les rappels ERP

9. Avantages pour Wellcare & Raf Pharmacy

  • 🔄 Précision des stocks en temps réel dans plus de 100 magasins et canaux
  • 🚫 Aucune vente excessive et expérience client fluide
  • ⚡ Haut débit : des milliers de mises à jour de SKU par heure
  • 🔍 Trace audit détaillé pour la conformité et le débogage
  • 📈 Amélioration du SEO & de l'UX sur les vitrines web et mobiles

10. FAQ

  1. Pourquoi récupérer l'action actuelle avant de mettre à jour ?
    Assure que nous calculons le delta correct, évitant ainsi les écrasements accidentels ou les ajustements en double.
  2. Combien de SKU GraphQL peut-il gérer dans un lot ?
    Jusqu'à 100 SKU par mutation et 60 par requête, configurables en fonction du plan de magasin.
  3. Puis-je mélanger REST et GraphQL ?
    Oui. Nous gardons REST comme solution de secours pour les mises à jour critiques lorsque GraphQL est limité.
  4. Le stock multi-emplacements fonctionne-t-il ?
    Absolument. Nous interrogeons et mettons à jour les niveaux par emplacement en utilisant locationId.
  5. Cette approche est-elle adaptable à d'autres ERP ?
    Oui. Notre conception modulaire peut s'intégrer avec Odoo, SAP, Oracle 6i, et plus encore.

Pourquoi choisir les solutions e-commerce de Seamedia ?
Chez Seamedia, nous combinons une expertise approfondie de Shopify avec un savoir-faire solide en intégration ERP pour fournir des solutions sur mesure et performantes qui génèrent de réels résultats commerciaux. Notre équipe—dirigée par des consultants expérimentés comme Prajosh VM—comprend les complexités de l'inventaire multi-sites, des volumes élevés de SKU et du commerce omnicanal. Nous concevons des flux de travail évolutifs, pilotés par API, qui maintiennent votre stock précis, vos clients satisfaits et vos opérations fluides. Que vous soyez une chaîne de pharmacies en forte croissance, un détaillant national ou un fabricant d'entreprise, Seamedia propose un développement de bout en bout, une connectivité ERP transparente et un support 24/7.

Prêt à rationaliser votre inventaire et dynamiser vos ventes ?
Contactez-nous dès aujourd'hui à hello@seamedia.in ou visitez www.seamedia.in pour discuter de la manière dont nous pouvons créer une solution de synchronisation de stock en temps réel sur mesure pour votre entreprise.