Commerce & Orders

Product Card

The shop catalog grid for retail/e-commerce apps. Renders products grouped into sections by category, with price, description, tags, and stock-aware badges. Deliberately separate from Menu Item Card, which is restaurant/dish shaped (allergens, spice level, combos) — use Product Card whenever you’re selling physical goods instead of food.

Flow positionShop / catalog step

Tapping a product routes to detailScreenId, read by Product Detail.

Data sourceLive Products API, stock-aware

Falls back to a generic starter catalog on the builder canvas so it never renders empty.

TierFree

Available on all plans.

What it does

Four things worth knowing

Auto-grouped by category

Products are bucketed into sections by category in first-seen order. With a single category, section headers are skipped entirely.

Stock-aware badges

Below lowStockThreshold shows “Only X left”; at zero stock the card dims, disables tapping, and shows “Out of stock”.

Full product detail forwarded on tap

Tapping a card passes title, price, image, tags, stock, variants, and sizes as navigation params to detailScreenId — Product Detail reads all of it from there.

Category filter support

activeCategoryFilter narrows the list to one category, useful when pairing with a separate category selector component.

Note: products are managed from Admin Product Manager, not from this component’s props — items only serves as a builder-canvas placeholder.

Builder setup

Find it, drop it, wire the flow

Where to find itAdd it to your Shop screen

  1. Component picker → Commerce & OrdersProduct Card.
  2. Place it on your home/shop screen, typically below a hero banner.
  3. Set detailScreenId to a screen containing a Product Detail component.

Before you publishThree things to check

  1. Add real products via Admin Product Manager so the catalog isn’t empty.
  2. Navigation wiring: detailScreenId must point at a screen with Product Detail.
  3. Set lowStockThreshold and currency to match your store.
Category: Commerce & OrdersComponent: BuilderProductCardRegistry key: product-cardFlow: Shop → Product Card → Product Detail
Props

Data, navigation, and content

PropTypeDefaultDescription
itemsarray[]Builder-canvas placeholder only — live data comes from the Products API.
currencyCodeselectEURDisplayed currency for product prices.
layouthorizontal / verticalhorizontalImage-left-text or image-top-text card orientation.
lowStockThresholdnumber5Stock count at or below which the “Only X left” nudge appears.
detailScreenIdscreen-selectShared target screen every product navigates to on tap.
activeCategoryFilterstringunsetOptional — restricts the grid to a single category.
showPrice, showDescription, showTags, showImage, showBadge, showStockbooleantruePer-field visibility toggles.
customWidth, customHeightruntime sizingBuilder/runtime dependentControls Review parity and viewport fit.
Toggles & colours

Make it yours

Most visual customisation lives in Builder style props. Keep component defaults in sync with registry defaultProps when updating branding tokens.

PropDefaultWhat it controls
backgroundColor, cardBackgroundColorTheme defaultsOuter container and card surfaces.
titleColor, priceColor, descriptionColorTheme defaultsText hierarchy across each card.
tagBackgroundColor, tagTextColorTheme defaultsTag chip styling.
badgeBackgroundColor, badgeTextColorTheme defaultsPromotional badge (e.g. “New”, “Bestseller”).
stockLowColor, stockOutColor#F59E0B, #EF4444Low-stock and out-of-stock pill colors.
imageSize, imageBorderRadius, cardBorderRadius, spacingComponent defaultsSizing and shape of the grid.
fontFamily, titleFontSize, priceFontSizeComponent defaultsTypography family and scale.
Tips

Common mistakes to avoid

Use Product Card for goods, not food

If you’re building a restaurant/café app, use Menu Item Card instead — it supports allergens, spice level, and combos that Product Card intentionally omits.

Seed products before publishing

An empty catalog shows a “No products yet” state. Use Admin Product Manager’s sample-product seeding to get real, editable content quickly.

Category names drive section headers

Keep category names consistent across products (e.g. always “apparel”, not “Apparel” and “apparel”) so items group into one section instead of two.

One detail screen for every product

detailScreenId is shared across all items — the Product Detail screen reads which product was tapped from navigation params, not from separate per-item screens.