Skip to content
Last updated

Price Integration in Norce Commerce and ERP Systems

This page explains how price data is integrated between Norce Commerce and ERP systems. It covers both directions: updating prices in Norce from the ERP, and sending prices from Norce to the ERP. Each section is self-contained and provides explicit context for all examples and tables.


Overview

Price data can be managed in either Norce Commerce or the ERP system. Integration ensures that both systems remain synchronized, supporting scenarios such as standard pricing, contract pricing, and campaign pricing.


Updating Prices in Norce Commerce

In some cases, prices are calculated in the ERP and imported into Norce Commerce. This can include standard prices, contract prices for specific customers, or temporary campaign prices.

Import Methods

Norce Commerce Connect provides several endpoints for importing price data:

  • ImportProducts: Updates a single price list along with other product data. Only one price list can be included per import.
  • ImportSkuPriceList: Allows bulk updates of multiple price lists and products. Use this for frequent or large-scale price updates.
  • ImportPriceList: Updates metadata for price lists themselves (not product prices). Use this to create or modify price lists, such as new contract price lists.

Key Fields for Price Import

The following table describes important fields used when importing prices into Norce Commerce. Each field is explicitly defined with its entity and usage.

FieldEntityDescriptionUsage
PartNoSkuPriceListRequired. Identifies the product to update.
PriceListCode / CodeSkuPriceList / PriceListRequired. Identifies the price list.
IsActiveSkuPriceListDefault is true. If you send in PriceSale, it will forcibly be set to true.
PriceCatalogSkuPriceListAlternative amount for tracking purposes.
PriceRecommendedSkuPriceListAlternative amount for tracking purposes.
PriceSaleSkuPriceListIf provided, sets the price rule to "fixed price" and activates the price.
QuantityBreakSkuPriceListMinimum quantity required for this price. Multiple prices can exist for the same product and price list if they have different quantity breaks.
NamePriceListName of the price list.
CurrencyCodePriceListCurrency of the price list. All prices should match the currency defined on the price list.
StartDatePriceListOptional start date for the price list.
EndDatePriceListOptional end date for the price list.
IsPublicPriceListDetermines if the price list is public for the application (auto-applied if true).
(Warehouse)CodeWarehouseAt least one warehouse and location must be associated with a price list for availability calculations.
(Location)CodeWarehouseLocationAt least one warehouse and location must be associated with a price list for availability calculations.

Example: Importing Prices with Norce Commerce Connect

Below are examples of importing prices using the ImportSkuPriceList endpoint. Each example includes a brief context and both header and body JSON.

Example 1: Importing Fixed Prices

This example imports fixed prices for a product, including a quantity break.

Endpoint:
https://connect.lab.storm.io/4.0/api/Product/ImportSkuPriceLists

Header:

{
    "AccountId": 0,
    "FullFile": false,
    "SerializationType": 0,
    "_SkuPriceListFieldsThatAreSet_Explanation": "PriceSale",
    "SkuPriceListFieldsThatAreSet": [3]
}

Body:

[
    {
        "_comment": "import fixed price ",
        "PartNo": "266639",
        "PriceListCode": "pl_campaign_mm",
        "PriceSale": 100,
        "QuantityBreak": 1
    },
    {
        "_comment": "import fixed price, w qty break",
        "PartNo": "266639",
        "PriceListCode": "pl_campaign_mm",
        "PriceSale": 90,
        "QuantityBreak": 10
    }
]

Example 2: Importing Other Price Fields

This example imports recommended prices and costs, with some fields set to null to demonstrate selective updates.

Header:

{
    "AccountId": 0,
    "FullFile": false,
    "_IgnoreSkuPriceListFieldsWhenEmpty_Explanation": "CostPurchase, PriceRecommended",
    "IgnoreSkuPriceListFieldsWhenEmpty": [4, 6],
    "SerializationType": 0,
    "_SkuPriceListFieldsThatAreSet_Explanation": "CostUnit, PriceRecommended, IsActive",
    "SkuPriceListFieldsThatAreSet": [5, 6, 10]
}

Body:

[
    {
        "_comment": "Price recommended and cost will be updated, overwrite values that already exist",
        "CostUnit": 2000,
        "CurrencyCode": "SEK",
        "IsActive": 1,
        "PartNo": "ERPPartNo0000004-1",
        "PriceListCode": "STD",
        "PriceRecommended": 4999,
        "QuantityBreak": 1
    },
    {
         "_comment": "Price recommended will be updated, costs will be ignored since they are null",
        "CostUnit": null,
        "CurrencyCode": "SEK",
        "IsActive": 1,
        "PartNo": "ERPPartNo0000004-2",
        "PriceListCode": "STD",
        "PriceRecommended": 5999,
        "QuantityBreak": 1
    }
]

Company and Customer Price Lists

To set up company or customer-specific price lists, follow these steps:

  1. Create the price list.
  2. Update the price list with SkuPriceList items.
  3. Assign the price list to the customer or company.

Example: Creating and Assigning a Company Price List

Step 1: Create a Price List

Endpoint:
https://connect.lab.storm.io/4.0/api/Product/ImportPriceLists

Header:

{
    "AccountId": 0,
    "FullFile": false,
    "_PriceListFieldsThatAreSet_Explanation": "Name, CurrencyCode, StartDate, EndDate, IsPublic, Warehouses, Description",
    "PriceListFieldsThatAreSet": [0, 1, 2, 3, 4, 7, 9],
    "SerializationType": 0,
    "_WarehouseFieldsThatAreSet_Explanation": "No values, only code is used.",
    "WarehouseFieldsThatAreSet": [],
    "_WarehouseLocationFieldsThatAreSet_Explanation": "No values, only code is used.",
    "WarehouseLocationFieldsThatAreSet": []
}

Body:

[
    {
        "_comment": "Company price list, with fixed price rule Use recommended price Fixed price",
        "Code": "ContractYYY",
        "CurrencyCode": "SEK",
        "Description": "Price list from the ERP System with contract prices for Company XXX",
        "EndDate": "2025-10-01Z",
        "IsPublic": false,
        "Name": "Contract prices for customer XXX",
        "StartDate": "2023-04-01Z",
        "Warehouses": [
            {
                "_comment": "A price list must have association to at least one warehouse.",
                "Code": "STD",
                "Locations": [
                    {
                        "Code": "STD"
                    }
                ]
            }
        ]
    }
]

Step 2: Update SkuPriceLists

Use the same import method as described in the previous section.

Step 3: Assign the Price List to a Company

Endpoint:
https://connect.lab.storm.io/4.0/api/Customer/ImportCompanies

Header:

{
    "AccountId": 0,
    "FullFile": false,
    "_AccountFieldsThatAreSet_Explanation": "n/a",
    "AccountFieldsThatAreSet": [],
    "_CompanyFieldsThatAreSet_Explanation": "Code, PriceLists",
    "CompanyFieldsThatAreSet": [2, 19],
    "_CustomerFieldsThatAreSet_Explanation": "None",
    "CustomerFieldsThatAreSet": []
}

Body:

[
    {
        "Id": null,
        "Code": "XXX",
        "Name": "Company XXX",
        "PriceLists": [
            {
                "Code": "ContractYYY",
                "IsExclusive": false
            }
        ]
    }
]

Updating Prices in the ERP

In many scenarios, Norce Commerce is the source of truth for prices, which are then sent to the ERP. The ERP may also require related information such as cost for business rules.

How Price Updates Are Sent to the ERP

  • Listen to price change events in Norce Commerce.
  • Use Norce Commerce Query API to fetch updated price information.

References:

Key Fields for ERP Price Updates

The following table describes important fields when exporting prices from Norce Commerce to the ERP.

FieldEntityDescription
PartNoProductSkuPricelistIdentifies the product.
PriceListIdProductSkuPricelistIdentifies the price list (internal Norce ID; lookup code separately).
QtyBreakProductSkuPricelistMinimum quantity required for this price. Multiple prices can exist for the same product and price list if quantity breaks differ.
CurrencyIdProductSkuPricelistCurrency of the price list (internal Norce ID; lookup code separately).
PriceSaleProductSkuPricelistCalculated sale price (fixed or rule-based).
CostPurchaseProductSkuPricelistCost of the item or service when purchased from supplier.
PriceStandardProductSkuPricelistStandard price, inherited from parent if available.
PriceRecommendedProductSkuPricelistRecommended price (MSRP), may be inherited.
ChosenSupplierIdProductSkuPricelistPreferred supplier ID for pricing rules.
ChosenSupplierPartNoProductSkuPricelistSupplier's product identifier.
ChosenSupplierPriceListIdProductSkuPricelistSupplier's price list ID.
ChosenSupplierQtyBreakProductSkuPricelistSupplier's quantity break (rarely used).
IsActiveProductSkuPricelistIndicates if the price is active.

Example: Fetching Price Information from Norce Commerce Query

Endpoint:
https://query.lab.storm.io/2.0/Products/ProductSkuPriceLists?$filter=in ('MyPartNo1', 'MyPartNo2') and PriceListId eq 1 and IsActive eq true&$select=PartNo,PriceListId,QtyBreak,CurrencyId,PriceSale,CostPurchase,PriceStandard, PriceRecommended,ChosenSupplierId,ChosenSupplierPartNo,ChosenSupplierPriceListId,ChosenSupplierQtyBreak

Response:

{
    "@odata.context": "...",
    "value": [
        {
            "PartNo": "MyPartNo1",
            "PriceListId": 1,
            "QtyBreak": 1,
            "CurrencyId": 2,
            "PriceSale": 6375.2000,
            "CostPurchase": 5734.3440,
            "PriceStandard": 0.0000,
            "PriceRecommended": null,
            "ChosenSupplierId": 1545,
            "ChosenSupplierPartNo": "MySupplierPartNo1",
            "ChosenSupplierPriceListId": 16810,
            "ChosenSupplierQtyBreak": 1
        },
        {
            "PartNo": "MyPartNo2",
            "PriceListId": 1,
            "QtyBreak": 1,
            "CurrencyId": 2,
            "PriceSale": 583.0645,
            "CostPurchase": 1087.5480,
            "PriceStandard": 0.0000,
            "PriceRecommended": null,
            "ChosenSupplierId": 1545,
            "ChosenSupplierPartNo": "MySupplierPartNo2",
            "ChosenSupplierPriceListId": 16810,
            "ChosenSupplierQtyBreak": 1
        }
    ]
}

Event Settings for Price Updates

To synchronize price changes, configure event listeners in Norce Commerce.

  • SkuPriceChangedNotification: Triggers only when SalePrice changes.
  • SkuPriceListChangedNotification: Triggers for changes to several price fields, including SalePrice and QuantityBreak.

Recommended Configuration Table:

EntityOn InsertOn UpdateOn DeleteFilter
tClientProductSkuPriceListYesYes (see important fields above)NoFilter on relevant price lists for the ERP

Only one event per client and type can be configured. If you need multiple notifications, merge your business logic in the listener.


Additional Metadata and Lookups

Some fields reference other entities by ID. Use batch lookups to resolve these efficiently.

Price List Information

Use these endpoints to fetch price list metadata:

  1. ClientPriceLists: Detailed info about each price list.
  2. ApplicationPricelist: Lists all price lists for the application, including the primary price list.
FieldEntityDescription
PriceListIdClientPriceListInternal Norce ID for the price list.
NameClientPriceListName of the price list.
AgreementClientPriceListIdentifier of the price list (renamed to Code in contracts).
CurrencyIdClientPriceListCurrency ID (lookup code separately).
ParentPriceListIdClientPriceListParent price list ID, if any.
StartDateClientPriceListOptional start date.
EndDateClientPriceListOptional end date.
SalesAreaIdClientPriceListSales area tag for correct price calculation and rounding.

Use ClientPriceList for all new integrations; PriceList is deprecated.

Example: Fetching Price List Information

  • Fetch all price lists:
    https://query.lab.storm.io/2.0/Application/ClientPriceLists?$select=PriceListId,Name,Agreement,CurrencyId,ParentPriceListId,StartDate,EndDate,SalesAreaId
  • Fetch the primary price list:
    https://query.lab.storm.io/2.0/Application/ApplicationPriceLists?$filter=IsPrimary eq true
  • Lookup currency:
    https://query.lab.storm.io/2.0/Core/Currencies
  • Sales area: See Sales Areas

Supplier Information

To retrieve additional supplier information for a price, use the following endpoint:

Endpoint:
https://query.lab.storm.io/2.0/Products/SupplierProductSkus?$filter=PartNo eq 'chosensupplierpartno' and SupplierId eq supplierid&$expand=PriceLists($expand=PriceList($select=Id,DefaultName,Code);$select=SupplierId, SupplierPriceListId,QtyBreak,CurrencyId,CostPurchase,CostPurchaseLastChecked;$filter=SupplierPriceListId eq 16810),OnHands($select=WarehouseId,LocationId,OnHandValue,OnHandLastChecked)&$select=PartNo,SupplierId,Name

Response:

{
    "@odata.context": "..omitted..",
    "value": [
        {
            "PartNo": "chosensupplierpartno",
            "SupplierId": chosensupplierid,
            "Name": "",
            "PriceLists": [
                {
                    "SupplierId": chosensupplierid,
                    "SupplierPriceListId": chosensupplierpricelistid,
                    "QtyBreak": 1,
                    "CurrencyId": 1,
                    "CostPurchase": 580.0000,
                    "CostPurchaseLastChecked": "2017-02-14T09:40:44.96+01:00",
                    "PriceList": {
                        "Id": 16810,
                        "DefaultName": "Premium Supplies Standard Pricelist",
                        "Code": "STD1"
                    }
                }
            ],
            "OnHands": [
                {
                    "WarehouseId": 811,
                    "LocationId": 811,
                    "OnHandValue": 100.000,
                    "OnHandLastChecked": "2017-02-14T09:40:44.96+01:00"
                }
            ]
        }
    ]
}

Further Reading

Further reading