Cost Price Promotion
API reference for creating and managing Cost Price promotions in Omnium OMS. Calculate selling prices dynamically from cost prices with configurable markup.
Cost Price Promotion API Reference
Table of Contents
- Overview
- How It Works
- API Endpoints
- Data Models
- Creating Promotions
- Examples
- Price Calculation Formula
- Best Practices
- Troubleshooting
Overview
Cost Price promotions allow you to dynamically calculate selling prices based on product cost prices from a linked price list, with a configurable markup percentage. This is ideal for cost-plus pricing strategies where the final price is derived from a product's cost rather than a fixed retail price.
Key Features
- Cost-plus pricing: Automatically calculate selling prices from cost prices with a percentage markup
- Price list integration: Link to a price list containing product cost prices
- Tax-inclusive calculation: Tax rate from the price list is applied automatically
- Automatic price generation: Product prices are updated in the catalog, visible on PLPs and PDPs
- Product filtering: Target specific products using category, brand, season, and property filters
Common Use Cases
- Outlet/clearance pricing where products are sold at cost + fixed margin
- Wholesale pricing based on cost with standard markup
- Dynamic pricing that automatically adjusts when cost prices change
- Seasonal markdowns where you want to maintain a minimum margin above cost
Key Differences from Other Promotions
| Feature | Cost Price Promotion | Category/Brand Promotion | Price List Promotion |
|---|---|---|---|
| Price source | Calculated from cost price + markup | Fixed discount on catalog price | Direct price from price list |
| Generates prices | Yes | Yes | Yes |
| Combinable | No (exclusive) | Configurable | Configurable |
| Requires price list | Yes (with cost prices) | No | Yes (with selling prices) |
How It Works
Price Calculation Workflow
- Link a price list containing cost prices for your products
- Set a markup percentage (e.g., 25% margin above cost)
- Configure product filters to target specific products (optional)
- Omnium calculates the selling price using the formula:
CostPrice x (1 + Markup%) x (1 + Tax%) - Prices are generated on matching products and displayed in the catalog
- At checkout, the promotion discount is applied as the difference between the original catalog price and the calculated cost-based price
Example Calculation
Given:
- Cost price: 100 NOK
- Markup: 25%
- Tax rate: 25%
Calculation:
If the original catalog price was 299 NOK, the customer sees:
299 NOK156.25 NOK (47.7% off)
API Endpoints
Base URL
Create Promotion
Request Body: OmniumPromotionRequest
Update Promotion (Patch)
Request Body: OmniumPromotionPatch
Get Promotions
Delete Promotion
Data Models
OmniumPromotionRequest
The main request model for creating a Cost Price promotion.
CostPricePromotion Data
The promotion-specific configuration within promotionData.
Properties
| Property | Type | Required | Description |
|---|---|---|---|
promotionType | string | Yes | Must be "CostPricePromotion". Note: unlike older promotion types that use numeric identifiers (e.g., 2 for MultiBuy), Cost Price promotions use a string-based type identifier |
priceListId | string | Yes | The ID of the price list containing cost prices for products |
markupPercentage | decimal | Yes | Percentage markup to add on top of cost price. E.g., 25 means 25% markup. Minimum value: 0 |
categoryAndBrandFilter | object | No | Filter to target specific products by category, brand, season, or properties. If omitted, applies to all products with cost prices in the linked price list |
reward | object | No | Optional reward configuration (inherited from order line promotion interface) |
OmniumCategoryAndBrandFilter
Defines which products qualify for the promotion.
Filter Properties
| Property | Type | Description |
|---|---|---|
categories | array | Include products in these categories |
requiredCategories | array | Products must be in these categories (AND logic) |
excludedCategories | array | Exclude products in these categories |
brands | array | Include products from these brands (case-insensitive) |
excludedBrands | array | Exclude products from these brands (case-insensitive) |
products | array | Include specific products/SKUs |
excludedProducts | array | Exclude specific products/SKUs |
seasons | array | Include products with these season values (case-insensitive) |
excludedSeasons | array | Exclude products with these season values (case-insensitive) |
properties | array | Include products with these property key-value pairs (case-insensitive, AND logic) |
excludedProperties | array | Exclude products with any of these property key-value pairs (case-insensitive, OR logic) |
Price List Requirements
The linked price list must contain cost prices for the products you want to apply the promotion to. Key fields on the price list:
| Property | Type | Description |
|---|---|---|
currencyCode | string | Currency of the price list (used for the calculated selling price) |
taxRate | decimal | Tax percentage applied in the calculation formula |
isExcludingTax | bool | Whether prices in the list exclude tax |
costCurrencyCode | string | Currency of the cost prices (if different from selling currency) |
costCurrencyExchangeRate | decimal | Exchange rate for currency conversion |
Each PriceListItem must have:
| Property | Type | Description |
|---|---|---|
skuId | string | SKU identifier for the product variant (preferred lookup key) |
productId | string | Product identifier (fallback if no SKU match) |
cost | decimal | Cost price in default currency |
costInPriceListCurrency | decimal | Cost price in the price list currency (used if > 0, otherwise falls back to cost) |
Creating Promotions
Basic Cost Price Promotion
Scenario: Apply cost + 25% markup to all products in the "Outlet" category
Brand-Specific Cost Pricing
Scenario: Apply cost + 15% markup to Nike products only
Zero Markup (Sell at Cost)
Scenario: Sell specific clearance products at cost price (no markup)
Note: Setting markupPercentage to 0 means products are sold at cost price plus tax only.
Examples
Example 1: Multi-Market Cost Pricing
Scenario: Apply cost + 30% markup across Norwegian and Swedish markets
Note: The price list's currencyCode and taxRate are used for the calculation. Ensure your price list has correct values for the target markets.
Example 2: Season-Based Cost Pricing
Scenario: Mark down last season's products to cost + 10%
Example 3: Customer Group Exclusive
Scenario: VIP members get cost + 20% on all products
Example 4: Specific Products Only
Scenario: Apply cost + 5% to specific SKUs
Example 5: Category with Property Filtering
Scenario: Apply cost + 20% to red clothing items, excluding small sizes
Price Calculation Formula
Formula
Where:
Calculation Examples
| Cost Price | Markup % | Tax Rate % | Markup Multiplier | Tax Multiplier | Calculated Price |
|---|---|---|---|---|---|
| 100 | 25 | 25 | 1.25 | 1.25 | 156.25 |
| 200 | 50 | 25 | 1.50 | 1.25 | 375.00 |
| 150 | 0 | 25 | 1.00 | 1.25 | 187.50 |
| 80 | 10 | 12 | 1.10 | 1.12 | 98.56 |
Cost Price Selection
When looking up cost prices from the price list, the system uses this priority:
costInPriceListCurrency- Used if greater than 0 (preferred, avoids currency conversion)cost- Fallback ifcostInPriceListCurrencyis 0 or not set
SKU Lookup Priority
When matching products to cost prices in the price list:
- By SKU ID - Exact match on variant SKU (preferred)
- By Product ID - Fallback if no SKU match found
Discount Calculation
The discount shown to the customer is calculated as:
Note: A discount is only applied if the calculated price is lower than the original catalog price. If the cost-based price would be higher than the existing price, no discount is created.
Rounding: If a rounding policy is configured on the promotion, the final calculated price is rounded accordingly (e.g., to nearest whole number or nearest .90). The discount amount and percentage are recalculated after rounding.
Best Practices
1. Ensure Cost Prices Exist
Before creating the promotion, verify that the linked price list contains cost prices for all target products. Products without matching cost prices in the price list will not be affected by the promotion.
2. Set Appropriate Priorities
Cost Price promotions cannot be combined with other promotions (canBeCombinedWithOtherPromotions is always false). Use priority values to control which promotion takes precedence:
- Cost price promotions for clearance: Priority 0-5
- Standard cost pricing: Priority 10-20
- Use
alwaysApply: trueonly if this promotion should override all others
3. Verify Tax Rate Configuration
The tax rate comes from the linked price list, not the promotion itself. Ensure the price list has the correct taxRate configured for your market.
4. Use Descriptive Names
Internal names should clearly indicate the pricing strategy:
- Good: "CostPlus25_Outlet_NOR"
- Bad: "Promo1"
5. Test Calculations Before Activation
Verify the formula produces expected prices:
- Check a sample of products with known cost prices
- Verify the tax rate is applied correctly
- Ensure the calculated price is lower than the original catalog price
6. Consider Multi-Currency Scenarios
If your price list uses costInPriceListCurrency, ensure values are populated for the correct currency. The system prefers costInPriceListCurrency over cost when available.
7. Monitor Price Updates
After creating or modifying a Cost Price promotion, the system asynchronously updates product prices in the catalog. The totalHits and lastPriceUpdate fields on the promotion track the progress of this update.
8. Set Realistic Date Ranges
Always set activeTo dates to avoid promotions running indefinitely. For seasonal clearance, use precise date ranges.
Troubleshooting
Promotion Not Generating Prices
Check:
- Is the promotion within its
activeFromandactiveTodates? - Is
priceListIdset and pointing to a valid price list? - Does the price list contain cost prices for the target products?
- Do the cost prices have values greater than 0?
- Are
marketsspecified on the promotion? - If using
orderTypes, note that promotions with order types do not generate product prices automatically
Solution: Verify the price list contains PriceListItems with matching skuId or productId values. Check that cost or costInPriceListCurrency is greater than 0.
Calculated Price Higher Than Original
Problem: No discount appears because the cost-based price exceeds the catalog price.
Check:
- Is the markup percentage too high for the product's cost-to-retail ratio?
- Is the tax rate in the price list correct?
- Is the cost price in the correct currency?
Solution: The promotion only applies a discount when the calculated price is lower than the original catalog price. Adjust the markup percentage or verify cost prices.
Discount Not Applied at Checkout
Check:
- Does the order line have
isExcludedFromPromotionsset totrue? - Is another non-combinable promotion already applied to the same product?
- Does the product's SKU match a
skuIdin the price list? - Is the order's market included in the promotion's
marketslist?
Solution: Cost Price promotions cannot be combined with other promotions. If another promotion has already been applied, the Cost Price promotion will not stack. Use alwaysApply: true if this promotion should override combination rules.
Products Not Matching Filters
Check:
- Verify products are in the specified categories
- Ensure brand names match (case-insensitive)
- For property filters, confirm products have the expected property key-value pairs
- Check that products are not excluded by
excludedCategories,excludedBrands,excludedProducts, orexcludedProperties - Verify products have
excludeFromPromotionsset tofalse
Price List Currency Mismatch
Problem: Calculated prices seem incorrect or unexpected.
Check:
- Verify the price list's
currencyCodematches the market currency - If using
costCurrencyCode, check thecostCurrencyExchangeRateis correct - Verify whether
costInPriceListCurrencyorcostis being used (system preferscostInPriceListCurrencywhen > 0)
API Response Models
Success Response (Create)
Error Response
Additional Resources
- Promotion Types Overview: See the Promotions Overview for a summary of all promotion types
- Price Lists: Cost Price promotions require a price list with cost prices. Ensure your price list is configured before creating the promotion
- Category/Brand Filters: The same filter model is used across all order line promotion types. See MultiBuy API Reference for detailed filter documentation
- Date Formats: Use ISO 8601 format (e.g.,
2026-01-01T00:00:00Z)
Support
For questions or issues:
- Check this documentation
- Review the troubleshooting section
- Examine API error messages for validation details
- Contact your Omnium support team
Document Version: 1.0 Last Updated: 2026 API Version: Compatible with Omnium OMS .NET 10.0+
