Skip to main content
Recommendations for building great personalized menu experiences with EveryBite.

Performance

Prefetch Filter Options

Load filter options when the menu screen initializes, not when the user opens the filter panel:

Use Pagination

Never fetch all dishes at once. Use cursor-based pagination:
Chain context comes from your session via the X-Session-ID header. You don’t need to pass chainId in the query.

Optimize Field Selection

Only request fields you need. GraphQL lets you be specific:

User Experience

Display Match Status Clearly

Use visual hierarchy to communicate match status:

Show Match Reasons

When a dish is an “Almost Match”, explain why:

Persist Preferences

Save user preferences locally for returning users:

Security

Protect API Keys

Never expose API keys in client-side code. Always proxy requests through your backend.

Validate Session IDs

Generate session IDs server-side or use cryptographically secure methods:

Passing IDs Securely

All communication with the SmartMenu API happens over HTTPS, which means every request—including the startSession mutation and X-Session-ID header—is encrypted in transit. No one can intercept or read these values as they travel between your servers and ours. IDs like guestId and passportId are passed once when you call startSession. After that, only the X-Session-ID header is needed on subsequent calls. Follow these best practices for the IDs you send: Use opaque identifiers Use random, meaningless strings rather than sequential numbers that could be guessed:
Never use personal information as IDs Don’t use email addresses, phone numbers, or other personal data as identifiers:
Hash IDs if you prefer not to share them If you’d rather not send your internal customer IDs to EveryBite, you can hash them before sending. Use a consistent salt so you can still correlate analytics data later:
As long as you’re proxying API calls through your backend (as recommended above), these IDs only travel server-to-server and are never exposed to end users.

Common Pitfalls

Always have UI for when no dishes match the user’s preferences. Suggest loosening filters.
Almost Matches are valuable - they show dishes that are close. Don’t hide them completely.
Search results are personalized per user. Don’t cache them across users.
Handle network errors, rate limits, and API errors gracefully with retry logic.