# Shopify

### Sync overview <a href="#syncoverview" id="syncoverview"></a>

We use hard deletes to remove records from the following tables:

* `ABANDONED_CHECKOUT_DISCOUNT_CODE`
* `ABANDONED_CHECKOUT_LINE`
* `ABANDONED_CHECKOUT_SHIPPING_LINE`
* `ABANDONED_CHECKOUT_URL_TAG`
* `COLLECTION_METAFIELD`
* `CUSTOMER_ADDRESS`
* `CUSTOMER_METAFIELD`
* `CUSTOMER_TAG`
* `CUSTOMER_TAX_EXEMPTION`
* `DISCOUNT_ALLOCATION`
* `DISCOUNT_APPLICATION`
* `DRAFT_ORDER_LINE`
* `DRAFT_ORDER_LINE_TAX_LINE`
* `DRAFT_ORDER_METAFIELD`
* `DRAFT_ORDER_NOTE_ATTRIBUTE`
* `DRAFT_ORDER_TAG`
* `FULFILLMENT_ORDER`
* `FULFILLMENT_ORDER_FULFILLMENT_HOLD`
* `FULFILLMENT_ORDER_LINE_ITEM`
* `MEDIA_ERROR`
* `MEDIA_FILE_ERROR`
* `MEDIA_SOURCE`
* `MEDIA_WARNING`
* `ORDER_DISCOUNT_CODE`
* `ORDER_LINE`
* `ORDER_METAFIELD`
* `ORDER_NOTE_ATTRIBUTE`
* `ORDER_RISK_ASSESSMENT`
* `ORDER_SHIPPING_LINE`
* `ORDER_SHIPPING_TAX_LINE`
* `ORDER_TAG`
* `ORDER_URL_TAG`
* `PRICE_RULE_ENT_COLLECTION`
* `PRICE_RULE_ENT_COUNTRY`
* `PRICE_RULE_ENT_PRODUCT`
* `PRICE_RULE_ENT_VARIANT`
* `PRICE_RULE_PREREQ_COLLECTION`
* `PRICE_RULE_PREREQ_CUSTOMER`
* `PRICE_RULE_PREREQ_CUSTOMER_SEGMENT`
* `PRICE_RULE_PREREQ_PRODUCT`
* `PRICE_RULE_PREREQ_VARIANT`
* `PRODUCT_IMAGE`
* `PRODUCT_IMAGE_METAFIELD`
* `PRODUCT_MEDIA`
* `PRODUCT_MEDIA_METAFIELD`
* `PRODUCT_METAFIELD`
* `PRODUCT_TAG`
* `PRODUCT_VARIANT`
* `PRODUCT_VARIANT_MEDIA`
* `PRODUCT_VARIANT_METAFIELD`
* `RETURN`
* `RETURN_LINE_ITEM`
* `RETURN_SHIPPING_FEE`
* `TAX_LINE`

#### Incremental sync <a href="#incrementalsync" id="incrementalsync"></a>

We cannot track incremental updates for the following tables because the necessary parameters are not available in Shopify's API:

* `APP`
* `CATALOG`
* `CUSTOMER_SAVED_SEARCH`
* `CUSTOMER_SEGMENTS`
* `PRODUCT_PUBLICATION`
* `DISCOUNT_AUTOMATIC_APP`
* `DISCOUNT_AUTOMATIC_BASIC`
* `DISCOUNT_AUTOMATIC_BXGY`
* `DISCOUNT_AUTOMATIC_FREE_SHIPPING`
* `DISCOUNT_CODE_APP`
* `DISCOUNT_CODE_BASIC`
* `DISCOUNT_CODE_BXGY`
* `DISCOUNT_CODE_FREE_SHIPPING`
* `DISCOUNT_CUSTOMER_BUYS_COLLECTION`
* `DISCOUNT_CUSTOMER_BUYS_PRODUCT`
* `DISCOUNT_CUSTOMER_BUYS_PRODUCT_VARIANT`
* `DISCOUNT_CUSTOMER_GETS_COLLECTION`
* `DISCOUNT_CUSTOMER_GETS_PRODUCT`
* `DISCOUNT_CUSTOMER_GETS_PRODUCT_VARIANT`
* `DISCOUNT_CUSTOMER_SEGMENT_SELECTION`
* `DISCOUNT_CUSTOMER_SELECTION`
* `DISCOUNT_DESTINATION_SELECTION_COUNTRY`
* `DISCOUNT_REDEEM_CODE`
* `DISCOUNT_SHAREABLE_URL`
* `DISPUTE`
* `GIFT_CARD`
* `LOCATION`
* `METAFIELD (SHOP)`
* `PAYOUT`
* `PUBLICATION`
* `SHOP`
* `USER`

As a result, we sync data for the above tables once a day. However, you can sync the latest data by syncing each table manually. See our table re-sync documentation for more information. We sync metafields with the owner resource as `shop` once a day, and sync other resource metafields incrementally based on their parent endpoint.

We sync the following tables daily if the sync takes less than 30 minutes. Otherwise, we sync them weekly on Saturdays.

* `DISCOUNT_AUTOMATIC_APP`
* `DISCOUNT_AUTOMATIC_BASIC`
* `DISCOUNT_AUTOMATIC_BXGY`
* `DISCOUNT_AUTOMATIC_FREE_SHIPPING`
* `DISCOUNT_CODE_APP`
* `DISCOUNT_CODE_BASIC`
* `DISCOUNT_CODE_BXGY`
* `DISCOUNT_CODE_FREE_SHIPPING`
* `DISCOUNT_CUSTOMER_BUYS_COLLECTION`
* `DISCOUNT_CUSTOMER_BUYS_PRODUCT`
* `DISCOUNT_CUSTOMER_BUYS_PRODUCT_VARIANT`
* `DISCOUNT_CUSTOMER_GETS_COLLECTION`
* `DISCOUNT_CUSTOMER_GETS_PRODUCT`
* `DISCOUNT_CUSTOMER_GETS_PRODUCT_VARIANT`
* `DISCOUNT_CUSTOMER_SEGMENT_SELECTION`
* `DISCOUNT_CUSTOMER_SELECTION`
* `DISCOUNT_DESTINATION_SELECTION_COUNTRY`
* `DISCOUNT_REDEEM_CODE`
* `DISCOUNT_SHAREABLE_URL`

#### Historical sync time frame <a href="#historicalsynctimeframe" id="historicalsynctimeframe"></a>

You can configure the historical sync time frame when setting up your connection to speed up both the initial sync and subsequent re-syncs. Historical sync time frame limits the amount of data synced for the following tables:

* `ABANDONED_APPLIED_DISCOUNT`
* `ABANDONED_CHECKOUT`
* `ABANDONED_CHECKOUT_DISCOUNT_CODE`
* `ABANDONED_CHECKOUT_LINE`
* `ABANDONED_CHECKOUT_SHIPPING_LINE`
* `ABANDONED_CHECKOUT_TAX_LINE`
* `ABANDONED_CHECKOUT_URL_TAG`
* `APPLIED_GIFT_CARD`
* `CUSTOMER_VISIT`
* `DISCOUNT_ALLOCATION`
* `DISCOUNT_APPLICATION`
* `DRAFT_ORDER`
* `DRAFT_ORDER_LINE`
* `DRAFT_ORDER_LINE_TAX_LINE`
* `DRAFT_ORDER_NOTE_ATTRIBUTE`
* `DRAFT_ORDER_TAG`
* `FULFILLMENT`
* `FULFILLMENT_EVENT`
* `FULFILLMENT_ORDER`
* `FULFILLMENT_ORDER_FULFILLMENT_HOLD`
* `FULFILLMENT_ORDER_LINE_ITEM`
* `FULFILLMENT_ORDER_LINE`
* `ORDER`
* `ORDER_ADJUSTMENT`
* `ORDER_DISCOUNT_CODE`
* `ORDER_LINE`
* `ORDER_LINE_REFUND`
* `ORDER_NOTE_ATTRIBUTE`
* `ORDER_RISK`
* `ORDER_RISK_ASSESSMENT`
* `ORDER_RISK_FACT`
* `ORDER_RISK_SUMMARY`
* `ORDER_SHIPPING_LINE`
* `ORDER_SHIPPING_TAX_LINE`
* `ORDER_TAG`
* `ORDER_URL_TAG`
* `REFUND`
* `RETURN`
* `RETURN_LINE_ITEM`
* `RETURN_SHIPPING_FEE`
* `TAX_LINE`
* `TENDER_TRANSACTION`
* `TRANSACTION`

We apply the selected start date only to these tables, as they contain data that you are less likely to reference later. For example, you still may want to refer to a product collection created two years ago, so we don't apply the start date to the `COLLECTION` table. However, you are unlikely to refer to an order created 10 years ago, which is why we apply the start date to the `ORDER` table.

You can modify the historical sync time frame at any time.

* If you set it to an earlier date, we perform a full historical re-sync during the next scheduled sync, retrieving data starting from that new date.
* If you set it to a later date, we don’t delete any existing data. Instead, we apply the new time frame only to subsequent re-syncs.

#### Sync limitations <a href="#synclimitations" id="synclimitations"></a>

If an update to a child object does not trigger an update in its parent object, we do not capture the update until the parent object is updated. For example:

* If the `productVariantMetafield` object is updated, we do not capture the update until its parent object, `product`, is updated.
* If the `damaged` inventory quantity is updated, the `updatedAt` timestamp of its parent object, `product`, remains unchanged, and we do not capture the update. However, if the `available` inventory quantity is updated, the `updatedAt` timestamp of its parent object, `product`, is updated, and we capture the update.

### Schema information <a href="#schemainformation" id="schemainformation"></a>

This schema applies to all DinMo accounts created on or after August 1, 2025.

![Explore Shopify schema ERD](https://fivetran.com/_/api/service-erd/shopify/preview-image/public?createdAt=2025-07-29T20%3A01%3A12.652Z)

[Interactive Shopify Schema ERD](https://fivetran.com/connector-erd/shopify?createdAt=2025-07-28T20%3A39%3A21.216Z)

#### Metafields <a href="#metafields" id="metafields"></a>

DinMo supports [Shopify's Metafield resource](https://shopify.dev/docs/api/admin-rest/2023-10/resources/metafield). We support the metafields of the following tables:

* `COLLECTION`
* `CUSTOMER`
* `DRAFT_ORDER`
* `ORDER`
* `PRODUCT`
* `PRODUCT_IMAGE`
* `PRODUCT_VARIANT`
* `SHOP`

To sync your Shopify account's metafields to your destination, you must sync the `METAFIELD` table. Also, sync all applicable metafields of any resources for which you have configured metafields. For example, the `COLLECTION_METAFIELD` or `CUSTOMER_METAFIELD` table.

All the metafields data for the resources you have selected will appear in the `METAFIELD` table in your destination following the next incremental sync. The `owner` column indicates the resource the metafields data refers to.

#### Web pixels data <a href="#webpixelsdata" id="webpixelsdata"></a>

Our connector supports syncing web pixels event data. We sync all the [standard Shopify web pixels events](https://shopify.dev/docs/api/web-pixels-api/standard-events) that are sent by the Shopify web pixels and sync them in the following tables:

* `ALERT_DISPLAYED_EVENT`
* `CART_ATTRIBUTE_EVENT`
* `CART_LINE_EVENT`
* `CART_VIEWED_EVENT`
* `CHECKOUT_ATTRIBUTES_EVENT`
* `CHECKOUT_DELIVERY_OPTION_EVENT`
* `CHECKOUT_DISCOUNT_APPLICATION_EVENT`
* `CHECKOUT_EVENT`
* `CHECKOUT_LINE_ITEM_DISCOUNT_ALLOCATION_EVENT`
* `CHECKOUT_LINE_ITEM_EVENT`
* `CHECKOUT_LINE_ITEM_PROPERTY_EVENT`
* `CHECKOUT_TRANSACTION_EVENT`
* `COLLECTION_VIEWED_EVENT`
* `COLLECTION_VIEWED_PRODUCT_VARIANT_EVENT`
* `PAGE_VIEWED_EVENT`
* `PRODUCT_ADDED_TO_CART_EVENT`
* `PRODUCT_REMOVED_FROM_CART_EVENT`
* `PRODUCT_VIEWED_EVENT`
* `SEARCH_RESULT_PRODUCT_VARIANT_EVENT`
* `SEARCH_SUBMITTED_EVENT`
* `UI_EXTENSION_ERRORED_EVENT`

We use the `CHECKOUT_EVENT` table and its child tables to store data from the following Shopify checkout-related events:

* `checkout_address_info_submitted_event`
* `checkout_completed_event`
* `checkout_contact_info_submitted_event`
* `checkout_shipping_info_submitted_event`
* `checkout_started_event`
* `payment_info_submitted_event`

You can choose what records to sync into the `CHECKOUT_EVENT` and its child tables by selecting or deselecting the corresponding event names in the connector schema dashboard.

{% hint style="info" %}
This feature is available only for connections created using DinMo’s Shopify public app.

* Only one connection per shop supports the synchronization of web pixels data. If you have multiple connections for the same Shopify store, only one connection syncs the web pixels data.
* When you enable any web pixels–related tables in the connection, DinMo registers a Shopify Web Pixel Extension on your storefront. This runs securely in Shopify’s sandboxed environment and follows Shopify’s customer consent rules.
* If your site has privacy or performance guidelines, we recommend that you check with your team before enabling these tables. You can disable this behavior by disabling all web pixel–related tables in your connection.
* For more information, see [Shopify Web Pixels documentation](https://shopify.dev/docs/apps/build/marketing-analytics/pixels).
  {% endhint %}

### Syncing empty tables and columns <a href="#syncingemptytablesandcolumns" id="syncingemptytablesandcolumns"></a>

The Shopify connection doesn't support the creation of empty tables and columns in your destination.

We create a table in the destination only if we can retrieve the table data from the source. If Shopify doesn’t return data for the source table, we don’t create the table in your destination.

### Shopify API access scopes <a href="#shopifyapiaccessscopes" id="shopifyapiaccessscopes"></a>

{% hint style="info" %}
The API access scopes listed in this section are applicable only for the Shopify connections created using a non-DinMo app (custom, private or another public app).
{% endhint %}

DinMo requires the following [authenticated access scopes](https://shopify.dev/docs/admin-api/access-scopes) for Shopify's Admin API:

* `read_all_orders`
* `read_assigned_fulfillment_orders`
* `read_customers`
* `read_discounts`
* `read_draft_orders`
* `read_files`
* `read_fulfillments`
* `read_inventory`
* `read_locales`
* `read_locations`
* `read_merchant_managed_fulfillment_orders`
* `read_orders`
* `read_price_rules`
* `read_product_listings`
* `read_products`
* `read_publications`
* `read_returns`
* `read_shipping`
* `read_shopify_payments_accounts`
* `read_shopify_payments_disputes`
* `read_shopify_payments_payouts`
* `read_third_party_fulfillment_orders`
* `read_customer_events`
* `write_pixels`

{% hint style="info" %}
The `read_gift_cards` and `read_users` scopes are available only for Shopify Plus accounts. To sync data from the `GIFT_CARD` and `USER` tables, contact Shopify Support to enable these scopes for your account.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.dinmo.io/integrations/dinmo-ingest/shopify.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
