# About license keys and concurrent seats

When you order RMH apps through the RMH Hub, you must specify the **number of concurrent seats** the customer requires for each app. The number of concurrent seats that the customer purchases for each app is assigned to the app's **license key**.

It may be helpful to think of concurrent seats as the **number of instances of the app** that need to be operated **at the same time (concurrently)**. For example, if your customer is a grocery store that has 10 checkout lanes and 2 customer service terminals, they would want to purchase at least 12 concurrent seats for the RMH POS app. This would allow the store to operate the RMH POS app at all 12 locations at the same time during peak sales periods.

Concurrent seats are not installed on specific computers or assigned to specific users. Instead, they are **floating seats** that are stored in a **pool in the cloud**, and they can be used by any activated app. There are separate pools for each license key. When a licensed RMH app is started, it checks whether the license key is valid and whether the maximum number of activations has been exceeded. Next, the app checks whether a concurrent seat is available to take from the relevant pool. If a seat is available, the app takes it. The app returns the seat to the pool when it is shut down.

<div align="left"><img src="/files/8cDz3U5BaMAxOsFQKRyU" alt=""></div>

It is important to understand that it is the licensed RMH app - and not the user - that takes the seat from the pool. For example, after a licensed RMH app is started on a computer, numerous users (such as cashiers, salespeople, and managers) can log in to the app and operate it, but the app will only use one seat from the pool.

Each licensed RMH app contacts the cloud licensing service every **60 minutes (1 hour)** to renew its seat. If the app fails to renew its seat as expected (e.g., if the app shut down abnormally or the computer failed), the cloud licensing service initiates a **timeout period** for the app's seat. The timeout period is currently set at **120 minutes (2 hours)**. If the app fails to renew its seat by the end of the timeout period, the app's seat is automatically returned to the relevant pool.

<div align="left"><img src="/files/roLlTzEYEu8RcJO7ySrn" alt=""></div>

{% hint style="info" %}
If you have access to the cloud license management portal, you can log in and manually return an app's seat to the pool before the end of the timeout period.
{% endhint %}

If the licensed RMH app cannot contact the cloud licensing service to renew its seat (e.g., because the computer or the store has lost its connection to the internet, or the cloud licensing service is not available), a warning message displays in the app. The app retains its seat and continues to operate normally without interruption for up to **48 hours**. Refer to [**About internet connectivity and licensing**](/installation/licensing/licensing-offline.md) for information.

If a customer has a **perpetual license** for their licensed RMH apps and their Enhancement Plan (EP) has lapsed, they retain use of each app's concurrent seats. However, if a customer has a **subscription license** for their licensed RMH apps and their subscription is not in good standing (e.g., it is unpaid or canceled), the concurrent seats that are provided through the subscription are set to zero (0). The customer's concurrent seats are restored as soon as their subscription returns to good standing.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.rmhpos.com/installation/licensing/licensing-concurrent-seats.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
