Skip to main content
For Quick Service Restaurants

Ship menu and promo changes on your launch date

Upload the web layer of your ordering app from CI when the promotion goes live. Route it by market or brand with channels, start with a pilot, and roll it back if ordering breaks.

Why restaurant teams add a live update lane

Menus and promotions change faster than store releases

A launch-day bug on the store-only path

A limited-time item goes live on a set date. On launch morning, QA finds that it does not show in the app menu.

The fix is in the web layer, but a store-only process means a new binary and store review, which is often 24–48 hours, sometimes much longer.

Even after approval, customers still have to install the update, and in-store kiosks need their own update path.

Promotions have fixed dates

A limited-time offer starts when the campaign starts. A web-layer fix should not wait for a store release.

Several brands and markets

Each brand app and each market can need different menus, promotions, and legal text from the same codebase.

Changes need a pilot first

A new ordering flow should run in one market or a few test devices before it goes everywhere.

Peak hours leave no room for errors

A broken ordering screen at lunch needs a way back that does not depend on a store release.

Use cases

Where restaurant apps use live updates

Ordering and checkout

Fix order and checkout screens in the web layer and ship menu display changes without a new binary.

Loyalty and rewards

Update reward screens, point displays, and redemption flows. Point values that come from your backend change there.

Store locator and pickup

Update store information screens, pickup instructions, and curbside options in the web layer.

Promotions

Launch promo banners, offer pages, and campaign entry points on your date. Pilot them on one channel first.

In-store kiosks

Kiosk apps can stay open all day. Apply updates during periodic checks, or when the kiosk returns to its idle screen.

Multi-brand apps

Keep every brand app in one Capgo organization, each with its own app ID, channels, and release history.

What Capgo gives restaurant teams

Ship on your schedule, per market and brand

Upload from CI at the time you pick

Capgo has no release scheduler. Your CI triggers the upload: on merge, on a manual run, or on a cron schedule you set for the launch.

  • Guides for GitHub Actions, GitLab CI, Bitbucket, and Azure DevOps
  • Keep the Capgo API key in your CI secrets
  • Roll back from the console or CLI if the launch goes wrong
# .github/workflows/capgo-launch.yml
on:
  workflow_dispatch:
  schedule:
    - cron: '0 6 15 11 *' # 06:00 UTC on 15 Nov, your launch time

jobs:
  upload:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - run: npm ci && npm run build
      - run: npx @capgo/cli@latest bundle upload --channel production --delta
        env:
          CAPGO_TOKEN: ${{ secrets.CAPGO_TOKEN }}
# one app ID per brand, same web codebase
npx @capgo/cli@latest bundle upload com.yourgroup.brand-a --channel production
npx @capgo/cli@latest bundle upload com.yourgroup.brand-b --channel production

Several brands from one account

Each brand app is its own app in Capgo, with its own channels and release history. Manage them in one organization with roles per team member.

  • One organization for every brand app
  • Separate channels and history per app ID
  • Roles for organization, app, and channel access

Channels for markets and pilot groups

Create a channel for each market, region, or pilot group. The app joins with setChannel() on channels that allow self-assignment, and your team can pin a device with an override.

  • Channels for markets, regions, or pilot stores
  • Devices join with setChannel() or device overrides
  • Progressive rollout inside each channel
// in the app, after the user or kiosk picks a market
import { CapacitorUpdater } from '@capgo/capacitor-updater'

await CapacitorUpdater.setChannel({ channel: 'market-uk' })
kiosk updates
// capacitor.config.ts
CapacitorUpdater: { autoUpdate: 'onlyDownload' }

// kiosk app
let next
CapacitorUpdater.addListener('updateAvailable', ({ bundle }) => {
  next = bundle
})

// when the kiosk is back on its idle screen
if (next) await CapacitorUpdater.set({ id: next.id })

Kiosks that stay open all day

The default mode applies updates when the app goes to the background, which a kiosk rarely does. Download updates automatically and apply them when the kiosk is idle.

  • onlyDownload mode emits updateAvailable when a bundle is ready
  • Call set() on your idle screen to apply it
  • Android kiosk mode plugin to lock the device to your app
Updates delivered per month
1B+
Typical API latency
~50ms
Devices reached
90M+
Apps using Capgo
4.7K+

How it works

How restaurant teams ship a menu change with Capgo

A typical flow for a promotion that starts in one market. Every command below is from the Capgo CLI docs.

  1. Create a channel per market or pilot

    Allow self-assignment so the app can join the channel for the market the user or kiosk is in.

    npx @capgo/cli@latest channel add market-uk --self-assign
    Channels docs
  2. Upload the promo to part of the market

    Run this from CI at launch time. The rollout sends the bundle to a share of devices on the channel while the rest stay on stable.

    npx @capgo/cli@latest bundle upload --channel market-uk --delta --rollout 10
    Progressive rollouts docs
  3. Promote when orders go through

    When ordering works as expected, promote the bundle to every device on the channel.

    npx @capgo/cli@latest channel set market-uk --rollout-promote
    Progressive rollouts docs
  4. Roll back during a rush

    If ordering breaks, send the rollout back to stable, or pick the previous bundle from the channel history in the console.

    npx @capgo/cli@latest channel set market-uk --rollout-rollback
    Rollbacks docs

Apps built with Capacitor

Restaurant apps change menus and campaigns constantly

Quick-service restaurant apps can update promotions, restaurant finder content, ordering notices, and regional campaign entry points without waiting for store approval.

BURGER KING® app icon APPLICATION

BURGER KING®

Restaurant app with vouchers, finder content, and campaign surfaces.

Google Play installs
14.3M
Store rating
3.9
Jack in the Box® - Order Food app icon Food & Drink

Jack in the Box® - Order Food

Ordering app where menu, rewards, and checkout guidance can change quickly.

Google Play installs
2.7M
Store rating
2.5
Denny's app icon FOOD AND DRINK

Denny's

Restaurant app where loyalty and food-ordering paths need frequent polish.

Google Play installs
1.7M
Store rating
4.7

Customer proof

What teams shipping with Capgo say

5.0/5 rated by developer teams 9,400+ teams Read reviews

Kapil

Founder, NuTriQ

“Being able to push production OTA updates instantly without waiting for full App Store review cycles has been a massive operational advantage.”

Portrait of Sergiu S

Sergiu S

Lead Developer, drivolino GmbH

“The Capgo Capacitor Updater plugin completely transformed how we ship updates. What used to take days now takes just minutes.”

no-tone @ Webincode

Developer, Webincode

“Being able to add Device ID's to certain groups and push the changes to only certain groups is a life saver.”

FAQ

Questions restaurant teams ask

Timing, kiosks, markets, and what a live update can change.

Can we schedule a menu launch?

Capgo does not have a release scheduler. Trigger the upload from your CI at the time you choose, for example with a scheduled GitHub Actions workflow or a manual run on launch morning. If the new UI must stay hidden until a date, gate it in your app or backend.

GitHub Actions guide

How do kiosks get updates if the app never closes?

In the default mode, updates apply when the app goes to the background, which a kiosk rarely does. Set autoUpdate to 'always' to apply updates during the periodic check (every 10 minutes by default), or to 'onlyDownload' and call set() when the kiosk returns to its idle screen.

Update behavior docs

Can each market or brand run a different version?

Yes. Give each brand its own app ID in Capgo, and give each market or pilot group its own channel. Devices join a channel with setChannel() when self-assignment is allowed, or through a device override.

Channels docs

What if a promo release breaks ordering?

Roll back the progressive rollout or pick the previous bundle from the channel history. If the new bundle fails to start and never calls notifyAppReady(), the device returns to the last working bundle by itself.

Rollbacks docs

Can a live update change menu prices?

Prices usually come from your backend or POS integration, so change them there. A live update changes the web screens that display the menu and prices. Native plugins, payment SDKs, and Capacitor upgrades need a store release.

Native compatibility docs

Ready to ship on your schedule?

Set up market channels and a CI upload on your own app during the trial.