Shopify Purchase Order Import: Store PO Numbers as Metafields

On this page
A wholesale merchant imports 800 products across six supplier deliveries over two months. The imports go smoothly. Products are live on the Shopify store, inventory counts are correct, and orders start flowing in.
Six months later a supplier dispute requires the merchant to prove what was received on a specific purchase order: which products arrived on PO-2026-0091, at what cost price, on what date, and whether the delivery matched the original order quantity. The merchant checks Shopify: no PO reference anywhere in the product data. They check the import files: the supplier CSVs contain product data but not procurement data. Cross-referencing the import files against the PO spreadsheet, the supplier invoices, and the Shopify order history takes three days of manual work.
This is the shopify purchase order import po number metafields problem. The products are in Shopify. The PO data exists in a separate spreadsheet. Nothing links the two together at the product level because no standard import workflow carries PO metadata from the procurement system to the product record.
Why Purchase Order Data Needs to Live at the Product Level
A purchase order is a business agreement between a merchant and a supplier. It specifies which products were ordered, at what price, in what quantity, and by what delivery date. In most wholesale operations, POs live in an ERP, an accounting system, or a spreadsheet. Shopify products have no built-in PO field.
The disconnect matters for three reasons.
Supplier reconciliation: when a delivery arrives short or with the wrong products, finding which PO covers which items requires cross-referencing two systems. If the Shopify product record carried the PO number, a single filter in Shopify admin or an export query would identify all products on the disputed delivery.
Cost tracking across import cycles: a product that was re-ordered six months after the original import may have a different cost price on the second PO. Without the PO number and cost-at-PO-time stored at the product level, the merchant has no way to tell which inventory was purchased at which price without going back to the source documents.
ERP and accounting integration: businesses using an ERP alongside Shopify need to link Shopify product records to ERP line items. The PO number is typically the shared reference key across systems. Without it in Shopify, the integration cannot identify which Shopify product corresponds to which ERP inventory line.
Why Standard Import Workflows Miss PO Data
Supplier CSV files contain what the supplier knows about the product. They rarely contain what the merchant knows about the procurement context.
A supplier's product export includes title, description, price, barcode, and images. It might include the supplier's own SKU or product code. It does not include the merchant's internal PO number, the order date, the agreed cost price, or the delivery reference. Those fields exist in the merchant's purchasing workflow, not the supplier's product catalogue.
Standard import wizards map supplier CSV columns to Shopify product fields. When no supplier column exists for PO data, the wizard has nothing to map. The import completes without PO metadata because the PO metadata was never in the source file.

The result is a recurring manual reconciliation task. Each month, the accounts team exports Shopify products, exports the PO spreadsheet, and does a VLOOKUP to match products to purchase orders. The VLOOKUP fails on any product where the Shopify title differs slightly from the title on the PO. Those mismatches get resolved manually, which takes hours. When a dispute or audit occurs, the process runs in reverse under pressure.
Building the PO Metafield Schema
Before importing PO data, the metafield structure needs to be set up in Shopify admin. PO data typically covers four fields:
procurement.po_number: the purchase order number (e.g., PO-2026-0091). Type:single_line_text_field. Used as the primary lookup key.procurement.supplier_ref: the supplier's own reference or invoice number. Type:single_line_text_field. Useful when the supplier reference differs from the merchant's PO number.procurement.cost_price: the cost price agreed on the PO, in the store's base currency. Type:number_decimal. Captures the cost-at-PO-time separately from the live cost-per-item field, which may change on subsequent imports.procurement.order_date: the PO issue date. Type:single_line_text_field(YYYY-MM-DD format). Shopify metafields have adatetype but storing as text avoids timezone parsing complications.
Using the procurement namespace groups all PO-related metafields together in the Shopify admin product panel, separate from product specification metafields in other namespaces. The shopify custom metafield definitions import guide covers namespace design and type selection in more detail.
From procurement spreadsheet to Shopify product record
Importing PO Numbers as Product Metafields
Once the metafield schema is in place, the import process maps the merchant's procurement data onto the product record at import time.
The merchant prepares the import file in two steps. First, they export the supplier CSV and add a column for each PO metafield: PO Number, Supplier Ref, Cost Price (PO), PO Date. These columns are populated from the merchant's purchasing records for this specific delivery. Every product on PO-2026-0091 gets "PO-2026-0091" in the PO Number column. Products from a different supplier on PO-2026-0092 get that reference instead.
- 01In Shopify admin, create the metafield definitions under Settings > Custom data > Products. Create procurement.po_number (single_line_text_field), procurement.supplier_ref (single_line_text_field), procurement.cost_price (number_decimal), and procurement.order_date (single_line_text_field)
- 02In the import file, add PO data columns next to the product data from the supplier CSV. One row per product; the PO columns are the same for all products in a single delivery batch
- 03In Importier's import wizard, map the PO Number column to procurement.po_number, the Supplier Ref column to procurement.supplier_ref, the Cost Price (PO) column to procurement.cost_price, and the PO Date column to procurement.order_date
- 04Save the import profile for this supplier. The column mapping for product data carries over on every subsequent import; only the PO data columns need to be updated for each new delivery
- 05Review the import preview to confirm the first five products show the correct PO number in the procurement.po_number metafield before pushing the full batch
After import, filtering Shopify products by the procurement.po_number metafield returns all products on that delivery in seconds. A supplier dispute about PO-2026-0091 is now a metafield filter, not a three-day cross-reference exercise.
Multi-Shipment Scenarios: One PO, Multiple Import Batches
Large wholesale orders arrive in multiple shipments. A single PO for 400 products from an overseas supplier might arrive in three containers over six weeks. Each container triggers a separate import batch, but all three batches reference the same PO number.
Importier's import wizard handles this correctly: the PO number is a static value applied to all products in the batch, the same way batch tags work. The first container import sets procurement.po_number = PO-2026-0091 on 150 products. The second container import sets the same value on another 130 products. The third sets it on the remaining 120.
After all three batches complete, filtering by procurement.po_number = PO-2026-0091 shows all 400 products from that PO, regardless of which batch they arrived in.

The procurement.cost_price metafield records the agreed cost from the original PO even if the merchant updates the Shopify cost-per-item field later (for currency fluctuations, landed cost adjustments, or data corrections). The PO-time cost is a historical record; the live cost-per-item is the current operating figure. Keeping both prevents the original agreement data from being overwritten.
Retroactive PO Attribution for Existing Products
When a catalogue already has products without PO metafields, retroactive attribution requires one of two approaches.
Metafield update via import: export the products without PO data using Importier's Metafields export preset, which outputs product handle plus all existing metafield values in a single CSV. Add the PO columns to the export, populate them from the purchasing records, and re-import with Importier's "update existing products" mode. The import matches on SKU or handle and updates only the metafield columns.
Store Scanner filter and batch update: filter products in Importier's Store Scanner by vendor or collection (which typically maps to a supplier or delivery) and use the batch update to apply a PO number to the filtered set. This approach works when the products can be identified by their vendor, collection, or tag without exporting a full spreadsheet.
The spreadsheet re-import is more precise for large retroactive batches; the Store Scanner update is faster for smaller sets where a filter accurately isolates the right products.

The supplier dispute that takes three days without PO metafields takes three minutes with them. The gap is not a matter of having the information: the merchant had the PO spreadsheet all along. The gap is whether that information exists at the level where Shopify can query it.
Using PO Metafields for ERP and Procurement Integration
For businesses operating an ERP alongside Shopify, the procurement.po_number metafield is the bridge between the two systems.
Most ERPs track inventory at the PO line-item level. A purchase order in the ERP lists the SKU, quantity, cost, and delivery date. When the goods arrive and are imported into Shopify, the ERP needs to know which Shopify product handle corresponds to which ERP inventory line. The PO number is the shared reference.
According to Shopify's custom data documentation, product metafields are accessible through the Storefront API, the Admin REST API, and the Admin GraphQL API. An ERP integration that queries Shopify products filtered by procurement.po_number can retrieve all products on a given PO and match them to the corresponding ERP records without manual key matching.
The same metafield enables automated cost reconciliation: when a supplier invoice arrives, a query for all products with procurement.po_number = PO-2026-0091 and procurement.cost_price retrieves the agreed cost for every item on that PO. Comparing the metafield cost against the supplier invoice identifies discrepancies before payment is made.
For businesses scaling toward more complex B2B operations, the shopify wholesale only products import b2b article covers the access control and visibility configuration that typically accompanies B2B catalogue management, which works alongside procurement metafields for a complete B2B product record.

According to MYOB's guide to purchase order management, purchase orders create a legally binding agreement that protects both the buyer and supplier. For the merchant, that protection is only accessible if the PO reference is retrievable at the product level when a dispute occurs.
AI Descriptions for B2B Procurement Products
Products imported with PO metafields are often B2B catalogue items sold to trade buyers rather than retail consumers. The AI description style appropriate for these products differs from consumer-facing descriptions.
Trade buyers making purchase decisions based on product data need specifications-first content: technical details, minimum order quantities, lead times, and supplier codes. The Technical Gadget description style with a B2B-oriented persona (Procurement Manager, Facilities Buyer, Business Operations Specialist) generates descriptions that lead with the practical purchasing criteria rather than consumer-facing benefits language.

- Supplier disputes require 3-day manual cross-reference of import files, invoices, and Shopify orders
- No way to filter Shopify products by which delivery they arrived on
- Cost-at-PO-time is overwritten when cost-per-item is updated
- ERP-to-Shopify product matching requires manual key lookups
- Multi-shipment batches have no shared identifier connecting them to the same PO
- Supplier dispute resolution: filter products by procurement.po_number in Shopify admin or via API in seconds
- Filter all products from a specific delivery by PO number at any time
- procurement.cost_price preserves the original agreed cost separately from the live cost-per-item
- ERP integration queries Shopify by PO number to match inventory records automatically
- All shipments on the same PO carry the same po_number value; all 400 products retrievable by one filter
Key Takeaways
- Supplier CSV files contain product data, not procurement data. Purchase order numbers, supplier references, cost-at-PO-time, and order dates are merchant-side business logic that must be added as custom metafields at import time, not derived from the supplier file.
- The
procurementnamespace groups PO-related metafields cleanly in Shopify admin. Creatingprocurement.po_number,procurement.supplier_ref,procurement.cost_price, andprocurement.order_dateseparates procurement tracking from product specification metafields. - PO number as a product metafield converts a three-day supplier dispute audit into a three-minute filter. The information exists in the merchant's records; the gap is whether it lives where Shopify can query it.
- Multi-shipment POs use the same PO number across multiple import batches. All products on PO-2026-0091 receive the same
procurement.po_numbervalue regardless of which container they arrived in, enabling single-filter retrieval of the complete delivery. - ERP integrations use
procurement.po_numberas the shared reference key. Shopify's Admin API returns products filtered by metafield value; the ERP queries by PO number to match inventory records without manual cross-referencing.
Track your supplier deliveries at the product level at importier.app.
Set up your first import in under five minutes.
Importier brings products into Shopify with AI descriptions, category metafields, and data enrichment on every run.


