Skip to content

Deliveroo Integration

Overview

The Deliveroo integration connects an Upvendo location to a Deliveroo restaurant so that your menu is pushed out to Deliveroo and incoming Deliveroo orders are received automatically into Upvendo.

Key Purpose: Push your menu to Deliveroo and receive Deliveroo orders inside Upvendo.

Purpose

This page lets you connect a single Upvendo location to a Deliveroo site (restaurant). Once connected you can push selected Upvendo menus to Deliveroo, sync item availability, and receive Deliveroo orders automatically via webhooks. Payments are handled entirely by Deliveroo.

Key Concepts

  • Site ID and Brand ID: Deliveroo identifies your restaurant by a site ID (the location, entered by the merchant) and a brand ID (fetched automatically from the Deliveroo Site API after the site ID is entered). A market code (e.g. uk, fr, be) is also resolved automatically from the brand list. All three are stored on the integration record and used to build Deliveroo API URLs and to match incoming webhooks.
  • Location-Scoped: The integration is scoped to one Upvendo location. Each location has its own Deliveroo site ID and is configured independently.
  • Webhook-Driven Orders: Deliveroo sends order webhooks to Upvendo. They are acknowledged immediately and processed on a queue, matched to a location by both site ID and brand ID, and turned into a transaction. Whether Upvendo accepts the order itself depends on the site type (see Tabletless vs tablet sites).
  • Tabletless vs tablet sites: Deliveroo marks each order with an is_tabletless flag. On a tabletless site there is no Deliveroo tablet, so Upvendo creates the order and then auto-accepts it. On a tablet site the restaurant accepts on the Deliveroo tablet, and Upvendo only ingests the order once it reaches accepted.
  • Menu Sync (manual, push-out): The menu sync transforms selected Upvendo menus into Deliveroo's format (categories, items, modifiers, mealtimes with schedules) and pushes them to Deliveroo's Menu API. Sync is triggered manually from the integration page.
  • Item Availability Sync: A separate "Sync Availability" action pushes which items are unavailable or hidden to Deliveroo's item-unavailabilities API, without re-uploading the whole menu. Individual item and stock changes are pushed automatically, without this action.
  • Sandbox vs Production: The integration talks to either sandbox (api-sandbox.developers.deliveroo.com) or production (api.developers.deliveroo.com) endpoints. Which one is used is decided by the deployment, not by the merchant.
  • Sync Status: Each integration record tracks a sync status. The status enum has three values: standby, syncing, and error, each with a timestamp and message.

Actions

Connect Deliveroo Integration

Enter your Deliveroo Site ID, then connect. The system validates credentials by fetching an OAuth access token, fetches the brand ID and market automatically from the Deliveroo API, and stores the integration record. If any step fails the record is rolled back (deleted).

On production this action is gated by a platform flag: while it is off, connecting fails with "Deliveroo connections are currently disabled" and the Upvendo team has to enable it.

Sync Menu to Deliveroo

Select one or more Upvendo menus and push them to Deliveroo. The sync sends items, categories, modifiers, prices, allergens, dietary tags, alcohol flags, tax rates, and availability schedules. This is a manual action and replaces the menu on Deliveroo.

Sync Item Availability

Push the current availability of items (unavailable / hidden) to Deliveroo without re-uploading the full menu. Useful when items go out of stock or are hidden.

Update Integration Settings

Change the site ID. Credentials are re-validated; if the site ID changed, the brand ID and market are re-fetched. On failure the previous credentials are restored and the sync status is set to error.

Set Deliveroo Site Status

On the Status tab, the Remote site status control switches the Deliveroo site between Open, Ready to open and Closed. Choosing Closed asks for confirmation first ("Close this Deliveroo site? It will stop receiving new orders."). Requires the manage-integration-settings permission.

View Activity Log and Recent Orders

The Status tab shows the integration's activity log (searchable, filterable by status and by date range, with a Refresh button) and a Recent Deliveroo Orders table listing order number, fulfillment type, order status, total and received time. Viewing them requires no extra permission.

Disconnect Deliveroo Integration

Open the Settings tab and click Disconnect, then type Deliveroo in the confirmation dialog to enable its Disconnect button. Requires the manage-integration-settings permission. Disconnecting removes the Deliveroo integration record for the location -- the stored site ID, selected menus, sync status and logs stop being returned, and reconnecting starts a fresh record. Underneath it calls DELETE /back-office/deliveroo/{locationId}; on success you are returned to the Transactions page.

Location

  • Backoffice Route: /deliveroo (Deliveroo integration page)
  • Page layout: before the location is connected the page is a single connect card (Site ID + Connect). Once connected it splits into two tabs:
    • Status -- the sync-status banner, a connection card (site ID, last sync), sync stats with a Sync Now shortcut (which jumps to the Settings tab, where the sync buttons live), the Remote site status control, and the activity log with recent Deliveroo orders.
    • Settings -- the site ID field and Save Settings, menu selection with Sync Menu / Sync Availability, the sandbox-only Force Reject switch, and Disconnect.
  • Backend Controller: app/Http/Controllers/Api/BackOffice/DeliverooIntegrationController.php
  • Backend Service: app/Services/BackOffice/DeliverooService.php
  • Vue Component: src/views/deliveroo/index.vue

Fields

The connect form has one input that matters. There is no separate "enabled" toggle (connecting creates the record), no API key field (OAuth credentials are platform-level), and no auto-accept or prep-buffer toggles. The only per-feature toggle is Force Reject, which appears on the Settings tab for sandbox integrations only -- it exists for Deliveroo's sandbox certification and rejects incoming tabletless orders instead of accepting them. It is never shown on a production integration.

Site ID

PropertyValue
Field IDsite_id
LabelSite ID
TypeText
RequiredYes

Description: Your Deliveroo restaurant location ID, from the Deliveroo Restaurant Hub. The brand ID and market are fetched automatically from it.


Sandbox mode is deployment-owned

The environment is fixed by the deployment, not by the merchant. Connecting forces sandbox on every non-production deploy and production on the production deploy, whatever the request carries. Updating an integration accepts is_sandbox in its validator but never applies it, so an existing integration keeps the environment it was created with. Moving an integration between environments is a reconnection, not a toggle.

There is no Sandbox Mode switch in the back office. The connect form shows a static sandbox notice, and the Settings tab shows the same notice when the integration is a sandbox one; the page does not send is_sandbox at all.


PropertyValue
Field IDmenu_ids
LabelSelect Menus
TypeMulti-select (Upvendo menu IDs)
RequiredYes (for Sync Menu)

Description: The Upvendo menus to push to Deliveroo when you click Sync Menu. Multiple menus can be selected and are combined into one payload.


Business Logic

Order Flow

Customer orders on Deliveroo
        |
        v
order.new webhook received (acknowledged immediately, processed on a queue)
        |
        +-- tabletless site --> transaction created in Upvendo,
        |                       then the order is auto-accepted
        |
        +-- tablet site --> restaurant accepts on the Deliveroo tablet
                                    |
                                    v
                        status webhook with status_log "accepted"
                        --> transaction created in Upvendo,
                            sync_status: succeeded sent to Deliveroo
        |
        v
Sent to KDS + payment capture job
        |
        v
in_kitchen / ready status webhooks move the order to In Progress, then Ready
        |
        v
Rider picks up -- collected/delivered marks the order Complete
Select menus in Upvendo
        |
        v
Click Sync Menu (manual)
        |
        v
Convert to Deliveroo format (categories, items, modifiers, mealtimes)
        |
        v
PUT to Deliveroo Menu API
        |
        v
Deliveroo menu updated

Business Rules

  • Connecting a Deliveroo integration for a location that already has one throws an error ("Deliveroo integration already enabled for this location"), preventing duplicates.
  • Credentials are validated immediately on connect and on update by requesting an OAuth access token (client credentials grant) from Deliveroo's auth endpoint. On connect, if any setup step fails the integration record is deleted; on update, the previous credentials are restored and the sync status is set to error ("Invalid Deliveroo credentials").
  • Connecting (and updating, when the site ID changes) also dispatches SyncLocationToDeliverooJob, which pushes the location's opening hours to Deliveroo.
  • New orders (order.new) are auto-accepted only on tabletless sites, and only after the transaction, its items, the KDS entries and the payment-capture job are in place. On tablet sites Upvendo takes no action until the order reaches accepted. There is no merchant-facing auto-accept toggle. A force_reject setting rejects instead of accepting, but only for tabletless orders on a sandbox integration -- it exists for Deliveroo's sandbox certification. Scheduled tabletless orders (with a confirm_at) are confirmed immediately if that time has passed, otherwise a job confirms them at that time.
  • Menu sync converts prices to the smallest currency unit (cents) and uses the merchant's default language mapped to a Deliveroo-supported language code (en, fr, it, ar, zh, nl; anything else defaults to en).
  • Menu availability schedules are only included when the menu's availability type is "Specific Day/Time"; otherwise no schedule constraint is sent and the mealtime is available whenever the restaurant is open.
  • Webhook events must include both a location_id (Deliveroo's site id) and brand_id in the order payload. Deliveroo always gets a 200 back from the endpoint itself; if either id is missing the payload is logged and dropped, and if no matching integration is found the queued job fails after 3 attempts.
  • Order creation is idempotent -- a replayed or re-delivered webhook will not create a second transaction, and every Deliveroo webhook is stored so it can be inspected and replayed.

FAQs

  • Do I need a separate Deliveroo API key? No. Upvendo uses platform-level Deliveroo OAuth credentials (client ID / client secret) configured server-side by the Upvendo team. You only provide your Deliveroo site ID.
  • Can I set different prices for Deliveroo than in my Upvendo menu? Not through this integration directly; the sync pushes Upvendo item prices as-is. To charge different prices on Deliveroo you would create a separate Upvendo menu for delivery and sync that.
  • How quickly do menu changes appear on Deliveroo? Menu sync is manual -- you must click Sync Menu. Once sent, Deliveroo's own processing may add a short delay before changes are visible.
  • What happens if I update my credentials and they are invalid? The system restores the previous credentials, sets the sync status to "error" with message "Invalid Deliveroo credentials", and throws an exception.
  • Are allergen and dietary labels synced? Yes. The menu sync includes each item's allergens (allergies) and dietary preferences (diets), plus the contains_alcohol flag.
  • Can I disconnect Deliveroo myself? Yes -- on /deliveroo, open the Settings tab and click Disconnect, then type Deliveroo in the confirmation dialog. You need the manage-integration-settings permission. It removes the integration for that location, and you can reconnect later with the same Site ID.
  • Where do I see what the integration has been doing? On the Status tab: the activity log lists sync and webhook entries (with search, status and date filters and a Refresh button), and below it a Recent Deliveroo Orders table shows the latest Deliveroo orders for the location.

Troubleshooting

Problem: Orders not coming through

Causes:

  1. Integration not connected, or credentials invalid
  2. Webhook signature verification failing
  3. Site ID / brand ID mismatch with the order payload
  4. On a tablet site, the order has not been accepted on the Deliveroo tablet yet

Solutions:

  1. Confirm the integration is connected and the site ID is correct
  2. Verify the Deliveroo webhook secret is configured and signatures are valid
  3. Ensure the order's site/brand IDs match the integration record
  4. On a tablet site, accept the order on the Deliveroo tablet -- Upvendo only ingests it after that

Problem: Menu not syncing

Causes:

  1. No menus selected to sync
  2. Item data invalid (missing prices, tax rates, or images)
  3. Deliveroo API validation error

Solutions:

  1. Select at least one menu, then click Sync Menu
  2. Check item data (names, prices, tax rates, images)
  3. Review the Activity Log for Deliveroo's validation errors

Examples

Connect Request (POST)

json
{
  "site_id": "your-deliveroo-site-id"
}

Sync Menu Request (POST)

json
{
  "menu_ids": ["662f1a...", "662f1b..."]
}