How to Import Historical Orders into Shopify with Their Original Dates

By The RetroOrder teamPublished 9 min read
Short answer

Shopify's admin has no CSV import for orders, so historical orders come in through a migration app or the Admin API's orderCreate mutation. To keep the original date, set processedAt to the real sale date with a time and offset in your store's time zone. Shopify shows that date on the order and uses it in analytics, while createdAt records the import day.

Key takeaways
  • Shopify's migration guide says to import products first, then customers, then historical orders.
  • Historical orders go in through a migration app or the Admin API, not a built-in CSV import, and Shopify's own Store Migration app lists products and customers, not orders.
  • Setting processedAt at creation keeps the original sale date on the order and in Shopify's analytics reports.
  • Every imported order gets createdAt equal to the import moment, so filter imported history by processed_at, not created_at.
  • orderCreate doesn't touch inventory or email customers by default, but staff still get a new order email per import unless you turn it off.

To import historical orders into Shopify with their original dates, you need a migration app or the Admin API, because Shopify's admin has no CSV import for orders. Whichever route you take, the field that matters is the processed date (processedAt). Set it to the real sale date when the order is created and Shopify shows that date on the order and counts the sale on that day in analytics. Leave it out and every order is dated the day you ran the import.

This guide covers the order to import things in, the tools you can use, how to map dates so nothing slips a day, the settings that stop a flood of emails and stock changes, and how to check the result.

Can you import historical orders into Shopify?

Yes, but not from a spreadsheet in the admin. Shopify's migration guide lists historical orders, meaning orders that have already been fulfilled, as data you can move, and gives three bulk options for them: migration apps from the Shopify App Store, the Order API for a custom solution, and the Transaction API for payment data.

Two things surprise people here:

  • There's no Orders > Import button. Products and customers have CSV imports in the admin. Orders don't. Many migration apps accept a spreadsheet, but they create the orders through the API behind the scenes.
  • Shopify's own Store Migration app isn't the tool for orders. Its App Store listing describes importing product and customer data from platforms such as WooCommerce, Square, Etsy, Wix and Amazon. It doesn't list order history as something it imports.

Whatever tool you pick, it ends up calling Shopify's orderCreate mutation (or the older REST endpoint), so the same rules about dates, inventory and notifications apply to all of them.

What order should you import data in?

Products first, then customers, then orders. Shopify's migration guide says this in so many words, and the reason is practical: an order line can only link to a product variant that already exists, and an order can only attach to a customer record that's already there.

If you import orders first, you get orders with free-text line items that don't connect to your catalog, and a customer list that's missing the purchase history you were trying to preserve.

A sensible sequence for a full move looks like this:

StepWhat you importWhy it comes here
1Products and variantsOrder lines match to variants by SKU, barcode or ID
2CustomersOrders attach to the customer by email or ID
3Test batch of 5-10 ordersCatches mapping mistakes while they're cheap to fix
4All historical orders, in batchesThe bulk of the work
5Open or recent orders, lastSo they reflect the latest status on the old platform

One side effect worth knowing: Shopify's API docs say that when you create an order with a customer, the order's shipping or billing address can become that customer's default address, with the shipping address taking precedence. If you import a customer's oldest orders last, an old address can end up as their default. Importing in date order, oldest first, avoids that.

Which tool should you use to import orders?

Use a migration app unless you have a developer and an unusual data shape. Both routes create the same kind of order, so the choice is about effort and control.

MethodSkill neededKeeps original dates?Good forWatch out for
Migration or order import appSpreadsheet skillsYes, if it maps a date column to processedAtMost stores, from a few hundred to tens of thousands of ordersCheck that it sets the processed date, not just a note or tag
Custom script on orderCreateDeveloperYes, you set processedAt directlyUnusual source data, repeat imports, tight controlNeeds write_orders, an offline token and rate-limit handling
Draft orders, entered by handNoneNo, drafts take the completion dateA handful of orders at mostDated the day you complete them, and they can email the customer
Shopify Store Migration appNoneNot applicableProducts and customersDoesn't list orders among what it imports

Before you buy an app, ask its support one question: "Which Shopify field does your date column go into?" The answer you want is the processed date. Some apps also let you choose whether to create orders as completed orders or as drafts. For history, you want completed orders.

If you're writing your own script, Shopify's docs note that orderCreate needs the write_orders scope and only works for apps using offline access tokens. On trial and development stores it's limited to five new orders per minute, so test with a small batch there and run the full import on the live plan. It also supports only one discount code per order, so multi-discount orders from another platform need their discounts flattened before import.

How do you keep the original order dates?

Map the original sale date to processedAt, and write it as a full timestamp in your store's time zone. Shopify's API docs say processedAt is the date that appears on your orders and the one used in analytics reports, and that you can set it to a past date when importing from another platform.

Three details decide whether the dates come out right:

  1. Use midday, with an offset. A bare date like 2023-05-13 often gets turned into midnight UTC, which is the evening of May 12 in the Americas. Write 2023-05-13T12:00:00-07:00 instead (use your own offset, and remember it changes with daylight saving time). If your source has real times, keep them and add the right offset. We cover the one-day-early problem in detail in why your Shopify order date looks wrong.
  2. Never send a future date. As of API version 2026-07, a future processedAt is clamped to the current time. Earlier versions reject it with a PROCESSED_AT_INVALID error. A typo that turns 2023 into 2032 produces an order dated today.
  3. Accept that createdAt will be today. Every imported order gets a creation timestamp equal to the moment it was imported, and that can't be changed. That's expected. For the full difference between the two fields, see Shopify created_at vs processed_at.

Here's what a single imported order looks like afterwards:

Field or screenValue for an order sold May 13, 2023, imported Oct 26, 2026
processedAt2023-05-13T12:00:00-07:00
createdAt2026-10-26, the moment of import
Order page and Orders listMay 13, 2023
Shopify Analytics sales reportsCounted on May 13, 2023
Admin CSV export Created at columnMay reflect the import date; check one order

That analytics row cuts both ways. If you import five years of history, five years of revenue appears in your Shopify reports. That's usually what you want for lifetime value and year-over-year comparisons, but tell your bookkeeper first if anyone reads tax or revenue figures straight out of Shopify.

If the orders are already in Shopify with the import date, setting the date on creation is no longer an option. You can change the processed date on the existing orders, but Shopify Analytics won't move sales it has already recorded. Our guide to backdating orders in Shopify explains what does and doesn't change.

How do you stop emails and inventory changes during an import?

Turn off staff order emails before you start, and leave the import's customer email and inventory options at their defaults. Shopify's defaults for orderCreate are already import-friendly, but the staff notification setting isn't.

What could go wrongDefault in orderCreateWhat to do
Customers get order confirmationssendReceipt is falseLeave it off
Customers get shipping confirmationssendFulfillmentReceipt is falseLeave it off, even for fulfilled orders
Stock drops for orders shipped years agoinventoryBehaviour is BYPASS ("do not claim inventory")Keep BYPASS for history; use a decrement option only for open orders you still have to ship
Staff get one email per imported orderOn, if they're set up as recipientsTurn off New order for each recipient first

Shopify's migration guide warns about that last row specifically: any staff member set to receive new order notifications, including the account owner, gets an email for each imported order. Ten thousand orders means ten thousand emails. To turn them off, go to Settings > Notifications > Staff notifications, click the … next to each recipient, and choose Turn off (or Edit recipient and uncheck New order). Turn them back on when the import is finished.

If you use an app, check what it does for each of these. Most expose the same choices under different names.

How do you check the import worked?

Run a small test batch, compare it field by field, then reconcile totals after the full import. Ten orders are enough to catch almost every mapping mistake.

For the test batch, open each order and check:

  • Date. The order page shows the original sale date, not the day before.
  • Money. Subtotal, shipping, tax, discounts and total match the old platform to the cent. Shopify's docs note that if you set a financial status that doesn't match the transactions, it persists but may be recalculated later, so include transactions that match the paid amount.
  • Customer. The order is attached to the right customer, and that customer's default address is still their current one.
  • Status. Paid and fulfilled history shows as paid and fulfilled. If you leave fulfillment status out, Shopify defaults it to unfulfilled, which puts years-old orders in your shipping queue.
  • Reference. The old platform's order number is stored somewhere you can search, such as the order name, a tag or the note. The API lets you set the order name to any string and record the original platform's ID in sourceIdentifier.
  • Inventory. Stock levels for the products in those orders didn't change.

After the full import, compare order counts and revenue by month between the old platform and a Shopify sales report. Small differences usually trace back to refunds and returns, which Shopify's reports place on the day they were processed.

Finally, tell whoever runs your integrations about the import. Imported orders have a created_at of import day, so any sync that filters on created_at will either miss them or treat years of history as new orders. A merchant on the Shopify Community who couldn't find orders imported with a migration app traced it to exactly this and switched to filtering by processed_at. Apps also need Shopify's read_all_orders access to see anything older than 60 days.

How RetroOrder helps

RetroOrder isn't an import tool, and the best time to set the date is during the import. Where it helps is cleanup: if some orders came in with the import date, a day early from a midnight UTC timestamp, or were entered by hand later, select them on the Orders page and choose More actions (⋯) > Backdate with RetroOrder. It changes the processed date Shopify shows on the order, anchored to noon in your store's time zone, in bulk and on orders older than 60 days, without touching line items, totals, taxes, the customer or fulfillment. It doesn't change createdAt, and it doesn't move sales that Shopify Analytics has already recorded, so fix dates in the import file whenever you still can. The free plan covers 10 backdated orders per calendar month; RetroOrder Unlimited is $9.99/month with a 14-day free trial.

Frequently asked questions

Can you import orders into Shopify with a CSV file?

Not from the Shopify admin. Products and customers have built-in CSV imports, but orders don't. Shopify's migration guide points you to migration apps from the Shopify App Store or the Admin API instead. Many of those apps accept a spreadsheet and create the orders through the API for you.

Will imported orders show their original date in Shopify?

Yes, if the import sets the processed date (processedAt) to the original sale date. Shopify's API docs say that value is the date shown on your orders and used in analytics reports. If the tool leaves it blank, the order is dated the day you imported it.

Do imported historical orders count in Shopify Analytics?

They're counted on their processed date. Shopify says the processedAt set at creation is the date used in analytics, so an order imported today with a 2023 processed date adds to 2023's sales. If you don't want old revenue in your Shopify reports, decide that before you import.

Will customers get emails when I import old orders?

Not through orderCreate unless you ask for them. The sendReceipt and sendFulfillmentReceipt options both default to false. Your staff are a different matter: Shopify's migration guide warns that anyone set to receive new order notifications gets one email per imported order, so turn those off first.

Why can't my app find imported orders when it filters by date?

Because imported orders have a created_at equal to the import time. A merchant on the Shopify Community traced missing orders to exactly this. Filter historical ranges by processed_at, which holds the original sale date, and make sure the app has read_all_orders access for anything older than 60 days.

Sources

  1. Shopify Help Center: Migrate to Shopify
  2. Shopify Admin GraphQL API: orderCreate mutation
  3. Shopify Admin GraphQL API: OrderCreateOrderInput (processedAt)
  4. Shopify Admin GraphQL API: OrderCreateInputsInventoryBehavior
  5. Shopify Help Center: Staff notifications
  6. Shopify Community: Some archived imported orders not returned from Orders API