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

# Overview

A **connector** is a piece of Frontic that knows how to talk to a specific source system — be it Shopware, Shopify, commercetools, some other system or even a CSV file drop. The connector handles the source's quirks for you — splitting inline variants, resolving translations, normalizing prices — so the records that land on your Data Feeds are already shaped for Frontic. You use a connector to set up an **integration**: a configured, credentialed link in your Frontic project that pulls data in (or accepts data pushed at it).

This page covers how integrations work end-to-end. For vendor-specific setup, click into a connector below.

## What's in an integration

<CardGroup cols={3}>
  <Card title="Connection" icon="plug">
    Auth and host for one source system. Valid options come from the source itself.
  </Card>

  <Card title="Channels" icon="globe">
    Translations the channel covers, plus connector-specific source segmentation where applicable.
  </Card>

  <Card title="Data Feeds" icon="rss">
    One feed per resource type, each with assigned channels and an update method.
  </Card>
</CardGroup>

## How data flows from source to project

<Steps>
  <Step title="Source" icon="server">
    Your Shopware store, Shopify shop, CSV file drop, ERP — whatever's authoritative for the data.
  </Step>

  <Step title="Integration" icon="plug">
    The connector's link to that source. Auth, host, channel config — everything that decides *what* to pull and *from where*.
  </Step>

  <Step title="Data Feeds" icon="rss">
    Live records inside Frontic, one feed per resource type. The connector keeps these in sync with the source via the feed's update methods.
  </Step>

  <Step title="Data Syncs" icon="wand-magic-sparkles">
    The mapping layer that decides how feed records become storage records — including which channel powers which project scope, which channel locale fills which project locale, and how the [Value Composer](/data-integration/value-composer) reshapes each field.
  </Step>

  <Step title="Data Storages" icon="database">
    The semantically structured records your blocks, listings, and pages query at runtime.
  </Step>
</Steps>

The integration owns "what comes from the source" — the project's scopes, regions, and locales are independent. The Data Sync's mappings are where the two models meet.

## Connection

Every integration carries one set of credentials to talk to one source system. Connection settings sit at the integration level — host URL, API keys, OAuth tokens, SFTP credentials, whatever the source needs. Frontic stores secrets encrypted and redacts them in logs.

Once connected, the connector pulls **reference data** from the source — typically the list of valid sales channels, currencies, and languages — and uses it to populate dropdowns when you configure channels or feeds.

A **Refresh** action is available wherever reference data is shown, in case you've added a sales channel or locale on the source side and want Frontic to pick it up without recreating the integration.

### IP Pool

Depending on your integration, Frontic will need to connect to your systems for fetching data.

We will use this IP pool for connections:

* `195.201.46.231`
* `78.47.233.107`

## Channels

Every channel carries fields that describe which translations it covers:

* **Channel name** — your label.
* **Available translations** — the locales this channel covers.
* **Fallback translation** — used when a translation is missing on a record.

On top of those, a connector can declare additional **typed system fields** on its channels — name, type, required flag, and a reference to a validated set of possible values pulled from the source. These aren't free-form metadata: the framework enforces them just like the framework-level fields, and the dropdowns are populated from the source.

* **Shopware** adds **Sales Channel** (validated against the live list of Shopware sales channels) and **Currencies** (validated against the sales channel's currencies).
* **commercetools** and **Akeneo** each add **Currencies**, validated against the source's enabled currency set.
* Other integrations may not declare any additional channel fields today — their channels carry only the basic fields, and any source-side segmentation lives at the connection or feed level instead.

The same Frontic project can host as many channels as you have segmentations to pull from.

## Data Feeds

A Data Feed is a sync source for one resource type. The connector declares which feed types it supports — Shopware for example exposes Products, Categories, and CMS Pages; Reviews.io exposes Product Reviews and Company Reviews; the File Importer simply exposes Content. You'll see only the feed types relevant to the connector you picked.

Each feed fetches data from all your channels — a Shopware Products feed, for instance, runs against every channel you've assigned it to, pulling the catalog for each (sales channel × currencies × translations) combination.

### The setup wizard

Adding a feed walks through three steps, with a **Finish** indicator on the progress bar marking the completion state:

<Steps>
  <Step title="Settings" icon="gear">
    Name the feed and pick its resource type from the connector's available types.
  </Step>

  <Step title="Updates" icon="arrows-rotate">
    Configure the update methods this feed uses to stay in sync (see below). Only the methods the connector supports are offered.
  </Step>

  <Step title="Schema" icon="table-list">
    Optionally pre-declare the feed's fields. Leave it empty if you'd rather let the schema fill in automatically as records arrive — every incoming record extends the feed's schema with any new fields it carries.
  </Step>
</Steps>

Each feed has a **Refresh** action that re-runs it against the source — useful when something changed on the source side that didn't reach Frontic, or to recover from a webhook gap. You don't need to refresh after a configuration change like updating the Value Composer, the storage schema, or the sync's channel/locale mappings — those revalidate automatically (see [change detection](#change-detection) below).

## What the connector does for you

A connector isn't a passthrough. Each adapter normalizes its source's quirks before records reach your Data Sync — so what arrives is already in a shape your Value Composer can map cleanly. What that means varies by connector:

<CardGroup cols={2}>
  <Card title="Variant denormalization" icon="boxes-stacked">
    Where the source mixes parent products and their variants in one structure, the connector splits them into separate records linked by `parentId` — so blocks drive grids off products and detail off variants.
  </Card>

  <Card title="Currency-resolved prices" icon="tag">
    When the source carries multi-currency pricing, the connector pre-filters the price array to the channel's currencies and stamps `currencyCode` and `currencyPrecision` on each entry.
  </Card>

  <Card title="Translation merging" icon="language">
    Source-side localized payloads are resolved to the right value per channel translation. Your sync references field names directly — no walking source-specific translation structures.
  </Card>

  <Card title="Reconciliation on refresh" icon="arrow-rotate-left">
    Where a connector supports it, a refresh diffs the previous result against the source's current state and emits deletes for records that disappeared — your storage doesn't accumulate orphans.
  </Card>
</CardGroup>

For exact per-connector behavior — which associations are pre-loaded, where translations fall back, what auto-delete covers — see each connector's "What the data looks like" section.

### Reserved `$`-prefix namespace

When a connector normalizes source data, it sometimes stamps the result onto the feed record under a **reserved `$`-prefix key** so it sits next to your record's own fields without colliding with them. For example:

* **`$rel`** — relation metadata (Shopware uses this to expose a flat list of category IDs as `$rel.categoryIds` so syncs don't have to walk the full association)
* **`$options`** — variant-defining attributes
* **`$properties`** — descriptive attributes that don't drive variant selection

## Update methods

Frontic supports three update methods for keeping feeds in sync. Each connector declares which combinations it supports — some support all three, some only a subset.

<CardGroup cols={3}>
  <Card title="Trigger" icon="bolt">
    The source pushes a webhook to Frontic on every change — near-real-time delivery for time-sensitive catalogs.
  </Card>

  <Card title="Polling" icon="clock-rotate-left">
    Frontic pulls from the source on a schedule. Lower bandwidth than triggers, with a built-in safety net behind them.
  </Card>

  <Card title="Ingest API" icon="upload">
    The source pushes records into Frontic's [Ingest API](/reference/ingest-api). You control timing, batching, and payload shape from your code.
  </Card>
</CardGroup>

A connector can support more than one method, and you pick which ones to enable per feed. If possible, a production setup should combine **trigger + polling** — webhooks for low-latency updates, polling as a backstop for missed events.

## Change detection

When a record arrives at Frontic — through any update method — the connector takes a fingerprint of it and compares against the version already on file. If nothing has materially changed, the write is dropped early: **no storage update, no cache to purge in your frontend, no downstream re-render**. Intake itself still happens (and still counts as an **API Update**), but real updates further down the queue don't get held up by no-op churn.

If you control the source, prefer to push only when something has actually changed — that's always cheapest. If you can't (a nightly file drop with yesterday's content, a webhook fired by an unrelated edit), the fingerprint check keeps the downstream impact minimal.

When you change a configuration like the Value Composer, the storage schema, or the sync's channel/locale mappings, the fingerprint shifts on every affected record — Frontic re-emits them automatically, so the new shape lands downstream without a manual refresh.

## Data Syncs — mapping integration to project

Up to this point, everything is integration-side. The Data Sync is where the integration meets your project.

A Data Sync sits between a feed and a storage and carries two kinds of mappings:

<CardGroup cols={2}>
  <Card title="Channel → Scope" icon="layer-group">
    For every project scope, pick which integration channel powers it. The same channel can power many scopes (one Shopware sales channel feeding both `public` and `b2b` scopes), or different scopes can be powered by different channels (one channel per scope).
  </Card>

  <Card title="Channel locale → Project locale" icon="language">
    For every project locale within a scope, pick which translation from the mapped channel fills it. The same channel translation can map to many project locales (a single `de` translation feeding `de-DE`, `de-AT`, and `de-CH`).
  </Card>
</CardGroup>

Both mappings are constrained: **every project scope and every locale within that scope must be satisfied** before the Data Sync can run. Frontic validates this at save time — you can't end up with a project scope or locale silently missing data.

Where a project locale's mapped channel translation has no value for a record, Frontic falls back to the channel's **fallback translation** before returning `null`. That makes partially-translated catalogues safe to ship: the experience still renders, it just renders the fallback locale's value where translation hasn't caught up.

## Available connectors

<CardGroup cols={3}>
  <Card title="Shopify" href="/connectors/shopify" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/shopify.svg?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=b9b05d30e5747891631d9ceaca57d8a3" width="24" height="24" data-path="images/connectors/shopify.svg">
    <div className="text-sm">Shopify Admin API connector for products, blogs, pages, and metaobjects.</div>
  </Card>

  <Card title="Shopware" href="/connectors/shopware" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/shopware.svg?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=175106539b1abfb9d8b8623a87ea543f" width="24" height="24" data-path="images/connectors/shopware.svg">
    <div className="text-sm">Shopware 6 connector with companion plugin, end-to-end onboarding, and webhook updates.</div>
  </Card>

  <Card title="commercetools" href="/connectors/commercetools" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/commercetools.png?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=832a3799166de1187fb6f9539e8d6f0d" width="128" height="128" data-path="images/connectors/commercetools.png">
    <div className="text-sm">commercetools connector for products and categories via OAuth 2.0.</div>
  </Card>

  <Card title="Akeneo" href="/connectors/akeneo" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/akeneo.png?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=1d12ade1ab15f1717a6a669f09481f1e" width="128" height="128" data-path="images/connectors/akeneo.png">
    <div className="text-sm">Akeneo PIM connector for product attributes, families, and categories.</div>
  </Card>

  <Card title="Contentful" href="/connectors/contentful" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/contentful.svg?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=acfd149900bd815dbfa6b6d29ef29f41" width="24" height="24" data-path="images/connectors/contentful.svg">
    <div className="text-sm">Contentful connector for editorial content with environment selection.</div>
  </Card>

  <Card title="Storyblok" href="/connectors/storyblok" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/storyblok.svg?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=d3185f3df91d66699c8842e54e21a02f" width="24" height="24" data-path="images/connectors/storyblok.svg">
    <div className="text-sm">Storyblok connector for stories with draft / published mode toggle.</div>
  </Card>

  <Card title="Reviews.io" href="/connectors/reviews-io" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/reviews-io.png?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=99255ce59e378cd35a0f97c1793b6d44" width="128" height="128" data-path="images/connectors/reviews-io.png">
    <div className="text-sm">Reviews.io connector for product and company reviews.</div>
  </Card>

  <Card title="n8n" href="/connectors/n8n" icon="https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/n8n.svg?fit=max&auto=format&n=zwqcoY8MRIYLLSYv&q=85&s=6951fbf220ce969c4d6a9fb8a16f3baa" width="24" height="24" data-path="images/connectors/n8n.svg">
    <div className="text-sm">n8n recipe pack for Frontic — push records via the Ingest API from any n8n workflow.</div>
  </Card>

  <Card title="File Importer" href="/connectors/csv-import" icon="file-import">
    <div className="text-sm">SFTP-based CSV connector for nightly exports and partner-supplied feeds.</div>
  </Card>

  <Card title="Custom" href="/connectors/custom" icon="paintbrush-fine">
    <div className="text-sm">For source systems without a first-party connector — push any JSON shape via the Ingest API.</div>
  </Card>
</CardGroup>
