Skip to main content
Data Storages support the following field types.
The composite and enum shapes below are the minimum guaranteed contract every Frontic project ships with. Each can be extended — added fields on a composite, added keys on an enum — from Settings → Data Types. Custom additions appear alongside the built-ins on every record that uses the type, but the built-in fields and keys themselves can’t be removed or renamed. Code written against the shapes below stays safe across every project; code that wants extensions reads them off the response when they’re present. See Data Types for the extension flow.

Field capabilities

Each field on a storage carries a small set of flags that change how its value is stored, returned, and resolved per request. They’re independent — a field can be array + translatable + scoped at the same time — and you set them when adding or editing the field.

isArray

Whether the field stores a list of values rather than a single value. The JSON return type becomes the array form (string[], Price[], and so on). Some composites are always arrays by design — Option and Sorting exist to be lists of attribute/value pairs and can’t be set to single-value mode.
{ "colors": ["Red", "Blue", "Green"] }

isTranslatable

Whether the field has per-locale variants. The same field on the same record can hold different values per project locale; the API returns the value for the caller’s resolved locale, falling back to the project’s default locale when a translation is missing. Use this for any user-visible copy — product names, descriptions, marketing text.
// Same record, different responses depending on the resolved locale
// en-US
{ "name": "Aurora Trail Runner" }
// de-DE
{ "name": "Aurora Trail-Läufer" }

isScoped

Whether the field is segmented by scope. A scoped field can hold a different value per scope (e.g. b2b vs public); the API returns the value for the caller’s resolved scope. Use this for content that legitimately diverges across audiences — wholesale pricing on a B2B scope, audience-specific descriptions, scope-specific imagery. isTranslatable and isScoped compose. A field that’s both gives you one value per (scope, locale) pair.
The following capability applies only to fields on a Products storage.

sharedAcrossVariants

This controls whether the field’s value lives at the product level (one value shared across every variant of the product) or at the variant level (each variant has its own value).
  • Shared examples: name, description, brand, breadcrumbs, hero imagery — they describe the product as a whole.
  • Variant-level examples: price, size, SKU, stock — they describe a specific buyable item.
See Product Models for the deeper trade-off and when to use which level.

isSystem

Read-only flag that marks built-in fields the platform manages directly. Every storage ships with key (the record identifier) and active (the visibility toggle). Products storages add parentKey (the variant → product link), options (the variant’s option array), and price (the variant’s primary price). System fields can’t be removed, renamed, or have their flags changed — they’re part of the contract every storage of that type guarantees. You populate their values via syncs or the admin UI like any other field.

Primitives

Scalar values for simple data.
TypeJSONDescription
StringstringText data.
IntegernumberWhole numbers.
FloatnumberFloating-point numbers.
BooleanbooleanTrue/false values.
DateTimestringISO-8601 date and time.
AnyanyAny valid JSON value.

Composites

Structured data types covering common commerce use cases. Each composite has a fixed inner shape that other configurations (Data Storages, Blocks) can reuse by reference.

Media

Images, video thumbnails, and other assets — with alt text, MIME type, and an optional thumbnail variant.

Option

Product options (color, size, material). Always used as an array — auto-generates dynamic facets grouped by attribute when used as a filter in a Search Listing.

Price

Prices with currency, precision, and optional reference price + tiered scales. The price amount is stored as an integer in the smallest unit at the configured precisionamount: 4999, precision: 2 represents 49.99. Resolved to the caller’s currency via Request Context.

PriceScale

A single tier of a tiered price ladder — used inside Price.scales for quantity discounts.

SEO

Meta titles, descriptions, and keywords. Typically translatable. See URLs & SEO.

Sorting

Parameterized sort positions for category-specific or collection-specific ordering. Always used as an array — when used as a sort option in a listing, the parameter value is matched against the key to determine order.

Swatch

Color or material swatches with a label, optional swatch image, and an optional hex color — for variant pickers and product grids.

Vendor

Vendor/supplier identity — a key, display label, and optional logo.

Weight

Weight value with unit.

Enums

String values with a discrete set of possible keys. You can customize the available keys.

Availability

Availability status for products. Default keys: in-stock, out-of-stock, preorder, backorder. Google Merchant Center-compatible.

StockLevel

Simplified stock display without exposing real inventory counts. Default keys: low, medium, high.

Specials

Mapped Value

A storage field whose value is resolved from another storage at query time, based on a shared key. Configure a target storage, a target field to read, and a source field on the current storage that holds the matching key. Good for brand names, category labels, or any reference data you’d rather not duplicate into every record. See Mapped fields for the full setup flow and constraints.