Catalog Module
Overview
The Catalog module is responsible for managing all product-related master data.
It defines how products are described, classified and enriched before they are used
by pricing, inventory and sales modules.
Catalog is a foundational module and is required for:
- product listings
- search and filtering
- pricing configuration
- inventory management
- SEO and merchandising
All operations are tenant-aware and scoped to the current tenant.
Services
The Catalog module consists of the following services:
- Brands - product brands and manufacturers
- Category - product categories and hierarchies
- Products - core product data
- Product Category - product category relations
- Product Colour - colour variants
- Product Size - size variants
- Product SEO - SEO metadata
- Product Property Value - dynamic product attributes
- Related Product - related and cross-sell products
- Property - attribute and property definitions
- Product System Types - variant dimension definitions (e.g. Colour, Size)
- Product Variants Type - concrete dimension values per product
- Product Variants - purchasable product variants
- Product Variants Attributes - dimension assignments per variant
- Product Images - product and variant images
Models
This module exposes and consumes the following models.
- Brand Model
- Category Model
- Product Model
- Product Colour Model
- Product Size Model
- Product SEO Model
- Product Property Value Model
- Property Model
- Product System Type Model
- Product Variants Type Model
- Product Variant Model
- Product Variant Attribute Model
- Product Image Model
Brand Model
Represents a product brand or manufacturer.
Fields:
Id (type: long)- internal identifierName (type: string?)- brand display nameCode (type: string?)- unique brand code (per tenant)IsActive (type: bool?)- active flag
Validation:
IsReadyToAdd()- requires
NameandCode
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
NameandCode IsActiveis optional
- requires
Category Model
Represents a product category.
Fields:
Id (type: long?)- internal identifierCode (type: string?)- unique category codeName (type: string?)- category nameSlug (type: string?)- SEO-friendly URL slugParentId (type: long)- optional parent categoryIsActive (type: bool?)- active flagProducts (type: List<ProductModel>?)- associated products (only included when explicitly requested)
Validation:
IsReadyToAdd()- requires
NameandCode Slugis optional
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
NameandCode Slugis optional
- requires
Notes:
Slugis used for SEO-friendly URLs- Products are only included when explicitly requested via
showProductsquery parameter - Product list respects entity access permissions when
entityIdis provided
Product Model
Represents a catalog product with pricing, stock, dynamic properties and variant data.
The product entity is the core element of the Catalog module and is used across pricing, inventory and sales domains.
Fields:
Id (type: long)- internal product identifierSKU (type: string?)- product code / SKUTitle (type: string?)- product display nameSummary (type: string?)- short product summaryDescription (type: string?)- full product descriptionBrand (type: BrandModel?)- associated brand object{ Id, Name, Code, IsActive }(replaces flatBrandId)TaxCodeId (type: long?)- tax classification identifierUnitOfMeasureId (type: long?)- unit of measure identifierWeightKg (type: decimal?)- product weight in kilogramsIsActive (type: bool)- active flagCreatedAt (type: DateTime)- creation timestampUnitPrice (type: decimal?)- base unit price (product-level)Stock (type: List<StockModel>?)- product-level stock informationSEO (type: ProductSEO?)- SEO metadataProperties (type: List<ProductPropertyModel>?)- dynamic product propertiesImages (type: List<ProductImageModel>?)- all product and variant imagesProductSystemTypes (type: List<ProductSystemTypeModel>?)- dimension types used by this product's variantsProductVariantsType (type: List<ProductVariantsTypeModel>?)- all dimension values available for this productProductVariants (type: List<ProductVariantDetailModel>?)- variants with nested attributes, images, stock and price
Notes:
- All fields are tenant-scoped
Brandis returned as a full object — no extra API call needed to resolve the brand nameUnitPriceandStockat product level are product-wide defaultsProductVariants[].UnitPriceandProductVariants[].Stockreflect per-variant pricing and stock (mapped viaProductVariantId)- Properties allow extending the product model without schema changes
Imagescontains all images — both product-level and variant-levelProductSystemTypesis derived from the product's variants (no additional query)ProductVariantsis a rich nested model; flat variant data is available via the ProductVariants endpoint
Product Colour Model
Represents a colour variant.
Fields:
Id (type: long)- internal identifierCreatedAt (type: DateTime)- creation timestampDescription (type: string?)- colour description or display nameCode (type: string?)- unique colour codeImageSwatchURL (type: string?)- URL to colour swatch imageIsActive (type: bool?)- active flag (default: true)
Validation:
IsReadyToAdd()- requires
Code,Description,ImageSwatchURL
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
Code,Description,ImageSwatchURL
- requires
Product Size Model
Represents a size variant that can be assigned to products.
Fields:
Id (type: long)- internal identifierCreatedAt (type: DateTime)- creation timestampDescription (type: string?)- size descriptionCode (type: string?)- unique size codeIsActive (type: bool?)- active flag
Validation:
IsReadyToAdd()- requires
CodeandDescription
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
CodeandDescription
- requires
Product SEO Model
Represents SEO metadata associated with a product.
Fields:
ProductId (type: long)- associated product identifierMetaTitle (type: string?)- SEO meta titleMetaDescription (type: string?)- SEO meta descriptionSlug (type: string)- URL-friendly product slugCanonicalUrl (type: string?)- canonical URL
Validation:
IsValid()- requires
ProductId - requires
MetaTitle - requires
MetaDescription - requires
Slug - requires
CanonicalUrl
- requires
Notes:
- Slug is normalized (lowercase, spaces replaced)
- Slug must be unique per product
Product Property Value Model
Represents a value assigned to a dynamic product property.
Fields:
ProductId (type: long)- associated product identifierPropertyId (type: long)- associated property identifierValue (type: string?)- property value
Validation:
IsEmpty()- returns true if
ProductId == 0orPropertyId == 0
- returns true if
Notes:
(ProductId, PropertyId)must be unique
Property Model
Represents a definable product attribute.
Fields:
Id (type: long)- internal identifierName (type: string)- property display nameCode (type: string)- unique property codeDataType (type: string)- expected value type (e.g. string, number, boolean)
Validation:
IsReadyToAdd()- requires
NameandCode
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
Name,Code,DataType
- requires
Notes:
- Properties are reusable
- DataType controls value interpretation
Product System Type Model
Represents a classification type used to describe product variants (e.g. a dimension such as Colour or Size).
Fields:
Id (type: int)- internal identifierName (type: string?)- display name (e.g.Colour)Code (type: string?)- unique code (e.g.colour)Display Type (type: string?)- UI rendering hint (e.g.swatch,dropdown,text)Is Active (type: bool)- active flagSort Order (type: int)- display orderCreated At (type: DateTime)- creation timestamp
Validation:
IsReadyToAdd()- requires
Name,Code,Display Type
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
Name,Code,Display Type
- requires
Product Variants Type Model
Represents an available attribute value for a product's variants (e.g. a selectable option within a given type, such as Midnight Blue for Colour).
Fields:
Id (type: long)- internal identifierProduct Id (type: long)- parent product identifierSystem Type Id (type: int)- associated system type identifierSystem Type Name (type: string?)- resolved system type name (read-only)Value (type: string?)- raw value (e.g.#191970)Display Value (type: string?)- human-readable label (e.g.Midnight Blue)Sort Order (type: int)- display order within the dimensionCreated At (type: DateTime)- creation timestamp
Validation:
IsReadyToAdd()- requires
Product Id > 0,System Type Id > 0,Value
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
Product Id > 0,System Type Id > 0,Value
- requires
Notes:
System Type Nameis populated from the navigation property and is not writable
Product Variant Model
Represents a purchasable variation of a product (e.g. a specific attribute combination such as Blue + Small), flat and 1:1 with the database table.
Fields:
Id (type: long)- internal identifierProduct Id (type: long)- parent product identifierSKU (type: string?)- unique stock-keeping unit codeTitle (type: string?)- variant display nameWeight Grams (type: int?)- variant weight in gramsIs Active (type: bool)- active flagSort Order (type: int)- display orderCreated At (type: DateTime)- creation timestamp
Validation:
IsReadyToAdd()- requires
Product Id > 0,SKU,Title
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
Product Id > 0,SKU,Title
- requires
Notes:
- This flat model is used by the ProductVariants endpoints
- The full nested model (with attributes and images) is
ProductVariantDetailModel, embedded inProduct Model
Product Variant Attribute Model
Represents an attribute assignment on a product variant (e.g. a dimension value link such as Colour → Midnight Blue).
Fields:
Id (type: long)- internal identifierProduct Variant Id (type: long)- the variant this attribute belongs toProduct System Type Id (type: int)- the dimension (e.g. Colour)Product Variants Type Id (type: long)- the specific value (e.g. Midnight Blue)
Validation:
IsReadyToAdd()- requires
Product Variant Id > 0,Product System Type Id > 0,Product Variants Type Id > 0
- requires
IsReadyToUpdate()- requires
Id > 0 - requires all three foreign keys
- requires
Product Image Model
Represents a visual asset linked to a product or one of its variants (e.g. a gallery photo or a variant-specific image).
Fields:
Id (type: long)- internal identifierProduct Id (type: long)- parent product identifierVariant Id (type: long?)- variant identifier;nullmeans product-level imageURL (type: string?)- publicly accessible image URLAlt Text (type: string?)- accessibility descriptionIs Primary (type: bool)- primary image flagSort Order (type: int)- display order
Validation:
IsReadyToAdd()- requires
Product Id > 0andURL
- requires
IsReadyToUpdate()- requires
Id > 0 - requires
Product Id > 0andURL
- requires
Notes:
- Images with
Variant Id = nullare product-level images - Images with a
Variant Idare variant-specific - The Products service returns all images in the top-level
Imagesarray and additionally nests variant images inside each variant