QSR payments and orders
Build quick-service restaurant checkout and payment flows with menu, modifier, location, and fulfillment context.
Build fast restaurant experiences without separating payment from the order your kitchen and operations teams need. DEUNA keeps item modifiers, service mode, store, schedule, and customer instructions attached to the payment lifecycle.
Menu-aware ordersSend menu IDs, SKUs, quantities, modifiers, taxes, and item totals.Fulfillment contextRepresent pickup or delivery, location details, and scheduled preparation.Payment orchestrationRoute each attempt across configured providers while preserving the same order token.
Complete QSR order payload#
The amounts use minor currency units. This example models a scheduled pickup with two customized items and enough context to reconcile the payment with the restaurant order.
Complete order payload
QSR
Menu, modifiers, service mode, location, schedule, and customer instructions in one restaurant order.
itemsshipping_optionsscheduled_atuser_instructionsRequest bodyJSON
{
"order_type": "DEUNA_CHECKOUT",
"order": {
"order_id": "qsr-2048",
"store_code": "mad-gran-via-01",
"currency": "EUR",
"items_total_amount": 2890,
"sub_total": 2890,
"total_tax_amount": 286,
"total_amount": 3176,
"items": [
{
"id": "meal-smash-01",
"sku": "SMASH-COMBO",
"name": "Smash burger combo",
"description": "Burger, fries, and drink",
"options": "medium; no onions; sparkling water",
"quantity": 1,
"category": "combos",
"taxable": true,
"unit_price": {
"amount": 1890,
"currency": "EUR",
"currency_symbol": "€"
},
"total_amount": {
"amount": 1890,
"original_amount": 1890,
"currency": "EUR",
"currency_symbol": "€",
"total_discount": 0
},
"tax_amount": {
"amount": 172,
"currency": "EUR",
"currency_symbol": "€"
}
},
{
"id": "side-wings-06",
"sku": "WINGS-6",
"name": "Six hot wings",
"options": "chipotle sauce",
"quantity": 1,
"category": "sides",
"taxable": true,
"unit_price": {
"amount": 1000,
"currency": "EUR",
"currency_symbol": "€"
},
"total_amount": {
"amount": 1000,
"original_amount": 1000,
"currency": "EUR",
"currency_symbol": "€",
"total_discount": 0
},
"tax_amount": {
"amount": 114,
"currency": "EUR",
"currency_symbol": "€"
}
}
],
"shipping_options": {
"type": "pickup",
"method": "counter",
"requires_shipping": false,
"details": {
"store_id": "mad-gran-via-01",
"store_name": "Gran Vía",
"address": "Calle Gran Vía 42, Madrid",
"address_coordinates": {
"lat": 40.4201,
"lng": -3.7058
},
"contact": {
"name": "Gran Vía team",
"phone": "+34910000000"
},
"additional_details": {
"pickup_time": "2026-10-03T18:30:00Z",
"stock_location": "Front counter"
}
}
},
"scheduled_at": "2026-10-03T18:30:00Z",
"user_instructions": "Label the order for Alex. Include napkins.",
"payer_info": {
"email": "alex@example.com",
"external_registration_date": "2024-02-10T12:00:00Z"
},
"channel_type": "mobile_app_ios",
"metadata": {
"vertical": "qsr",
"service_mode": "pickup",
"loyalty_member_id": "LOY-88201"
},
"callback_urls": {
"on_success": "https://merchant.example.com/payments/success",
"on_pending": "https://merchant.example.com/payments/pending",
"on_reject": "https://merchant.example.com/payments/rejected",
"on_canceled": "https://merchant.example.com/payments/canceled",
"on_failed": "https://merchant.example.com/payments/failed"
}
}
}Model the business context#
| Requirement | Order fields |
|---|---|
| Menu and modifiers | items[].id, sku, options, quantity, category |
| Pickup or delivery | shipping_options.type, method, details.store_id |
| Timing | scheduled_at, shipping_options.details.additional_details.pickup_time |
| Kitchen or handoff notes | user_instructions |
| Loyalty and service mode | Namespaced keys inside metadata |
Production checklist#
- Keep item, tax, discount, shipping, and total amounts internally consistent.
- Send the store that will prepare or fulfill the order.
- Use an ISO 8601 timestamp and the correct merchant timezone for scheduled orders.
- Confirm the final payment state through verified webhooks before releasing the order to fulfillment.
- Test pickup, delivery, modifier, coupon, decline, retry, and timeout scenarios.
Next, review Process an order payment and the payment workflow and statuses.