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.
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.
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.
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.
The following table describes important fields used when importing prices into Norce Commerce. Each field is explicitly defined with its entity and usage.
Field | Entity | Description | Usage |
---|---|---|---|
PartNo | SkuPriceList | Required. Identifies the product to update. | |
PriceListCode / Code | SkuPriceList / PriceList | Required. Identifies the price list. | |
IsActive | SkuPriceList | Default is true. If you send in PriceSale, it will forcibly be set to true. | |
PriceCatalog | SkuPriceList | Alternative amount for tracking purposes. | |
PriceRecommended | SkuPriceList | Alternative amount for tracking purposes. | |
PriceSale | SkuPriceList | If provided, sets the price rule to "fixed price" and activates the price. | |
QuantityBreak | SkuPriceList | Minimum quantity required for this price. Multiple prices can exist for the same product and price list if they have different quantity breaks. | |
Name | PriceList | Name of the price list. | |
CurrencyCode | PriceList | Currency of the price list. All prices should match the currency defined on the price list. | |
StartDate | PriceList | Optional start date for the price list. | |
EndDate | PriceList | Optional end date for the price list. | |
IsPublic | PriceList | Determines if the price list is public for the application (auto-applied if true). | |
(Warehouse)Code | Warehouse | At least one warehouse and location must be associated with a price list for availability calculations. | |
(Location)Code | WarehouseLocation | At least one warehouse and location must be associated with a price list for availability calculations. |
Below are examples of importing prices using the ImportSkuPriceList
endpoint. Each example includes a brief context and both header and body JSON.
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
}
]
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
}
]
To set up company or customer-specific price lists, follow these steps:
- Create the price list.
- Update the price list with SkuPriceList items.
- Assign the price list to the customer or company.
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"
}
]
}
]
}
]
Use the same import method as described in the previous section.
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
}
]
}
]
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.
- Listen to price change events in Norce Commerce.
- Use Norce Commerce Query API to fetch updated price information.
References:
The following table describes important fields when exporting prices from Norce Commerce to the ERP.
Field | Entity | Description |
---|---|---|
PartNo | ProductSkuPricelist | Identifies the product. |
PriceListId | ProductSkuPricelist | Identifies the price list (internal Norce ID; lookup code separately). |
QtyBreak | ProductSkuPricelist | Minimum quantity required for this price. Multiple prices can exist for the same product and price list if quantity breaks differ. |
CurrencyId | ProductSkuPricelist | Currency of the price list (internal Norce ID; lookup code separately). |
PriceSale | ProductSkuPricelist | Calculated sale price (fixed or rule-based). |
CostPurchase | ProductSkuPricelist | Cost of the item or service when purchased from supplier. |
PriceStandard | ProductSkuPricelist | Standard price, inherited from parent if available. |
PriceRecommended | ProductSkuPricelist | Recommended price (MSRP), may be inherited. |
ChosenSupplierId | ProductSkuPricelist | Preferred supplier ID for pricing rules. |
ChosenSupplierPartNo | ProductSkuPricelist | Supplier's product identifier. |
ChosenSupplierPriceListId | ProductSkuPricelist | Supplier's price list ID. |
ChosenSupplierQtyBreak | ProductSkuPricelist | Supplier's quantity break (rarely used). |
IsActive | ProductSkuPricelist | Indicates if the price is active. |
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
}
]
}
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:
Entity | On Insert | On Update | On Delete | Filter |
---|---|---|---|---|
tClientProductSkuPriceList | Yes | Yes (see important fields above) | No | Filter 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.
Some fields reference other entities by ID. Use batch lookups to resolve these efficiently.
Use these endpoints to fetch price list metadata:
- ClientPriceLists: Detailed info about each price list.
- ApplicationPricelist: Lists all price lists for the application, including the primary price list.
Field | Entity | Description |
---|---|---|
PriceListId | ClientPriceList | Internal Norce ID for the price list. |
Name | ClientPriceList | Name of the price list. |
Agreement | ClientPriceList | Identifier of the price list (renamed to Code in contracts). |
CurrencyId | ClientPriceList | Currency ID (lookup code separately). |
ParentPriceListId | ClientPriceList | Parent price list ID, if any. |
StartDate | ClientPriceList | Optional start date. |
EndDate | ClientPriceList | Optional end date. |
SalesAreaId | ClientPriceList | Sales area tag for correct price calculation and rounding. |
Use ClientPriceList for all new integrations; PriceList is deprecated.
- 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
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"
}
]
}
]
}
- Using Norce Commerce Event
- Calling Norce Commerce Query
- Norce Commerce Query Postman examples
- Calling Norce Commerce Connect
- Norce Commerce Connect Postman examples