Price List Elements
Additional charges a price list carries on top of its unit amount, how they are calculated, and how they appear in the API, imports, exports and approvals.
Tip
Looking for hands-on instructions? See Adding tariffs and surcharges in the price lists guide for step-by-step directions.
Overview
A price list element is an additional charge attached to a price list: a tariff, a surcharge, a duty, a levy or a handling fee. The product UI calls them additional charges.
Elements let you keep the base unit_amount as the price of the goods and declare the extra charges separately, so
buyers can see what makes up the price they pay, and buyers' approvers can see exactly which charges changed.
Key points:
- Elements are additive. The resolved price a buyer pays is the unit amount plus every element on the price list.
- Elements belong to one price list. They are created with the price list and, like the price list itself, they cannot be edited afterwards. Changing a charge means creating a new price list.
- A price list carries up to 5 elements.
- Elements are accepted on the
standard,volumeandgraduatedbilling schemes, for products, product variants and services. They are rejected onquoteandexternalprice lists, which carry no price of their own. - An element change is a price change. A new price list that only changes its elements still needs the buyer's approval, and it is never auto-approved.
Element Fields
| Field | Required | Values | Notes |
|---|---|---|---|
type | Yes | tariff, surcharge, duty, levy, handling, other | What kind of charge it is. Shown to the buyer as the charge name. |
amount_type | Yes | percentage, fixed | Whether amount is a percentage of the unit price or a fixed amount in the price list currency. |
amount | Yes | Decimal greater than 0 | Percentage points for percentage elements (maximum 100). A currency amount for fixed elements, up to four decimal places. |
apply_per | For fixed | unit, line | What a fixed amount is charged against. Ignored for percentage elements, which are always per unit. |
description | No | Up to 191 characters | A label shown alongside the charge, e.g. EU import tariff. |
sort_order | No | Integer, 0 to 65535 | Display and calculation order. Defaults to 0; ties are broken by creation order. |
Types
The type is a label for the buyer, it does not change the calculation. Use other for a charge none of the named
types describe, and give it a description.
Amount types and apply per
amount_type | apply_per | Charged as |
|---|---|---|
percentage | not used | amount% of the per-unit price, on every unit. |
fixed | unit | amount on every unit ordered. |
fixed | line | amount once per order line, whatever the quantity. |
apply_per is required whenever amount_type is fixed. For percentage elements it may be omitted; the platform
stores and returns it as unit.
How Elements Are Calculated
Elements are applied in the pricing pipeline after promotions and field price modifiers, and before tax and shipping.
The rules:
- All figures are per unit. The per-unit price after tiers, promotions and modifiers is the base every element is applied to.
- Percentage elements never compound. Every percentage element takes its share of the same base price, so two 10% elements add 20%, not 21%.
- Fixed per-unit elements are added as they are.
- Fixed per-line elements are charged once for the order line and spread over the quantity being priced, in the same
way a volume tier's
flat_amountis folded into the unit price. At a quantity of 1 the whole amount lands on that unit. - Tax follows the price list. Elements are added before tax, so tax is calculated on goods plus elements. When the
price list is
tax_behaviour: inclusive, element amounts are treated as tax inclusive too, consistent with the price they are added to. - Currency follows the price list. Fixed amounts are in the price list currency. If the platform falls back to another currency at resolution time, the element amounts are converted together with the price.
Worked example
A standard price list with unit_amount 100.00 CHF and these elements, resolved for a quantity of 4:
| Charge | Amount type | Amount | Applied per | Per unit |
|---|---|---|---|---|
| Tariff | percentage | 12.5 | unit | 12.50 |
| Surcharge | percentage | 2 | unit | 2.00 |
| Handling | fixed | 20.00 | line | 5.00 |
The additional charges total 19.50 CHF per unit, so the resolved unit price is 119.50 CHF and the line comes to 478.00 CHF before tax. Had the quantity been 1, the handling fee would have added the full 20.00 CHF to that single unit.
Creating Elements
Supplier API
Add an elements array to the Create Price List request. The same array is
accepted on each entry of prices when creating a product through the Create Product
endpoint.
curl --location --request POST 'https://api.axiomdata.io/api/suppliers/price-lists' \
--header 'Content-Type: application/json' \
--data-raw '{
"priceable_type": "product",
"priceable_identifier": "testproduct",
"billing_scheme": "standard",
"unit_amount": "100.00",
"public_price": "120.00",
"currency_code": "CHF",
"country_code": "CH",
"tax_behaviour": "exclusive",
"store_id": 1,
"elements": [
{
"type": "tariff",
"amount_type": "percentage",
"amount": 12.5,
"description": "EU import tariff"
},
{
"type": "handling",
"amount_type": "fixed",
"apply_per": "line",
"amount": 20,
"description": "Handling fee"
}
]
}'
Validation:
| Rule | Result when broken |
|---|---|
| At most 5 elements | 422 |
elements on a quote or external price list | 422 |
type or amount_type outside the allowed values | 422 |
amount missing, zero or negative | 422 |
amount over 100 on a percentage element | 422 |
apply_per missing on a fixed element | 422 |
description over 191 characters | 422 |
Price lists are validated as a whole, so a rejected element rejects the price list: no price is created without its charges.
Price list and product CSV imports
Each element is a group of five columns, numbered 1 to 5:
| Column | Required | Description |
|---|---|---|
element_{N}_type | Yes, when the element is filled in | tariff, surcharge, duty, levy, handling or other. Not case sensitive. |
element_{N}_amount_type | Yes, when the element is filled in | percentage or fixed. |
element_{N}_amount | Yes, when the element is filled in | Greater than 0. Percentage points, or an amount in the price currency. |
element_{N}_apply_per | No | unit or line. Defaults to unit for fixed elements. Ignored for percentages. |
element_{N}_description | No | Optional label, up to 191 characters. |
In the prices CSV the columns are named exactly as above. In the products CSV, where price columns carry the
price. prefix, they are price.element_1_type, price.element_1_amount_type and so on.
type,identifier,billing_scheme,tax_behaviour,price,currency,store_id,country,public_price,element_1_type,element_1_amount_type,element_1_amount,element_1_apply_per,element_1_description,element_2_type,element_2_amount_type,element_2_amount,element_2_apply_per,element_2_description
product,testproduct,standard,exclusive,100,CHF,1,CH,120,tariff,percentage,12.5,,EU import tariff,handling,fixed,20,line,Handling fee
Import behaviour:
- An element counts as filled in when any of its
type,amount_typeoramountcells has a value. A half-filled element fails validation for the row rather than being dropped, so a price is never imported without a charge you declared. - A
descriptionorapply_peron its own does not declare an element. - Column numbering does not have to be contiguous. A file with
element_1_*andelement_3_*columns imports both. - The column number sets the display order (
sort_order).
Where Elements Appear
Supplier API responses
Show Price List, List Price Lists and the
product price list endpoints include an elements array on any price list that has them, ordered by sort_order. The
key is omitted from price lists without elements.
"elements": [
{
"type": "tariff",
"amount_type": "percentage",
"apply_per": "unit",
"amount": 12.5,
"description": "EU import tariff",
"sort_order": 0
},
{
"type": "handling",
"amount_type": "fixed",
"apply_per": "line",
"amount": 20,
"description": "Handling fee",
"sort_order": 1
}
]
Resolved prices
Wherever the platform resolves a price for a buyer, the response carries:
| Key | Always present | Meaning |
|---|---|---|
price_elements | Yes | Per-unit total of the additional charges, already included in modified_price and modified_unit_price. 0 when the price list has none. |
price_element_details | With include_price_elements=1 | One entry per element with its type, amount_type, apply_per, amount, description and applied_amount, the per-unit amount it added. |
include_price_elements is accepted as a query parameter by the supplier Price Resolver
endpoint and the buyer product price and
service price endpoints, and as a body field on the buyer bulk price endpoint.
Cart responses always itemise the elements on each cart item and total them per currency under price_elements in the
cart summary.
"resolved_price": {
"currency_code": "CHF",
"base_price": 100,
"modified_price": 119.5,
"price_elements": 19.5,
"price_element_details": [
{
"type": "tariff",
"amount_type": "percentage",
"apply_per": "unit",
"amount": 12.5,
"description": "EU import tariff",
"applied_amount": 12.5
},
{
"type": "surcharge",
"amount_type": "percentage",
"apply_per": "unit",
"amount": 2,
"description": null,
"applied_amount": 2
},
{
"type": "handling",
"amount_type": "fixed",
"apply_per": "line",
"amount": 20,
"description": "Handling fee",
"applied_amount": 5
}
]
}
Supplier and buyer UI
- In the supplier portal, a price with charges shows a N charges pill in the product and service price tables and on the Approvals page. Expanding the row opens an Additional charges table listing each charge, its description, its amount and whether it applies per unit, per order line or to the unit price.
- Buyers see the same pill and breakdown on their Offer Approvals page when reviewing your offers.
Exports
The Offer Approval export on the supplier side, and the
Price Approval and
Price Change Report exports on the buyer side, carry the elements
of each price list in element_1_type, element_1_amount_type, element_1_amount and element_1_apply_per through to
element_5_*. Descriptions are not exported. This is why a price list is capped at five elements: every charge stays
visible to whoever approves the change.
Approval Behaviour
price, price_change and price_change_percentage in approvals and exports describe the unit amount only. They do not
include additional charges.
To stop an element-only change slipping past a price-based rule, auto-approval rules
approve a pending price list only when its elements are identical to those of the currently approved price list for the
same product, store and country (or when neither has any). "Identical" compares each element's type, amount_type,
apply_per and amount; a changed description or order does not count as a change. Any other difference sends the
price list to manual review, whatever the rule says about the unit amount.
Constraints Summary
| Constraint | Value |
|---|---|
| Elements per price list | 5 |
| Billing schemes | standard, volume, graduated |
amount | Greater than 0, at most 999999999999999.9999 |
Percentage amount | At most 100 |
description | 191 characters |
sort_order | 0 to 65535 |
| Editable after creation | No, create a new price list |
Tip
For step-by-step instructions on adding charges through the UI or a CSV import, see Adding tariffs and surcharges.