Learn how to set up and customize data exports from your Shopify store to Google Sheets with SyncRange.
After connecting your Shopify store, you can configure exports to send your e-commerce data to Google Sheets. This allows you to analyze sales trends, monitor inventory, track customer behavior, and create custom reports based on your store's data.
Before configuring Shopify exports, make sure you have:
Follow these steps to create a new Shopify export:
From your dashboard, go to "Export Builder" and click "Create New Export".
Choose "Shopify" from the list of available data sources.
If you have multiple Shopify stores connected, select the store you want to export data from.
Select the Google Sheet where you want to export your Shopify data.
Set up the export configuration as described in the sections below.
The Shopify export configuration screen
Click "Create Export" to save your configuration and create the export.
When configuring a Shopify export, you have several options to customize what data is exported and how it's organized:
Configure the fundamental settings for your export:
The date range applies to Orders, Line Items, Customers, Sales Metrics, Product Analysis, Refund Analysis, Refund Line Analysis, Payouts, and Balance Transactions only. Products, Store, Locations, Inventory, and Inventory Locations always export all current data (no date filter). Choose a range that matches your reporting needs, shorter ranges are faster to export, while longer ranges provide more historical context.
For Since last export, the first run falls back to today up to now (UTC), then future runs only fetch new rows for supported tabs (Orders, Line Items, Customers, Sales Metrics, Product Analysis, Refund Analysis, Refund Line Analysis, Payouts, Balance Transactions).
Line Items, Product Analysis, Refund Analysis, and Refund Line Analysis refunds in incremental runs: Refund rows are matched against the refund processed date, not the original order's creation date. That means a refund processed in the current incremental window is included even if the underlying order was created months earlier (and won't be missed when comparing totals to your Shopify dashboard).
Customers in date ranges: The Customers tab is filtered by customer creation date. A customer is included only when their account was created within the selected window — customers who placed an order in the window but signed up earlier will not appear.
Tip: 'Since last export' is especially well suited to Orders in Append mode, so each run adds only new rows to your Google Sheets and BigQuery tables.
Shopify exports are organized by data types, with each type creating a separate tab in your Google Sheet. The interface uses a tab-based layout where you can configure each data type independently:
The tab interface for configuring different data types
Available data tabs include:
For each data tab, you can:
For each data tab, you can select which columns (fields) to include in your export:
The column selection interface for a data tab
Each data tab has its own set of available columns. Example columns include:
| Data Tab | Example Columns |
|---|---|
| Products | Product ID, Title, Variant ID, SKU, Barcode, Vendor, Product Type, Tags, Description, Status, Published, Handle, Image URL, Price, Compare at Price, Weight, Inventory Quantity, Options, Collections, Created/Updated Date |
| Orders | Order ID, Order Number, Order Date, Order Date Time, Customer ID/Name/Email, Fulfillment Status, Financial Status, Currency, Subtotal, Total Price, Refunded Amount, Shipping, Tax, Total Discounts, Quantity Sold, Discount Codes Applied, Discount Code IDs, Manual Discount Codes, Automatic Discount Titles, Discount Codes Applied (JSON), Discount Code IDs (JSON), Note, Note Attributes, Source, Date Exported |
| Line Items | Line Item ID, Order ID, Order Number, Order Date, Order Date Time, Line Item Name, Line Item Type (Product, Shipping, Refund), Quantity, Unit Price, Currency, Total Price, Refunded Amount, Discount Amount, Discount Codes Applied, Discount Code IDs, Manual Discount Codes, Automatic Discount Titles, Discount Codes Applied (JSON), Discount Code IDs (JSON), Discounted Price, Tax fields, SKU, Variant/Product fields, Fulfillment fields, Date Exported |
| Product Analysis | Product ID, Product Title, Product Type, Vendor, Currency, Gross Sales, Discounts, Returns, Net Sales, Tax, Total Sales, Units Sold, Orders, Date Exported — one row per product and currency for the selected period; sorted by product ID |
| Refund Analysis | Product ID, Product Title, Product Type, Vendor, Currency, Units Sold, Gross Sales, Orders With Product, Refunded Units, Refund Amount, Refund Line Items, Orders Refunded, Net Units, Net Sales, Refund Rate (Units), Refund Rate ($), Avg Refund Value, Avg Refund Quantity, Avg Days to Refund, Date Exported — one row per product and currency; sorted by refund amount (highest first) |
| Refund Line Analysis | Refund Line ID, Order ID, Order Name, Order Date, Order Date Time, Refund Date, Line Item Name, Refunded Quantity, Refund Price (per unit), Refund Amount, SKU, Variant ID/Title, Product ID/Title/Type, Vendor, Return Reason, Return Reason Note, Customer Note, Restock Type, Restocked, Discount fields, Is Gift Card, Date Exported — one row per refund line item |
| Discounts | Discount ID, Discount Type, Title, Summary, Status, Discount Code, Total Used Count, Code Used Count, Limit Total Times, Limit One Use Per Customer, Starts At, Ends At, Created At, Updated At, Value Type, Value, Value Currency, Minimum Purchase Type, Minimum Value, Eligibility Type, Eligibility Values, Eligibility Customer Segment IDs, Eligibility Customer Segment Names, Eligibility Customer Segment IDs (JSON), Eligibility Customer Segment Names (JSON), Discount URL |
| Payouts | Payout ID, Payout Date, Status, Type, Net Amount, Currency, Charges Gross, Charges Fee, Refunds Gross, Refunds Fee, Adjustments Gross, Adjustments Fee, Date Exported — one row per bank transfer; filtered by payout date |
| Balance Transactions | Balance Transaction ID, Transaction Date, Type, Source Type, Test, Order ID, Order Number, Payout ID, Payout Status, Gross Amount, Fee Amount, Net Amount, Currency, Source ID, Source Order Transaction ID, Adjustment Reason, Description, Date Exported — one row per ledger entry; filtered by processed date |
| Customers | Customer ID, First Name, Last Name, Email, Notes, Created At, Last Order Date, City, Country, Country Code, Customer Segment IDs, Customer Segment Names, Customer Segment IDs (JSON), Customer Segment Names (JSON) |
| Inventory | Inventory Item ID, Variant ID, Product ID, Product Title, SKU, Quantity, Unit Cost, Inventory Value, Tracked, Country of Origin, HS Code |
You can use the "Select All" and "Deselect All" buttons to quickly manage your column selections.
Some tabs pair comma-separated values with JSON columns for easier parsing in BigQuery and scripts. See Customer Segment and list JSON columns under Advanced features.
Looking for a full per-column reference with descriptions of each available field? See the Shopify data reference.
Product Analysis: A per-product summary of revenue, discounts, returns, units and orders over the selected date range — one row per product (or per variant when that option is enabled). Rows are sorted by Product ID, then variant ID when that mode is on, then currency. Append is off by default so each run replaces the sheet.
Refund Analysis: A per-product refund summary over the selected date range — refunded units, refund amount, refund rates, average refund value, and average days from order to refund — with units sold and gross sales shown alongside for context. Only products with at least one refund in the window appear; products with sales but no refunds are excluded. Sorted by Refund Amount (highest first). Append is off by default.
Refund Line Analysis: One row per refund line item over the selected date range, with order, product, and variant context, plus return reason metadata when the refund came from a Shopify Return (return reason, return reason note, customer note) and the refund line's restock type / restocked flag.
Payouts: One row per Shopify Payments bank transfer over the selected date range, with rolled-up charge, refund, and adjustment fees. Filtered by Payout Date (issued_at). Requires Shopify Payments — see Shopify Payments exports.
Balance Transactions: One row per Shopify Payments ledger entry (charge, refund, adjustment) with per-transaction Fee Amount, plus links to the order and payout. Filtered by Transaction Date (processed_at). Join to Orders on Order ID for per-order fee analysis.
For details on how refunds, totals, and date columns work across these tabs, see How refunds and totals work and Order Date vs Order Date Time under Advanced features.
Orders and Line Items use slightly different filters when you select the same date range, because they answer slightly different questions. The table below summarises which orders/refunds show up where:
| Scenario | In Orders? | Products + Shipping in Line Items? | Refund row in Line Items? |
|---|---|---|---|
| Order created in window, never refunded | Yes | Yes | n/a |
| Order created in window, refunded in window | Yes | Yes | Yes |
| Order created in window, refunded before the window | Yes (Total Price already reflects the refund; Refunded Amount is populated) | Yes | No (refund happened in an earlier window) |
| Order created before the window, refunded in window | No | No | Yes (Order Date on the refund row is the original order date — outside the window) |
| Order created in window, refunded in a future window | Yes | Yes | No (refund hasn't been processed yet at the time of this export) |
created_at. Total Price, Subtotal and Refunded Amount reflect the order's current state (all-time refunds included).created_at (same as Orders).refund.createdAt), so refunds processed in the window are still picked up even if the order was created earlier.Practical implication: if you sum Total Price across Orders and across Line Items for the same window they may not match exactly, because the two exports include slightly different sets of orders for refund-related rows. Use the Refunded Amount column on either tab to see how much of an order has been refunded as of now.
Refunded but no refund line item? When an order in the Orders tab has a non-zero Refunded Amount but no matching Refund rows in Line Items, the refund happened in an earlier window than the one you're exporting. Re-export with a wider date range that includes the refund's processed date to surface those rows.
For each data tab, you can choose how to handle the exported data:
The append option is particularly useful for building historical datasets over time. When enabled, each export adds new rows to the destination and leaves existing rows. When disabled, the destination is fully refreshed and existing data is removed.
Use the append option for data you want to track over time (like orders or sales metrics), and use replace for data that represents current state (like inventory or product details).
These choices reduce how much work each run does, which helps on very large stores and lowers the chance of slow runs or Shopify gateway errors.
Per-column context for the Customers tab is also noted under Shopify data reference → Customers.
Optional columns and structured formats for power users, BigQuery, and automation.
Line Items totals: The Total Price column is the net price after discounts for both product and shipping rows (it equals Discounted Price). Refund rows use a negative Total Price equal to the refund amount. Sum Total Price across product, shipping, and refund rows of the same order to reconcile to your Shopify dashboard's net sales (excluding tax). Use Discount Amount to see how much discount was allocated to each line.
Refund rows in Line Items: Each refunded line item is emitted as its own row with Line Item Type = Refund, a negative Total Price, and the original product's SKU, Variant ID/Title, Product ID/Title, Product Type and Vendor populated, so per-product revenue queries deduct refunds from the right product.
Refunded Amount on Line Items: The Refunded Amount column is per-row: refund rows show the amount refunded for that specific line, and product/shipping rows show 0. Sum Refunded Amount across all rows of an order to get the total refunded for the order (or use the Orders tab's Refunded Amount column for a single number per order).
Orders totals: The Subtotal and Total Price columns reflect the current order values (refunded line items, shipping refunds and tax refunds are subtracted), so they match Shopify's "Total sales" view. Refunded Amount remains a separate column showing how much was refunded. For a fully refunded order both Subtotal and Total Price will be 0, with Refunded Amount equal to the original total.
Product Analysis and Refund Analysis totals: Gross Sales is product price × quantity from sales in the window, before discounts and before refunds. Net Sales then subtracts Discounts and Returns, matching Shopify's Sales by product report.
On both Orders and Line Items, the Order Date column is a date only (YYYY-MM-DD), which is friendlier for grouping and pivoting. A separate Order Date Time column is available if you need the full timestamp (YYYY-MM-DD HH:MM:SS). Existing BigQuery tables with an order_date column keep their existing schema; if that column was previously typed as TIMESTAMP in BigQuery, new values are written as midnight (00:00:00) — add the Order Date Time column to recover full precision.
Segment and discount lists are available as plain comma-separated columns and as JSON array strings on the same row. Use the JSON variants for reliable parsing in BigQuery (PARSE_JSON) or in Google Apps Script (JSON.parse).
If the Customers export feels slow, try removing the segment columns—see Export efficiency tips.
On Orders and Line Items, optional JSON string columns complement the comma-separated discount fields: one column lists labels (codes or automatic discount titles), the other lists resolved catalog discount IDs where available.
JSON.parse in Sheets scripts or PARSE_JSON in BigQuery on the cell value.[] for both JSON columns.SyncRange can export Shopify Payments financial data when your store uses Shopify Payments and has granted the read_shopify_payments_accounts and read_shopify_payments_payouts scopes. This covers platform processing fees and bank payout reconciliation.
issued_at. Supports Since last export.processed_at. Supports Since last export.Reconnect required: Stores connected before this feature was added must reconnect Shopify to grant the new scope. If the scope is missing or Shopify Payments is not activated, Payouts and Balance Transactions tabs are skipped (the rest of the export continues).
Full column definitions: Payouts and Balance Transactions.
When you enable Note Attributes in the Orders tab, SyncRange exports Shopify order additional details as a single JSON array string column. This works in both Google Sheets and BigQuery exports.
[{"key":"delivery_window","value":"Afternoon"},{"key":"order_priority","value":"Urgent"}]When you configure the Orders tab, you can add up to eight custom metafield columns. Each metafield you specify becomes its own column in your export: the column header is the metafield name (e.g. custom.internal_id), and each row shows that metafield’s value for that order. This works for both Google Sheets and BigQuery exports.
custom.internal_id, custom.warehouse_id, delivery.instructions).To get the exact metafield name from Shopify, use your Shopify admin (see the image below for where to find it). The name is always in the form namespace.key (for example, custom.po_number). Copy that value and paste it into the corresponding Metafield 1–8 field in SyncRange.
The image below shows where to find or copy the order metafield name (namespace.key) in your Shopify dashboard—e.g. Settings → Custom data → Orders, or an order detail page where the metafield is shown.
In Shopify admin: go to Settings → Custom data → Orders (or the metafield definition you use). The metafield name is shown as Namespace and Key—combine them as namespace.key (e.g. custom.internal_id). You can also see it when editing an order and viewing its metafields. Use that exact value in SyncRange’s Metafield 1–8 fields.
When you configure the Products tab, you can add up to 8 custom product metafield columns. Each metafield you specify becomes its own column in your export: the column header is the metafield name (e.g. custom.internal_id), and each row shows that metafield’s value for that product (or variant). This works for both Google Sheets and BigQuery exports.
custom.brand, custom.segment).When you configure the Collections tab, you can add up to 8 custom collection metafield columns. Each metafield you specify becomes its own column in your export: the column header is the metafield name (e.g. custom.internal_id), and each row shows that metafield’s value for that collection. This works for both Google Sheets and BigQuery exports.
custom.segment, custom.brand).namespace.key).If your export is missing expected data:
If your export fails with errors:
If your exports are running slowly or timing out: