Skip to main content

Third-Party Integrations

EveryBite integrates with your existing restaurant technology stack. Pull nutrition data in, push menu updates out, and sync bidirectionally with loyalty and operations systems.

Integration Architecture

Integration Architecture
EveryBite acts as the central hub for your restaurant data, with three types of integrations:
  • Inbound - Pull data from nutrition systems, recipe databases, and POS platforms into EveryBite
  • Outbound - Push enriched menu data to delivery apps, digital signage, and operations systems
  • Bidirectional - Two-way sync with loyalty platforms for real-time consistency

Integration Types

Inbound (Data Sources)

Pull data into EveryBite from external systems.
IntegrationData TypeUse Case
MenuCalcNutrition analysisGet FDA-compliant nutrition facts
Recipe ManagementIngredients, recipesSync from your recipe database
POS SystemsMenu items, pricesImport existing menu structure

Outbound (Data Destinations)

Push EveryBite data to external systems.
IntegrationData TypeUse Case
CrunchTimeMenu, inventoryOperations management
Delivery PlatformsMenu, availabilityThird-party ordering
Digital SignageMenu, nutritionIn-store displays

Bidirectional

Two-way sync for real-time data consistency.
IntegrationData TypeUse Case
ThanxLoyalty, transactionsRewards program sync
PunchhLoyalty, offersLoyalty management

Managing Integrations

Enable an Integration

mutation EnableIntegration(
  $brandId: ID!
  $integration: IntegrationType!
  $config: IntegrationConfigInput!
) {
  enableIntegration(
    brandId: $brandId
    integration: $integration
    config: $config
  ) {
    id
    status
    lastSyncAt
  }
}

Configuration Example

mutation {
  enableIntegration(
    brandId: "brand_honeygrow"
    integration: MENUCALC
    config: {
      apiKey: "mc_xxx"
      syncFrequency: DAILY
      autoSync: true
    }
  ) {
    id
    status
  }
}

Check Integration Status

query GetIntegrations($brandId: ID!) {
  integrations(brandId: $brandId) {
    integration
    status          # ACTIVE, PAUSED, ERROR
    lastSyncAt
    nextSyncAt
    syncFrequency
    errorMessage
  }
}

Disable an Integration

mutation DisableIntegration($brandId: ID!, $integration: IntegrationType!) {
  disableIntegration(brandId: $brandId, integration: $integration) {
    success
  }
}

Sync Modes

Automatic Sync

Set up scheduled syncs:
mutation ConfigureAutoSync(
  $brandId: ID!
  $integration: IntegrationType!
  $frequency: SyncFrequency!
) {
  configureIntegrationSync(
    brandId: $brandId
    integration: $integration
    config: {
      autoSync: true
      syncFrequency: $frequency  # HOURLY, DAILY, WEEKLY
    }
  ) {
    nextSyncAt
  }
}

Manual Sync

Trigger an immediate sync:
mutation TriggerSync($brandId: ID!, $integration: IntegrationType!) {
  triggerIntegrationSync(brandId: $brandId, integration: $integration) {
    syncId
    status      # PENDING, IN_PROGRESS, COMPLETED, FAILED
    startedAt
  }
}

Sync Status

Monitor sync progress:
query GetSyncStatus($syncId: ID!) {
  syncStatus(syncId: $syncId) {
    status
    progress        # 0-100
    itemsProcessed
    itemsTotal
    errors {
      itemId
      message
    }
    completedAt
  }
}

Data Flow Control

Select What to Sync

Control which data flows to each integration:
mutation ConfigureDataFlow(
  $brandId: ID!
  $integration: IntegrationType!
  $dataTypes: [DataType!]!
) {
  configureIntegrationDataFlow(
    brandId: $brandId
    integration: $integration
    dataTypes: $dataTypes  # MENU_ITEMS, NUTRITION, PRICES, AVAILABILITY
  ) {
    enabledDataTypes
  }
}

Filter by Location

Sync specific restaurants only:
mutation {
  configureIntegrationScope(
    brandId: "brand_xxx"
    integration: CRUNCHTIME
    scope: {
      includeRestaurants: ["rest_1", "rest_2"]
      # OR
      excludeRestaurants: ["rest_3"]
      # OR
      includeChains: ["chain_east"]
    }
  ) {
    scopedRestaurants
  }
}

Webhooks

Receive notifications when sync events occur:
mutation RegisterWebhook(
  $brandId: ID!
  $events: [WebhookEvent!]!
  $url: String!
) {
  registerIntegrationWebhook(
    brandId: $brandId
    events: $events
    url: $url
  ) {
    webhookId
    secret  # Use to verify webhook signatures
  }
}

Webhook Events

EventTriggered When
SYNC_STARTEDA sync begins
SYNC_COMPLETEDSync finishes successfully
SYNC_FAILEDSync encounters an error
DATA_UPDATEDData changed via integration
INTEGRATION_ERRORIntegration has issues

Webhook Payload

{
  "event": "SYNC_COMPLETED",
  "timestamp": "2025-12-17T12:00:00Z",
  "brandId": "brand_xxx",
  "integration": "MENUCALC",
  "data": {
    "syncId": "sync_123",
    "itemsProcessed": 150,
    "duration": 45
  },
  "signature": "sha256=..."
}

Dashboard Management

Integrations can also be managed in the EveryBite Dashboard:
  1. Go to SettingsIntegrations
  2. Click + Add Integration
  3. Select the integration type
  4. Enter credentials and configure options
  5. Enable and test
Integration Dashboard

Troubleshooting

Common Issues

IssueCauseSolution
Sync stuckAPI rate limitWait and retry, or reduce sync frequency
Missing itemsScope filterCheck restaurant/chain scope settings
Stale dataSync disabledRe-enable auto-sync
Auth errorExpired credentialsRotate API keys in config

View Sync Logs

query GetSyncLogs($brandId: ID!, $integration: IntegrationType!) {
  integrationSyncLogs(
    brandId: $brandId
    integration: $integration
    limit: 50
  ) {
    syncId
    status
    startedAt
    completedAt
    itemsProcessed
    errors {
      message
      timestamp
    }
  }
}

Available Integrations