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 SKU, 100+ magasins physiques, et des ventes actives sur des boutiques web Shopify, des 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
- 1. Approche Initiale : API REST de Shopify
- 2. Migration to Shopify's GraphQL API
- 3. Overview of the architecture
- 4. Récupération des stocks actuels via GraphQL
- 5. Stock Adjustment via GraphQL
- 6. Points forts de l'optimisation
- 7. Comparaison de Performance
- 8. Technologies & Outils
- 9. Avantages pour Wellcare & Raf Pharmacy
- 10. FAQ
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
inventoryAdjustQuantitiesmutation - 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
- ERP → Middleware
- INNSOF ERP envoie une charge utile JSON via HTTP POST à notre
StockController.
- INNSOF ERP envoie une charge utile JSON via HTTP POST à notre
- 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_idetinventory_item_id(à partir des tables mises en cache).
- Nous analysons, validons et journalisons la demande dans une base de données locale (
- Obtenir le stock actuel
- Récupérer les niveaux de stock existants via GraphQL (par emplacement et SKU).
- Calculer les Deltas
- Comparer le stock ERP avec le stock Shopify pour déterminer
delta.
- Comparer le stock ERP avec le stock Shopify pour déterminer
- Ajuster l'inventaire
- Envoyer une seule mutation GraphQL par lot (jusqu'à 100 SKU).
- Gestion des réponses
- Enregistrer les succès/échecs et renvoyer l'état de mise à jour à l'ERP.
- 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_idetlocation_iddans 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_logetstock_update_log.
7. Comparaison de performance
| Métrique | API REST | API 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équent | Rare |
| Précision en temps réel | Modéré | Élevé |
| Intégration des retours ERP | Partiel | Complet, enregistré |
8. Technologies & Outils
- API Admin GraphQL de Shopify
- PHP (StockController) avec
ShopifyService,LogManager,DBOps,ApiService - 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
- 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. - 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. - Puis-je mélanger REST et GraphQL ?
Oui. Nous gardons REST comme solution de secours pour les mises à jour critiques lorsque GraphQL est limité. - Le stock multi-emplacements fonctionne-t-il ?
Absolument. Nous interrogeons et mettons à jour les niveaux par emplacement en utilisantlocationId. - 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.