For Shopify agencies
Why a quote converts at the wrong price on Shopify: diagnose it by the size of the difference
By Jahangir Alam · October 9, 2026 · 13 min read
- Last verified
- Shopify API
- 2026-10
- Audience
- Shopify agencies and developers handling a converted quote whose draft order, invoice or order shows a different price
- Scope
- Draft orders, invoice checkout and orders created from an accepted quote at API 2026-10: price overrides and catalog prices, the price lock on send, exchange rates and presentment money, tax inclusion and exemption, automatic discounts and codes, discount allocation and cents, split drafts, shipping, deposits, and after-order changes
When a quote converts to a Shopify draft order at the wrong price, measure the difference before you look for the cause: where it shows, at which stage, and how big it is. A line at exactly the catalog price, every amount off by the exchange rate, a total higher by exactly the tax line, a total lower by exactly one discount nobody quoted, a cent per line - each of those shapes has its own documented cause in Shopify, and the size points to it before you open a single setting.
This page is that diagnosis: a table that starts from the observed difference, the Shopify fields that confirm each cause, the fix, and the results Shopify documents as expected - a price lock on send, a re-price after editing a foreign-currency draft, a tax-exempt buyer charged the full tax-included price - kept apart from real faults. What breaks between quote time and conversion time is the design side of the same problem: what to build so the difference never happens.
Everything about Shopify below was checked against Shopify's own pages on 9 October 2026 at API version 2026-10; sources are at the end.
First, measure the difference
Three numbers, in this order:
- Where it shows. A line price, an order discount, the subtotal, tax, shipping, the amount due now, a missing or extra line - or only a report in the shop's currency.
- The stage it first appears at. The calculated draft (
draftOrderCalculateon the input you stored), the saved draft, the invoice checkout, or the order. If the calculated draft is already wrong, the input is wrong; if only the checkout or the order differs, something changed after creation. - Its shape. Subtract and divide before you guess: Y − X equal to one discount or the tax line, Y ÷ X equal to the exchange rate or to (1 + a tax rate), a difference of one cent per line, one whole line.
Then read the row that matches.
The difference, by shape
| # | The buyer accepted X; you see Y | Stage | Shape | Causes, in the order to rule out | Confirm with | Fix |
|---|---|---|---|---|---|---|
| 1 | A line at the store's or the company catalog's price | Calculated or saved draft | Catalog price − agreed price, variant lines only | No priceOverride on the line; the agreed price sent in the custom-line field on a variant line; the line re-added in the admin |
Line priceOverride is null; originalUnitPriceSet = the catalog price; allVariantPricesOverridden is false |
Send priceOverride in the draft's currency on every negotiated variant line (shape 1) |
| 2 | Right on the draft, different at the invoice checkout | Invoice checkout | The product's or catalog's new price | A catalog-priced line with prices unlocked when the invoice went out; the draft edited after sending | No priceOverride; the lock on send; updatedAt later than the invoice |
Override the price, or lock on send; never edit after sending (shape 2) |
| 3 | Every amount, or the order discount, off by a factor near the exchange rate | Draft | × the rate | A price sent in another currency (converted automatically); the draft edited later (re-priced at the current rate); no presentment currency set; a fixed discount read in shop currency | presentmentCurrencyCode; each priceOverride.currencyCode; appliedDiscount.amountSet shop versus presentment money |
Fix the currency at quote time and create the draft in it; don't edit a saved foreign-currency draft (shape 3) |
| 4a | Total higher by the whole tax line | Draft or checkout | = totalTaxSet |
The exemption wasn't applied; a tax-exempt buyer on tax-included prices | taxExempt, taxesIncluded, the location's tax settings |
Put the company location on the draft; price exempt buyers explicitly on tax-included stores (shape 4) |
| 4b | Tax differs by a rate difference | Draft, checkout or order | Base × (rate₁ − rate₂) | A different shipping address; the billing address used when no shipping address exists; a checkout address outside the market; from 2026-10, an address change on the order | taxLines[].rate, the addresses |
Ship-to on the draft; compare at conversion |
| 4c | Line prices divided or multiplied by (1 + the home tax rate) | Draft | ÷ or × (1 + rate) on catalog-priced lines | Tax-inclusive or dynamic tax-inclusive market pricing; the quote and the draft disagree on taxesIncluded |
taxesIncluded on the quote versus the draft |
Quote on the same tax basis as the buyer's market |
| 5 | Total lower by one exact amount nobody quoted | Draft or checkout | = one platform discount | Automatic discounts accepted; a code the buyer entered at checkout; the same discount sent as a line and an order discount; a cart transform on a Plus store | platformDiscounts (title, code, automatic); the order's discountApplications |
Set acceptAutomaticDiscounts and allowDiscountCodesInCheckout explicitly; one discount, one place (shape 5) |
| 6 | A quoted discount missing or smaller | Draft | = the missing discount, or the percentage of a smaller base | An ineligible code (skipped); a shipping or buy-X-get-Y code; a discount function with network access; a percentage applied after line discounts | The DraftOrderDiscountNotAppliedWarning in warnings; appliedDiscount.amountSet |
Carry a negotiated discount as the price or as one order discount; read the warnings on every calculate |
| 7 | Order lines look undiscounted, but the total is right | Order | Each line gross by its share of the order discount, a cent either way | Reading discountedUnitPriceSet, which excludes order-level and code discounts; per-line allocation cents |
discountAllocations; priceAfterAllDiscountsBeforeTaxesSet |
Reconcile on totals and allocations; never re-sum lines (shape 7) |
| 8 | Split drafts sum to the accepted total ± a cent per draft, or ± a shipping charge | Drafts | ≤ 1 cent per draft, or a whole shipping charge | Each draft's share of a fixed discount rounded on its own; each draft taxed and shipped on its own | Each draft's subtotal against its accepted subset | Expected within a cent per draft; shipping per draft by design |
| 9 | Shipping different | Draft or checkout | = a rate difference | No rate preselected, so the buyer chose at checkout; a product added after the invoice; a shipping discount code (unsupported on drafts) | shippingLine, totalShippingPriceSet |
Preselect the agreed rate, sent with its currency (shape 9) |
| 10 | Amount due now isn't the deposit percentage of the invoice | Draft or checkout | Deposit percentage of the subtotal only | Shopify's help puts the deposit on the subtotal, excluding tax and shipping; its API reference says order total | amountDueNowSet, amountDueLaterSet |
State the basis to the buyer |
| 11a | A line missing | Draft or order | One whole line | The line is still open on the quote - not declined - and converts when accepted; from 2026-10, a buyer-requested removal after the order | The quote's accepted lines; Order.requestedOrderEdits |
Convert the next accepted lines; handle requested edits |
| 11b | An extra line at 0.00 | Draft or invoice | One line, zero | A price-hidden line - shown to the buyer as "Included" - converting at zero | The quote line's visibility | Expected: a price-hidden line must be zero (why) |
| 12 | Order total no longer equals the draft's | Order | A refund, an edit or a tax recalculation | Comparing current* fields (after refunds and edits) with the draft; from 2026-10, tax recalculated when an unfulfilled order's address changes |
originalTotalPriceSet versus currentTotalPriceSet |
Compare like with like (after the order) |
| 13 | A payout, report or ERP in the shop's currency differs | After capture | The exchange rate at transaction time | Shop money is an estimate on a multi-currency draft | presentmentMoney versus shopMoney |
Reconcile in the presentment currency |
The line is at the catalog price
Shape 1. For a variant line, Shopify uses priceOverride "in place of the product variant's catalog price in this draft order". The custom-line price field, originalUnitPriceWithCurrency, "is ignored when variantId is provided" - so a negotiated price sent there on a variant line silently becomes the catalog price. With a company location on the draft, the catalog price is the company's ("prices ... automatically reflect the settings for that company"), which makes the mistake look plausible. One Boolean catches the whole class: when every variant line was negotiated, allVariantPricesOverridden on the calculated draft must be true.
Shape 2. A draft's prices are unlocked by default. Sending an invoice or sharing a checkout link locks them by default "unless you manually set it to be unlocked", and unlocking updates the draft with the product's or catalog's current price. A lock stops rises and falls alike. A line carrying a priceOverride has its own price and isn't exposed to catalog changes in the first place; the lock matters for catalog-priced lines. And never edit a draft after the invoice went out: draftOrderUpdate after a checkout started unlinks that checkout. A change after acceptance is a new proposal and a new draft, not an edit.
The difference is an exchange rate
A draft has one presentmentCurrencyCode. A price override in another currency "will be converted over to match the draft order's presentment currency". The rate on a local-currency draft is calculated when the draft is created and holds for the invoice - but Shopify's help says that editing a saved draft re-prices the whole order at the current rate. On a multi-currency draft, presentment money "is the source of truth for what a customer is going to be charged and shop_money is an estimate".
Order discounts deserve their own check. For a FIXED_AMOUNT applied discount, Shopify's 2026-10 reference says value is "a fixed amount in your shop currency"; a separate amountWithCurrency field takes an amount "in the specified currency". So a fixed discount meant in the buyer's currency, sent as value, can arrive converted from the shop currency. Read appliedDiscount.amountSet - both its shop and presentment money - against the amount you meant, and test fixed discounts on a draft in a non-shop currency before relying on them. A percentage discount has no currency to get wrong.
The difference is tax
Classify a tax difference by its ratio; each ratio has one documented mechanism.
- The whole tax line (4a). The exemption didn't reach the draft. A company location's exemption applies when the location is on the draft; the draft's
taxExemptis overridden by the customer's own tax-exempt field when a customer is applied. And on tax-included pricing, "if you set a customer to be tax exempt ... then the customer is still charged the full listed product price" - expected, by Shopify's rule. Tax exemption on Shopify B2B covers where exemptions live. - A rate difference (4b). Draft taxes follow the shipping address, falling back to the billing address when there is none; a checkout address outside the draft's market is charged the destination's rate. From API 2026-10, changing the shipping address of an unfulfilled order with
orderUpdaterecalculates its tax and can leave a balance due or refundable. - Prices divided by (1 + the home rate) (4c). Tax inclusion is set per market, and when a tax-inclusive store sells into another region Shopify deducts the home tax rate from catalog prices. If the quote and the draft disagree on
taxesIncluded, every catalog-priced line moves by that factor.
The failure-modes post explains why a quote's tax is an estimate and how to compare it at conversion.
The difference is a discount
An extra discount (shape 5). Match the unexplained amount against the calculated draft's platformDiscounts or the order's discountApplications - Shopify records every non-custom discount there with its title, code and whether it was automatic. The sources to check:
acceptAutomaticDiscounts: trueapplies eligible automatic discounts "in addition to discount codes and custom draft order discounts". In the admin, automatic discounts aren't applied to drafts unless you tick the option; the API input documents no default, so set the field explicitly.- Discount codes at the invoice checkout are off by default per draft; Shopify warns that with them on, drafts "risk potentially being discounted more than you anticipate".
- On B2B, automatic discounts and codes "apply as additional discounts on top of" catalog prices.
- A custom order discount is applied on top of line discounts - "be careful not to duplicate the discount".
- On a Plus store, a cart transform function runs on draft orders too, and can change a line's price.
A missing or smaller discount (shape 6). A code the draft isn't eligible for "will be skipped during calculation", and the calculate result says so: DraftOrderDiscountNotAppliedWarning names it by discountTitle and discountCode (the priceRule field was removed at 2026-10). Shipping codes and buy-X-get-Y codes aren't supported on drafts, and discount functions with network access don't run on them. A percentage order discount is a percentage of the order subtotal, applied on top of line discounts, so it comes out smaller than a quote that took the percentage of the gross lines.
The difference is a cent
On the order, the per-line fields answer different questions. discountedUnitPriceSet "doesn't include order-level or code-based discounts", so every line of an order with an order discount looks undiscounted while the total is right. The order discount's share of each line is in discountAllocations ("the final calculated discount amount applied to each line"), and priceAfterAllDiscountsBeforeTaxesSet gives the line after all of them. Allocation produces cent amounts per line, so a quote's own pro-rata and Shopify's can differ by a cent per line while the totals agree: reconcile on totals, and never re-sum the rows into a "should be".
When one quote converts into several draft orders, each draft's share of a fixed discount is rounded on its own, so the drafts can sum to the accepted total plus or minus a cent per draft. Each draft is also taxed and shipped on its own.
Shipping, the deposit and whole lines
- Shipping (shape 9). A preselected shipping line can't be changed by the buyer at checkout; with none preselected, the buyer chooses from the available rates. A product added after the invoice doesn't update a calculated rate.
ShippingLineInput.priceis deprecated at 2026-10;priceWithCurrencytakes precedence and carries its currency. - The deposit (shape 10). Deposits are a Shopify Plus feature. Shopify's help says a deposit is "a percentage of the order subtotal only - it doesn't include taxes or shipping"; the API's
DepositInputsays order total - the reference records the contradiction.amountDueNowSetis what the buyer pays now. - A missing line (11a). If the buyer accepted part of a quote, only the accepted lines convert. A line they haven't decided on is still open on the quote - not declined - and converts when it is accepted. From 2026-10, a buyer can also ask to remove unfulfilled lines after the order, through order editing.
- A line at zero (11b). A line whose price was hidden on the quote - the buyer saw "Included" - converts at 0.00. It must be zero: buyer totals come from the stored quote figure, never summed from the displayed rows, so a hidden line priced above zero would reveal its price by subtraction.
After the order exists
The order's totalPriceSet and subtotalPriceSet are the amounts before returns; the current* fields are after refunds, returns and edits; originalTotalPriceSet is the total at creation. Compare the draft with the original, and explain any gap to the current total from refunds, edits, buyer-requested edits and - from 2026-10 - tax recalculated after an address change. A payout or an ERP in the shop's currency will differ from what the buyer paid by the exchange rate at the time of the transaction; reconcile in the presentment currency. When the quote and the Shopify order disagree catalogues everything that drifts after the order exists.
Where QuotWay fits
QuotWay sends every negotiated variant price as priceOverride in the quote's currency, creates the draft in that currency, and sends a whole-quote discount as one order-level discount. A company-aware quote carries the company location as the purchasing entity, with the location's tax exemption. The convert screen shows Shopify's calculated subtotal, tax, shipping and total for the merchant to read, and holds the conversion when the tax Shopify calculates drifts from the quote's beyond your threshold - see converting a quote to a draft order. Since 30 September 2026 a whole-quote discount also counts toward the price floor and discount approvals, so an order discount can't take a line below the floor unnoticed (floor price and discounts).
The drift check compares tax, shipping and inventory - not line prices or discounts. So the table above is still worth running on a converted quote whose total surprises you; the 50-test launch plan has the draft-order tests to repeat after a fix. Plans are on the pricing page, and conversion is described on convert quotes to orders.
FAQ
Why does a Shopify draft order show the catalog price instead of the negotiated price?
The variant line has no priceOverride. Shopify ignores the custom-line price field (originalUnitPriceWithCurrency) when a variantId is provided, so a negotiated price sent there becomes the catalog price - the company's catalog price if a company location is on the draft. Send priceOverride and check allVariantPricesOverridden on the calculated draft.
Why did the price change when the buyer opened the draft-order invoice?
The line was priced from the catalog and the draft's prices were unlocked when the invoice went out, so it picked up the product's or catalog's current price. Sending an invoice locks prices by default; a line with a priceOverride isn't affected. Editing the draft after sending also unlinks the checkout.
Why is a fixed discount wrong on a draft order in another currency?
Shopify reads a fixed-amount appliedDiscount.value in the shop's currency and offers amountWithCurrency for an amount in another currency. A discount meant in the buyer's currency, sent as value, can arrive converted. Compare appliedDiscount.amountSet in both currencies with what you meant, and test on a non-shop-currency draft.
Why was a tax-exempt B2B customer charged the full price?
On tax-included pricing, Shopify charges a tax-exempt customer the full listed price - that is its documented rule. If the total is higher by the whole tax line on tax-excluded pricing, the company location's exemption didn't reach the draft.
Why is the order discounted more than the quote?
An automatic discount or a code was applied on top of the negotiated prices. Match the extra amount against platformDiscounts on the draft or discountApplications on the order, and set acceptAutomaticDiscounts and allowDiscountCodesInCheckout explicitly on drafts made from quotes.
Why wasn't a discount code applied to my draft order?
The draft wasn't eligible for it, so Shopify skipped it and said so in a DraftOrderDiscountNotAppliedWarning naming the code. Shipping and buy-X-get-Y codes aren't supported on draft orders, and discount functions with network access don't run on them.
Why don't the order's line prices show the quote's discount?
discountedUnitPriceSet on an order line excludes order-level and code discounts. The order discount's share of each line is in discountAllocations; read those, and reconcile on the total.
Why is a line missing, or why is there a line at 0.00?
First check whether a missing line is one the buyer hasn't decided on - it is still open on the quote and converts when accepted. A line at 0.00 is one whose price was hidden on the quote: it must be zero, because the buyer's total comes from the stored quote figure, not from the displayed rows.
Sources
Shopify pages, read on 9 October 2026 at API version 2026-10:
- DraftOrderLineItemInput -
priceOverride, the custom-line price ignored on variant lines, currency conversion of overrides - DraftOrderInput -
presentmentCurrencyCode,acceptAutomaticDiscounts,taxExempt, discount codes - DraftOrderAppliedDiscountInput - fixed amounts in shop currency;
amountWithCurrency - DraftOrder and CalculatedDraftOrder - presentment money as the source of truth,
allVariantPricesOverridden,platformDiscounts,warnings, amounts due now and later - DraftOrderDiscountNotAppliedWarning - skipped codes named by title and code
- LineItem, DiscountAllocation and Order - per-line price fields, allocations, original versus current totals, requested order edits
- ShippingLineInput -
pricedeprecated,priceWithCurrency - Cart Transform API and Discount Function API - functions on draft orders
- Release notes 2026-10 -
priceRuleremoved from discount warnings;orderUpdatetax recalculation - Creating draft orders, sending draft-order invoices and discounts on draft orders - price lock on send, exchange rate fixed at creation and re-priced on edit, tax by address, automatic discounts and codes, custom discounts
- Creating B2B orders using draft orders - company prices, preselected shipping, deposits on the subtotal
- B2B discounts - discounts on top of catalog prices
- Including or excluding tax in prices - tax inclusion per market, home rate deducted, tax-exempt customers on tax-included pricing
- Exchange rates - conversion at the time of the transaction
QuotWay behaviour is described from its public documentation and the app's source, read on 9 October 2026.
Related articles
- For Shopify agenciesIs Shopify good for B2B? When it's the right platform, and when it isn't14 min read
- For Shopify agenciesWhen the quote and the Shopify order disagree: what drifts after conversion12 min read
- For Shopify agenciesBuild vs buy: what a custom Shopify RFQ app has to run in 202614 min read
See how QuotWay handles this on your store.