> ## 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.

# commercetools

<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/commercetools.png?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=832a3799166de1187fb6f9539e8d6f0d" alt="commercetools" style={{ height: "56px", width: "auto", flexShrink: 0, marginTop: "0.25rem" }} width="128" height="128" data-path="images/connectors/commercetools.png" />

  <div>
    The commercetools connector syncs your products and categories from a commercetools project into Frontic. Master and variant SKUs are denormalized into separate records with parent links preserved, and prices are pre-filtered to the currencies on each channel — so your Data Sync receives clean, currency-resolved payloads.
  </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 }}>OAuth 2.0 (client credentials)</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, Categories</div>
  </div>
</div>

## What you get

<CardGroup cols={2}>
  <Card title="Products" icon="boxes-stacked">
    Master products with variants split into separate records by SKU, parent links preserved, prices pre-filtered per currency.
  </Card>

  <Card title="Categories" icon="folder-tree">
    Power category pages, attach category context to other records, drive navigation.
  </Card>
</CardGroup>

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

## Set up the API client

Before adding the integration in Frontic, create a dedicated API client in commercetools Merchant Center:

<Steps>
  <Step title="Open API clients" icon="plug">
    In Merchant Center, go to **Settings → Developer settings → API clients** and click **Create new API client**.
  </Step>

  <Step title="Pick the read-only scopes" icon="key">
    Under **Scopes**, select **View** for these resources — Frontic only reads from commercetools, so view scopes are enough:

    * View project settings
    * View stores
    * View tax categories
    * View products
    * View published products
    * View attribute groups
    * View product selections
    * View categories
    * View standalone prices
    * View types
    * View key-value documents

    The connector uses **Manage** scopes for none of these. Don't grant write scopes the integration won't use.
  </Step>

  <Step title="Save and copy the credentials" icon="copy">
    After creating, commercetools shows the credentials **once**. Copy the **project key**, **client ID**, **client secret**, **API URL**, and **auth URL** — you'll paste them all into the Frontic connection form. If you lose the secret you'll need to create a new client.
  </Step>
</Steps>

## Connection settings

<ParamField path="Project Key" type="string" required>
  Your commercetools project key. Visible at the top of Merchant Center and on the API client credentials screen.
</ParamField>

<ParamField path="Client ID" type="string" required>
  The API client's ID created above.
</ParamField>

<ParamField path="Client Secret" type="string" required>
  The client secret paired with the Client ID.
</ParamField>

<ParamField path="API URL" type="string" required>
  The commercetools API endpoint for your project's region (e.g. `https://api.europe-west1.gcp.commercetools.com`).
</ParamField>

<ParamField path="Auth URL" type="string" required>
  The OAuth token endpoint for your project's region (e.g. `https://auth.europe-west1.gcp.commercetools.com`).
</ParamField>

The connection populates the channel's currency dropdown from your commercetools project's enabled currencies.

## Channels

A commercetools channel in Frontic carries the locales and currencies 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>
  commercetools locale codes 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>

<ParamField path="Currencies" type="multiselect" required>
  Currencies (from your commercetools project's enabled set) the connector pulls. Product prices are pre-filtered to these.
</ParamField>

The **Refresh** button re-fetches commercetools currencies and locales — use it after enabling new ones in commercetools.

## Data Feeds

The commercetools connector exposes two feed types:

| Feed           | What it pulls                                                                                                                 |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| **Products**   | Master products as parents and variants as separate records (one per SKU), with prices and translations resolved per channel. |
| **Categories** | The full category tree, parent links preserved.                                                                               |

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

* **Updates step** — Polling is supported.
* **Manual refresh** — every commercetools feed exposes a Refresh action that re-runs the feed against the source.

## What the data looks like

### Variants

A commercetools product with multiple variants becomes a parent record + one record per variant SKU, linked via `parentId`. A simple product (single variant) is emitted as a self-parented record. See [Product Models](/commerce-concepts/product-models) for how this shape composes at the API layer.

### Currency-resolved prices

Product prices are pre-filtered to the currencies declared on the channel. Variants inherit the per-currency price layout, so map them into the [Price composite](/reference/storage-field-types#composites) without per-region picking logic in your Value Composer.

### Attributes split into options and properties

commercetools attributes arrive as `{ name, value }` pairs in the source payload. The connector's attribute extractor unwraps the envelope and splits attributes by role, stamping each list onto the feed record under the reserved `$`-prefix namespace:

* **`$options`** — variant-defining attributes
* **`$properties`** — descriptive attributes that don't drive variant selection

Map either list straight into your storage's [Option](/reference/storage-field-types#composites) and property fields in the Value Composer, instead of unwrapping commercetools' `name`/`value` structure per field.

### Product type caching

Product types are cached on the integration's Instance — large catalogs sync faster because attribute definitions aren't refetched per record.

## Good to know

* **Read-only.** The commercetools connector pulls from commercetools; it doesn't push back. Edits happen in the Merchant Center.
* **Custom attribute groups.** commercetools attribute groups come through on the raw payload. Map them in your Data Sync if you need them as first-class fields.

## What isn't supported today

Commercetools has several segmentation and pricing primitives the connector doesn't currently use. The data still comes through on the raw record where commercetools includes it, but the connector doesn't filter or resolve by these dimensions:

* **Stores.** The connector pulls products from the project root, not via the [Store-scoped endpoints](https://docs.commercetools.com/api/projects/products#in-store-endpoints). Records that exist in only some stores arrive un-filtered. Use Frontic [scopes](/project-settings/scopes) and a [base query](/api-builder/listings#base-query) on your listings to segment instead.
* **Inventory channels and distribution channels.** Channel-specific prices (`priceChannel`) and channel-specific stock (`distributionChannel`) aren't applied during ingest. The connector pulls the master prices and filters by the channel's currencies; channel-tier-specific prices show up on the raw payload but aren't unwrapped.
* **Complex pricing.** Customer-group prices, country-specific prices, and validity-windowed prices on top of currency aren't resolved. The Price composite Frontic stores reflects the master / fallback price for each currency on the channel.

If your storefront depends on any of these dimensions, [get in touch](mailto:support@frontic.com) — we're actively collecting use cases to shape native support and your scenario helps us prioritise.

## Related

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

  <Card title="Akeneo" icon="database" href="/connectors/akeneo">
    Akeneo's connector — same `$options` / `$properties` split.
  </Card>
</CardGroup>
