Upsell vs Cross-Sell
Upsell
“Make it a large?”Upgrade within the same item—medium to large, regular to premium, add extra protein.
Cross-Sell
“Want fries with that?”Add complementary items—sides, drinks, desserts that pair well with their selection.
Classic Examples
| Type | Trigger | Recommendation | Reason |
|---|---|---|---|
| Upsell | Medium Drink | Large Drink | ”Only $0.50 more for 50% more” |
| Upsell | Regular Bowl | Protein Bowl | ”92% of high-protein guests upgrade” |
| Upsell | Single Burger | Double Burger | ”Most popular with hungry guests” |
| Cross-Sell | Burger | Fries | ”85% of guests add fries” |
| Cross-Sell | Salad | Iced Tea | ”Popular healthy pairing” |
| Cross-Sell | Entree | Dessert | ”Save room for our brownie?” |
Segment-Driven Intelligence: Recommendations are based on co-purchase patterns within the guest’s segments. If 78% of wheat-free guests order fries with their burger, we’ll surface that pairing with high confidence.
Get Pairing Recommendations
Input
| Parameter | Type | Required | Description |
|---|---|---|---|
dishIds | [ID!]! | Yes | The dish(es) to find pairings for. Single dish for add-on flow, multiple for checkout. |
categories | [String!] | No | Filter recommendations by category (e.g., ["sides", "drinks"]) |
segments | [String!] | No | Override guest segments. Use for multi-guest orders. If omitted, uses session context. |
excludeDishIds | [ID!] | No | Dishes already in cart—won’t be recommended |
limit | Int | No | Max recommendations to return (default: 10, max: 10) |
Response
| Field | Type | Description |
|---|---|---|
recommendations | [PairingRecommendation!]! | Up to 10 recommended dishes, sorted by confidence |
basedOnSegments | [String!]! | Which guest segments drove these recommendations |
dishId | ID! | The recommended dish ID |
dishName | String! | Display name |
description | String | Dish description for tooltips/details |
imageUrl | String | Image URL for carousel display |
category | String! | Category (e.g., “sides”, “drinks”, “desserts”) |
priceCents | Int | Price in cents (null if unavailable) |
nutrition | Nutrition | Full nutrition panel—query just { calories } if you only need that |
allergens | [Allergen!]! | Allergens for badge display |
confidence | Float! | 0.0-1.0 weighted blend across guest’s segments |
reason | String! | Human-readable explanation (e.g., “78% of wheat-free guests order this with burgers”) |
Example: Cross-Sell (“Want fries with that?”)
Guest adds a burger to their cart. Show them complementary sides and drinks.Example: Upsell (“Make it a large?”)
Guest selects a medium drink or regular bowl. Suggest the upgrade.Example: Checkout Cross-Sell (“Complete your meal”)
Guest has multiple items in cart. Suggest complementary dishes before they complete the order.Example: Multi-Guest Order
Override segments when ordering for multiple people with different dietary needs.When you pass
segments explicitly, we use those instead of the guest’s session segments. This is useful for group orders where one person is ordering for multiple guests with different preferences.How Recommendations Work
Segment Weighting
When a guest belongs to multiple segments, we use a weighted blend:- Find dishes frequently ordered with the input dish(es) by each segment
- Weight each segment’s contribution based on the guest’s confidence in that segment
- Combine into a single ranked list
- Wheat-free pairings contribute more to the final score
- High-protein pairings still influence recommendations
Confidence Threshold
We only recommend pairings where at least 50% of the segment has ordered that combination. This ensures recommendations are based on meaningful patterns, not noise.| Confidence | Meaning |
|---|---|
| 0.9+ | Very strong pairing—almost everyone in segment orders this |
| 0.7-0.9 | Strong pairing—majority of segment orders this |
| 0.5-0.7 | Moderate pairing—meets threshold, worth suggesting |
Category Filtering
Usecategories to control what types of items appear:
UI Best Practices
Carousel Display
Most UIs display pairings in a horizontal carousel. The response includes everything you need: image, name, price, calories, allergens.
Show the Reason
The
reason field explains why we’re recommending each item. Showing this builds trust: “78% of guests like you order this.”Respect Allergens
Display allergen badges prominently. Even though we filter by segment, some pairings may contain allergens the guest should know about.
Quick Add
Make it easy to add items with one tap. The
dishId and priceCents give you everything needed to add to cart.When to Call This Endpoint
| Scenario | When to Call | Input |
|---|---|---|
| Add-on flow | After guest adds a dish to cart | Single dishId, filter by relevant categories |
| Dish detail page | When viewing dish details | Single dishId, show “Pairs well with…” |
| Checkout | Before payment | All dishIds in cart, exclude those dishes |
| Order confirmation | After order placed | All ordered dishIds, for “Next time, try…” |

