Documentation
Channels6 min readUpdated 28 July 2026

Connectors

Installing a connector, mapping the catalog, running a dry sync, and keeping the mapping alive as channels change underneath you.

On this page

A connector is the adapter between the hub and one external system. It handles authentication, field mapping, scheduling and the channel's own error vocabulary. Installing one is a five-step job, and four of those steps are mapping.

Install and authorise

1
Install the connector into a project

Connectors are installed per project, so two brands can connect to the same marketplace with separate credentials and separate mappings.

2
Authorise

OAuth where the channel supports it, API credentials where it does not. Credentials are stored encrypted and are never exposed back through the API or the interface once saved.

3
Map the catalog

Match your categories to the channel taxonomy and your attributes to its required fields. The connector tells you which fields are mandatory before you sync, not after it rejects them.

4
Choose the sync direction per data type

Defaults are sensible — content and stock out, orders in — and every one of them is editable. See the table in How channels work.

5
Dry run, read the diff, then go live

A dry run produces the full list of creates, updates and rejections without writing anything. Read it. The first one is always instructive.

Mapping in practice

Mapping fails in three predictable ways, and all three are visible in a dry run:

  1. Required attribute missing — the channel wants a material, a hazard class or an age rating that your catalog does not carry. Add it as a product attribute rather than typing it into the listing, or you will type it again for every SKU.
  2. Taxonomy mismatch — your category maps to a channel node that no longer exists. Re-map the node; do not reorganise your own tree to match theirs.
  3. Unit and currency drift — grams against ounces, tax-inclusive against tax-exclusive. Set these per channel once, and verify with a single SKU before mapping the rest.
Worth knowing

Resist per-listing overrides while you are still setting up. Each one is a small permanent exception, and a hundred of them is the middleware layer you were trying to leave behind.

Scheduling and retries

Each connector declares what it can do — push, pull, or receive webhooks — and runs on its own schedule. Failures retry with exponential backoff and land in a dead-letter queue you can inspect and replay per record.

StateMeaningWhat to do
healthyLast run completed, queue drainedNothing
degradedRetrying, queue growingCheck the channel's status page
staleNo successful run in the expected windowRe-authorise; tokens expire quietly
blockedChannel rejected the credentials or the accountFix at the channel, then replay

Building your own

The plugin system is the same surface our own connectors use — there is no privileged internal path. A connector registers itself, declares its capabilities and implements the handlers it needs.

registerPlugin({
  id: 'acme-marketplace',
  capabilities: ['catalog.push', 'inventory.push', 'orders.pull'],
  handlers: {
    'catalog.push': async ({ listings, client }) => client.upsertListings(listings),
    'orders.pull': async ({ since, client }) => client.fetchOrders({ since })
  }
})

See Plugins for the lifecycle, configuration schema and testing approach.

Changing your mind

Disconnecting a channel stops sync and keeps the data. Listings become inactive, orders and their history stay exactly where they are, and the mapping is preserved so reconnecting later is not a fresh start.

Your catalog and order history export in full, in open formats, whenever you ask. That is deliberate: a platform should keep you because leaving is unattractive, not because it is difficult.

Ask about this page withChatGPTClaudePerplexity