Last updated

The Supplier Product Model

Norce Commerce maintains two separate product catalogs: the client catalog (the products you sell) and the supplier catalog (the products your suppliers offer). Understanding how these two catalogs relate — and where they differ — is essential for building a correct supplier integration.

API Reference: Supplier ImportProducts
Schema: SupplierProduct
Related: Supplier Integrations · Supplier Solution Design


Two catalogs, one platform

The supplier catalog and the client catalog coexist independently in Norce. A supplier product does not automatically become a client product — there is a deliberate mapping step between them.

Supplier catalog                    Client catalog
─────────────────                   ──────────────────
SupplierProduct                     Product
  SupplierPartNo (supplier's ID)      ManufacturerCode
  Manufacturer  ───────────────────►  Variant
  ManufacturerPartNo ──────────────►    ManufacturerPartNo  ← the link
  CategoryCode (supplier's)           SKU
  OnHand (supplier stock)               PartNo (your ID)
  PriceList (cost prices)               OnHand (your stock)
                                        PriceList (sale prices)

The link between a supplier product and a client product is the Manufacturer + ManufacturerPartNo pair. When both catalogs contain a record with the same combination, Norce connects them. This is how supplier cost prices flow into product pricing calculations, and how supplier stock becomes visible as estimated availability.

A large portion of a supplier's catalog will often remain unmapped — either intentionally, or because the corresponding client products haven't been created yet. Unmapped supplier products exist in the supplier catalog and are queryable via the Query API, but they do not appear on the storefront.


Key differences between the two models

AspectSupplier productClient product
Primary identifierSupplierPartNo (the supplier's own number)PartNo (your internal number)
Link keyManufacturer + ManufacturerPartNoManufacturerCode + ManufacturerPartNo
StockSupplier on-hand — what the supplier has available to ship to youClient on-hand — what you have in your own warehouses
PricesCost prices (CostPurchase, PriceRecommended) — what the supplier charges youSale prices (PriceSale) and internal costs (CostUnit)
CategoriesSupplier's own category structureYour client category structure
Status/lifecycleActive or inactive via IsActiveFull lifecycle: Coming, Active, Expiring, etc.
Import APIsupplier/ImportProductsproduct/ImportProducts
Header typeSupplierProductHeaderProductHeader

Required fields for a supplier product import

FieldDescription
SupplierIdSet in the header (SupplierProductHeader.SupplierId), not in the product payload. Identifies which supplier this catalog belongs to.
SupplierPartNoThe supplier's own part number. Used as the primary key within the supplier catalog.
ManufacturerManufacturer code. Combined with ManufacturerPartNo, this is what links the supplier product to your client product.
ManufacturerPartNoMust match the ManufacturerPartNo on the corresponding client product variant for the link to be established.
WarehouseCodeRequired for on-hand records. Identifies the supplier warehouse.
LocationCodeRequired for on-hand records. Identifies the location within the warehouse.
PriceListCodeRequired for price records. Identifies the supplier price list.

Manufacturer mapping

Manufacturers in the supplier catalog do not need to map directly to manufacturers in the client catalog. Norce supports a flexible mapping between them, configured in the Supplier Mapping section of the Admin UI.

When a supplier product arrives with a manufacturer that Norce does not recognise on the client side, there are two approaches:

  • Auto-create the manufacturer — the integration (or a Norce setting) automatically creates a corresponding manufacturer in the client catalog. The supplier product is then linked immediately.
  • Leave it unmapped — the supplier product lands in the supplier catalog in an unmapped state. A user can later go to Supplier Mapping in the Admin UI and decide whether to map it, and to which client manufacturer. This is useful when you want human review before new manufacturers enter the client catalog.

If a manufacturer is not mapped, products from that manufacturer will not appear in the client catalog or on the storefront. They are only findable via Query API lookups.

When a supplier changes their manufacturer code over time, existing mappings will not update automatically and may need manual attention. Norce does support many-to-one mapping — multiple supplier manufacturer codes can map to the same client manufacturer — but within that client manufacturer, ManufacturerPartNo must still be unique across all contributing supplier manufacturers.


Category mapping

Supplier categories can be mapped to client catalog categories in the Admin UI, similarly to manufacturer mapping.

This mapping is not required when your integration takes explicit responsibility for creating and categorising client products. If your integration creates client products and assigns them to the correct client categories directly, the supplier category mapping is irrelevant.

Category mapping becomes important when you use Norce's creation rules — a feature that lets Norce automatically create client products from supplier catalog entries based on business rules. Creation rules can be scoped to specific supplier category segments, so the mapping determines which supplier products are eligible for automatic creation and which client category they land in.

If a supplier restructures their category hierarchy over time, category mappings will need to be reviewed and updated manually.


When you import a supplier product with Manufacturer = "ACME" and ManufacturerPartNo = "WIDGET-100", Norce looks for a client product variant with the same pair. If found, the supplier product is linked to that client product variant. If not found, the supplier product exists in the supplier catalog but is not yet connected to any sellable product.

This matching is automatic — but it only works if the values are identical in both catalogs. Differences in casing, spacing, or encoding will prevent the link from forming.

Common causes of failed matching:

  • The supplier uses a different manufacturer code than what is registered in Norce on the client side
  • ManufacturerPartNo has trailing spaces or different encoding in the supplier feed
  • The client product has not yet been imported when the supplier product arrives (import order matters — see Metadata Integrations)
  • Two supplier manufacturers mapping to one client manufacturer have overlapping ManufacturerPartNo values — these must be unique within the client manufacturer

Supplier stock vs. client stock

These are separate and serve different purposes:

  • Supplier on-hand represents what the supplier has available at their warehouse. It is typically updated as part of the regular supplier catalog feed — daily or weekly — and should be interpreted as an approximate indication of availability rather than an exact real-time count. Reliability varies significantly between suppliers.
  • Client on-hand represents what you have in your own warehouses. It is imported separately via ImportOnHands and is typically updated much more frequently — multiple times per day.

Both can be visible on the storefront simultaneously. A product can show estimated supplier availability even when your own warehouse stock is zero, which enables extended assortment scenarios without holding inventory.

In most supplier integration setups, avoid importing supplier stock as client on-hand. If you are using Norce's supplier functionality, the two should remain separate. The exception is when you are not using supplier catalog functionality at all and simply want to reflect an external stock figure as client on-hand — in that case, using client on-hand directly is reasonable.


Supplier prices vs. client prices

Cost prices and sale prices are kept separate and serve different roles:

  • Supplier prices (CostPurchase, PriceRecommended) are the costs your supplier charges you. CostPurchase feeds into Norce's pricing calculations — for example, a cost-plus price rule on a client price list uses it to calculate the sale price automatically.
  • Client prices include sale prices (PriceSale) managed through the client price list import, and CostUnit — an internal cost figure that typically comes from the ERP or finance team rather than the supplier. CostUnit is used for margin calculations and is separate from the supplier's CostPurchase.

This separation means you can update supplier costs frequently without directly touching your sale prices, and let Norce recalculate derived prices based on the new costs.


Verifying a supplier import

The first thing to check after a supplier import is the Connect job status. Every import returns a job ID — monitor it in the Admin UI under Integration Status, or subscribe to the JobCompletedEvent. A completed job with errors will tell you which records failed and why, before you dig into individual products. See Job integration examples for how to poll job status programmatically.

Once the job has completed successfully, use Norce Commerce Query for more granular spot checks:

Check supplier product exists and is active:

/SupplierProductSkus?$filter=SupplierPartNo eq 'SUPPLIER-123'&$select=SupplierPartNo,ManufacturerPartNo,IsActive

Check the link to a client product was established:

/SupplierProductSkus?$filter=ManufacturerPartNo eq 'WIDGET-100'&$select=SupplierPartNo,ManufacturerPartNo,ProductId

A non-null ProductId confirms the supplier product is linked to a client product. A null ProductId means the link was not established — check that Manufacturer + ManufacturerPartNo matches exactly in both catalogs, and that the manufacturer mapping is in place.

Check supplier on-hand:

/SupplierProductSkus('SUPPLIER-123')?$expand=OnHand

Check supplier prices:

/SupplierProductSkus('SUPPLIER-123')?$expand=PriceLists

Further reading