Aller au contenu

Ingénierie

Quand le prix catalogue change en pleine négociation : quel prix un devis doit utiliser

Par Jahangir Alam · 31 octobre 2026 · 10 min de lecture

Dernière vérification
API Shopify
2026-10
Public
Développeurs et agences qui construisent ou auditent la négociation et les validations de devis dans une couche de devis sur Shopify
Périmètre
Les changements de prix catalogue pendant qu'un devis est ouvert, en API 2026-10 : où un prix Shopify bouge (prix de la variante, prix fixes et ajustements en pourcentage des listes de prix, tarification par volume, priorité entre catalogues, taux de change) et quels webhooks existent, quatre prix par ligne et leur rôle, quand relire le prix actuel et quand ne jamais le faire, sa résolution avec contextualPricing à la quantité de la ligne avec provenance et gestion des échecs, montrer au vendeur ce qui a bougé, la devise, et des cas de test

Un prix catalogue qui change pendant qu'un devis est ouvert ne doit jamais changer l'offre que l'acheteur a entre les mains. Il doit changer ce que voit le vendeur, et ce contre quoi la prochaine version du vendeur est vérifiée. Il faut pour cela quatre prix par ligne, chacun avec un seul rôle : le prix catalogue capturé quand la ligne est entrée dans le devis, le prix actuel que l'acheteur paierait aujourd'hui, le prix demandé par l'acheteur et le prix proposé. L'offre est figée une fois envoyée. Le prix actuel est relu côté serveur à chaque envoi du vendeur et stocké avec la version. La contre-proposition de l'acheteur le reprend sans le modifier, et rien n'est rechiffré après l'envoi d'une version. Quand le devis accepté devient une commande provisoire Shopify, le prix accepté est envoyé explicitement.

Cette page décrit cette conception, avec du code simplifié. Les versions de devis immuables expliquent pourquoi une version envoyée n'est jamais modifiée, et pourquoi un devis se convertit au mauvais prix couvre le côté commande provisoire ; cette page porte sur l'entre-deux, pendant que la négociation est ouverte. Quand QuotWay sert d'exemple, il est décrit tel qu'il fonctionne aujourd'hui ; le reste relève de recommandations, signalées comme telles.

Les faits Shopify ci-dessous ont été vérifiés dans la documentation de Shopify le 31 octobre 2026, en version d'API 2026-10 ; les sources sont en fin de page.

Où un prix Shopify peut bouger

« Le prix catalogue » n'est pas un nombre unique sur Shopify. Le prix d'un acheteur résulte de plusieurs éléments, et chacun peut changer de son côté :

Ce qui change Effet sur le prix de l'acheteur Un webhook vous prévient-il ?
Le prix de la variante Fait bouger le prix par défaut, et chaque prix de liste de prix défini par un ajustement en pourcentage products/update - qui se déclenche aussi quand un produit est commandé
Un prix fixe sur une liste de prix Fait bouger le prix de cet acheteur pour cette variante uniquement Aucun sujet ne nomme les listes de prix
L'ajustement en pourcentage d'une liste de prix Fait bouger chaque variante de la liste sans prix fixe ni tarification par volume Aucun sujet ne nomme les listes de prix
La suppression d'un prix fixe Retombe sur l'ajustement en pourcentage de la liste Aucun sujet ne nomme les listes de prix
La tarification par volume et les paliers de quantité Change le prix au-delà d'un seuil de quantité ; dès qu'un produit a une tarification par volume, l'ajustement en pourcentage du catalogue ne s'y applique plus Aucun sujet ne nomme les paliers de quantité
L'attribution d'un autre catalogue à l'acheteur Peut changer le prix : « the more specific price is used » (le prix le plus spécifique est utilisé), et si aucun catalogue n'est plus spécifique, le prix le plus bas Non documenté
Les taux de change du marché Les prix convertis « change automatically with market exchange rates » (suivent automatiquement les taux de change du marché), sauf si vous utilisez des taux manuels ou des prix internationaux fixes Non

Deux conséquences structurent la suite. D'abord, aucun événement auquel s'abonner ne couvre les changements de prix B2B : une couche de devis ne peut pas garder ses prix à jour en écoutant. Elle doit relire le prix aux moments qui comptent. Ensuite, le prix propre de la variante n'est pas le bon nombre pour un acheteur B2B. Le bon nombre est le prix après tous les ajustements, pour cet acheteur, à cette quantité.

Quatre prix, quatre rôles

Chaque ligne garde quatre prix. Ils semblent redondants jusqu'à ce qu'on se demande quelle décision chacun sert :

Prix Rôle Écrit Relu
Prix catalogue capturé Historique : ce que l'acheteur a vu au moment de demander Une fois, quand la ligne entre dans le devis Jamais
Prix actuel (référence) La base de décision : % de remise, contrôles de prix plancher, seuils de validation À chaque envoi du vendeur, côté serveur Au chargement de l'éditeur (affichage), à chaque envoi du vendeur
Prix demandé La demande de l'acheteur Quand l'acheteur soumet sa demande ou fait une contre-proposition Jamais - une contre-proposition est une nouvelle version
Prix proposé L'offre Quand le vendeur envoie une version Jamais - l'offre suivante est une nouvelle version

Le prix capturé et le prix actuel sont séparés à dessein. Les fusionner fait perdre soit l'historique (qu'a vu l'acheteur quand il a demandé ?), soit la base de décision (quelle est la profondeur de cette remise aujourd'hui ?). Une règle de prix plancher qui compare l'offre à un prix catalogue vieux de trois semaines contrôle la mauvaise remise.

Quand relire, et quand ne jamais relire

Le prix actuel est lu à quelques moments définis, et chacun a un objectif différent :

Moment Relire le prix actuel ? Pourquoi
Réception - l'acheteur soumet une demande Enregistrer ce que l'acheteur a vu ; résoudre côté serveur avant qu'une décision ne l'utilise La boutique peut soumettre le prix montré à l'acheteur, ce qui est le bon historique. Un prix envoyé par un navigateur ne peut pas être vérifié contre le catalogue tant que le serveur ne l'a pas résolu : il ne doit pas devenir la base de décision sans contrôle.
Chargement de l'éditeur - le vendeur ouvre le devis Oui, pour l'affichage Le vendeur doit voir ce qui a bougé avant de rédiger une offre. Rien n'est stocké.
Envoi du vendeur - une nouvelle version part Oui, de façon autoritaire, et le stocker sur la version Les contrôles de prix plancher et de validation s'appuient sur ce nombre. Le stocker permet d'expliquer la décision plus tard.
Contre-proposition de l'acheteur Non - reprendre la référence de la version L'acheteur répond à une version. Rechiffrer sous ses pieds change la question à laquelle il a répondu.
Réévaluation d'une validation Non - utiliser la référence stockée L'approbateur décide sur les chiffres qui vont partir, pas sur un prix plus récent.
Après l'envoi d'une version Jamais Une version envoyée est un document. Un prix modifié est une information pour la prochaine version du vendeur.
Conversion en commande provisoire Non - forcer le prix accepté Sans prix explicite, Shopify chiffre la ligne au prix catalogue actuel.

La dernière ligne est la plus souvent oubliée, et elle est traitée en détail dans pourquoi un devis se convertit au mauvais prix : pour une ligne de variante, priceOverride remplace le prix catalogue ; le champ de prix des lignes personnalisées est ignoré quand une variante est indiquée.

Résoudre le prix actuel avec contextualPricing

L'API Admin de Shopify résout le prix d'un acheteur en un seul champ ; le prix de départ d'un devis Shopify B2B détaille la chaîne de catalogues, de listes de prix et de règles de quantité qui le produit. ProductVariant.contextualPricing prend un contexte - un companyLocationId pour un acheteur B2B, ou un country pour un marché - et renvoie « the final price after all adjustments are applied » (le prix final après application de tous les ajustements), les paliers de quantité, la règle de quantité et un auditTrail qui enregistre « the adjustments used to determine the final price, in order of their application » (les ajustements utilisés pour déterminer le prix final, dans leur ordre d'application).

query CurrentPrices($ids: [ID!]!, $location: ID!) {
  nodes(ids: $ids) {
    ... on ProductVariant {
      id
      contextualPricing(context: { companyLocationId: $location }) {
        price { amount currencyCode }
        quantityPriceBreaks(first: 10) {
          nodes { minimumQuantity price { amount currencyCode } }
        }
        auditTrail { priceAdjustments { __typename } }
      }
    }
  }
}

Trois détails décident si le nombre est juste.

Résoudre à la quantité de la ligne. price est le prix pour une unité. Une ligne B2B de 500 unités peut dépasser un palier de quantité, et le vrai prix catalogue de l'acheteur est alors le prix du palier. Comparer une offre au prix unitaire fait paraître chaque remise plus profonde qu'elle n'est, si bien que prix planchers et validations se déclenchent sur des affaires qui n'en ont pas besoin. Les paliers s'appliquent par variante et ne se cumulent pas entre variantes. Une esquisse (recommandation) :

// Le prix catalogue de l'acheteur à une quantité donnée : le palier le plus élevé que la quantité
// atteint, sinon le prix contextuel de base.
function priceAtQuantity(cp: ContextualPricing, quantity: number): Money {
  const reached = cp.quantityPriceBreaks.nodes
    .filter((b) => b.minimumQuantity <= quantity)
    .sort((a, b) => b.minimumQuantity - a.minimumQuantity)[0];
  return reached ? reached.price : cp.price;
}

Garder la provenance. Stockez à côté du nombre d'où il vient : le contexte utilisé, l'heure et, si vous pouvez le déterminer, le catalogue. « Remise de 18 % par rapport à 42,00 » n'est vérifiable que si vous pouvez dire ce qu'était 42,00. L'audit trail aide à expliquer comment un prix a été obtenu, mais il ne nomme ni catalogue ni liste de prix, et il est vide quand Shopify ne peut pas renvoyer un historique complet.

Décider ce que signifie un échec. Shopify peut expirer, ou un scope peut manquer. Sauter en silence le contrôle de prix plancher parce que le prix actuel est inconnu transforme une panne en faille tarifaire. Revenez à la dernière référence stockée et signalez la ligne, ou bloquez l'envoi des lignes sans aucune référence (recommandation). Les deux se défendent ; « pas de référence, donc pas de contrôle » ne se défend pas.

Montrer au vendeur ce qui a bougé

Relire le prix au chargement de l'éditeur ne sert que si le vendeur voit le résultat. Montrez, par ligne, le prix capturé, le prix actuel et l'écart, avant que le vendeur rédige une offre. La réponse devient alors une décision, pas un accident. Un prix modifié laisse trois options honnêtes :

  • Honorer l'offre. L'acheteur détient une version envoyée à l'ancien prix. Maintenez-la jusqu'à son échéance ; la date d'échéance est la fenêtre de protection du prix que vous avez choisie. Combien de temps un devis doit rester valable traite du choix de cette fenêtre.
  • Rechiffrer. Envoyez une nouvelle version du vendeur à un nouveau prix, avec la raison. L'ancienne version reste dans l'historique, intacte.
  • Laisser expirer, puis repartir des prix actuels.

Surveillez aussi les baisses. Si le prix actuel passe sous une offre ouverte, l'acheteur peut voir le prix plus bas dans votre boutique. Signalez ce cas autant que les hausses : une offre au-dessus du propre prix catalogue de l'acheteur est un problème de confiance, pas seulement une question de marge.

La devise : un taux est aussi un prix

Pour un devis dans la devise de l'acheteur, le taux de change est un autre élément qui bouge. Shopify convertit les prix « automatically with market exchange rates » (automatiquement selon les taux de change du marché), sauf si la boutique utilise des taux manuels, et « international fixed prices will always take precedence over a manual conversion rate » (les prix internationaux fixes priment toujours sur un taux de conversion manuel).

Deux règles rendent cela gérable (recommandation). Fixez la devise du devis à sa création, et ne convertissez jamais une offre envoyée. Quand le prix actuel revient dans une autre devise que celle du devis, convertissez-le avec un taux enregistré - et enregistrez lequel, car « le prix a augmenté » et « le taux a bougé » mènent à deux conversations différentes avec l'acheteur. Côté commande provisoire, la section sur le taux de change explique ce que fait Shopify quand un brouillon est créé ou modifié dans une autre devise.

Ce qui ne bouge jamais

  • Les prix d'une version envoyée. Un changement de catalogue après l'envoi ne touche pas l'offre.
  • Les lignes acceptées. L'acceptation nomme sa version et enregistre ses prix.
  • Les prix des lignes de la commande provisoire. Ils sont envoyés depuis la version acceptée, explicitement, pour que le prix catalogue actuel ne puisse pas les remplacer.

Les versions de devis immuables expliquent pourquoi les deux premiers points tiennent. Créer la commande provisoire exactement une fois couvre le troisième sans doublons.

Cas de test pour votre propre développement

  1. Augmentez le prix d'une variante après l'envoi d'un devis. L'offre envoyée et la vue de l'acheteur ne changent pas.
  2. Augmentez-le, puis envoyez une nouvelle version du vendeur. La nouvelle version stocke le nouveau prix actuel, et le contrôle de prix plancher l'utilise.
  3. Modifiez un prix fixe sur une liste de prix B2B. L'éditeur affiche le changement au chargement suivant, sans aucun webhook.
  4. Modifiez l'ajustement en pourcentage d'une liste de prix. Chaque variante sans prix fixe bouge ; celles qui en ont un ne bougent pas.
  5. Chiffrez 500 unités d'une variante avec un palier à 100. La référence est le prix du palier, pas le prix unitaire.
  6. Laissez l'acheteur faire une contre-proposition après un changement de prix. Elle reprend la référence de la version ; rien n'est relu.
  7. Faites échouer la résolution du prix. L'envoi soit se bloque, soit part avec une référence stockée et signalée - jamais sans contrôle de prix plancher.
  8. Baissez le prix sous une offre ouverte. Le vendeur voit la baisse.
  9. Acceptez, puis modifiez le prix catalogue, puis convertissez. La commande provisoire porte le prix accepté.

La place de QuotWay

Sur les devis rattachés à une entreprise, QuotWay relit le prix du site de l'entreprise à chaque envoi du vendeur, côté serveur, avec contextualPricing et le site d'entreprise du devis - et non à partir de la copie de l'éditeur. Il stocke ce prix sur chaque ligne de la version, enregistre sur la version le catalogue d'après lequel il a été résolu, et l'utilise comme référence pour les prix planchers et les validations de remise. La contre-proposition d'un acheteur reprend le prix catalogue capturé et cette référence sans relire ni l'un ni l'autre. L'éditeur de proposition affiche la référence catalogue de chaque ligne et avertit quand un produit ne figure pas dans le catalogue du site d'entreprise de l'acheteur. Une version envoyée n'est jamais rechiffrée, et la conversion d'un devis accepté envoie le prix accepté sur chaque ligne de la commande provisoire Shopify.

Les devis rattachés à une entreprise demandent le forfait Enterprise et une boutique Shopify avec le B2B ; voir les devis B2B sur Shopify, la négociation et les tarifs.

Questions fréquentes

Un changement de prix catalogue affecte-t-il un devis déjà envoyé ?

Il ne le devrait pas. Une version envoyée stocke ses propres prix : l'offre que l'acheteur détient reste telle qu'envoyée. Le changement compte pour la prochaine version du vendeur, dont les contrôles de prix plancher et de validation doivent utiliser le prix actuel, et pour la conversion, où le prix accepté doit être envoyé explicitement, faute de quoi Shopify utilise le prix catalogue actuel.

Quel prix les validations de remise et les prix planchers doivent-ils utiliser ?

Le prix actuel de l'acheteur pour cette ligne, résolu côté serveur au moment de l'envoi du vendeur, à la quantité de la ligne, et stocké avec la version. Pas le prix capturé quand la ligne est entrée dans le devis, qui peut dater de plusieurs semaines, ni un prix fourni par le navigateur.

Existe-t-il un webhook Shopify pour les changements de listes de prix B2B ?

Aucun qui les nomme. En version d'API 2026-10, les sujets de webhook comprennent products/update, qui se déclenche quand des variantes changent (et quand un produit est commandé), mais aucun sujet ne nomme les listes de prix, les catalogues ou les paliers de quantité. Relisez les prix aux moments où un devis en a besoin plutôt que de compter sur un événement.

Comment obtenir le prix d'un site d'entreprise avec l'API Admin ?

Interrogez contextualPricing sur la variante de produit avec context: { companyLocationId: ... }. Il renvoie le prix final après tous les ajustements, les paliers de quantité, la règle de quantité et un historique des ajustements appliqués. Retenez le prix du palier correspondant à la quantité de la ligne.

La contre-proposition d'un acheteur doit-elle être rechiffrée au catalogue actuel ?

Non. Une contre-proposition répond à une version précise : elle reprend les prix et la référence de cette version. Rechiffrer sous les pieds de l'acheteur change la question à laquelle il a répondu. Reprenez le nouveau prix quand le vendeur envoie la version suivante.

Et si le prix catalogue baisse pendant qu'un devis est ouvert ?

Signalez-le au vendeur. Une offre au-dessus du prix catalogue actuel de l'acheteur est visible pour l'acheteur dans votre boutique. Le vendeur peut rechiffrer à un prix plus bas dans une nouvelle version, ou maintenir l'offre et l'expliquer ; dans les deux cas, ce doit être une décision, pas une découverte au moment du paiement.

Sources

Pages Shopify consultées le 31 octobre 2026 (version d'API 2026-10) :

Le comportement de QuotWay est décrit d'après sa documentation publique et le code source de l'application, consultés le 31 octobre 2026.

Articles liés

Découvrez comment QuotWay gère cela sur votre boutique.

Nous souhaitons déposer des cookies de mesure d'audience pour comprendre comment le site est utilisé. Ils ne sont pas nécessaires : refuser ne change rien au fonctionnement du site, et vous pouvez revenir sur votre choix à tout moment depuis notre page de confidentialité.