Orders and fulfillment

Shopify Orders: Export and Import in Bulk

Last updated

Use the Orders resource to export Shopify orders into a Matrixify-shaped CSV or XLSX file. You can then build a focused spreadsheet for supported updates, new orders, line-item additions, tracking changes, fulfillment cancellation, archiving, cancellation, refunds, tags, and metafields, and upload it through EditEngine's Advanced Import.

Orders are not ordinary catalog records. An export can contain many rows for one order, most order data becomes immutable after creation, and several operations cannot be undone. Start from the smallest workflow template that contains the fields you actually intend to change.

This guide follows the official Matrixify Orders column reference, Orders export tutorial, bulk-update tutorial, existing-product order tutorial, unfulfill tutorial, and archive/unarchive tutorial. Where EditEngine differs, this guide states the EditEngine behavior explicitly.

Before you start

  • Keep an untouched export as your audit and rollback reference. Shopify order cancellation, refunds, and fulfillment cancellation are consequential; cancellation cannot be reversed.
  • Test every workflow on one non-critical order before using a larger file.
  • Use Advanced Import only. The worksheet may be named Orders or Order.
  • Keep all rows for one order together. Do not sort child rows away from their order group.
  • For same-store updates, keep the Order ID. For a cross-store import, remove source-store IDs and review all customer, product-variant, fulfillment, location, transaction, and metafield references.
  • Public Orders imports are limited to 50,000 spreadsheet rows.
  • Do not re-import a full Orders export unchanged, and never change every exported row to UPDATE. Existing Line Item rows can be interpreted as new lines to append.

Step 1 — Select Orders

Open EditEngine → Export, choose Orders, and select CSV or Excel format.

Orders selected as the EditEngine export resource

The production Orders panel displays the exact unfiltered count Shopify exposes to the app. Standard Shopify order access covers the last 60 days; older orders require Shopify approval for the protected read_all_orders scope. Adding filters does not change the displayed total.

A filter with no matches can produce a valid header-only file. An XLSX export contains the Orders worksheet plus an Export Summary worksheet describing the selected fields, filters, and row totals.

Step 2 — Choose a workflow template

Orders has 23 production export templates. Prefer one of the focused templates over a full export when you plan to import the sheet again.

Order export templates in EditEngine

Common round-trip templates include:

GoalTemplateWhat to review after export
Change supported order fieldsBulk update OrdersKeep only fields you intend to update
Append a lineAdd line itemsFill a single blank line per order
Update trackingUpdate tracking numbersKeep the existing Fulfillment ID
Create a refund transactionRefund OrdersVerify amount, gateway, note, and notification choice
Cancel an orderCancel OrdersReview every cancellation and refund flag
Archive or unarchiveArchive or unarchive OrdersPopulate or clear Closed At deliberately
Remove or set a customerRemove Order customerTreat Customer: ID as a store-scoped reference
Cancel a fulfillmentUnfulfill OrdersSet only the intended Fulfillment ID to CANCELLED
Add or remove tagsUpdate Order tagsSet Tags Command explicitly

The Blank add-line template emits one row per order and omits existing line, shipping, refund, transaction, and fulfillment rows. This is the safest starting point for line additions.

The Full Orders export is for backup, reporting, and migration analysis. It is not a one-click replace file. The Bulk delete Orders template is visible for format compatibility, but public Advanced Import rejects Order DELETE; do not design a public workflow around it.

Step 3 — Choose the 204 column controls

EditEngine exposes 204 Orders column controls. Only ID and Name are selected by default.

The default Orders columns selected in EditEngine

GroupControlsWhat it contains
Base51Identity, commands, contact, tags, dates, source, totals, tax controls, and statuses
Customer13Linked customer identity, profile details, marketing states, and totals
Addresses and Browser Details40Billing, shipping, IP, landing, referrer, and UTM values
Company6B2B company and company-location identity
Line Items31Line type, product/variant snapshot, quantity, price, tax, properties, and fulfillment state
Line Items Product Data13Current linked product and variant values
Refunds8Refund identity, date, note, restock reporting, and receipt flags
Transactions and Risk30Payment transactions, card details, device/user references, and risk values
Fulfillments11Fulfillment identity, dates, tracking, location, status, and notification flag
Metafields1Dynamic order metafield columns selected by namespace and key

The Tax controls can expand to as many as 100 order-level and 100 line-level tax blocks based on observed data. That expansion creates additional output headers without turning each tax field into a separate selector.

The Line Items Product Data group reads the linked product or variant as it exists now. It is different from the order's line-item snapshot and is export-only. Use it for analysis such as SKU, cost, inventory, and weight comparisons; do not expect edits in those columns to change a product or an order.

Some values can be blank because Shopify Admin GraphQL has no faithful equivalent or because optional access is unavailable. For example, order-level User ID and Checkout ID stay blank. Transaction: User ID is populated only when a Shopify Plus store grants the optional read_users scope; other stores still export successfully with that cell blank.

Step 4 — Filter the export

Select Add filter to narrow the Orders written to the file.

A Status filter in the EditEngine Orders export panel

EditEngine exposes 50 production filter fields:

  • identity and time: ID, Name, Created At, Updated At, and Processed At;
  • order state: Tags, Status, Payment Status, Fulfillment Status, Test Order, Return Status, Chargeback Status, and Sales Channel;
  • source and commerce: Source, Source Identifier, Discount Code, Payment Gateway, Purchase Order Number, and Confirmation Number;
  • customer and address: Customer ID, Email, Phone, Tax Exempt, shipping country/province/method, billing country, Delivery Method, Fulfillment Location, and Physical Location;
  • line data: Line Type, title, name, product handle, variant ID/title/inventory quantity/barcode, SKU, vendor, total line-item quantity, and weight;
  • fulfillment and refund dates: Fulfillment Created At, Fulfillment Updated At, and Refund Created At;
  • risk and payment: Risk Level, Risk Recommendation, Transaction CC Last 4, and Price Total; and
  • order metafield value by namespace, key, and text or number type.

Date filters use the store's time zone and support on/after, on/before, ranges, and full relative periods. Numeric filters support comparisons and ranges. Text filters support comma-separated matching, empty/not-empty checks, and * patterns where offered.

Multiple filters can match all or any. A blank condition matches everything and shows a warning. An unusable numeric condition is ignored instead of silently removing every order.

When you use a line-level or Line Type filter, EditEngine can show Include only matching line items. Leave it off to keep all selected child rows for each matching order; turn it on only when the file should contain the matching line subset. A Delivery Method filter requires one of Shopify's fulfillment-order access scopes, and EditEngine blocks submission until that access is granted.

Matrixify's current Orders documentation lists the core identity, date, status, customer, line, fulfillment, refund, and metafield filters. EditEngine adds fields such as Delivery Method, totals, quantities, PO/confirmation numbers, test, risk, locations, returns, chargebacks, card last four, and sales channel.

Step 5 — Understand the multi-row order shape

One order can expand into these Line: Type rows:

  • Line Item
  • Discount
  • Shipping Line
  • Refund Line
  • Refund Shipping
  • Transaction
  • Fulfillment Line

EditEngine writes line items first, then an order-level discount row when present, shipping rows, refund rows, transaction rows, and fulfillment rows. It repeats order identity and ordinary order fields on child rows, but keeps order totals, order taxes, Note, Order Status URL, and order metafields on the top row only. Top Row = TRUE marks the first row and Row # preserves spreadsheet order.

Exports set Command = NEW, Tags Command = REPLACE, Send Receipt = FALSE, and Inventory Behaviour = bypass. Those values match the exported record shape; they are not permission to re-create or rewrite an existing order.

For an update, build a minimal sheet with one intentional row group per order. If a focused export still contains child rows you do not intend to execute, remove them before import.

Step 6 — Choose identity and Command explicitly

EditEngine resolves an existing order by:

  1. ID, when present; then
  2. exact Name when ID is absent.

Order Name is not guaranteed to be unique. More than one exact match fails as ambiguous. If an ID is present but does not resolve, MERGE and UPDATE fail instead of falling back to Name.

CommandPublic Advanced Import behavior
NEWCreates only when no matching order exists; otherwise fails
MERGEUpdates a verified match; a public Name-only miss does not create
UPDATEUpdates an existing match and never creates
REPLACERejected before any Shopify request
DELETERejected before any Shopify request
IGNORESkips the row group

Use UPDATE for normal same-store changes and NEW for deliberate creation. Although Matrixify documents a blank Command as NEW, EditEngine defaults a missing row and file command to UPDATE.

Matrixify also documents MERGE as create-on-miss. EditEngine deliberately refuses a public Name-only MERGE miss because standard Shopify access may hide an older order with the same Name. Use explicit NEW when you intend to create, or UPDATE with an Order ID when you intend to modify.

Matrixify's Orders REPLACE deletes and recreates an order, and its DELETE removes one. EditEngine's public Orders importer disables both commands. This safety boundary takes precedence over the compatible export columns and templates.

Step 7 — Create new orders carefully

For a new order, use Command = NEW and include at least one valid line. EditEngine can create variant-backed lines or custom lines, along with supported contact, note, tags, financial status, currency, processed time, shipping and billing addresses, additional details, fulfillment status, source fields, transactions, and shipping lines.

Important creation rules:

  • A variant line with blank Line: Price uses the current catalog price. An explicit zero remains zero.
  • A custom line without a Variant ID always needs a money value; a blank price becomes 0.00 and needs Currency.
  • A Shipping Line needs Currency.
  • Transaction rows need an amount and Currency, with supported kind, status, gateway, and optional processing/authorization values.
  • Send Receipt defaults to false, Inventory Behaviour defaults to bypass, and fulfillment receipt sending is false.
  • Referenced products, variants, customers, fulfillments, and locations must belong to the destination store.

Matrixify can use Number to separate multiple new unnamed orders. EditEngine's current Orders adapter does not use Number for grouping. Give each new multi-row order a repeated, unique Name; rows without ID or Name join the preceding order group.

Step 8 — Update only supported existing-order data

Existing orders support these focused changes:

ChangeEditEngine behavior
Email, Phone, NoteNon-empty values update the order contact or note
TagsMERGE adds, DELETE removes, REPLACE replaces the listed set
Shipping addressSupplied address fields update the order shipping address
Additional Detailsname: value lines update custom attributes
Customer IDNon-empty sets that destination-store customer; an explicitly blank Customer ID column removes the current customer
MetafieldsNon-empty dynamic cells set values; an explicitly blank selected metafield cell deletes that metafield
Closed AtNon-empty archives an open order now; blank unarchives an archived order
Line ItemAppends a variant or custom line through Shopify order editing
Fulfillment trackingUpdates number, URL, company, and notification choice for an existing Fulfillment ID
Fulfillment Status CANCELLEDCancels the existing fulfillment and requires destructive operations enabled
Cancelled AtCancels the order now and requires destructive operations enabled
Refund rowCreates an amount-based refund transaction and requires destructive operations enabled

Blank Email, Phone, Note, Tags, shipping fields, or Additional Details do not clear the existing value. Closed At, Customer ID, and selected metafield columns have explicit blank semantics, so review those columns separately.

For existing orders, non-refund Transaction rows and shipping-line changes are create-only and fail. Billing-address edits, payment status, currency, processed/source fields, Send Receipt, Inventory Behaviour, and some fulfillment fields are also create-only in the current importer.

Step 9 — Handle tags, lines, tracking, refunds, and cancellation

Tags

Always populate Tags Command. EditEngine currently defaults a missing Orders Tags Command to REPLACE, while Matrixify documents MERGE as its default. A populated Tags cell with no Tags Command can therefore replace all existing tags. A blank Tags cell performs no tag change, including with REPLACE.

Add a line item

Use the blank add-line template, keep the order ID, set Command = UPDATE, use Line: Type = Line Item, and fill the new variant or custom-line values. The template asks for Line: Command = MERGE for clear Matrixify-shaped intent. EditEngine appends lines; public import does not edit or remove an existing line item.

Tracking and unfulfillment

Tracking updates and fulfillment cancellation require the existing Fulfillment: ID. Tracking numbers and URLs accept semicolon-separated values. Fulfillment: Send Receipt controls Shopify's tracking notification.

Setting Fulfillment: Status = CANCELLED cancels that fulfillment; it does not delete the order. This destructive operation must be enabled for the Orders sheet.

Refunds

The current importer creates an amount-based refund transaction from the refund row's Transaction Amount, Gateway, Note, and Send Receipt choice. It does not replay exported refund-line restock details. Do not assume Refund: Restock or Refund: Restock Type will move inventory in this workflow.

For ordinary payment gateways, EditEngine anchors the refund to a successful Sale or Capture transaction. An explicit gateway must match the same gateway; it never falls back to a different payment on a split-payment order. cash, store-credit, and exchange-credit may be used without a parent payment transaction.

Cancel an order

Any non-empty Cancelled At value requests cancellation at import time; Shopify does not let the importer set the historical timestamp. Cancel: Reason accepts customer, inventory, fraud, declined, other, or staff. Cancel: Refund controls refunding original payment methods, and Cancel: Send Receipt controls the customer notification. EditEngine cancels with restock disabled.

Already-cancelled orders are skipped for cancellation. A cancelled order cannot be uncancelled.

Step 10 — Import through Advanced Import

Open EditEngine → Import, choose Advanced import, and upload the edited CSV or XLSX file.

EditEngine Advanced Import ready for an Orders spreadsheet

Before starting the import:

  1. Confirm that EditEngine detects the Orders resource and the intended worksheet.
  2. Review the detected headers and total spreadsheet row count.
  3. Confirm every order group's ID or unique Name.
  4. Confirm every explicit Command; do not rely on a blank default.
  5. Review Tags Command and every blank Customer ID, Closed At, and metafield cell.
  6. Confirm that only intended new Line Item, refund, transaction, shipping, and fulfillment rows remain.
  7. Enable destructive operations only when the file intentionally cancels an order, creates a refund, or cancels a fulfillment.
  8. Start with one safe order and inspect its result before scaling up.

Advanced Import requires order read/write access, order-edit access, and the relevant fulfillment-order write scopes. It checks its execution lease again before each mutation so an obsolete worker cannot continue writing after ownership is lost.

Step 11 — Verify the result

After the import completes:

  1. Download the result file and investigate every failed or warning row.
  2. Open each sample order in Shopify Admin and verify contact, note, tags, shipping address, customer, line items, metafields, archive state, and totals.
  3. For tracking changes, open the exact fulfillment and verify company, number, URL, and notification choice.
  4. For unfulfillment, confirm that only the intended fulfillment was cancelled.
  5. For refunds and cancellations, verify the payment timeline and inventory separately.
  6. Re-export the same Order IDs with the smallest relevant column set and compare the new state with your intended values.
  7. Keep the untouched source export and result file with your operational audit trail.

Common mistakes

Changing a full export to UPDATE. Every exported Line Item row can become an appended line. Use a workflow template and keep only intentional child rows.

Leaving Command blank. EditEngine defaults missing Orders commands to UPDATE, unlike Matrixify's documented NEW default.

Leaving Tags Command blank. EditEngine defaults it to REPLACE for Orders, unlike Matrixify's documented MERGE default.

Using MERGE as create-on-miss. Public Name-only MERGE misses are blocked because older orders may be outside Shopify's accessible history.

Using REPLACE or DELETE. Public Orders imports reject both before a Shopify request, even though compatible export controls and templates exist.

Keeping source-store IDs. Order, customer, variant, fulfillment, and location IDs do not transfer between stores.

Using Number to group unnamed orders. The current EditEngine adapter groups by ID, then Name, then the preceding row; it does not split groups by Number.

Expecting all 204 export controls to be writable. Most are reporting or creation-only fields. Current product data, totals, risk, browser, and generated identity fields are not existing-order updates.

Blanking ordinary cells to clear them. Most blank order fields mean no update, but blank Customer ID, Closed At, and selected metafield cells have deliberate actions.

Expecting refund restock from exported refund rows. Current Advanced Import creates the refund transaction but does not replay refund-line restock details.

Assuming the count includes all history. Without protected all-orders access, Shopify exposes only the last 60 days to EditEngine.


About EditEngine: EditEngine Bulk Product Editor helps Shopify merchants bulk edit, import, and export store data from spreadsheets. Install on Shopify →

Previous
Export and import Shopify translations