---
title: "Shopify to Snowflake: Connector Setup and SQL"
canonical: "https://www.owox.com/blog/articles/shopify-data-to-snowflake"
updated: "2026-10-29"
---

# How to load Shopify data into Snowflake with OWOX Data Marts

To get Shopify data into Snowflake, create an Admin API access token for your store, set up a connector Data Mart with the token and shop domain, choose an endpoint such as Orders and the fields you need, and publish. Orders land one row each in your Snowflake account, with line items stored as JSON that Snowflake can unpack in a query.

[Snowflake](/blog/topics/snowflake) · Updated October 1, 2026 · [Ievgen Krasovytskyi](/team/ievgen-krasovytskyi) · 7 min read

![How to load Shopify data into Snowflake with OWOX Data Marts](https://cdn.owox.com/www/content-marketing-article/shopify-data-to-snowflake/thumbnail/2-zz1bni.png/public)

Shopify’s own reports answer what sold. They do not answer what it cost to sell it. Ad spend is in the ad platforms, and Shopify cannot join to them.

Once orders are in Snowflake, next to the ad platform tables, that join is one query. This guide loads Shopify data into Snowflake with the Shopify [connector](/product/data-connectors) in [OWOX Data Marts](https://www.owox.com/app-signup): the token it needs, the endpoints worth loading, what the orders table looks like and the SQL to get from it to daily sales and product-level revenue.

## What you end up with

One table per endpoint in your own Snowflake account. The one you will query most is `shopify_orders`: one row per order, with its financial and fulfilment status, totals, customer reference and timestamps.

The connector reads the Shopify Admin API, writes the tables and repeats on a schedule. It does not model the data. Net sales, cohorts and margin are SQL you write on top.

## Before you start

**In Shopify.** Your store’s address, such as `yourstore.myshopify.com`, and permission to create and install an app in the store.

**In Snowflake.** A storage of type [Snowflake](/data-storages/snowflake) connected to your project, as described in the [storage guide](https://docs.owox.com/docs/storages/supported-storages/snowflake/): account identifier, warehouse, and a key pair or a username with a programmatic access token. The role must be able to create a database, a schema and tables. A small dedicated warehouse with auto-suspend is enough, and [Snowflake pricing explained](/blog/articles/snowflake-pricing-cost-control) shows what a daily load costs.

## The Turning Point

OWOX Data Marts

See your first report built in real time. _15 minutes._

1.  Connect your data warehouse
2.  Pick your metrics
3.  Get a live Google Sheets report

In the time it takes to write a ticket. Then imagine never writing that ticket again.

[Book a Demo](/book-a-call)

We'll use your actual use case

## Step 1: create the access token

The connector authenticates with an **Admin API access token**. You get one by creating an app for your own store. The [credentials guide](https://docs.owox.com/packages/connectors/src/sources/shopify/credentials/) has the exact request. In outline:

1.  In the Shopify Dev Dashboard, create an app and give its version **read scopes** only: orders, customers, products, inventory, discounts, checkouts, locations, fulfilment orders and content.
2.  **Release** the version and **install** the app in your store.
3.  From the app’s settings, take the client ID and secret, and request a token from your store’s token endpoint. The response contains the access token.

Every scope is a read scope. The connector cannot change anything in the store.

## Step 2: create the Data Mart and connect the store

Click **New Data Mart**, enter a title such as “Shopify Orders”, select the Snowflake storage and click **Create Data Mart**. On the Data Setup tab, set **Definition Type** to **Connector** and choose **Shopify**.

![Edit Connector form for Shopify in OWOX Data Marts on a Snowflake Data Mart, with two required fields, Shop Domain and Admin API Access Token – a store is connected with its address and one token](https://cdn.owox.com/www/content-marketing-article/shopify-data-to-snowflake/screens/1.png/public)

Enter the **Shop Domain** and the **Admin API Access Token**.

## Step 3: choose the endpoint and the fields

Each Data Mart loads one endpoint. Shopify offers many. These are the ones that matter for analytics.

*   **Orders.** Financial and fulfilment status, totals, discounts, refunds, customer and timestamps. Start here.
*   **Customers.** Contact details, marketing consent, order count and lifetime spend.
*   **Products** and **Product Variants.** The catalogue: vendor, type, status, SKU, price and inventory quantity.
*   **Abandoned Checkouts.** Checkouts that did not complete, with items and prices.
*   **Discount Codes**, **Collections**, **Inventory Items**, **Locations**, **Fulfillment Orders** and **Tender Transactions** for operations reporting.

There are also endpoints for store content and for metafields, the custom fields attached to orders, products, customers and other objects.

Then select fields.

![Connector Fields panel for Shopify in OWOX Data Marts with 32 of 49 fields selected for the orders endpoint, id locked as the key, and name, email, phone, status and price fields ticked – customer contact fields are a choice, not a default you have to accept](https://cdn.owox.com/www/content-marketing-article/shopify-data-to-snowflake/screens/2.png/public)

Two things to decide here.

**Personal data.** The Orders endpoint offers `email`, `phone` and shipping and billing address fields. If your reporting does not need them, do not load them. A table without personal data is a table you can grant access to freely. `customerId` is enough to count and join customers.

**Nested fields.** `lineItems`, `refunds`, `shippingLines` and `customer` are loaded as JSON text inside the order row. Select `lineItems` if you want product-level reporting. The query further down unpacks it.

The last screen asks for the database, schema and table. The setup proposes a database named after the source, the schema `PUBLIC` and a table named after the endpoint.

## Step 4: publish, backfill and schedule

Click **Publish & Run Data Mart**. Publishing starts the first import. Afterwards the Data Setup tab shows the source, the Snowflake table and its columns.

![Data Setup tab of a Shopify connector Data Mart in OWOX Data Marts, showing the Shopify source with the orders endpoint, the Snowflake database, schema and table it writes to, and the output schema with id as the key and a description for each field – orders are in a table in your own account](https://cdn.owox.com/www/content-marketing-article/shopify-data-to-snowflake/screens/3.png/public)

**History.** Click **Manual Run** and choose **Backfill (custom period)**. One backfill run covers at most 31 days. For older orders, run consecutive periods, each after the previous one has finished.

![Manual Run panel in OWOX Data Marts with Backfill (custom period) selected, start and end date fields and a note that a backfill run can cover at most 31 days – history is loaded one month at a time](https://cdn.owox.com/www/content-marketing-article/shopify-data-to-snowflake/screens/4.png/public)

**Schedule.** A Data Mart without a trigger does not run again. On the **Triggers** tab, add a trigger of type **Connector Run**: daily, weekly, monthly or at an interval.

![Create Scheduled Trigger form in OWOX Data Marts on the Shopify orders Data Mart, with trigger type Connector Run, a daily schedule at 09:00 and a time zone – new and changed orders are loaded without anyone starting it](https://cdn.owox.com/www/content-marketing-article/shopify-data-to-snowflake/screens/5.png/public)

Scheduled runs are incremental. Each one covers the current day plus the days set by the **Reimport Lookback Window**, two by default. The connector selects orders by when they were last updated, not when they were placed, so an old order that is refunded today is picked up by today’s run. Orders are merged on their `id`: the changed order replaces its earlier version and is not added a second time.

The same rule applies to a backfill. Its period is matched against the update time of the order.

## What the orders table looks like in Snowflake

**Names are case-sensitive, and in camel case.** The connector creates the schema, table and column names quoted, exactly as Shopify spells them: `totalPrice`, `processedAt`, `displayFinancialStatus`. In Snowflake a quoted name is case-sensitive and an unquoted one is read as upper case, so `SELECT totalPrice` fails. Quote every column, the schema and the table: `shopify_owox."PUBLIC"."shopify_orders"`. The database name is not quoted.

**Money is numeric, in the shop’s currency.** `totalPrice`, `subtotalPrice`, `totalTax`, `totalDiscounts`, `totalShippingPrice` and `totalRefunded` can be summed directly. `currencyCode` says which currency.

**There are four timestamps.** `createdAt`, `processedAt`, `updatedAt` and `closedAt`. For sales by day, `processedAt` is the usual choice. Pick one and use it everywhere.

**Status is two columns.** `displayFinancialStatus` covers payment and `displayFulfillmentStatus` covers shipping. A sales report nearly always needs a filter or a split on the first.

## Query the data

Both queries were validated on Snowflake against a table loaded by the connector.

Orders, gross sales, refunds and net sales by day:

```
SELECT
  DATE_TRUNC('day', "processedAt") AS day,
  "currencyCode" AS currency,
  COUNT(*) AS orders,
  SUM("totalPrice") AS gross_sales,
  SUM("totalRefunded") AS refunded,
  SUM("totalPrice") - SUM("totalRefunded")
    AS net_sales,
  SUM("totalPrice") / NULLIF(COUNT(*), 0)
    AS average_order_value
FROM shopify_owox."PUBLIC"."shopify_orders"
WHERE "processedAt" >=
  DATEADD(day, -90, CURRENT_DATE())
GROUP BY 1, 2
ORDER BY 1;
```

“Net sales” here is the order total minus refunds. Whether yours also excludes tax and shipping is a decision to make once, in a published query.

Units and sales by product, unpacking the line items:

```
SELECT
  li.value:sku::STRING AS sku,
  li.value:title::STRING AS title,
  SUM(li.value:quantity::NUMBER) AS units,
  SUM(
    li.value:quantity::NUMBER
    * li.value:discountedUnitPriceSet.shopMoney.amount::FLOAT
  ) AS sales
FROM shopify_owox."PUBLIC"."shopify_orders" o,
  LATERAL FLATTEN(
    input => PARSE_JSON(o."lineItems")
  ) li
WHERE o."processedAt" >=
  DATEADD(day, -90, CURRENT_DATE())
GROUP BY 1, 2
ORDER BY sales DESC;
```

`PARSE_JSON` turns the text into a structure, and `LATERAL FLATTEN` produces one row per line item. The keys inside the JSON are case-sensitive as well, so write `discountedUnitPriceSet` exactly. One limit to know: the connector stores up to 250 line items per order.

If product reporting is a daily need, turn this query into a view or a table in a reporting schema, so reports read rows and not JSON. [Snowflake as a reusable reporting layer](/blog/articles/snowflake-reusable-reporting-layer) shows the pattern.

## From table to report

A connector Data Mart can be reported from directly. On its **Destinations** tab you attach reports to [Google Sheets](/product/spreadsheets), Data Studio, Slack or email, each with its own columns and schedule. [Snowflake reports in Google Sheets](/blog/articles/automate-snowflake-google-sheets) covers the delivery.

The report most stores want is sales next to ad spend. With the ad platforms loaded into the same Snowflake account, that is the daily sales query above joined on the day to a unified spend query. [Self-service marketing analytics on Snowflake](/blog/articles/snowflake-self-service-marketing-analytics) builds the spend side.

## Where to go next

The ad platforms load into the same Snowflake account with the same kind of Data Mart: [Facebook Ads](/blog/articles/facebook-ads-to-snowflake-data-marts), [Google Ads](/blog/articles/google-ads-data-snowflake-owox), [Microsoft Ads](/blog/articles/microsoft-ads-snowflake-owox), [LinkedIn Ads](/blog/articles/linkedin-ads-to-snowflake), [TikTok Ads](/blog/articles/tiktok-ads-data-snowflake) and [Reddit Ads](/blog/articles/reddit-ads-to-snowflake).

For the platform itself, start with [what Snowflake is and how it works](/blog/articles/snowflake-data-warehouse-explained).

## Your New Normal

Turn your data into decisions.

Governed data marts give you the clean foundation ML needs to actually work.

*   No AI hallucinations
*   Analyst-governed definitions
*   Every number traces to SQL

[Get started free](https://www.owox.com/app-signup)

## FAQ

## Frequently Asked Questions

How are refunded or changed Shopify orders updated in Snowflake?

The connector selects orders by when they were last updated. An order that is refunded, fulfilled or edited is picked up by the next scheduled run, and because rows are merged on the order ID, the new version replaces the earlier one. Each run covers the current day plus the Reimport Lookback Window, two days by default.

Should I load customer emails and phone numbers from Shopify?

Only if a report needs them. The Orders endpoint offers email, phone and address fields, and each is optional in the field selection. The customerId field is enough to count and join customers. A table without personal data is simpler to grant access to and to share through reports.

How do I deliver Shopify data from Snowflake to spreadsheets and dashboards?

On the Data Mart's Destinations tab, create reports to Google Sheets, Data Studio, Slack or email, each with its own columns and schedule. For net sales or product-level numbers, publish your own query as a SQL Data Mart and report from that, so every report uses the same definition.

How do I report on Shopify line items in Snowflake?

The orders table stores line items as JSON text in the lineItems column. In a query, use PARSE\_JSON on the column and LATERAL FLATTEN to get one row per line item, then read sku, title, quantity and the unit price from each. The keys inside the JSON are case-sensitive. The connector stores up to 250 line items per order.

Why does my query fail on Shopify column names in Snowflake?

The connector creates schema, table and column names quoted, exactly as Shopify spells them in camel case, for example totalPrice and processedAt. In Snowflake a quoted name is case-sensitive and an unquoted name is read as upper case, so the column is not found. Write every name in double quotes exactly as created.

What do I need before connecting Shopify to Snowflake?

Your store address, permission to create and install an app in the store, and an Admin API access token issued for that app with read scopes. In Snowflake you need a connected storage with an account identifier, a warehouse and a key pair or a username with a programmatic access token, on a role that can create a database, schema and tables.

Which Shopify data can I load into Snowflake?

Orders, customers, products and product variants, abandoned checkouts, discount codes, collections, inventory items, locations, fulfillment orders and tender transactions, plus store content and metafields. Each endpoint is loaded by its own Data Mart into its own table. For sales reporting, start with Orders.

How do I load Shopify data into Snowflake?

Create an Admin API access token for your store, then create a Data Mart in OWOX Data Marts on your Snowflake storage with the definition type Connector and the source Shopify. Enter the shop domain and the token, pick an endpoint such as Orders and the fields you need, and publish. A Connector Run trigger on the Triggers tab repeats the load on a schedule.

## Who wrote this

![Ievgen Krasovytskyi](https://cdn.owox.com/www/webflow/68404586b341508a789a4aa5_.png/public)

[Ievgen Krasovytskyi](/team/ievgen-krasovytskyi) Head of Marketing

Ievgen Krasovytskyi is the Head of Marketing at OWOX, leading strategy across content, SEO, product marketing, and AI-powered automation. With deep expertise in analytics infrastructure, data warehouses, and marketing technology, he builds systems that connect marketing performance to business outcomes. Ievgen writes about SaaS growth, analytics workflows, and the future of AI in marketing operations.

[LinkedIn](https://www.linkedin.com/in/ievgen-krasovytskyi-a38a1253/) · [All articles](/team/ievgen-krasovytskyi)

[Snowflake](/blog/topics/snowflake)

## Related articles

[Snowflake · How to Load LinkedIn Ads Data into Snowflake with OWOX Data Marts · October 1, 2026](/blog/articles/linkedin-ads-to-snowflake)

[Google BigQuery · Snowflake vs BigQuery: A Detailed Comparison · October 13, 2026](/blog/articles/snowflake-vs-bigquery-comparison)

[Data Analytics · How to Choose a Data Warehouse: BigQuery, Snowflake, Redshift, Athena and Databricks Compared · October 15, 2026](/blog/articles/choose-right-data-warehouse)

[See all articles →](/blog/articles)

## Book a call

You are booked. The invitation is on its way to , with the calendar invite and the meeting link.

[Reschedule](#)

[Cancel](#)

## Schedule a meeting

## Schedule in person meeting at Data Outpost San Francisco

You are booked. The invitation is on its way to , with the calendar invite and the meeting link.

[Reschedule](#)

[Cancel](#)

## Links

Pages this page links to, on this site and on docs.owox.com. Where the page has a Markdown twin, its address follows the link.

- [Snowflake](https://www.owox.com/blog/topics/snowflake) — /blog/topics/snowflake.md
- [Ievgen Krasovytskyi](https://www.owox.com/team/ievgen-krasovytskyi) — /team/ievgen-krasovytskyi.md
- [connector](https://www.owox.com/product/data-connectors) — /product/data-connectors.md
- [OWOX Data Marts](https://www.owox.com/app-signup)
- [Snowflake](https://www.owox.com/data-storages/snowflake) — /data-storages/snowflake.md
- [storage guide](https://docs.owox.com/docs/storages/supported-storages/snowflake)
- [Snowflake pricing explained](https://www.owox.com/blog/articles/snowflake-pricing-cost-control) — /blog/articles/snowflake-pricing-cost-control.md
- [Book a Demo](https://www.owox.com/book-a-call) — /book-a-call.md
- [credentials guide](https://docs.owox.com/packages/connectors/src/sources/shopify/credentials)
- [Snowflake as a reusable reporting layer](https://www.owox.com/blog/articles/snowflake-reusable-reporting-layer) — /blog/articles/snowflake-reusable-reporting-layer.md
- [Google Sheets](https://www.owox.com/product/spreadsheets) — /product/spreadsheets.md
- [Snowflake reports in Google Sheets](https://www.owox.com/blog/articles/automate-snowflake-google-sheets) — /blog/articles/automate-snowflake-google-sheets.md
- [Self-service marketing analytics on Snowflake](https://www.owox.com/blog/articles/snowflake-self-service-marketing-analytics) — /blog/articles/snowflake-self-service-marketing-analytics.md
- [Facebook Ads](https://www.owox.com/blog/articles/facebook-ads-to-snowflake-data-marts) — /blog/articles/facebook-ads-to-snowflake-data-marts.md
- [Google Ads](https://www.owox.com/blog/articles/google-ads-data-snowflake-owox) — /blog/articles/google-ads-data-snowflake-owox.md
- [Microsoft Ads](https://www.owox.com/blog/articles/microsoft-ads-snowflake-owox) — /blog/articles/microsoft-ads-snowflake-owox.md
- [LinkedIn Ads](https://www.owox.com/blog/articles/linkedin-ads-to-snowflake) — /blog/articles/linkedin-ads-to-snowflake.md
- [TikTok Ads](https://www.owox.com/blog/articles/tiktok-ads-data-snowflake) — /blog/articles/tiktok-ads-data-snowflake.md
- [Reddit Ads](https://www.owox.com/blog/articles/reddit-ads-to-snowflake) — /blog/articles/reddit-ads-to-snowflake.md
- [what Snowflake is and how it works](https://www.owox.com/blog/articles/snowflake-data-warehouse-explained) — /blog/articles/snowflake-data-warehouse-explained.md
- [Google BigQuery · Snowflake vs BigQuery: A Detailed Comparison · October 13, 2026](https://www.owox.com/blog/articles/snowflake-vs-bigquery-comparison) — /blog/articles/snowflake-vs-bigquery-comparison.md
- [Data Analytics · How to Choose a Data Warehouse: BigQuery, Snowflake, Redshift, Athena and…](https://www.owox.com/blog/articles/choose-right-data-warehouse) — /blog/articles/choose-right-data-warehouse.md
- [See all articles →](https://www.owox.com/blog/articles) — /blog/articles.md
