Shopify purchase order import: what the CSV import actually does
Native Shopify purchase orders can import line items from a CSV. Here is what the import covers, what it leaves out, and the field map for the rest.
InventoryX is in development and not available today. ClearStock is the live Shopify app.
Native Shopify purchase orders can import line items from a CSV — SKU or barcode, quantity, optional cost and tax — into one new or existing purchase order. What you cannot import is a PO record: the supplier, currency, expected-arrival date, payment terms, and closed history are set on the PO itself, one PO at a time. Most "purchase order import" confusion is the gap between those two things.
This is the map of the import paths, the field mapping that makes the rest fast and error-free, and the cost of choosing the wrong one.
The two imports people mean
| What people mean by "import" | What it actually does | Creates a PO? | Verdict |
|---|---|---|---|
| Native PO line-item CSV import | Adds SKUs, quantities, and optional cost/tax to one PO | Adds lines to a new or existing PO | The path most merchants miss |
| Inventory CSV import | Sets on-hand quantities per variant per location | No | Fast, and wrong for receiving |
| Product CSV import | Creates or updates products, variants, prices, SKUs | No | Not a purchasing tool |
| Third-party PO app import | Loads PO records into that app's own data model | In the app, not in Shopify | Useful above a few POs a week |
| Spreadsheet → keyed admin PO | A typed PO built from a reviewed sheet | Yes, natively | Reliable when you need the full record |
The distinction that matters: Shopify's native purchase order object records what you ordered, from which supplier, to which location, at what cost, and what you received. A line-item import fills the middle of that object. It does not create the supplier, set the dates, or receive the stock.
What the native line-item import cannot do
The import is deliberately narrow. It adds products to a PO; it does not create or complete the PO record. Specifically:
- Supplier and currency. Both are set on the PO, not in the line-item file. A supplier in a different currency needs the PO's supplier currency set before the lines make sense.
- Dates and terms. Order date, payment terms, supplier, and currency live on the PO. Expected arrival is a date you track on the linked transfer or your receiving sheet. You cannot import a batch of POs with different dates in one pass.
- Multiple POs at once. The import targets one PO. Splitting a 300-line sheet by supplier into six POs is a manual step per PO.
- Closed or historical POs. The import is for a new or existing open PO, not a record of a completed purchase.
- Receiving. Importing lines does not receive stock. Receiving happens against the linked inventory transfer, not the PO.
That last point is the one that causes the most damage, so it gets its own section.
Why the inventory CSV is the wrong shortcut
Because receiving is the whole point of a purchase order, and importing quantities into inventory skips it.
Consider a 12-line order for 480 units. If you import the quantities into the inventory CSV, the shelf and the system agree by the end of the day — and you have lost:
- The ordered-versus-received comparison. A supplier short-ships 12 units, the imported number matches the shelf, and the shortfall is invisible forever. That is a $200 conversation you can no longer have.
- Lead-time data. No order date and receive date pair means no measured lead time, so every reorder point built on that supplier runs on the quote rather than reality (the lead-time method).
- The audit trail. Bulk edits and CSV imports change quantities without recording a supplier movement, so the adjustment history shows a number that changed and cannot say why.
- Open-order visibility. A PO that exists in the system can be seen as "on order" by anyone about to order again. An imported quantity cannot, so the second order goes out while the first is still in transit.
There is one legitimate use for a quantity import in a purchasing context: setting opening stock for a new location, or correcting a full reconciliation after a count, when there is no supplier transaction behind the change. If a supplier shipped it, it should arrive through a PO and a receipt.
The field map for the spreadsheet route
When you need the full PO record, the workable small-store workflow is a structured sheet that becomes a typed PO in minutes. Build the sheet with these columns, in this order, and the keying is mechanical:
| Sheet column | Shopify PO field | Notes |
|---|---|---|
| PO number | PO reference / number | One convention, sequential, never reused |
| Supplier | Supplier record | Must exist in the admin, or create it first |
| Supplier currency | Supplier currency on the PO | Set it before the lines; it changes the landed cost |
| Ship to | Destination location | One location per PO; split if stock goes to two |
| Order date | PO date | ISO format (2026-11-12) so sorting never lies |
| Expected arrival | Expected arrival date | The field that makes lateness detectable; never leave blank |
| Payment terms | Notes | Net 30, deposit, COD — visible to whoever pays |
| Line # | Line order | Keeps the printed PO matching the sheet |
| SKU | Variant | Must match the variant exactly; SKUs are not unique across variants by default |
| Description | Variant title | For human review only — the SKU governs |
| Qty | Quantity | Whole numbers, in the supplier's unit (case or each — decide once) |
| Unit cost | Cost per item on the PO line | Cost, not retail; feeds margin reporting |
| Case pack | Notes | "Ordered in cases of 12" prevents invoice arguments |
| Tags | PO tags | Optional; useful for season, brand, or project grouping |
| Line total | Computed | =Qty × Unit cost — your check on the supplier's invoice later |
Two columns worth keeping in the sheet anyway: a received quantity column you fill in at the dock, and a variance column (=Received − Qty) that turns the PO into a three-way-match input. Receiving is recorded against the linked inventory transfer, not typed into the PO.
A worked example
A five-line restock for a stationery store, illustrative numbers:
| SKU | Qty | Unit cost | Line total | Case pack |
|---|---|---|---|---|
| NB-A5-DOT | 240 | $2.85 | $684.00 | 24 (10 cases) |
| PEN-GEL-BLK | 600 | $0.62 | $372.00 | 50 (12 boxes) |
| TAPE-WASHI-3 | 144 | $1.10 | $158.40 | 12 (12 packs) |
| STKR-SHEET-A6 | 300 | $0.38 | $114.00 | 25 (12 packs) |
| PLNR-2027-A5 | 60 | $4.20 | $252.00 | 6 (10 packs) |
| Total | $1,580.40 |
Check three things before keying or importing: every quantity is a multiple of its case pack (240/24 = 10, 600/50 = 12, 144/12 = 12, 300/25 = 12, 60/6 = 10 — all clean), every SKU exists as a variant with that exact string, and the total matches what the supplier quoted. Those three checks catch almost every real-world PO error before it becomes a receiving discrepancy.
Then create the PO, import or add the lines, record the expected arrival on your receiving sheet, and save. If the supplier needs a document, print or export the PO and send it — the admin tracks the order but does not email it for you at the time of writing. The complete sequence from decision to payment, including the three-way match, is in the purchase order process, and the native PO mechanics are in the Shopify purchase orders guide.
When an app-level PO import is worth it
The native route scales to roughly a dozen POs a week before the keying becomes the bottleneck. Above that, third-party purchasing apps that support full PO import earn their price, for three specific reasons:
- Repeat orders. A standing order for the same 40 SKUs, imported from a saved file, is minutes instead of an hour.
- Multi-supplier splitting. A sheet of 300 lines sorted by supplier becomes six POs in one pass, which is tedious by hand and error-prone at the boundaries.
- Bulk migration. Moving an existing PO book from a spreadsheet (or from Stocky exports) into a system that will track it.
What to check in any app that advertises PO import: does it match lines by SKU or by product title (titles drift), does it validate case packs and MOQs, does it store the expected arrival date, and does receiving against the imported PO update Shopify inventory or only the app's own records. That last question decides whether you have a purchasing system or a second ledger.
The pre-import checklist
Before any bulk purchasing action, whether it creates POs or changes quantities:
- One SKU per line, exact match. Export your variant list and check with a
VLOOKUP; don't trust typing. - Whole numbers, right unit. Decide case-versus-each per supplier and write it in the sheet header.
- Case packs and MOQs satisfied. Every quantity a clean multiple, every line above the minimum.
- Costs are current. A PO at last year's price is a dispute at invoice time.
- Expected dates present. No date means no lateness, which means nobody chases.
- Location scoped. One PO per destination; split rather than guess.
- Backup taken. Save the pre-change export with the date in the filename.
- Owner named. One person keys it, so a duplicate line has one owner.
Eight checks, five minutes, and they prevent the failure mode that costs most: a PO that looks complete, imports cleanly, and silently under-orders the item you needed.
Common questions
Can I import purchase orders into Shopify? Yes, for line items. The native PO screen can import a CSV of products — matched by SKU or barcode, with quantity and optional cost and tax — into one new or existing purchase order. You cannot import the PO record itself (supplier, currency, dates, terms) or a batch of separate POs.
What's the difference between a PO line-item import and an inventory import? A PO line-item import adds products and quantities to a purchase order. An inventory import sets on-hand quantities per variant and location and creates no PO, no order date, no expected arrival, and no ordered-versus-received comparison.
Can I import a PO to update inventory without receiving it? No. The line-item import adds lines to the PO; it does not receive stock. Receiving happens against the linked inventory transfer, which is what creates the ordered-versus-received record and the lead-time data.
Does Shopify's API let apps create purchase orders? The Purchase Order Read API exposes POs, line items, supplier snapshots, and linked transfers for reading. Apps that create POs keep their own records or write through their own workflows, so the authority for a PO may live outside Shopify depending on your stack.
How many PO lines is too many to key by hand? Around 40 lines per PO or a dozen POs a week is where keying starts producing errors; above that, a spreadsheet-to-app import pays for itself. Below it, a reviewed sheet plus the eight-point checklist is faster than configuring an importer.
Next step
Build the sheet columns above as a template today and use it for your next PO, even a two-line one — the point is to have the expected date, the case pack, and the received-quantity column in place before the shipment lands. Then compare the sheet's total against the supplier's invoice at receiving; that single comparison is the cheapest purchasing control you will ever install.