Importing Draft Orders
The Draft Orders import creates and updates draft orders from a CSV/Excel file, a Google Sheet, or directly from another connected store. A draft order usually has several line items, so the import uses one row per line item — rows that share the same Number belong to the same draft order.
For the wizard itself — uploading, mapping, dry runs, schedules — see Importing into EcomSolo.
How a draft order is laid out
Each draft order is a group of consecutive rows sharing the same Number (an import-only grouping column — it isn't sent to Shopify). The first row of the group carries the order-level fields (email, addresses, PO number, …); every row carries one line item.
How draft orders are matched
Draft orders have no natural unique key (Name — e.g. #D123 — is assigned by
Shopify and can't be set), so matching for updates uses this precedence:
- ID — the draft order's Shopify GID, if your file has it → update.
- PO number — otherwise, an existing draft with the same
PoNumber→ update. - Otherwise a new draft order is created.
So a file with PO numbers is safely re-runnable; a file without them creates a new draft each run.
The default operation is Upsert; Create only, Update only, Merge (partial update) and Delete all resolve the same way (ID, then PO number). See Choosing the operation for how each one behaves.
Columns
Order-level (first row of each Number group): Number, Id, PoNumber,
Email, Note, Tags, Currency, Visible To Customer, the Shipping and
Billing address blocks, Shipping Line: Title/Price, and an order
Discount: Type/Value/Title.
Line-item (every row):
| Column | Notes |
|---|---|
| Line: Variant ID | The target variant's Shopify GID — the most direct product match. |
| Line: SKU | A product SKU — resolved to the target store's variant automatically (the cross-store-friendly option). |
| Line: Title | For a custom line item (no product). Needs a Currency on the order to carry a price. |
| Line: Price | Unit price for a custom line item. |
| Line: Quantity | Quantity for the line (defaults to 1). |
A line resolves in order: Variant ID → SKU → custom (Title + Price). A SKU that doesn't exist in the target store and has no title is skipped.
Importing from another store
On the wizard's Source step, pick From another store to copy draft orders from a connected store. Each source draft comes across as its set of line-item rows (line items carried by SKU so the target re-matches its own variants; custom lines keep title + price), with addresses, PO number, email, note and tags. Matched by ID then PO number. Combined with a schedule this becomes a recurring one-way draft-order sync.
Deleting draft orders
Pick the Delete operation in Step 1 (permission-gated) and upload a file carrying just the identity — the draft's Id (Shopify GID) or its PoNumber — matched exactly as an update resolves (ID first, then PO number):
PoNumber
PO-1001
PO-1002
A ready-to-run copy lives at
features/importing/examples/draft-orders-delete-sample.csv. The dry run shows
a red "Will delete N" count; an Id/PO number that matches nothing is
skipped (so re-running the same delete file is safe). Deleting a draft order
removes it from Shopify permanently — this cannot be undone. A file row with
neither an Id nor a PO number matches nothing and is skipped.
Results and freshness
Draft orders you create or update take effect in Shopify immediately, and EcomSolo's Draft Orders dashboard refreshes within seconds of the run.
Sample file
A ready-to-run sample covering every case lives at
features/importing/examples/draft-orders-sample.csv. It uses custom line
items (title + price) so it runs in any store without needing your own
SKUs:
Number,PoNumber,Email,Currency,ShippingAddress.FirstName,ShippingAddress.LastName,ShippingAddress.Address1,ShippingAddress.City,ShippingAddress.CountryCode,ShippingAddress.Zip,ShippingLine.Title,ShippingLine.Price,Discount.ValueType,Discount.Value,LineItem.Title,LineItem.Price,LineItem.Quantity
1,PO-1001,jane@example.com,USD,Jane,Doe,1 Home St,Berlin,DE,10115,Standard shipping,5.00,,,Consulting hour,100.00,2
1,,,,,,,,,,,,,,Setup fee,50.00,1
2,PO-1002,ben@example.com,USD,,,,,,,,,PERCENTAGE,10,Gift wrapping,15.00,1
2,,,,,,,,,,,,,,Rush handling,25.00,1
3,,sam@example.com,USD,Sam,Lee,5 Main Rd,Munich,DE,80331,,,,,Sample product,9.99,1
Row by row: draft 1 is two custom lines with a shipping address, shipping charge and PO number; draft 2 adds a 10% order discount; draft 3 is a single-line, no-PO draft (created fresh each run).
Referencing real products (SKU / Variant ID)
To put catalogue products on a draft, use LineItem.Sku (or
LineItem.VariantId) instead of a custom Title/Price — but the value must
exist in the target store, e.g.:
Number,PoNumber,Email,LineItem.Sku,LineItem.Quantity
10,PO-2001,pat@example.com,YOUR-REAL-SKU,2
A SKU that isn't in the target store is skipped, and the error report names it
(SKU 'YOUR-REAL-SKU' not found in the target store). Import your Products
first, then reference them here.
Troubleshooting
| Error in the report | What it means / what to do |
|---|---|
draft order has no usable line items | No row in the group had a Variant ID, a SKU that exists on the target, or a custom Title. |
custom line item '…' has a price but the draft order has no Currency | Add a Currency column (e.g. USD) so the custom price can be set. |
Add at least 1 product | Shopify rejects an empty draft — every draft needs at least one line item. |
FAQ
Will re-importing create duplicates? Only if your rows have no Id/PoNumber
— matching is by ID then PO number, so PO-keyed files update in place.
Can I add products by SKU? Yes — Line: SKU is resolved to the target
store's variant. Products missing on the target are skipped.
Can I delete draft orders? Yes — pick the Delete operation and upload a file of Ids or PO numbers. See Deleting draft orders. It's permission-gated and irreversible.
Does it complete/pay the draft? No. Create and update runs only create and update the draft order itself.