> ## Documentation Index
> Fetch the complete documentation index at: https://docs.frontic.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Shopify

<div style={{ display: "flex", gap: "1.75rem", alignItems: "flex-start", marginTop: "0.5rem", marginBottom: "1.75rem" }}>
  <img src="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/shopify.svg?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=b9b05d30e5747891631d9ceaca57d8a3" alt="Shopify" style={{ height: "56px", width: "auto", flexShrink: 0, marginTop: "0.25rem" }} width="24" height="24" data-path="images/connectors/shopify.svg" />

  <div>
    The Shopify connector syncs your Shopify store's catalog and content into Frontic. Variants are denormalized into separate records with parent links preserved, and the connector covers four resource types — products, blogs, pages, and metaobjects — so you can build product, content, and structured-data experiences off the same backbone.
  </div>
</div>

<div style={{ display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: "0.75rem", marginBottom: "2rem" }}>
  <div style={{ padding: "0.75rem 1rem", border: "1px solid var(--card-border, rgba(0,0,0,0.08))", borderRadius: "0.625rem" }}>
    <div style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.75rem", textTransform: "uppercase", letterSpacing: "0.04em", opacity: 0.6, marginBottom: "0.25rem" }}>
      <Icon icon="key" iconType="solid" /> Auth
    </div>

    <div style={{ fontSize: "0.875rem", fontWeight: 500 }}>Access Token</div>
  </div>

  <div style={{ padding: "0.75rem 1rem", border: "1px solid var(--card-border, rgba(0,0,0,0.08))", borderRadius: "0.625rem" }}>
    <div style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.75rem", textTransform: "uppercase", letterSpacing: "0.04em", opacity: 0.6, marginBottom: "0.25rem" }}>
      <Icon icon="arrows-rotate" iconType="solid" /> Update methods
    </div>

    <div style={{ fontSize: "0.875rem", fontWeight: 500 }}>Polling</div>
  </div>

  <div style={{ padding: "0.75rem 1rem", border: "1px solid var(--card-border, rgba(0,0,0,0.08))", borderRadius: "0.625rem" }}>
    <div style={{ display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.75rem", textTransform: "uppercase", letterSpacing: "0.04em", opacity: 0.6, marginBottom: "0.25rem" }}>
      <Icon icon="boxes-stacked" iconType="solid" /> Resources
    </div>

    <div style={{ fontSize: "0.875rem", fontWeight: 500 }}>Products, Blog, Pages, Metaobjects</div>
  </div>
</div>

## What you get

<CardGroup cols={2}>
  <Card title="Products" icon="boxes-stacked">
    Variants split into separate records, parent links preserved. Per-variant fetch fills in inventory and price detail.
  </Card>

  <Card title="Blog" icon="newspaper">
    Blog articles by blog ID — pick which blog feeds the storage when you create the feed.
  </Card>

  <Card title="Pages" icon="file-lines">
    Shopify pages — about, contact, custom marketing pages.
  </Card>

  <Card title="Metaobjects" icon="diagram-project">
    Shopify metaobjects for structured custom data — lookbooks, ingredient lists, store locations.
  </Card>
</CardGroup>

The Shopify connector follows the standard integration model — see [how integrations work](/connectors/overview) for Connection, Channels, and Data Feeds. This page covers the Shopify-specific configuration.

## Connection settings

<ParamField path="Host" type="string" required>
  Your Shopify store domain, e.g. `https://my-shop.myshopify.com`.
</ParamField>

<ParamField path="API Key" type="string" required>
  The Shopify app's API key.
</ParamField>

<ParamField path="API Secret" type="string" required>
  The Shopify app's API secret key.
</ParamField>

<ParamField path="Access Token" type="string" required>
  The admin API access token granted to your app for the store.
</ParamField>

The settings panel shows a **Connection Status** indicator. Shopify doesn't expose a dedicated connection-test endpoint, so the status stays at `unknown` until the first sync runs successfully — at which point it flips to `connected`. Auth failures surface their reason on the indicator after a sync attempt.

## Channels

A Shopify channel in Frontic carries which translations the connector pulls per record.

<ParamField path="Channel Name" type="string" required>
  A label for the channel in Frontic.
</ParamField>

<ParamField path="Available Translations" type="multiselect" required>
  Locale keys the connector pulls per record.
</ParamField>

<ParamField path="Fallback Translation" type="select" required>
  The translation used when a value is missing in another locale.
</ParamField>

## Data Feeds

The Shopify connector exposes four feed types:

| Feed            | What it pulls                                                                         | Per-feed config      |
| --------------- | ------------------------------------------------------------------------------------- | -------------------- |
| **Products**    | All products with variants split into separate records, parent-child links preserved. | —                    |
| **Blog**        | Articles from a specific blog.                                                        | `Blog ID` (required) |
| **Pages**       | Shopify pages.                                                                        | —                    |
| **Metaobjects** | Structured custom data — lookbooks, store locations, etc.                             | —                    |

The standard **Settings → Updates → Schema** setup wizard applies — see [Data Feeds in the overview](/connectors/overview#data-feeds).

### Blog feed config

<ParamField path="Blog ID" type="string" required>
  The Shopify blog ID this feed reads from. Find it in Shopify admin under **Online Store → Blog posts** — the blog's ID is in the URL when you open the blog's settings.
</ParamField>

## What the data looks like

### Variants

Shopify always exposes products and variants as a parent/children pair, so the connector mirrors that: every product becomes a parent record (empty `parentId`), and every variant becomes its own record with `parentId` set to the product. **Even single-variant products produce two records** — one parent plus one variant — because that's the structure Shopify itself returns. See [Product Models](/commerce-concepts/product-models) for how this composes at the API layer.

For each variant, the connector issues a **dedicated Shopify API call** to fetch full variant detail (inventory, pricing, options) and merges it into the variant record on top of the parent's payload. This makes large catalogs cost more requests against Shopify's rate limit than a flat product fetch would — keep it in mind when configuring polling schedules on bigger stores.

### Schema auto-derivation

Shopify product payloads are rich JSON. As records arrive on the feed, Frontic's auto-schema fills in the field list for you — no need to declare every Shopify field up front in the wizard's Schema step. See [feed schema](/connectors/overview#data-feeds) in the overview.

## Good to know

* **No companion app.** Setup is direct: create a Shopify app or private API client, copy the credentials in. There's no Frontic-side app you install in Shopify.
* **Per-variant fetch.** Fetching variant detail issues one request per variant under the hood — large catalogs benefit from polling schedules on the Shopify rate-limit side.
* **Custom fields & metafields.** Standard product fields come through resolved; metafields land on the raw payload. Map them in your Data Sync.

## Related

<CardGroup cols={2}>
  <Card title="Product Models" icon="boxes-stacked" href="/commerce-concepts/product-models">
    How Shopify's parent products and variants compose at the API layer.
  </Card>

  <Card title="Shopware" icon="store" href="/connectors/shopware">
    A fully-fledged commerce-platform connector — companion plugin, end-to-end onboarding.
  </Card>
</CardGroup>
