Platform - Limits

General limits

There are two Liveblocks plans, and each has its own set of limits.

ProEnterprise
Monthly active users 25,000 Custom
Projects 100Unlimited
Team members per account 10Custom
Average connections per MAU 500Custom
Maximum data stored size per room 20 MBCustom
Simultaneous connections per room 50Custom
Simultaneous connections per project 100,000Unlimited
Monthly public key connections 3,000Custom
Monthly comments* 100,000Custom
Monthly notifications* 200,000Custom
Total text editor data* 8 GBCustom
Total sync engine data* 8 GBCustom
yDocUpdated webhook event throttle 60 secondsCustom
storageUpdated webhook event throttle 60 secondsCustom

* Requires add-on purchase.

First day free policy

Both plans include our first day free policy, meaning you’ll only be charged for users who come back after their first visit. Learn more.

Free development environment limits

The Pro plan comes with a free, fully-featured, development environment, allowing you to prototype Liveblocks applications before making a purchase. There are usage limits.

Free development environment
Monthly active users 50
Projects 2
Team members per account 3
Average connections per MAU 100
Maximum data stored size per room 10 MB
Simultaneous connections per room 10
Simultaneous connections per project 1,000
Monthly public key connections 1,000
Monthly comments2,000
Monthly notifications2,000
Total GB stored (text editors) 256 MB
Total GB stored (sync datastores) 256 MB
yDocUpdated webhook event throttle 60 seconds
storageUpdated webhook event throttle 60 seconds

Commercial usage

The Pro plan’s free development environment is restricted to non-commercial use only. All commercial usage of the platform requires a paid Pro or Enterprise plan. Commercial usage refers to any usage of the Liveblocks platform in projects where financial gain is being sought by any party involved in the production, including paid employees or consultants.

Other limits

roomId limit

A roomId cannot exceed 128 characters.

userId limit

A userId cannot exceed 128 characters. Each userId must be used to represent a single user.

userInfo limit

userInfo sent from the authentication endpoint cannot exceed 1024 characters once serialized to JSON.

Broadcast event limit

Broadcast event messages have a limit of 1 MB.

Liveblocks Storage limits

  • A LiveObject cannot exceed 128 kB when totalling the size of the keys and values.
  • A LiveMap can be any size, so long as each individual value does not exceed 128kB.
  • A LiveList can be any size, so long as each individual value does not exceed 128kB.

Note that when one realtime data structure is nested inside another, it does not count towards the limit. Only the JSON leaves of your data structure count towards the limit. For example, if a LiveList is nested inside a LiveObject, the LiveList and its contents do not count towards the LiveObject’s data limit.

FAQs

What is a monthly active user (MAU)?

Monthly active users (MAU) represents the number of users that have used any Liveblocks features within a given month, with the exception of users that only connect one time, as they are always free. Users are identified by the userId property provided in your authentication endpoint. This userId generally comes from your database or your authentication provider.

One unique userId corresponds to one user, no matter how long they connect for. For example, a user that connects for 5 minutes on 2 different days is counted as 1 MAU, and a user that connects 8 hours a day for a month is also counted as 1 MAU. This applies so long as usage falls under our Fair Use Policy.

First day free policy

Both plans include our first day free policy, meaning you only pay for returning users. In concrete terms, when a userId connects for the first time, they do not count towards your MAU limit. They are only counted when they connect to Liveblocks again on another calendar day. For all users, days start at 00:00 UTC and end at 23:59:59 UTC.

What’s a connection?

A connection occurs when a user opens a web page containing a Liveblocks room. Each tab counts as one connection, which means that a user with two open tabs has two connections. A room is joined when using RoomProvider in React or enterRoom in JavaScript. Liveblocks connections are analogous to WebSocket connections, representing a realtime link to our server.

What’s a room?

A room is the virtual space where people collaborate. For most products, a room corresponds to a document.

What’s a simultaneous connection per room?

A simultaneous connection per room is when a user or multiple users are connected to the same Liveblocks room at the same time. Learn more about handling simultaneous room connection limits in our guide about joining rooms at maximum capacity.

What’s a simultaneous connection per project?

A simultaneous connection per project is when a user or multiple users are connected to the same project at the same time.

How is data storage calculated?

Storage for Text Editor and Sync Datastore is a cumulative calculation that represents all data that is currently stored. It does not reset monthly, and the total usage will continue to accrue over time as you add more content and data. You can monitor your usage at any time in the dashboard.

What happens when limits are reached?

Liveblocks returns a different error for each limit that a user might reach. That way, you can decide how to best handle those cases in your product. Learn more about limits.

Do you count monthly active users during testing?

If you connect to rooms and call the Liveblocks API during any automated testing, you may want to provide a static userId to avoid hitting limits.

For example, you could do this by setting an environment variable and checking the process when you call authorize from @liveblocks/node.

.env.test
TEST_USERID="machine"
liveblocks.config.ts
export default async function auth(req, res) {  const room = req.body.room;  const response = await authorize({    room,    secret,    userId:      process.env.NODE_ENV === "test" ? process.env.TEST_USERID : "user123",  });  return res.status(response.status).end(response.body);}

Learn more

For further information regarding acceptable use of our Services, please refer to our Terms of Service or your Enterprise Service Agreement.

We use cookies to collect data to improve your experience on our site. Read our Privacy Policy to learn more.