Skip to main content

Overview

Channels segment a single Store into distinct selling surfaces. A channel represents where an order originates from — the online storefront, an in-person point-of-sale till, a marketplace integration (Amazon, eBay), a B2B wholesale portal, a mobile app — and which subset of the store’s products is available there. Every store ships with one default channel named Online Store. You can add more from Settings → Sales channels in the admin dashboard.

Channel Attributes

code is normalized to a URL-safe slug on save — POS becomes pos, Point of Sale! becomes point-of-sale. Leaving code blank derives it from name.

How Channels Work

Resolution at request time

Every incoming Store API or storefront request resolves to a channel:
  1. If the X-Spree-Channel header is present, the value is matched against channels.code — or channels.id when the value looks like a prefixed ID (ch_…) — scoped to the current store.
  2. Otherwise, the store’s default channel is used.
The resolved channel is then available to controllers, models, and serializers throughout the request.

Selecting a channel from the Store SDK

The Store SDK sends X-Spree-Channel on every request when configured. The value can be either the channel code (merchant-meaningful, recommended) or the prefixed ID (ch_…). setChannel is a sticky setter that mirrors setLocale / setCurrency / setCountry.
The Admin API does not consume X-Spree-Channel — admin endpoints return data across all channels for the current store. Filter by channel on the admin side via Ransack (q[channel_id_eq]=ch_xxx for orders, q[channels_id_in][]=ch_xxx for products).

Product visibility

A product is visible on a channel only when it has a publication record joining the two. Each publication carries an optional window: Product status (draft / active / archived) is the outer gate: a Draft or Archived product is hidden on every channel regardless of its publication window. The dashboard’s Publishing card renders this as a “Not available” badge on every channel row when status isn’t active.

Order attribution

Every order is attributed to one channel. The channel is set from the X-Spree-Channel header on cart creation, from the merchant’s selection on the “New order” form, or defaults to the store’s primary channel. This attribution drives reporting (best-selling by channel, revenue per channel) and per-channel order routing — see Order Routing.

Publishing Products on Channels

Dashboard

The product edit page has a Publishing card with one row per channel the product is on. Click Manage to attach or detach channels via checkboxes. Each row expands into a per-channel schedule editor. Bulk operations from the product list: Add to sales channels… and Remove from sales channels….

Admin API

Three endpoints cover the publishing surface:
channels.addProducts is idempotent: re-publishing an already-published product is a no-op for its window unless published_at / unpublished_at are explicitly passed. Cross-store onboarding is allowed when the caller’s key has update permission on the product. For per-product updates, use PATCH /api/v3/admin/products/:id with a product_publications array:
The write contract is full-set: the array represents the complete desired state. Channels absent from the payload are detached.

Auto-Publish Behavior

  • Dashboard — new products are auto-published on the store’s default channel. The merchant can untick channels via the Publishing card post-create.
  • Admin API — new products are not auto-published. The caller supplies product_publications: [{ channel_id }] on create, or calls POST /admin/channels/:id/add_products afterwards.
  • Sample data (bin/rake spree:load_sample_data) — all loaded products are explicitly published on the default channel.
  • Stores — Channels belong to a store
  • Markets — Different from channels: markets segment geography/currency, channels segment selling surfaces
  • Products — Product catalog and publication
  • Order Routing — Channels can override the store’s routing strategy
  • Store SDK: Products — Channel-scoped product listing and filtering
  • Admin SDK: Resources — How adminClient.channels.addProducts and other resource methods are structured