Automate B2B quote requests: from price request to draft order to order
Updated · By Ecomsellertool editorial team
To automate B2B quote requests, capture every request in one queue, check it by rule against the buyer's price list, minimum quantities, stock, terms and your margin floor, then create a draft order. Clean requests go out as a priced quote with a valid-until date; exceptions go to a person. When the buyer accepts, the same draft becomes the order, so nobody retypes it.
- Shopify B2B runs on the Basic, Grow, Advanced and Plus plans, and draft order to invoice, checkout to draft and PO numbers are on all four; deposits are Plus only (checked November 5, 2026).
- A Shopify draft order assigned to a B2B company location takes that company's prices, payment terms and checkout options automatically.
- Shopify's draft order statuses are Open, Invoice sent and Completed. None means expired, so the workflow has to hold the valid-until date and act on it.
- Reserved draft order units move to Committed and cannot be bought by other customers; without a reservation, other customers can buy them while the quote is open.
- Draft order tags become order tags on conversion, so a quote number can follow the sale from request to order.
- In this recipe an AI model only reads free-text requests. Rules check every line, and a person approves anything below the margin floor or outside the buyer's terms.
The step map: who runs each step
Trigger: A wholesale buyer asks for a price: a quote form, an email to your sales inbox, or an order submitted for review at checkout on a Shopify B2B store.
| Step | What happens | Who runs it |
|---|---|---|
| 1 | The request is logged in one queue with a quote number, and the sender is matched to a known company location. An unknown sender gets the wholesale application link, not a price. | Rule |
| 2 | An AI model reads a free-text email or form note into lines: item, quantity, requested price and date, with a confidence score per field. Structured form fields and submitted drafts skip this step. | AI model |
| 3 | Each line is checked: the buyer's price and price breaks, minimum and increment, available stock, the buyer's terms and open balance, and the margin floor. | Rule |
| 4 | The decision table routes the request. A draft order is created for the company location with the prices, payment terms, quote number as a tag, a valid-until date and an inventory reservation if the row calls for one. | Rule |
| 5 | A person reviews what the table flags: prices below the floor, custom items, short stock, new terms and overdue accounts. The person edits the draft, never a second copy. | Person |
| 6 | The quote goes to the buyer as the draft order's invoice email, with the checkout link and the valid-until date in the message. | Rule |
| 7 | The workflow watches the draft, sends one reminder before the date, and at expiry releases the reservation and closes the draft after saving its details to the quote log. | Rule |
| 8 | When the buyer accepts, the draft is completed into an order that carries the quote tag, the PO number and the terms, and the quote log records who accepted and when. | Rule |
6 rule steps · 1 AI model step · 1 person step. A rule follows fixed logic you approve; an AI model handles messy input and its output is checked by rules; a person makes the calls listed below.
What stays with a person
- Any price below the margin floor, and any discount above the rep's band
- Custom items and products with no price or cost on file
- Stock shortfalls: partial shipment, backorder date or a substitute
- Payment terms other than the buyer's, and quotes for accounts with overdue invoices
- Accepted quotes that arrive after the valid-until date, or with changed lines
Which tools can run it
- Shopify's own B2B draft orders with Shopify Flow alerts and tags, for a few quotes a week that a person prices
- Zapier, Make or n8n reading a form or inbox and creating drafts, for simple price-list quotes with no margin check across systems
- Custom code on your accounts, for the full decision table, cost and margin checks, valid-until timers and an ERP that must agree
Systems it connects
- Quote form and sales inbox
- Shopify B2B, draft orders and catalogs
- Cost source (Shopify unit cost, a master sheet or the ERP)
- Accounting system or ERP for open balances
- Slack or email for approvals
- Quote log
Build size: Medium
Draft orders do the heavy lifting; the work is agreeing the floor, the discount bands, the valid-until rules and who approves what.
A wholesale buyer asks what 200 cases would cost. Someone on your team opens the price list, checks the minimum, looks up stock, works out whether the discount they want still makes money, and types a reply. Days later the buyer says yes, and someone types the whole thing again as an order, sometimes at a price that has since changed. This recipe answers the routine requests by rule, sends the hard ones to a person with the numbers attached, and makes the quote itself the record that becomes the order. It is one page of our automation library.
Which quote requests can go out automatically, and which need a person?
This table is the core of the build, and you can use it today even if every quote is still typed by hand. Each row is a situation, the rule that spots it, who answers, what the buyer receives and how the quote ends. "Auto-draft" means the workflow prepares the draft order; "auto-send" means it also goes to the buyer without review. Start with a person approving every row, then switch the clean row to auto-send once the rule's decisions match what your team would have done. Valid-until periods are yours to set.
| Request situation | What the rule checks | Auto-draft or person | What the buyer receives | When accepted or expired |
|---|---|---|---|---|
| Known buyer, catalog items, list or break price, enough stock | Buyer's price and breaks, minimum and increment, stock, terms, no overdue balance, every line above the floor | Auto-draft and auto-send | Quote with prices, terms and valid-until date, plus the checkout link | Accepted: draft completes on their terms. Expired: reminder first, then reservation released and draft closed |
| Asks for a discount that stays above the floor | Requested price against the rep's discount band and the floor | Auto-draft; the rep approves in one click | The quote at the approved price, or the list price with a short reason | Accepted: order at the quoted price. Expired: the discount lapses; a new request is checked afresh |
| Asks for a price below the floor | Line margin against the floor, with cost and freight shown | Person | A holding reply at once, then a quote or a counter-offer | Accepted: order at the price the person approved, name logged. Declined: reason saved for the next request |
| Below the minimum, or not a whole case | Minimum and increment for that buyer's catalog | Auto-draft at the nearest valid quantity | A quote at that quantity, with a note saying what changed | Accepted: order at the valid quantity. Buyer insists on the original: goes to a person |
| Quantity beyond your largest price break | Largest break, and the buyer's usual order size | Auto-draft; a person sets the price | A holding reply, then a quote | Accepted: order at the price the person set. Expired: reservation released |
| Stock short for part of the request | Available units per line, and the next inbound date if known | Person | A split offer: what ships now and what ships later, or a substitute | Accepted: draft updated to the agreed split. Expired: reservation released |
| Custom or made-to-order item | No variant, price or cost on file | Person adds a custom line | A quote after the person prices it | Accepted: order with the custom line. Expired: draft closed; price kept in the log for reference |
| Asks for different terms, or the account has overdue invoices | Requested terms against the terms on file; open balance from accounting | Person | A holding reply, then a quote on approved terms | Accepted: order on the approved terms. Overdue: a person decides whether to require prepayment |
| A price change or contract expiry falls inside the quote period | Effective dates in your price master | Auto-draft; the date is capped at the change | A quote valid until the day before the change, saying so | Accepted in time: old price holds. Later: requote at the new price |
| Unknown sender, no company account | Sender against companies and contacts | No draft | No price; a link to the wholesale application | Approved later: the request re-enters the queue |
New accounts belong to our wholesale customer application queue, not to this workflow. A quote is only as good as the prices behind it, so changing the lists themselves is the job of our wholesale price list sync.
The price, minimum and increment checks all read one source in Shopify. The Admin API's ProductVariantContextualPricing object returns a variant's final price, quantity price breaks and quantity rule, and its pricing context accepts a company location, so the workflow sees what that buyer would see (checked November 5, 2026). Shopify's quantity rules guide says rules apply per variant, so a buyer cannot combine 5 gray and 5 blue hats to meet a minimum of 10 (checked November 5, 2026). The rule should check variant by variant too.
How do you set a margin floor for automatic quotes?
The floor is the price below which no quote leaves without a person's name on it. Two lines of arithmetic are enough, using your contribution margin thinking at the level of one unit.
Line margin = (quoted unit price − cost to serve per unit) ÷ quoted unit price
Lowest automatic price = cost to serve per unit ÷ (1 − margin floor)
An illustrative example, not a client result. A product costs $10.40 landed, plus a $0.60 per-unit freight allowance, so the cost to serve is $11.00. With a 35% floor, the lowest automatic price is $11.00 ÷ 0.65 = $16.93 after rounding up.
| Illustrative quote | Unit price | Line margin | What the rule does |
|---|---|---|---|
| Buyer's tier price | $18.50 | 40.5% | Auto-send |
| Price break at 50 units | $17.75 | 38.0% | Auto-send |
| Discount request, inside the rep's band | $16.93 | 35.0% | Rep approves in one click |
| Discount request, below the floor | $16.50 | 33.3% | Person decides, with these numbers in front of them |
Check each line, not the order average, or one deep discount hides inside a large order. Where the cost comes from matters as well. Shopify's InventoryItem object holds one unit cost in the shop's currency, and reading it can require the "View product costs" permission (checked November 5, 2026). A freight allowance or a landed cost usually lives somewhere else, so name one source for cost, and convert a quote in another currency before comparing. When suppliers raise prices, our supplier cost change alerts keep that number honest.
How does a quote request become a Shopify draft order?
Build the quote as a draft order from the start, not as a PDF or an email. Shopify's B2B draft order guide says a draft assigned to a B2B customer and company location automatically reflects that company's prices, payment terms and checkout options, and that you can set a custom price on a line to quote a negotiated price (checked November 5, 2026). Shopify's B2B features by plan page puts draft order to invoice, checkout to draft and PO numbers on Basic, Grow, Advanced and Plus, and says B2B is not available on Starter or Retail (checked November 5, 2026).
Requests reach the queue three ways. A form gives clean fields. An email needs the AI model to read it. The third is Shopify's own: with Submit all orders as drafts for review, buyers at that company location check out without paying and the order waits as a draft for you (checked November 5, 2026). The B2B guide says those drafts have prices locked by default and are not complete until you click Create order or the customer pays after you send an invoice.
| What the quote needs | The Shopify field or call | What to know (checked November 5, 2026) |
|---|---|---|
| The buyer, and their prices and terms | purchasingEntity and paymentTerms on DraftOrderInput | A draft accepts at most 499 line items |
| A preview before anything is created | draftOrderCalculate | Previews prices, shipping and discounts without creating a draft |
| A negotiated or pinned price | priceOverride and generatePriceOverride on DraftOrderLineItemInput | The override replaces the catalog price in that draft; overrides cannot be applied to bundle components |
| Stock held for the buyer | reserveInventoryUntil | Per the creating draft orders guide, reserved units move to Committed and others cannot buy them |
| The quote number on the record | tags | The Draft order created trigger page says tags become order tags on conversion |
| The quote itself, sent to the buyer | draftOrderInvoiceSend | A secure checkout link in the email; the subject and message can be set, which is where the valid-until date goes |
Reserve stock on purpose, not by default. A reservation takes units off sale for everyone else, so hold them for large or scarce lines and let small quotes run on available stock, accepting that the buyer may see an out-of-stock error at checkout if the item sells out and overselling is off.
What happens when a buyer accepts or a quote expires?
Acceptance should finish the same draft, whichever way the yes arrives. Shopify's draft orders overview says a paid draft becomes a regular order (checked November 5, 2026).
| How the buyer says yes | What the workflow does | The check before it completes |
|---|---|---|
| Pays through the invoice's checkout link | Shopify creates the order; the orders/create webhook marks the quote accepted by its tag | None needed for the price; the log still records the date against the valid-until date |
| Replies yes, or emails a purchase order | The AI model sorts the reply, rules match the quote number, and draftOrderComplete creates the order, payment pending on the buyer's terms | Lines, quantities and price match the quote, and the date has not passed; any difference goes to a person |
| Tells the rep by phone | The rep clicks Create order on the same draft | The rep sees the valid-until date and the current stock on the draft |
A deposit can sit between the yes and the order. Shopify's payment terms guide says deposits on draft orders are Plus only, and the B2B guide adds that a deposit is a percentage of the order subtotal only (checked November 5, 2026). Once an accepted order ships on terms, our B2B invoice reminders take over. If a buyer's purchase order arrives with no quote behind it, that is a job for B2B order entry from email.
Expiry is the part teams miss. Shopify's DraftOrderStatus list has three values: Open, Invoice sent and Completed (checked November 5, 2026). None means expired. The DraftOrder object says inventory is restocked after the reservation time, and the overview says drafts created on or after April 1, 2025 are deleted only after 1 year of inactivity. The Shopify pages we read state no expiry for the invoice link either. So a quote sent in March can still look live in June at March's price.
The workflow has to own the date. Store valid-until in a metafield or the quote log, send one reminder before it, and on the day save the draft's details to the log and close it with draftOrderDelete. Test on a development store what an already-sent invoice link does after that, before relying on it. A late yes goes to a person, who requotes or honors the old price.
What should stay with a person?
Anything that changes what you earn or what you promise. The checkpoint list above covers prices below the floor, custom items, short stock, unusual terms and late acceptances. The person never starts from a blank screen. They see the request, the draft, the margin on each line, the buyer's recent orders and the rule that stopped it, and they edit the draft that will become the order.
Log each decision with a name and a reason. After a few weeks that log shows which exceptions a person approves every time. Those are candidates for a wider discount band, and the buyers who keep asking for the same exception may belong on a different price tier. That is a commercial call, so it stays with you; the log only makes the pattern visible.
Which tool should run it?
The simplest one that can see your prices, your costs and the calendar.
| Level | Fits when | What to watch |
|---|---|---|
| Shopify's own draft orders, plus Shopify Flow | A few quotes a week, priced by a person | Flow is a free app on Basic, Grow, Advanced and Plus, and its Send draft order invoice action can email the invoice. The trigger page names drafts created by a user or a third-party app, so test drafts buyers submit at checkout. Send HTTP Request is on Grow and above (checked November 5, 2026) |
| Zapier, Make or n8n | Simple price-list quotes from one form | Margin checks and expiry timers get awkward; log every run or a failed quote goes unnoticed |
| Custom code on your accounts | The full table, margin checks, valid-until timers, an ERP or a large catalog | Can run on Ecomsellertool Growth OS beside your order and stock flows; the draft_orders/update webhook fires on every change to a quote |
Our Zapier vs Make vs n8n comparison covers how those tools count work, and our guide to what Shopify Flow automates covers the built-in option. Two more limits to plan around: Shopify's B2B guide says that on a draft in a different currency from your store, payment terms can only be collected by credit card or by marking the order as paid, and that price locks do not cover bundles. Direct catalogs per company are Plus only, so on lower plans, buyer-specific prices can live as line overrides on the quote.
Who builds B2B quote automation?
Ecomsellertool builds workflow automation on your own accounts and systems for ecommerce brands. We have built software on Amazon's seller APIs since 2017 and shipped 50+ tools for 100+ teams. For quotes, we write your decision table and margin floor with you, then connect the requests, checks, approvals and draft orders. Send a project brief below, or read how our workflow automation service works.
Limits, logs and per-product costs are work we have shipped elsewhere:
- Rules with hard limits and a full log. TRAKTOR is rule-based automation we built for advertising: each rule has criteria, a lookback window and a frequency, changes budgets only within set minimum and maximum limits, and logs the rule, the previous and new values and a timestamp. A margin floor and a quote log follow the same pattern.
- Costs mapped to each product. For Beezboard, a profit tool for Amazon sellers, we built cost mapping that assigns COGS to specific products and adds new costs monthly or annually, the per-product cost record a margin floor depends on.
Get your quote workflow built
Send us how a quote request works today
Describe the workflow you want automated. We reply with a written plan: scope, timeline and a fixed price.
Frequently asked questions
Does Shopify have a request-a-quote feature for B2B?
Shopify's B2B guides describe the job with draft orders. Your team can create a draft for a company and set a negotiated price on a line, and a company location can be set to submit all orders as drafts for review. A form that collects requests from buyers and answers them by rule takes a workflow tool or custom code.
How do I turn an accepted quote into an order without retyping it?
Make the quote a draft order from the start. When the buyer pays through the invoice link, Shopify turns the draft into a regular order. When the buyer says yes by email or sends a PO, your team or the workflow completes the same draft, on the buyer's payment terms if they have them. Nothing is entered twice.
Do Shopify draft orders expire on their own?
Not on a quote's timetable. Shopify lists three statuses, Open, Invoice sent and Completed, and automatically deletes drafts created on or after April 1, 2025 only after 1 year of inactivity. An inventory reservation can end on a set date, but the quote's valid-until date has to be stored and enforced by your workflow.
Will a quoted price change if I update my price list?
It can, unless the price is pinned. Shopify says a draft's prices are unlocked by default until you lock them, while sending an invoice or sharing a checkout link locks them by default, and orders buyers submit for review are locked by default. A lock also stops prices falling if you later cut the product's price.
Should AI set wholesale quote prices?
No. In this recipe an AI model only reads messy requests into structured lines. Prices come from the buyer's price list, the margin floor comes from your rules, and a person decides any exception. That keeps every price traceable to a list or to a named approver.
What margin floor should a wholesale quote use?
Your own, set per product group after freight and any cost of serving the account. There is no standard figure. Check the floor on each line, not on the order average, so one heavily discounted item cannot hide behind a large order of healthy ones.
