Hello Creators!
Today, we’re launching Restart Notifications on game servers! Whenever you schedule a delayed server restart, whether from the Server Management page or the Open Cloud API, all of the game servers that are scheduled to close will immediately fire the game.ServerRestartScheduled event.
Create Seamless Restarts for Your Players
You can use Restart Notifications to avoid player disruption from restarts. First, attach a callback to the event in your scripts to notify players of the impending server restart. Before the server closes, you can prompt players to save their progress, teleport them to new servers, or run any other custom logic.
The ServerRestartScheduled event contains the following arguments:
| Argument | Type | Description |
|---|---|---|
RestartTime |
DateTime | The earliest time the external shutdown is scheduled to occur. For updates involving many servers, the actual restart time may be slightly later than this time. |
Source |
Enum.CloseReason | For restarts that you initiate, this will always be DeveloperUpdate. |
Attributes |
Dictionary | Flexible table to indicate the purpose of the restart. You might use this to indicate restart reason, urgency, a user-facing message, etc. The table will be empty if no attributes are provided. |
We’ll send you notifications for all delayed server restarts that you initiate. Delivery is best effort and realtime, typically within 1-2 seconds with 99.9% success rate.
In Creator Hub, when confirming a server restart, you can attach a custom JSON payload to the restart that will populate the attributes field in the event.
How to Use Restart Notifications
- To get started, in a server side script attach a callback to
game.ServerRestartScheduled:
local roundInProgress = false -- Set elsewhere in game code whenever a game round starts or ends
local restartPending = false
game.ServerRestartScheduled:Connect(function(restartTime, source, attributes)
local msg = attributes and attributes.message or ""
local timeStr = restartTime:FormatLocalTime("LTS", "en-us") -- since this is run on the server, it will be in UTC
-- Forward these fields to clients via remote:FireAllClients() to display customized messages in your UI
print(string.format("Server restart at %s from source: %s. Reason: %s.", timeStr, tostring(source), msg))
if not roundInProgress then
print("No round in progress. Teleporting players in 10 seconds")
task.wait(10)
-- Teleporting players when a restart has been scheduled will bring them to a server on the latest place version
-- Make sure to add error handling code in case the teleport fails
game:GetService("TeleportService"):TeleportAsync(game.PlaceId, game:GetService("Players"):GetPlayers())
else
-- You can add code to teleport players after a game round ends if restartPending is true.
restartPending = true
end
end)
-
After you submit the restart, once the notification hits the game server, the custom callback will save these fields and forward them to clients.
-
You can then use the saved source,
restartTime, and attributes fields to populate user-facing modals or teleport players out of the server.
What’s Next
As hinted by the source argument, in the future we will extend ServerRestartScheduled to also fire when a server is scheduled to be shut down by Roblox. While we want to minimize these types of server shutdowns as much as possible, they’re sometimes unavoidable, and we want to provide you the opportunity to make them seamless wherever possible.
We’re excited to see how you use this feature to improve gameplay flows and minimize disruption in your games! As always, we welcome your feedback and questions.
Roblox Creator Services Team
FAQs
Will a notification be sent for immediate restarts?
- No, you must set a delay time in order for servers to receive notifications.
Will a notification be sent if I don’t include a custom payload?
- Yes, notifications are sent for all delayed server restarts. When no payload is included, the attributes field will be an empty table.
Can I provide the attributes dictionary when using the Open Cloud endpoint?
- Yes, pass the JSON in the attributes field inside the request body.

