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 |
|---|---|---|
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 | Revel's shared |
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 |
|---|---|
Subdomain | The first part of their Revel web address. For |
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
Open the customer's license in OnePass and go to Data Streams.
Click Add Data Stream, give it a name, and choose RevelPOS as the data source. A configuration template appears.
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 |
|---|---|
|
|
| The customer's Revel web address without |
| The customer's Revel API credentials. Leave blank in |
| Kuusoft's Revel Partner credentials. Only used in |
|
|
| The numeric establishment (store) ID for this license. A non-numeric value is rejected at save time. |
| Which kind of Revel custom menu to use: |
| The name of the specific custom menu, if they have more than one of that kind. Leave blank for the default. |
| Leave |
| Leave |
| Leave |
| Leave |
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 |
|---|---|
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 |
Availability | When the item is served, e.g. "MONDAY 11:00-14:00". |
Inventory Status |
|
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:
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.
Build the menu design once, against any one of them.
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 |
|---|---|
"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 |
"Revel rejected the request (HTTP 400)" | Usually the Establishment ID or a |
"Mode [...] is not a valid Revel application mode" |
|
"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 |
"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 | 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 | 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.comresolves 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.49means $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.