Shopify indique 128,45 pour la commande. Le bon de commande dans Odoo indique 106,16. Personne n'a rien touché, le connecteur ne signale aucune erreur, et pourtant les deux chiffres divergent. En pratique, presque tous les écarts de montant entre Odoo et Shopify se ramènent à l'une de huit causes, et chacune laisse une empreinte différente. Ce guide les parcourt toutes les huit, donne le symptôme qui identifie chacune et pointe le champ exact à vérifier de chaque côté.
Cela vaut pour toute commande Shopify hébergée dans Odoo, quel que soit le connecteur qui l'a importée : le Shopify Odoo Connector d'Emipro, Webkul, un module OCA ou une passerelle maison. Les noms de champ ci-dessous sont ceux des modèles standard d'Odoo, complétés le cas échéant par les paramètres qu'un connecteur expose habituellement sur son enregistrement d'instance.
D'abord, assurez-vous de comparer des nombres comparables
Avant de chercher un bug, vérifiez ce que vous comparez réellement. Les deux systèmes affichent plusieurs « totaux », et ils ne veulent pas dire la même chose.
- Total actuel Shopify : ce que le client doit aujourd'hui, après remboursements et modifications. Dans l'Admin API : currentTotalPriceSet.
- Total d'origine Shopify : ce qui a été convenu au paiement, avant tout changement ultérieur : originalTotalPriceSet.
- Total de la commande Odoo : amount_total sur sale.order, c'est-à-dire ce que le connecteur a importé, plus ce qu'il a resynchronisé ensuite.
- Facturé net dans Odoo : factures clients comptabilisées moins avoirs comptabilisés (account.move, move_type out_invoice et out_refund).
Que ces quatre nombres diffèrent n'est pas, en soi, un problème. La seule vraie question est de savoir quelle paire devrait correspondre, et cela dépend du chemin parcouru par la commande : une commande non facturée n'appelle pas la même comparaison qu'une commande facturée, remboursée puis modifiée.
1 Cause 1 : prix taxe comprise
C'est la fausse alerte la plus fréquente, et la plus facile à écarter. Si vos prix Shopify incluent la taxe et que vos taxes Odoo sont configurées en « Comprise dans le prix », le sous-total de Shopify et le montant hors taxes d'Odoo mesurent deux choses différentes : le premier est TTC, le second HT.
Le symptôme ne trompe pas : l'écart vaut exactement le taux de taxe. 128,45 contre 106,16, ce n'est pas un arrondi, c'est 21 % de TVA.
La solution consiste à choisir une comparaison qui survit à ce réglage. Comparez les totaux TTC — total actuel Shopify contre amount_total d'Odoo — ou comparez le net des deux côtés, en retranchant amount_tax à amount_total dans Odoo. Ce qu'il ne faut jamais faire, c'est comparer le sous-total Shopify au amount_untaxed d'Odoo sans être certain que les deux côtés sont configurés de la même façon.
2 Cause 2 : la commande est figée, la facture continue sa vie
Les connecteurs importent une commande Shopify dans un sale.order. Dès que cette commande est facturée, la plupart cessent d'y répercuter les changements ultérieurs, et c'est justifié : une commande facturée est un document comptable, pas un miroir. À partir de là, la commande enregistre ce qui a été commandé et les factures enregistrent ce qui a réellement été facturé.
Donc, quand un remboursement arrive après la facturation, le total actuel de Shopify baisse et la commande Odoo ne bouge pas. L'argent a bien bougé dans Odoo, mais ailleurs : dans un avoir, un account.move avec move_type = out_refund.
Où regarder : sale.order.invoice_ids donne toutes les factures et tous les avoirs rattachés à la commande. Additionnez les out_invoice comptabilisés, soustrayez les out_refund comptabilisés, et ce net est ce qui doit correspondre au total actuel de Shopify. Par ligne, la quantité qui fait foi est qty_invoiced, pas product_uom_qty.
C'est aussi pourquoi comparer le bon de commande à Shopify produit de plus en plus de fausses alertes à mesure que la commande vieillit : vous comparez une photo prise à l'import à un document vivant.
3 Cause 3 : remboursements — l'argent correspond toujours, les quantités pas forcément
Les remboursements Shopify existent en deux variantes, et une seule touche au stock. Un remboursement peut rendre l'argent et remettre les unités en stock, ou rendre l'argent en laissant les unités où elles sont : produit abîmé, geste commercial, ajustement partiel de prix.
Dans l'Admin API, la distinction se lit sur chaque ligne de remboursement, dans restockType : NO_RESTOCK, CANCEL, RETURN ou LEGACY_RESTOCK. Conséquence pour le rapprochement : un remboursement NO_RESTOCK baisse le montant sans changer la quantité vive de la ligne, donc un contrôle des quantités ligne à ligne peut sembler faux alors que l'argent est parfait.
C'est l'écart le plus mal interprété, parce que l'instinct pousse à croire les quantités plutôt que les montants. Ici les montants ont raison et les quantités racontent autre chose : ce qui a été facturé face à ce qui est physiquement revenu.
4 Cause 4 : la commande a été modifiée après coup dans Shopify
L'édition de commande de Shopify modifie la commande sur place : des lignes sont ajoutées, retirées ou requantifiées après le paiement du client. Shopify conserve les deux chiffres — originalTotalPriceSet pour le paiement, currentTotalPriceSet pour la commande modifiée — et la plupart des connecteurs resynchronisent le bon de commande : amount_total suit donc la modification dans Odoo et cesse de correspondre à ce qui avait été commandé.
En soi, c'est sans danger. La variante risquée est la modification qui arrive après facturation : une ligne déjà facturée dans Odoo est supprimée dans Shopify. Odoo a alors facturé plus que ce que Shopify encaissera jamais. Ce n'est pas un artefact d'affichage, c'est une surfacturation réelle, et il faut un avoir.
Symptôme : le facturé net d'Odoo dépasse le total actuel de Shopify, la commande n'a aucun remboursement, et le total d'origine Shopify est supérieur à son total actuel. Quand ces trois conditions sont réunies, la commande a été modifiée après facturation.
5 Cause 5 : cartes cadeaux, vendues et dépensées
Les cartes cadeaux produisent deux écarts complètement différents selon le côté de la transaction où elles se trouvent, et il vaut la peine de bien les séparer.
Vendre une carte cadeau. Dans Shopify, la ligne porte l'indicateur isGiftCard et n'a généralement aucun SKU. Les connecteurs ne l'apparient pas par SKU : ils détectent l'indicateur à l'import et routent la ligne vers un produit dédié configuré sur l'instance du connecteur (chez Emipro, gift_card_product_id). Si votre rapprochement apparie les lignes par SKU, la même carte apparaît en deux demi-lignes : une côté Shopify avec un libellé et sans SKU, une côté Odoo avec la référence interne du produit synthétique. La carte va bien ; c'est la clé d'appariement qui est fausse.
Payer avec une carte cadeau. Là, Shopify n'a aucune ligne : une carte cadeau utilisée en paiement est un moyen de paiement, et elle n'apparaît que parmi les passerelles de la commande. Les connecteurs qui doivent équilibrer l'encaissement dans Odoo ajoutent une ligne négative — « Gift card for … » — pointant vers ce même produit synthétique. Odoo a dès lors une ligne de plus que Shopify, et toute vue ligne à ligne naïve montre une ligne sans contrepartie.
6 Cause 6 : remises, cadeaux et produits artefacts
Shopify et Odoo modélisent le même geste commercial sous des formes différentes. Un cadeau dans Shopify, c'est une deuxième ligne à 0,00. Une remise, c'est un montant porté par la ligne elle-même. Les connecteurs Odoo expriment souvent les deux par une ligne supplémentaire pointant vers un produit synthétique configuré sur l'instance : typiquement un produit de remise, un produit d'ajustement de remboursement, un produit de droits de douane, un produit de pourboire et un produit de livraison.
Ces lignes artefacts n'ont aucune contrepartie dans les lineItems de Shopify. Ligne à ligne, elles ressemblent à des fantômes ; sur le total, elles sont exactement ce qui fait coïncider les deux montants. Les supprimer casserait la commande au lieu de la réparer.
Comment comparer correctement : agrégez les lignes par SKU avant de les apparier, et excluez les produits configurés comme artefacts sur l'instance du connecteur. Une fois ces deux règles en place, les différences restantes sont réelles.
7 Cause 7 : livraison, droits de douane et frais
La livraison est un concept à part dans Shopify — une ligne de livraison avec son prix et sa taxe — alors que dans Odoo elle arrive en général comme une ligne de commande ordinaire marquée is_delivery, valorisée depuis le produit de livraison du connecteur. Droits de douane, pourboires et surcharges de paiement suivent le même schéma.
Conséquence pratique : le nombre de lignes ne correspond presque jamais, même sur une commande parfaitement synchronisée, et toute comparaison de sous-totaux hérite de cet écart. Comparez d'abord les totaux ; ne comparez les lignes qu'après avoir exclu les lignes de livraison et de frais côté Odoo.
Il en va de même pour l'axe livraison : une ligne de service n'a aucun mouvement de stock derrière elle, sa quantité livrée reste donc à zéro pour toujours. C'est le comportement correct, pas une expédition en attente.
8 Cause 8 : devise, presentment money et arrondis
Shopify renvoie chaque champ monétaire en double : shopMoney, dans la devise de votre boutique, et presentmentMoney, dans la devise que le client a réellement vue. Si vous vendez en plusieurs devises, le connecteur en a importé une et vous lisez peut-être l'autre.
Odoo ajoute sa propre seconde conversion : la commande est stockée dans sa devise puis convertie dans celle de la société au taux du jour. Un taux de change périmé produit un petit écart toujours orienté dans le même sens — un indice fiable, car les vraies erreurs sont rarement aussi régulières.
Reste l'arrondi pur. Des différences de un à trois centimes sur des commandes multi-lignes avec remises en pourcentage par ligne relèvent de l'arrondi, et les traquer, c'est perdre son après-midi. Tout écart plus grand a l'une des causes ci-dessus derrière lui.
Référence rapide : du symptôme à la cause
| Ce que vous voyez | Cause la plus probable | Où vérifier |
|---|---|---|
| L'écart vaut exactement le taux de taxe | Prix taxe comprise | Taxe Odoo « Comprise dans le prix » ; comparer les totaux TTC |
| Odoo supérieur à Shopify, la commande a un remboursement | Remboursement comptabilisé après facturation | account.move out_refund ; qty_invoiced par ligne |
| Odoo supérieur, sans remboursement, Shopify original > actuel | Commande modifiée après facturation (surfacturation) | originalTotalPriceSet contre currentTotalPriceSet |
| Les montants correspondent, la quantité d'une ligne non | Remboursement sans remise en stock | refundLineItems.restockType ; currentQuantity |
| Une ligne de plus dans Odoo, écart d'un montant rond | Carte cadeau utilisée en paiement | Passerelles de paiement ; ligne négative dans Odoo |
| Une carte cadeau affichée en deux demi-lignes | Appariée par SKU au lieu de l'indicateur carte cadeau | isGiftCard ; produit carte cadeau de l'instance |
| Lignes Odoo supplémentaires nommées remise ou douane | Produits artefacts du connecteur | Produit remise / douane / pourboire / livraison de l'instance |
| Une différence de quelques centimes | Arrondi ou taux de change | shopMoney contre presentmentMoney ; taux du jour dans Odoo |
Un contrôle de cinq minutes, reproductible
Quand un écart atterrit sur votre bureau, cette séquence le résout plus vite que de fixer les deux écrans :
- Ouvrez la commande Shopify. Notez le total actuel et regardez si elle porte des remboursements ou a été modifiée.
- Ouvrez le bon de commande Odoo. Notez amount_total et regardez invoice_status.
- Si elle est facturée : additionnez les factures comptabilisées, retranchez les avoirs comptabilisés, et comparez ce chiffre — pas le total de la commande — au total actuel de Shopify.
- Si elle n'est pas encore facturée : comparez à amount_total et considérez le résultat comme provisoire. Il changera dès la comptabilisation de la facture.
- Si l'écart persiste, parcourez les huit causes dans l'ordre : taxes d'abord, puis facturation, remboursements, modifications, cartes cadeaux, artefacts, livraison, devise. La première qui colle est presque toujours la bonne.
Cinq minutes par commande, c'est acceptable quand cela arrive deux fois par mois. Cela cesse de l'être quand un conseiller doit le faire avant de répondre à chaque e-mail « vous m'avez facturé le mauvais montant », ou quand quelqu'un doit contrôler par sondage une journée de commandes avant la clôture.
À lire ensuite
Ou vérifiez-le en un clic
Odoo–Shopify Order Check exécute toute cette comparaison à votre place, dans la page de commande que vous avez déjà ouverte : totaux, taxes, quantités, lignes, adresses et livraison, avec les remboursements et les cartes cadeaux traités comme du contexte et non comme des erreurs. L'extension est en lecture seule — elle n'écrit jamais dans Odoo ni dans Shopify — et ne demande aucune clé d'API.
Essayer 14 jours gratuitement