Query products with customer-specific pricing
Fetch products showing the price that applies to the logged-in contact's company, including any pricesheet or orderlist pricing.
Query
When a user is authenticated, the price field automatically resolves to the customer-specific price if one exists. No extra parameters are needed — Propeller applies pricesheets based on the session.
query GetCustomerPrice($productId: Int!, $quantity: Int!, $taxZone: String!) {
product(productId: $productId) {
productId
sku
names { language value }
price(input: { quantity: $quantity, taxZone: $taxZone }) {
net
gross
list
taxCode
type
quantity
}
}
}
Variables
{
"productId": 1895,
"quantity": 1,
"taxZone": "NL"
}
Response — customer-specific price active
When a pricesheet matches the authenticated user's company, type indicates the source:
{
"data": {
"product": {
"productId": 1895,
"sku": "HP-450G10-I5",
"names": [
{ "language": "NL", "value": "HP ProBook 450 G10 i5" }
],
"price": {
"net": 907.50,
"gross": 750.00,
"list": 899.00,
"taxCode": "H",
"type": "PRICESHEET",
"quantity": 1
}
}
}
}
Response — fallback to default price
When no customer-specific price exists, the default catalog price is returned with type: "DEFAULT":
{
"data": {
"product": {
"productId": 1895,
"sku": "HP-450G10-I5",
"names": [
{ "language": "NL", "value": "HP ProBook 450 G10 i5" }
],
"price": {
"net": 1087.79,
"gross": 899.00,
"list": 899.00,
"taxCode": "H",
"type": "DEFAULT",
"quantity": 1
}
}
}
}
How it works
Authentication drives pricing. The same query returns different prices depending on the session. An anonymous request gets the default catalog price, while an authenticated request may get a pricesheet price. The type field tells you the source: DEFAULT = catalog, PRICESHEET = company-specific, BULK_SALES_PRICE = volume tier. Compare gross to list to show a "you save X%" indicator.