SOP: Historical Sales Data Migration to Shopify

Follow this structured guide to securely migrate historical sales data into Shopify while preserving financial accuracy, customer records, and transaction integrity — without triggering unintended notifications.

This documentation outlines the process for migrating historical sales transactions into Shopify for reporting continuity and operational transparency. It is designed for system administrators and data teams handling large-scale data imports.

Golden Rules for Sales History Imports

1 Disable Automated Order Notifications

You do not want past customers receiving "Your order has shipped" emails for things they bought months ago. Follow Phase 3 below perfectly.

2 Mark as Fulfilled

In-person sales mean the customer already took the item. Make sure fulfillment status is set to `fulfilled` to prevent clogging your active shipping queue.

3 Preserve Financial & Reporting Accuracy

Use exact past dates (Processed At) and accurate transaction amounts so your historical Shopify sales reports perfectly match your accounting.

Phase 1

How to Prepare Your CSV Data File

Before importing, you must format your legacy POS data to match Shopify's strict requirements. Follow these detailed steps to build a perfectly compliant CSV file.

1Download the Template

The easiest way to start is by downloading our pre-formatted CSV template. It contains all the exact column headers you need. Open this in Excel or Google Sheets.

Screenshot Required HereShow the user clicking "Download Template" from the app dashboard.

2Grouping Multiple Line Items (The Name Column)

This is the most common point of failure. In your CSV, each row represents a single line item (a single product), not the entire order.

To tell the system that multiple products belong to the exact same order, you must give them the exact same order number in the Name column.

Example

If Order #1001 had a T-Shirt and a Hat, your CSV will have two rows. Both rows must say #1001 in the Name column.

NameLine: TitleLine: Price
#1001Cotton T-Shirt25.00
#1001Baseball Hat15.00
#1002Running Shoes120.00
Screenshot Required HereShow a cropped view of Excel highlighting the 'Name' column grouping rows.

3Timestamps & Transaction Math

Historical orders are only useful if they appear on the correct dates in your Shopify Analytics. Ensure the Processed At column is filled out using the strict format: YYYY-MM-DD HH:MM:SS.

Shopify's Strict Math Requirement

Shopify will reject your order if the math does not perfectly equal the Transaction: Amount. For every order (grouped by Name), the system calculates:

(Line: Price × Quantity) + Taxes - Discounts = Transaction: Amount

Note: You only need to put the Transaction: Amount on the first row of an order. You can leave it blank for the subsequent rows of that same order.

Screenshot Required HereShow an Excel snippet pointing out the 'Processed At' column and the 'Transaction: Amount' math aligning perfectly.

4Exporting as CSV

Once your data is mapped, you must save the file in a format the system can read. If you are using Excel, go to File > Save As and select CSV UTF-8 (Comma delimited) (*.csv).

Why UTF-8? Standard CSVs can break special characters (like accents in customer names: René). UTF-8 preserves all global characters safely.

Screenshot Required HereShow the Excel 'Save As' dropdown highlighting "CSV UTF-8".
Phase 2

Import Historical Sales Data

  • Log in to your Shopify Admin.
  • Click on Apps and open Helios HistoriQ.
  • Locate the Import section at the top of the dashboard.
  • Click Add File and select your updated CSV file. Under the file name, it should recognize the data as Orders. (If it says "Unrecognized", check your header spelling!)
Phase 3

Import Configuration & Automation Controls

Before you click "Import", you must configure the settings so Shopify doesn't treat these like new web orders.

Send ReceiptUNCHECK this to prevent confirmation emails.
Send Fulfillment ReceiptUNCHECK this to prevent shipping emails.
Send Order UpdateUNCHECK this.
Inventory OptionSet to "Do not adjust inventory". Items are already gone; deducting them again will ruin current stock levels.
Phase 4

Test the Import Configuration

Never import thousands of rows without testing your options first.

  1. Scroll to the bottom of the Options.
  2. Find "Import only first X items".
  3. Type 3 into the box.
  4. Click Import.
  5. Wait for the green "Completed" bar.
Phase 5

Validate Imported Records

Open Shopify > Orders and check the 3 newly imported test records:

  • Date & Time: Does it exactly match the old Historical Sales date, or does it incorrectly say "Today"?
  • Status: Are the orders marked as Paid & Fulfilled?
  • Financial Math: Does the Subtotal + Tax - Discount precisely equal the Total?
Phase 6

Execute Full Migration

If the 3 test orders look perfect, you are ready for the main event.

  • Upload the exact same file again.
  • Clear the "Import only first X items" box so it is completely empty.
  • Double-check that email Options are still turned OFF.
  • Click Import and let it run!

Depending on rows, this takes 10 mins to a few hours. You can close your browser; the server handles the rest. Download the "Import Results" file at the end to check for any errors (explained in the far right column of that result file).


Mapping Guide

Complete Data Dictionary

Map your exact custom columns to the required CSV formats. Use the search bar below to instantly find your column.

1. Order Identity & Timestamps

Column Name
order_number

The primary identifier for the order in Shopify. For Historical Sales, use your old receipt/transaction numbers so they don't overlap web orders.

Example Record
Sales-10045
Column Name
processed_at

CRITICAL: Exact date/time the sale occurred. Uses this to accurately backdate the sale in Shopify analytics. (YYYY-MM-DD HH:MM:SS)

Example Record
2023-11-04 14:30:00
Column Name
status

Dictates the payment state. Since these are Historical Sales, almost all records should be marked as paid.

Example Record
paid
Column Name
fulfillment_status

Tells Shopify if items have been given to customer. Use fulfilled to prevent order showing in shipping queue.

Example Record
fulfilled
Column Name
note

A text field for internal staff memos. Import cashier notes here.

Example Record
Customer requested email receipt.
Column Name
tags

Searchable keywords. Comma-separated. Highly recommended to add a Historical Sales tag to easily filter old orders later.

Example Record
Legacy_Sales, Walk-in

2. Customer Profile

Column Name
email

Contact email of the buyer. Shopify links past orders to customer profiles automatically with this.

Example Record
john.doe@example.com
Column Name
shopify_customer_id

If you already migrated customers and know the Shopify ID, use it. Otherwise, leave blank and rely on email.

Example Record
68778783ad298

3. Locations (Billing/Shipping)

Column Name
shipping_name

Full name. Shopify splits First/Last automatically.

Example Record
Jane Smith
Column Name
shipping_address1

Primary street address.

Example Record
123 Main St
Column Name
shipping_city

Destination city.

Example Record
Toronto
Column Name
shipping_province

State/Province code (2 letters).

Example Record
ON
Column Name
shipping_zip

Postal code.

Example Record
M5V 2K7
Column Name
shipping_country

Country ISO Code (2 letters).

Example Record
CA
Column Name
billing_name

Billing full name.

Example Record
Jane Smith
Column Name
billing_address1

Billing street address.

Example Record
456 Oak Lane
Column Name
billing_city

Billing city.

Example Record
Austin
Column Name
billing_province

Billing State/Province code.

Example Record
TX
Column Name
billing_zip

Billing Postal code.

Example Record
78701
Column Name
billing_country

Billing Country ISO Code.

Example Record
US

4. Cart / Products

Column Name
line_item_title

Exact name of product purchased. This appears on historical receipts.

Example Record
Premium Cotton T-Shirt
Column Name
quantity

Number of units bought for this specific line item.

Example Record
2
Column Name
price

Base price for ONE single unit (before taxes/discounts).

Example Record
25.00
Column Name
item_sku

Stock Keeping Unit. Relied upon heavily to connect legacy sales to live Shopify inventory.

Example Record
TSHIRT-WHT-MED
Column Name
barcode

Scanned UPC/EAN at register.

Example Record
012345678910

5. Discounts Applied

Column Name
discount_title

Name of the promo or manual override cashier applied.

Example Record
Walk-in 10% Off
Column Name
discount_type

Calculation type. Use "percentage" or "fixed_amount".

Example Record
percentage
Column Name
discount_amount

Value of discount. If type is percentage, enter 10. If fixed, enter dollar amount.

Example Record
10

6. Taxes

Column Name
line_item_tax_price

Exact amount of tax applied to THIS single row item.

Example Record
1.25
Column Name
tax_title

Name of primary tax applied.

Example Record
State Sales Tax
Column Name
tax_rate

Percentage rate formatted as decimal (5% = 0.05).

Example Record
0.05
Column Name
tax_price

Total currency amount charged for this tax on entire order.

Example Record
5.50
Column Name
tax_2_title

Secondary tax name (if applicable).

Example Record
County Tax
Column Name
tax_2_rate

Secondary tax decimal rate.

Example Record
0.02
Column Name
tax_2_price

Secondary tax total currency amount.

Example Record
2.20

7. Payment Transaction

Column Name
transaction_kind

Money movement. Use "sale" for Historical Sales migrations.

Example Record
sale
Column Name
transaction_amount

Actual amount handed to cashier. Must perfectly match order total (Items+Tax-Discount).

Example Record
54.20

8. Returns & Voids

Column Name
cancel_reason

Reason order was voided. Accepts: customer, inventory, fraud, declined, other.

Example Record
customer
Column Name
cancel_restock

Was item put back on shelf? TRUE or FALSE.

Example Record
FALSE
Column Name
cancel_staff_note

Internal cashier reason for return.

Example Record
Customer brought it back, wrong size.
Column Name
cancel_notify_customer

Important: Leave blank to prevent sending unnecessary cancellation emails to past customers.

Example Record
Leave blank to disable notification

Support

Troubleshooting & Common Errors

Encountered an issue during your test import? Check these common solutions.

Wrap Up

Post-Migration Checklist

Once your final import shows as 100% Completed, run through these final steps.

1. Verify Analytics

Open Shopify Analytics > Reports. Filter by a past month to ensure your historical revenue has populated correctly.

2. Check Customers

Search for a customer who was included in the import. Confirm that the historical order appears on their timeline.

3. Archive Files

Store your original CSV file securely in an encrypted drive for compliance and backup purposes.