Maintenir un inventaire précis et à jour est primordial pour tout détaillant à volume élevé. Bien-être et Pharmacie Raf—deux chaînes de pharmacies leaders au Qatar avec plus de SKU 10,000, Plus de 100 magasins physiqueset des ventes actives à travers Boutiques en ligne Shopify, application mobile et systèmes de point de vente—Nous avons développé une solution robuste et en temps réel de mise à jour des stocks de l'ERP vers Shopify. Nous présentons ci-dessous notre architecture de bout en bout, des extraits de code et nos résultats de performance.
- Portée et défis du projet
- 1. Approche initiale : API REST Shopify
- 2. Migration vers l'API Shopify GraphQL
- 3. Présentation de l'architecture
- 4. Récupération du stock actuel via GraphQL
- 5. Ajustement de l'inventaire via GraphQL
- 6. Points forts de l'optimisation
- 7. Comparaison des performances
- 8. Technologies et outils
- 9. Avantages pour Wellcare et Raf Pharmacy
- 10. FAQ
Portée et défis du projet
- Clients: Pharmacie Wellcare et pharmacie Raf, Qatar
- Taille du catalogue : Plus de 10,000 XNUMX références SKU
- Canaux de vente: Vitrine Shopify, applications mobiles sans tête, plus de 100 emplacements physiques
- ERP : INNSOF ERP pousser les mises à jour des stocks
- Exigences :
- Synchronisation en temps réel pour éviter la survente
- Évolutif pour un volume de mises à jour élevé
- Latence et erreurs d'API minimales
- Gestion précise des stocks multi-sites
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 pousser les mises à jour des stocks.
// 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 lots : Un SKU par demande
- Limites tarifaires strictes : ~2 appels/sec par magasin → goulot d'étranglement pour des milliers de références
- Latence élevée : 50 à 100 ms par requête, accumulant les retards
- Sujet aux erreurs : Erreurs fréquentes de limite de débit sous charge
2. Migration vers l'API Shopify GraphQL
Pour surmonter les limitations REST, nous sommes passés à De Shopify API d'administration GraphQL, déverrouillage :
- Mises à jour par lots au
inventoryAdjustQuantitiesmutation - Limitation basée sur les coûts (plus flexible que REST)
- Réduction des frais généraux du réseau en demandant uniquement les champs nécessaires
- Ajustements basés sur le delta (mise à jour uniquement lorsque le stock change réellement)
3. Présentation 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 et journalisation
- Nous analysons, validons et enregistrons 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 enregistrons la demande dans une base de données locale (
- Obtenir le stock actuel
- Récupérez les niveaux de stock existants via GraphQL (par emplacement et SKU).
- Calculer les deltas
- Comparez les actions ERP et Shopify pour déterminer
delta.
- Comparez les actions ERP et Shopify pour déterminer
- Ajuster l'inventaire
- Envoyez une seule mutation GraphQL par lot (jusqu'à 100 SKU).
- Gestion des réponses
- Enregistrez les réussites/échecs et transmettez l'état de mise à jour à l'ERP.
- Nouvelles tentatives et repli
- Les tâches cron automatisées réessayent les lots ayant échoué ; reviennent à REST si nécessaire.
4. Récupération du stock actuel via GraphQL
Un calcul delta précis commence par la récupération des quantités existantes. Nous effectuons des lots 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 rassemble 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 de l'inventaire via GraphQL
Une fois que nous connaissons le stock actuel, nous préparons le delta mettre à jour la charge utile :
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 SKU à la fois, réduisant considérablement le bavardage sur le réseau.
6. Points forts de l'optimisation
- Traitement par lots et découpage en morceaux : 60 éléments/requête pour les lectures ; 100 éléments/mutation pour les écritures.
- Mise en cache locale : Boutique
inventory_item_id&location_iddans MySQL pour éviter les recherches répétitives. - Logique Delta : Mettez à jour uniquement les SKU dont le stock actuel diffère du stock ERP.
- Sensibilisation à la limite de débit : insérer
sleep()/usleep()stratégiquement et revenir à REST pour les nouvelles tentatives urgentes. - Journalisation robuste : Chaque demande et réponse est enregistrée
api_request_logetstock_update_logles tables.
7. Comparaison des performances
| Métrique | API REST | API GraphQL |
|---|---|---|
| Prise en charge des mises à jour par lots | ❌ | ✅ |
| Temps moyen pour 100 SKU | ~60 s | ~5 s |
| Erreurs de limite de débit (sous charge) | Fréquent | Rare |
| Précision en temps réel | Modérée | Haute |
| Intégration des commentaires ERP | Partiel | Complet, connecté |
8. Technologies et outils
- API d'administration Shopify GraphQL
- PHP (Contrôleur de stock) au
ShopifyService,LogManager,DBOps,ApiService - MySQL pour la mise en cache locale et les journaux
- INNSOF ERP webhooks
- cron Jobs pour les nouvelles tentatives et les rappels ERP
9. Avantages pour Wellcare et Raf Pharmacy
- (I.e. Précision des stocks en temps réel dans plus de 100 magasins et canaux
- 🚫 Zéro survente et une expérience client fluide
- | Haut débit: des milliers de mises à jour de SKU par heure
- 🔍 Piste d'audit détaillée pour la conformité et le débogage
- 📈 Amélioration du référencement et de l'expérience utilisateur sur les vitrines Web et mobiles
10. FAQ
- Pourquoi récupérer le stock actuel avant de mettre à jour ?
Garantit 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 conservons REST comme solution de secours pour les mises à jour critiques lorsque GraphQL est limité. - L’inventaire multi-sites fonctionne-t-il ?
Absolument. Nous interrogeons et mettons à jour les niveaux par emplacement à l'aidelocationId. - Cette approche est-elle adaptable à d’autres ERP ?
Oui. Notre conception modulaire s'intègre à Odoo, SAP, Oracle 6i, etc.
Pourquoi choisir les solutions de commerce électronique Seamedia ?
Chez Seamedia, nous allions une expertise approfondie de Shopify à un solide savoir-faire en matière d'intégration ERP pour proposer des solutions sur mesure et performantes qui génèrent des résultats commerciaux concrets. Notre équipe, dirigée par des consultants expérimentés comme Prajosh VM— comprend la complexité des stocks multi-sites, des volumes élevés de références et du commerce omnicanal. Nous concevons des workflows évolutifs, pilotés par API, qui garantissent l'exactitude de vos stocks, la satisfaction de vos clients et le bon fonctionnement de vos opérations. Que vous soyez une chaîne de pharmacies en pleine croissance, un distributeur national ou un fabricant, Seamedia offre un développement de bout en bout, une connectivité ERP fluide et une assistance 24h/7 et XNUMXj/XNUMX.
Prêt à rationaliser votre inventaire et à dynamiser vos ventes ?
Appelez-nous tout de suite au bonjour@seamedia.in ou visitez le site www.seamedia.in pour discuter de la manière dont nous pouvons créer une solution de synchronisation des stocks en temps réel personnalisée pour votre entreprise.