The Two-Layer Model
EveryBite uses a two-layer approach to personalization:Menu Key
App-level, staticIdentifies which brand’s menu data your app can access. Stored in your app configuration.
Guest Preferences
User-level, dynamicThe individual guest’s dietary needs. Passed per-request or loaded from their profile.
Preference Types
Dietary Preferences (Diets)
What type of diet does the guest follow?| Diet | Description |
|---|---|
Vegan | No animal products |
Vegetarian | No meat, may include dairy/eggs |
Pescatarian | No meat except fish/seafood |
GlutenFree | No gluten-containing ingredients |
DairyFree | No dairy products |
Allergen Exclusions
What allergens must be avoided?| Allergen | Description |
|---|---|
Dairy | Milk and milk products |
Egg | Eggs and egg products |
Fish | Fish |
Shellfish | Shrimp, crab, lobster, etc. |
Wheat | Wheat and wheat products |
TreeNut | Almonds, walnuts, cashews, etc. |
Peanut | Peanuts and peanut products |
Sesame | Sesame seeds and sesame oil |
Soy | Soybeans and soy products |
Gluten | Gluten proteins |
Nutrient Targets
What nutritional goals does the guest have?Session Tracking
Every API call includes anX-Session-ID header that enables analytics and personalization tracking. Sessions bind important context like restaurant location, chain, platform, and guest identity to every request. See Sessions for details.
How session data is used depends on whether the user is anonymous or authenticated:
- Authenticated User
- Anonymous User
Sessions are directly tied to the known guest via authentication token. Complete history preserved.
Passing Preferences
Option 1: Per-Request (Anonymous Users)
Pass preferences directly with each query. For anonymous users, we track sessions and use behavioral patterns to build an inferred profile over time.Session intelligence: Even without authentication, we compile sessions from the same device/browser to understand preference patterns. A guest who consistently excludes dairy across multiple sessions may see dairy-free options surfaced more prominently.
Option 2: From Profile (Authenticated Users)
When you includeguestId in startSession, preferences are loaded from the guest’s saved profile. All sessions are tied directly to this known user, enabling:
- Persistent preferences across devices
- Complete dining history
- Loyalty program integration
With GuestIQ, preferences are set once and work everywhere. A guest sets “I’m allergic to peanuts” in their profile, and it’s applied at every participating restaurant. All session data is associated with their verified identity.
Option 3: Combined (Profile + Overrides)
Start with saved preferences but add request-specific filters. The authenticated user’s session still tracks these temporary overrides for analytics.How Preferences Affect Results
When you pass preferences, two things happen:1. Filtering
Dishes that don’t meet criteria are filtered out or flagged:2. Match Status Calculation
Every dish gets amatchStatus based on how well it fits the preferences:
| Status | Meaning |
|---|---|
MATCH | Fully compatible with all preferences |
PARTIAL_MATCH | Can be modified to become compatible |
NOT_A_MATCH | Contains excluded allergens or incompatible |
Building a Preferences UI
Use thefilterOptions query to build your preferences UI dynamically:
Example UI Pattern
Based on our SmartMenu implementation:
- Diet toggles - Buttons for Vegan, Vegetarian, etc.
- Allergen checkboxes - Multi-select for allergens to exclude
- Nutrient sliders - Range inputs for calories, protein, etc.
- Active filter chips - Show selected filters with remove buttons

