Skip to main content

Order Pricing

Overview

This document explains how to interpret the pricing and calculation fields provided in order data.

Order Amount Fields

FieldDescription
subtotalAmount of all items in the order prior to tax and/or discounts
taxAmount of taxes charged to the customer and paid to the merchant
tax_withheld_by_dspAmount of taxes charged to the customer and paid to the DSP
restaurant_tipAmount of tip provided to the store
driver_tipAmount of tip provided to the driver
delivery_feeAmount of fees provided to the delivery courier
service_chargeDiner-paid service charge that goes to the merchant (merchant revenue)
dsp_feesDiner-paid fee(s) that are not merchant revenue — collected at fulfillment and remitted to the DSP/platform
amount_paid_by_other_methodsPortion of the order already settled electronically (e.g. credits/card) when the remainder is due in cash
cash_amount_dueAmount to collect from the customer in cash at fulfillment (only on unpaid/cash orders) — see Cash Orders

Currency Format

All pricing values are provided in the lowest denomination of the currency specified for the store.

For example:

  • USD: Values are in cents (e.g., 2500 = $25.00)
  • EUR: Values are in cents (e.g., 2500 = €25.00)

Order Markup Values

The default behavior for item markups is to submit the order into the POS at the price it was ordered on the DSP, inclusive of markup.

To receive order markup total as a distinct line item, please reach out to Partner API support to enable this for your integration.

Markup Line Item Example

If enabled, markup will be provided as a separate line item where the markup total across all items on the order is shown:

{
"line_items": [
{
"name": "Burger",
"quantity": 1,
"price_amount": 1200,
"price_currency": "usd",
"modifiers": []
},
{
"name": "Uber Markup",
"quantity": 1,
"price_amount": 250,
"price_currency": "usd",
"modifiers": []
}
]
}

In this example, the markup total is $2.50.

Order Discounts

When a promotion is configured on the ordering channel, we will attach this information to the order to allow for accurate reporting within the POS. The discounts array will contain details about the discounts applied to the order, but discount amounts are NOT subtracted from item level prices or order subtotal.

Discount information can be provided in two forms: order-level and item-level.

Order-Level Discounts

When you have an order-level discount, the items field will be omitted from the discount record:

{
"discounts": [
{
"provider_id": "discount_id",
"amount": 250
}
]
}

Item-Level Discounts

When you have an item-level discount, the items array will reference the applicable items for the discount:

{
"discounts": [
{
"provider_id": "discount_id",
"amount": 250,
"items": [
{
"provider_id": "variation_id"
}
]
}
]
}

Cash Orders

When an order is paid in cash (unpaid: true), cash_amount_due is the amount the customer hands over at fulfillment. This value comes directly from the ordering platform and is not guaranteed to equal the order subtotal or total:

  • It can be less than the total when the platform funds a promotion that reduces the cash owed without a separate discount line.
  • It can be more than subtotal + delivery when the customer pays platform fees in cash. These are surfaced in dsp_fees — for example an Uber marketplace fee or a Wolt small-order surcharge. They are collected in cash by the merchant on the platform's behalf (and typically recouped by the platform at payout), so they are not merchant revenue and are kept separate from service_charge.

When part of the order was already paid electronically (e.g. platform credits or card) and only the remainder is due in cash, that prepaid portion is provided in amount_paid_by_other_methods.

To reconcile the cash to collect against the order components:

cash_amount_due = subtotal
+ tax
+ delivery_fee
+ service_charge
+ dsp_fees
- discounts
- amount_paid_by_other_methods

Example

An order with a €19.99 item and a €3.00 delivery fee also carries a €1.60 platform fee the customer pays in cash. Only the fee is surfaced in dsp_fees; the cash to collect is €24.59:

{
"subtotal": 1999,
"delivery_fee": 300,
"dsp_fees": 160,
"unpaid": true,
"cash_amount_due": 2459
}

Bundles

A bundle is a set of items sold together (for example, a combo meal). Stream sends bundles to the POS as their individual line items rather than a single bundled item, so an order's pricing and item totals are unaffected by bundling.

To let you identify which items in an order belong to a bundle — for reporting or other purposes — Stream surfaces bundle information on the order payload. This information is optional to consume; existing behavior for non-bundle orders is unchanged.

  • Each line item that belongs to a bundle carries a bundle_id.
  • The order-level bundles array describes each bundle (id, name, quantity, price_amount).
  • A line item's bundle_id references the matching id in the bundles array.
  • When an order contains more than one bundle, each bundle has a distinct id, so items can be attributed to the correct bundle.
  • Items that are not part of a bundle omit bundle_id, and the bundles array is only present when the order contains at least one bundle.

In the example below, the first two items belong to the bundle_1 bundle and the third item is a regular, non-bundle item:

{
"line_items": [
{
"provider_id": "burger_id",
"name": "Burger",
"quantity": 1,
"price_amount": 800,
"price_currency": "usd",
"modifiers": [],
"bundle_id": "bundle_1"
},
{
"provider_id": "fries_id",
"name": "Fries",
"quantity": 1,
"price_amount": 400,
"price_currency": "usd",
"modifiers": [],
"bundle_id": "bundle_1"
},
{
"provider_id": "soda_id",
"name": "Soda",
"quantity": 1,
"price_amount": 200,
"price_currency": "usd",
"modifiers": []
}
],
"bundles": [
{
"id": "bundle_1",
"name": "Combo Meal",
"quantity": 1,
"price_amount": 1099
}
]
}