Frontic treats products as a first-class concept, not as generic CRUD records that happen to have a “price” field. When you create a Data Storage with the Products schema type, the stack gives you a parent/child product + variant model out of the box — with built-in composites for pricing, options, media, and SEO that every commerce experience needs. This page covers how that model is shaped, how variants relate to products, and how to work with it across Data Storages, Detail Blocks, and Search Listings.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.
Products vs. Content
When you create a Data Storage, you pick a schema type:Products
For sellable things. Products can have variants, each variant can
have its own options and price, and the stack knows how to
surface both levels at the API layer.
Content
For everything else — articles, categories, landing pages, editorial
content. Flat records without the product/variant structure.
Product and variant
In Frontic’s model, the variant is the buyable thing — every SKU, every cart line, every price sits at the variant level. The product is a virtual grouping around one or more variants, carrying the attributes they share (name, description, brand). Every product has at least one variant; a product with a single variant (a book, a non-configurable item) is still modeled this way.Variant (buyable)
The actual thing a customer purchases — a red medium t-shirt, a
size 10 sneaker in black. Every variant carries its own
options
(color, size, material), price, and stock. Every buyable item in the
catalog is a variant.options— the list of options that define this variant (e.g.color: red,size: M)price— the variant’s price, typed as the built-in Price compositeparentKey— links this variant to its parent product
key and active fields every storage has.
Sharing fields across variants
When you add custom fields to a Products storage, you decide whether each field lives at the variant level (different per variant) or is shared across variants (same for every variant of the product). A good rule of thumb:| Lives at variant level | Shared across variants |
|---|---|
| Price, stock, SKU, barcode | Product name, description, brand |
| Specific media (variant photos) | Category, tags |
| Variant-specific options (color, size) | SEO title, shared hero image |
| Availability, weight, dimensions | Care instructions, warranty text |
Built-in composites
Frontic ships with composite field types designed for commerce. You use these the same way you use primitives — add them to your storage schema, map source data into them via the Value Composer, and they become first-class parts of your API.Price
Prices with currency information. Automatically filtered by the caller’s
region currency via Request Context.
PriceScale
Price ranges and scaled pricing — quantity discounts, tiered pricing,
before/after sale prices.
Option
Product options (size, color, material) with values and metadata. The
stack uses these to build dynamic facets in listings automatically.
Swatch
Color or material swatches with preview images and metadata — for
variant pickers and product grids.
Media
Images and assets with captions, thumbnails, and variants. Handles the
awkward shape commerce media usually comes in.
SEO
Meta titles, descriptions, keywords — consumed by URLs, Redirects &
SEO.
Availability
Enum for
in_stock, out_of_stock, preorder, backorder. Google
Merchant Center-compatible by default.StockLevel
low, medium, high enum for simplified stock display without
exposing real inventory counts.Product-level vs. variant-level blocks
When you create a Detail Block connected to a commerce storage, you pick which level the block operates on. The key thing to understand: shared fields are stable (one value per product), variant fields rotate (one value per variant). A variant block can read the product name, but a product block can’t pick one variant’s price — it needs a strategy to derive it.- Product-level block
- Variant-level block
Returns one record per product. Has access to shared fields only (name, description, brand, categories). Variant-specific data is not directly available because the block wouldn’t know which variant to choose from.To surface variant data from a product block, use the special field types:
- Price — derive a price from the variants using a strategy (
first,lowest,highest) - Variant field — aggregate a single field across all variants (e.g. all available colors, all EANs for search indexing)
- Variant list — embed the full list of variants, each shaped by a variant-level block
Request context on products
Every product response is shaped by Request Context before it hits your frontend. For a product storage specifically, that means:- Prices are returned in the caller’s currency, based on the resolved region
- Translatable fields (name, description, marketing copy) are returned in the resolved locale
- Scoped fields (e.g. B2B-only descriptions, wholesale-only specs) are returned only if the caller’s scope matches
Translatable / Scoped / Shared in the storage schema, and the stack does the rest.
Mapping from source systems
When you connect a source system via a Connector, its product data shape almost certainly doesn’t match Frontic’s clean parent/variant model. Shopify thinks about products one way, commercetools another, an ERP a third way, and a PIM a fourth. A Data Sync is where those source shapes get mapped into the canonical Frontic structure — splitting flat records into parent + variants, combining variant-level fields, normalizing prices into the Price composite, and so on. The per-field reshaping lives in the Value Composer, where Computed fields chain operations to produce the exact structure each composite type expects. Buddy is good at this step specifically. Point Buddy at a source and describe the target shape, and it’ll propose a Data Sync configuration for you to review and approve.Related
Multi-Channel & Multi-Region
How scopes, regions, currencies, and locales turn one product model into
a multi-market catalog.
URLs, Redirects & SEO
How product pages get their URLs, how URL history is preserved, and how
SEO metadata flows from storage to response.
Detail Blocks
The full Detail Block configuration reference, including variant list
and variant field options.
Storage Field Types
Reference for all built-in composites and primitives.