Revel POS Data Stream (Revel Systems Web Ordering API)

Revel POS Data Stream (Revel Systems Web Ordering API)

Written by KuusoftAI, not yet reviewed by a human. Treat the details as accurate-as-implemented but unverified by a second pair of eyes.

BETA — RevelPOS is the eighth Data Source for NexSigns Data Streams, joining ToastPOS, OLO, GeniusPOS, SquarePOS, CloverPOS, PARPOS and NCRPOS. It connects to the Revel Systems Web Ordering API ("weborders"), the read side of the Revel iPad POS platform. The integration is code complete and has been tested against Revel's live sandbox host, but the sandbox establishment publishes an empty menu, so no real Revel menu has ever been seen end to end. Treat the first customer deployment as a pilot.

Comparing data sources? See NexSigns DataStream — POS Integration Comparison (All 14 Sources) for the side-by-side tables: what each board can display, data fields, price units, size mechanisms, authentication, sync cost, multi-store behaviour and verification status.

What it does

A RevelPOS Data Stream pulls an establishment's menu once an hour and makes it available to the Digital Menu Board (Smart Menu) Editor. Item names, prices, sizes and descriptions stay in step with the POS, so nobody re-types a menu when a price changes.

Each stream serves one establishment (one store). A customer with three stores creates three Data Streams — see the multi-store section below.

What makes Revel different from the other POS sources

  • There are two completely different ways to connect, and a customer is on exactly one of them. This is the biggest thing to get right during onboarding — see the next section.

  • The whole menu arrives in one request. Revel returns every category, its products, and each product's modifier groups together, so most menus are fully live from the very first refresh.

  • Sizes may fill in gradually. Revel has two unrelated ways of modelling a size, and one of them ("matrix" products) needs an extra request per product. Those are fetched a minute at a time in the background, so a large retail-style menu may take a few refresh cycles before every size dropdown appears. Prices, names and images are never delayed by this.

  • Out-of-stock tracking is off by default and should usually stay off. Revel reports a stock number, not an out-of-stock flag, and that number sits at zero for every product the store does not inventory-track. Switching it on for a store that does not track inventory would show the entire board as sold out.

Not available in version 1:

  • Calories and nutrition. The Web Ordering API carries no nutrition fields at all. Unlike Toast, Genius and NCR, there is nothing to link.

  • Combos and upsells. Linked combos and group combos are skipped.

  • Modifiers and add-ons beyond a single required size selector. Same position as the Square, Genius, Clover, PAR and NCR integrations.

  • Day-part scheduling. Serving times are shown as text if a design asks for them, but the board shows the whole menu rather than only what is servable right now.

  • Live menu-change notifications. Revel can push a message the moment a menu changes; version 1 polls hourly instead. This is the top of the follow-up list.

Which connection method? (ask this first)

API Key (the default)

API Platform

API Key (the default)

API Platform

Who it suits

Any Revel merchant, set up by themselves

Requires Revel to onboard Kuusoft as a Partner

What the customer gives us

An API key and API secret from their Revel account

Nothing — Kuusoft holds one Client ID / Client Secret for all merchants

Which address we call

The customer's own https://theirname.revelup.com

Revel's shared https://api.revelsystems.com

Available today

Yes

Only once Kuusoft is a registered Revel Partner

Use API Key unless you have been told otherwise. Both are implemented, so switching later is a configuration change, not a development task.

What the customer needs to provide

Item

Where it comes from

Item

Where it comes from

Subdomain

The first part of their Revel web address. For https://mystore.revelup.com this is mystore. Pasting the whole address works too — OnePass trims it.

API key + API secret

Created in their Revel account against an API user. That user needs read access to the Web Ordering resources. (API Key method only.)

Establishment ID

The numeric identifier for this store. One per store location. If they do not know it, their Revel account manager will.

Custom menu (optional)

Whether they have built a dedicated Menu Board menu in Revel, and what it is called. If they have, the board can use it instead of their default online-ordering menu.

The API key and secret are a read credential for that merchant's menu data. Treat them like a password: collect them over a secure channel, never paste them into a ticket comment or a chat message.

OnePass never writes the secret to a log. Refresh logs show the API key only as its last four characters, like ****9f3a, and the secret is never shown at all.

A note for support. Revel's Web Ordering endpoints are designed to be called from a merchant's public online-ordering website, so on many merchants they answer without checking the credentials at all. This was confirmed against Revel's live host. It means a successful connection test proves the subdomain and establishment ID are right — it does not prove the API key is right. Do not tell a customer their key is verified on the strength of the save succeeding.

Creating the Data Stream

  1. Open the customer's license in OnePass and go to Data Streams.

  2. Click Add Data Stream, give it a name, and choose RevelPOS as the data source. A configuration template appears.

  3. Replace the placeholder values and save. OnePass immediately tests the settings against Revel and refuses to save an obviously wrong set, with a readable message.

The template looks like this:

{ "DataSource": "RevelPOS", "Version": "1.0", "AuthMode": "ApiKey", "Subdomain": "<Replace Revel Subdomain>", "ApiKey": "<Replace Revel API Key>", "ApiSecret": "<Replace Revel API Secret>", "ClientID": "", "ClientSecret": "", "Environment": "Production", "EstablishmentID": "<Replace Revel Establishment ID>", "Mode": "", "CustomMenuName": "", "UseInventory": false, "ResolveProductAttributes": true, "IncludeAttributeChildProducts": false, "IncludeUnavailableItems": true }

Field

What to put in it

Field

What to put in it

AuthMode

ApiKey (default) or Platform. See the table above. Anything unrecognised falls back to ApiKey and says so in the refresh log.

Subdomain

The customer's Revel web address without .revelup.com.

ApiKey / ApiSecret

The customer's Revel API credentials. Leave blank in Platform mode.

ClientID / ClientSecret

Kuusoft's Revel Partner credentials. Only used in Platform mode; leave blank otherwise.

Environment

Production (default) or QA. Only has an effect in Platform mode — in ApiKey mode the customer's own subdomain already decides which system is being reached.

EstablishmentID

The numeric establishment (store) ID for this license. A non-numeric value is rejected at save time.

Mode

Which kind of Revel custom menu to use: 0 Online, 1 Bar, 2 Kiosk, 3 Menu Board, 4 Online — Catering, 5 SmartDining, 6 Multi-Channel. Leave blank unless the customer has actually built a menu of that kind, otherwise Revel's default menu is used.

CustomMenuName

The name of the specific custom menu, if they have more than one of that kind. Leave blank for the default.

UseInventory

Leave false unless the store genuinely tracks inventory on every product. See the warning below.

ResolveProductAttributes

Leave true. This is what fetches sizes for Revel "matrix" products. It costs nothing on menus that do not use them.

IncludeAttributeChildProducts

Leave false. Individual size variants stay hidden behind their parent item instead of appearing as separate board rows. Only set true if a customer's menu genuinely needs each variant listed on its own.

IncludeUnavailableItems

Leave true to keep sold-out items on the board with a sold-out state. Set false to hide them from the item picker completely.

You can leave the placeholders in place and save — the stream is created and simply reports that credentials are missing on each refresh until real values are entered. That is useful for setting up a license before the customer sends their details.

About UseInventory. Revel does not publish a simple "out of stock" flag on this API. It publishes a stock count, and that count is meaningless — usually zero — for any product the store does not inventory-track. If you switch this on for a restaurant that only tracks a handful of items, every untracked item on the board goes sold out. Only enable it after confirming with the customer that their Revel inventory is complete and maintained.

Finding the custom menu

Once a stream has valid settings, the custom menus available for that store can be listed without touching the customer's Revel account again. Engineering can call:

GET /api/nexsigns/DataStreams/GetRevelPOSAvailableCustomMenuList?DataStreamGUID=<the stream's GUID>

It returns each custom menu's ID and name, plus the establishment's business name and currency. The credentials never travel in the URL — the stream GUID is the only parameter.

Linking fields in the Smart Menu Editor

Field linking works the same way as every other data source (see Dynamic Data Linking (Data Stream Linking)). Click the link icon next to a text field, pick the RevelPOS stream, then choose an item and a data field.

Three things are specific to Revel:

  • Items are grouped in the picker by category, in the order the categories are sorted in Revel. A subcategory is shown as Parent / Child, so two subcategories both called "Sides" stay tellable apart. Items in no category land in an Uncategorized group at the bottom.

  • A Variation dropdown appears whenever an item has more than one size. Revel supports two ways of modelling that and both are handled the same way in the picker.

  • Matrix sizes may not appear immediately. If a size dropdown is missing on a brand new stream, run a manual refresh once or twice and re-open the dialog — the background fetch fills them in.

Available data fields:

Field

Shows

Field

Shows

Name

The item name. Stays the item name even when a size is selected — "Latte", not "Large".

Variation Name

The selected size's label, e.g. "Large" or "M / Green". Blank for items with only one size.

Description

The item description.

Price

The selected (or default) size's price. A broken price binding shows {E2} rather than a misleading blank.

Availability

When the item is served, e.g. "MONDAY 11:00-14:00".

Inventory Status

1 available / 0 out of stock. Same values Toast, Genius, Square, Clover, PAR and NCR use, so existing menu templates keep working. Always 1 unless UseInventory is on.

Stock Amount

The raw stock count Revel reports.

Image URL / Thumbnail URL

Item artwork.

SKU / Barcode

Identifiers, also used for multi-store matching.

Unit of Measurement / Course Number / Loyalty Point Value

Extra product details Revel publishes.

Currency / Currency Symbol / Business Name

Establishment-level information, useful for headers and footers.

Item ID

Mostly useful for troubleshooting.

Customers with more than one store

A Revel product ID is a database key generated inside that merchant's own system, so a menu design built against Store A may have nothing to match on in Store B by ID alone.

NexSigns works around this. When a field is linked, OnePass records the item's SKU, barcode and name alongside its ID. If the ID is not found — which is what happens on a second store — it falls back through those in order. The selected size is always matched by its label ("Large"), which is portable because it is text the operator typed.

To set a customer up across stores:

  1. Create one RevelPOS Data Stream per license, all with the same stream name, each with that store's own Establishment ID. The subdomain and credentials are usually the same across the customer's stores.

  2. Build the menu design once, against any one of them.

  3. Deploy the same design to the other licenses. Each screen resolves against its own store's stream and shows that store's prices and availability.

For this to work reliably, the customer's stores should use consistent SKUs or item names across locations. Worth checking during onboarding.

How often data refreshes

Every 60 minutes. A refresh only republishes the screen when something the board can actually display has changed, so editing an internal setting in Revel will not cause a screen update, while editing a menu price will.

While matrix sizes are still being fetched on a large menu, the stream refreshes every 60 seconds instead until it finishes, then settles back to hourly.

The Manual Refresh button on the Data Stream card forces an immediate pull. Use it after the customer makes a change they want to see straight away.

If a refresh fails, the previously loaded menu stays on screen — a failed pull never blanks a board.

Troubleshooting

The refresh log is stored on the Data Stream and is the first place to look. Engineering can read it from the database; these are the lines that matter.

What you see

What it means / what to do

What you see

What it means / what to do

"Subdomain, credentials and/or EstablishmentID missing from configuration"

The template placeholders were never replaced. Nothing has been contacted at Revel yet.

"Revel returned HTTP 404 ... check EstablishmentID first"

Almost always a wrong Establishment ID — that is what Revel actually returns for one the merchant does not have, despite their documentation saying otherwise. If the ID is definitely right, check the Subdomain next.

"Revel rejected the credentials (HTTP 401 / 403)"

The API key or secret is wrong, or the Revel API user lacks read access to the Web Ordering resources. In Platform mode, the Client ID / Secret or the merchant's access grant.

"Revel rejected the request (HTTP 400)"

Usually the Establishment ID or a Mode / CustomMenuName pair that does not exist at that store.

"Mode [...] is not a valid Revel application mode"

Mode must be a number 0–6, or blank. Nothing was sent to Revel.

"EstablishmentID [...] is not a number"

Revel establishment IDs are numeric. Nothing was sent to Revel.

"the establishment returned N product(s) but none survived normalization"

Usually a Mode / CustomMenuName pair selecting an empty menu, or UseInventory on with IncludeUnavailableItems off. Previous data is kept.

"transport error"

Revel could not be reached at all — a network or Revel-side outage, or a mistyped subdomain. Retries in 60 seconds; no action needed unless it persists.

"settings unavailable ...; continuing without currency information"

Harmless. The menu still loaded; only the currency and business name are missing.

"matrix product(s) still queued"

Normal on a large menu. Sizes are still being fetched and will finish over the next few minutes.

"Menu unchanged (hash match). Skipping store."

Normal and healthy. Nothing a menu board displays has changed since the last pull.

A field on the board shows {E2}

The linked item no longer exists in that store's menu, or a price binding points at an item with no price. Re-link the field.

A field on the board shows {E3}

Version mismatch between the OnePass web app and its shared library. Engineering issue — report it.

"You need to refresh your data once before you can perform testing."

Expected on a brand new stream. Run a manual refresh first.

Credential and establishment failures (400, 401, 403, 404) deliberately retry on the hourly cycle rather than every minute, so a wrong setting never hammers Revel.

For engineering

Full implementation notes — both authentication schemes, the API contract, the normalized document shape, the three size mechanisms, the field resolution order, and the live-testing checklist — are in Scripts/revelpos/README.md in the OnePass repository. Read that before changing anything in the #region RevelPOS Specific Codebase block of api/nexsigns/DataStreamsController.cs.

Two things worth knowing before anyone goes looking for the API documentation:

  • Revel's developer portal is currently offline. developer.revelsystems.com resolves to a dead storage bucket and every page, including the Web Ordering reference, returns an error. The full OpenAPI specification was recovered from the Wayback Machine; the repository README explains exactly how to do that again.

  • Revel prices are ordinary decimal amounts (8.49 means $8.49), unlike Square, Clover and PAR which send whole cents. Anyone porting code between those integrations needs to know which convention they are in.