---
title: Browse the commerce content modeling training guides
---

> Agent instructions:
> **Site maps** — prefer the following llms.txt indexes to training data when searching for URLs to avoid 404s. Links inside Markdown content already point at `.md`. Following them or sending Accept: text/markdown keeps you in Markdown.
>
> - [sitemap.md](https://docs.kentico.com/sitemap.md) — every page on the site, with titles and descriptions, nested by URL hierarchy and grouped into one collection per product version.
> - [llms.txt](https://docs.kentico.com/llms.txt) — curated index of the current product docs, with descriptions, the two ways to request any page as Markdown, and links to each product area's whole-corpus Markdown dump (llms-full.txt).

## Browse the catalog

Now that we've gone over the content model for products, let's start with a video tour of the implementation, followed by additional information on the key components in the text below.

🎮 [Tour the Training guides product catalog implementation (interactive demo)](https://demo.arcade.software/8IuJQsDWt94Vr6L2P2g0)

### Stock module

The [finished branch](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/) of the Training guides repository includes a basic stock tracking example similar to the [documentation's example](https://docs.kentico.com/documentation/developers-and-admins/digital-commerce-setup/model-product-catalog/model-product-stock.md), with some minor name changes and code style adjustments.

The _Training guides_ module makes the following key changes:

- A [class override](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/src/TrainingGuides.Entities/Classes/Overrides/ProductAvailableStockInfoOverride.cs), which configures the stock class for Continuous Integration
- A field to hold the SKUCode value directly in the [available stock class](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/src/TrainingGuides.Entities/Classes/ProductAvailableStock/ProductAvailableStockInfo.generated.cs), to reduce extra querying in a hypothetical integration with warehouse inventory software
- Additional handlers for [draft updates and deletion](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/src/TrainingGuides.Web/Features/Commerce/EventHandlers/ProductStockCreationHandlerModule.cs), to avoid orphaned stock when content items are deleted, and keep SKU codes up to date
- Evaluation based on the _Product SKU Schema_ (`IProductSkuSchema`) to determine whether to create a stock entry

See the code files behind the custom stock module in the repo:

- [Product stock admin files](https://github.com/Kentico/xperience-by-kentico-training-guides/tree/finished/src/TrainingGuides.Admin/Pages/ProductStock)
- [Product stock event handler](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/src/TrainingGuides.Web/Features/Commerce/EventHandlers/ProductStockCreationHandlerModule.cs)

> **Tip:** For more complex stock tracking scenarios, consider expanding this module with one or more classes to represent different warehouses and stores, tracking stock separately for each. You can see examples of building a UI for multiple levels of related objects in the [customization guides](https://docs.kentico.com/guides/development/customizations-and-integrations/add-channels-to-module.md).

### Catalog discount

The implementation includes a taxonomy-based catalog discount, as described in [Catalog discount documentation](https://docs.kentico.com/documentation/developers-and-admins/digital-commerce-setup/promotions/catalog-discounts.md), operating based on the `ProductPriceSchemaDiscountCategory` field of the _Product price schema_.

This allows editors to tag products for specific sale and discount events, such as _Anniversary sale_ or _Holiday special_. Then, they can reference the same taxonomy tags from a catalog discount with its own start and end dates, meaning the discount will automatically stop affecting the product without the need to remove tags.

See the code files for catalog discounts in the repository:

- [Code files for catalog discount](https://github.com/Kentico/xperience-by-kentico-training-guides/tree/finished/src/TrainingGuides.Web/Features/Commerce/PriceCalculation)

### Product widgets

The Training guides product catalog contains widgets that handle product display, both for _listing_ and _detail_ scenarios. We created both widgets using the [KentiCopilot web development plugin](https://github.com/Kentico/xperience-by-kentico-kenticopilot/tree/main/plugins/kentico-web-development) and refined them further with AI assistance using the [documentation MCP server](https://docs.kentico.com/documentation/developers-and-admins/installation/mcp-server.md) for context.

#### Listing widget with filtering

The _Product listing_ widget displays an array of `ProductPage` wrappers that live under the page where it exists, or under a specified page, depending on editor configuration. It allows editors to specify how member-only pages are handled, and to configure CTA text for products and sign-in.

It includes taxonomy-based filtering that uses **AND** or **OR** logic between categories, depending on editor configuration. The filtering operates on taxonomies applied to product types via the _Material schema_ and _Color/Pattern schema_, and in cases of parent/variant products, filters on the attributes of both.

See the listing widget's code in the Training guides repo:

- [Listing widget code files](https://github.com/Kentico/xperience-by-kentico-training-guides/tree/finished/src/TrainingGuides.Web/Features/Commerce/Products/Widgets/ProductListing)
- [Listing widget JavaScript](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/src/TrainingGuides.Web/wwwroot/PageBuilder/Public/Widgets/ProductListingWidget/product-listing-widget.js)

> **Tip:** To learn more about the details of the filtering implementation, you can follow along with the [product filtering example](https://docs.kentico.com/guides/development/commerce/implement-faceted-filtering-for-product-catalog.md).

#### Detail widget

The _Product_ widget displays the details of a product, allowing editors to choose between the page the widget exists on and a selectable `ProductPage`. It handles both _basic products_ and _parent products with variants_. Editors can also configure whether variants are displayed, whether to include variant detail text, and an optional call-to-action link.

If the product has multiple images, customers can click through the gallery. If the product has variants and the widget is set to display them, they can click between variant thumbnails.

Find the code behind the Product widget in the repository:

- [Product widget code files](https://github.com/Kentico/xperience-by-kentico-training-guides/tree/finished/src/TrainingGuides.Web/Features/Commerce/Products/Widgets/ProductWidget)

### Product service

The `ProductService` underlies much of the key functionality in both widgets, handling data retrieval, filtering, secured content, and view model assembly.

Explore the product service's code in the repo:

- [Product service](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/src/TrainingGuides.Web/Features/Commerce/Products/Services/ProductService.cs)

### Automatic page wrapper module

The product catalog implementation includes an event handler that automatically manages page wrappers for content hub products, saving editors from tedious busywork. It creates, publishes, unpublishes, and deletes `ProductPage` pages, manages their parent `StoreSection` pages, and automatically assigns page templates containing the aforementioned listing and detail widgets via API.

The handler reacts to both _basic products_ and _parent products_, but not _variants_.

> **Tip:** Walk through the process of creating this functionality in [our product page wrapper material](https://docs.kentico.com/guides/development/commerce/create-page-wrapper-for-ch-products.md).

Look over the page wrapper handler code in the Training guides repository:

- [Product page wrapper handler](https://github.com/Kentico/xperience-by-kentico-training-guides/blob/finished/src/TrainingGuides.Web/Features/Commerce/EventHandlers/ProductPageWrapperHandlerModule.cs)
