Tiered and volume pricing
Propeller supports bulk pricing — discounted prices that apply when a customer orders larger quantities. This page covers how to query and display tiered pricing.
How bulk pricing works
Bulk prices are quantity-based price tiers configured on a product. When a customer adds a product to the cart with a quantity that falls within a bulk price tier, the lower price is automatically applied.
For example, a product might have:
| Quantity | Price (excl. tax) |
|---|---|
| 1–9 | €10.00 |
| 10–49 | €8.50 |
| 50+ | €7.00 |
Propeller calculates the correct price based on the cart quantity. You don't need to apply the tier logic in your frontend.
Orders outside configured volume tiers fall back to the list price.
Discount calculation types
The priceData.bulkPriceDiscountType indicates how bulk discounts are calculated:
| Type | Description | Example |
|---|---|---|
COST_PRICE_PLUS | Cost price plus a percentage margin | Cost €40 + 25% margin = €50 |
LIST_PRICE_MIN | List price minus a percentage | List €100 − 20% = €80 |
NET_PRICE | Fixed amount (direct price per unit) | Price = €75 |
Querying bulk prices
Use the bulkPrices field on a product to retrieve the available price tiers:
query GetBulkPrices($productId: Int, $taxZone: String) {
product(productId: $productId) {
price(input: { taxZone: $taxZone }) {
gross
net
type
}
priceData {
list
bulkPriceDiscountType
}
bulkPrices(input: { taxZone: $taxZone }) {
gross
net
discount {
quantityFrom
validFrom
validTo
}
}
}
}
Response:
{
"data": {
"product": {
"price": { "gross": 24.25, "net": 29.34, "type": "DEFAULT" },
"priceData": { "list": 24.25, "bulkPriceDiscountType": "NET_PRICE" },
"bulkPrices": [
{
"gross": 23.43, "net": 28.35,
"discount": { "quantityFrom": 8, "validFrom": null, "validTo": null }
},
{
"gross": 22.35, "net": 27.04,
"discount": { "quantityFrom": 12, "validFrom": null, "validTo": null }
},
{
"gross": 21.95, "net": 26.56,
"discount": { "quantityFrom": 16, "validFrom": null, "validTo": null }
},
{
"gross": 20.34, "net": 24.61,
"discount": { "quantityFrom": 20, "validFrom": null, "validTo": null }
}
]
}
}
}
Bulk price fields
| Field | Description |
|---|---|
gross | Tier price excluding tax |
net | Tier price including tax |
discount.quantityFrom | Minimum quantity for this tier to apply |
discount.validFrom / discount.validTo | Date range when this tier is valid (null means no restriction) |
The price.type field returns BULK_SALES_PRICE or BULK_COST_PRICE when a bulk tier is active.
Volume-based cost prices
Separately from bulk sales pricing, Propeller supports cost prices that vary by quantity. These are configured on the product's priceData.costPrices field:
priceData {
costPrices {
quantityFrom
value
}
}
Each cost price has a quantityFrom threshold and a value per unit. Volume-based cost prices are used for margin calculations when the discount type is COST_PRICE_PLUS.
Bulk pricing in the cart
When items are added to the cart, Propeller automatically applies the correct bulk price tier based on the total quantity. The cart response reflects the tiered price:
query {
cart(id: "018dcc9a-f965-7434-8fad-369aa9a8c276") {
items {
productId
quantity
price
priceNet
totalPrice
totalPriceNet
}
}
}
Next steps
- Understanding pricing layers — price types, tax zones and surcharges
- Customer-specific pricing — price sheets, action codes and overrides
- Querying products — include pricing in product listing queries