In short
Every server has a budget of data store calls per minute. Go over it and Roblox puts the request in a queue and warns you. If the queue fills (Roblox's docs give 30 requests per queue), new requests are dropped with errors 301 to 306, such as 302: SetAsync request dropped, and that data is not saved. Save less often: once when a player leaves, plus an autosave every few minutes, not on every coin.
- The budget for reads and for writes is
60 + 40 × playersrequests a minute per server (from Roblox's limits page), plus a burst when the server starts.
What the message means
DataStore request was added to queue. If request queue fills, further requests will be dropped. Try sending fewer requests.Key = 123456789
Other forms of the same message:
Request was throttled. Try sending fewer requests. Key = 123456789302: SetAsync request dropped. Request was throttled, but throttled request queue was full.304: UpdateAsync request dropped. Request was throttled, but throttled request queue was full.301: GetAsync request dropped. Request was throttled, but throttled request queue was full.
The warning names the key (Key = ...), usually a player's UserId. Many warnings for one key mean one player's data is written too often; warnings across many keys mean the whole server is over its budget.
Queued requests still run, just later. Dropped ones never run, so treat 301 to 306 as lost saves.
Causes and fixes
Three things cause this warning in practice. Each one below has the smallest code that triggers it, then the fix.
Saving on every change
Calling SetAsync from a Changed event, or every time a coin is collected, sends a request per change. A busy player can make dozens a minute.
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local store = DataStoreService:GetDataStore("PlayerCoins")
Players.PlayerAdded:Connect(function(player)
local coins = player:WaitForChild("leaderstats"):WaitForChild("Coins")
-- one write per coin: queued, then dropped
coins.Changed:Connect(function(value)
store:SetAsync(tostring(player.UserId), value)
end)
end)
Keep the value in memory while the player plays. Save when they leave and on a slow autosave, inside pcall.
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local store = DataStoreService:GetDataStore("PlayerCoins")
local AUTOSAVE_SECONDS = 120
local function save(player: Player)
local leaderstats = player:FindFirstChild("leaderstats")
local coins = leaderstats and leaderstats:FindFirstChild("Coins")
if not (coins and coins:IsA("IntValue")) then
return
end
local ok, err = pcall(function()
store:SetAsync(tostring(player.UserId), coins.Value)
end)
if not ok then
warn(`[SaveData] save failed for {player.Name}: {err}`)
end
end
Players.PlayerRemoving:Connect(save)
task.spawn(function()
while true do
task.wait(AUTOSAVE_SECONDS)
for _, player in Players:GetPlayers() do
save(player)
end
end
end)
The DataStore guide adds loading, retries and saving when the server shuts down.
One data store per stat
Saving Coins, Gems, Level and Inventory to four separate stores (or keys) makes four requests per save. Multiply by every player and the budget goes fast.
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
Players.PlayerRemoving:Connect(function(player)
local id = tostring(player.UserId)
-- four writes for one player
DataStoreService:GetDataStore("Coins"):SetAsync(id, 100)
DataStoreService:GetDataStore("Gems"):SetAsync(id, 5)
DataStoreService:GetDataStore("Level"):SetAsync(id, 3)
DataStoreService:GetDataStore("Wins"):SetAsync(id, 12)
end)
Save one table per player in one store: one request instead of four.
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local store = DataStoreService:GetDataStore("PlayerData_v1")
Players.PlayerRemoving:Connect(function(player: Player)
local data = { Coins = 100, Gems = 5, Level = 3, Wins = 12 }
local ok, err = pcall(function()
store:SetAsync(tostring(player.UserId), data)
end)
if not ok then
warn("[SaveData] save failed:", err)
end
end)
A loop or a retry with no wait
A while loop that saves every second, or a retry that tries again straight away after a failure, keeps hammering the same key.
local DataStoreService = game:GetService("DataStoreService")
local store = DataStoreService:GetDataStore("ServerStats")
-- retries instantly, many times a second, while throttled
repeat
local ok = pcall(function()
store:IncrementAsync("Visits", 1)
end)
until ok
Retry a few times with a growing wait between tries, then give up and report it.
local DataStoreService = game:GetService("DataStoreService")
local store = DataStoreService:GetDataStore("ServerStats")
local MAX_TRIES = 4
for attempt = 1, MAX_TRIES do
local ok, err = pcall(function()
store:IncrementAsync("Visits", 1)
end)
if ok then
break
end
warn(`[Stats] attempt {attempt} failed: {err}`)
task.wait(2 ^ attempt) -- 2, 4, 8, 16 seconds
end
Fix it in your place
Paste the error, RoCode fixes it in your place
Copy the line from Output and paste it here. RoCode opens the script it names in the place you have open in Studio, works out which of the causes above it is, and edits the code there instead of handing you a snippet to paste.
RoCode is an AI agent for Roblox Studio: it reads the scripts in the place you have open, finds the line and edits it there, and every change is an undo point. It runs on Windows or macOS with a desktop browser. Free to start, with free credits every day.
How to find the line that causes it
- The warning names the key:
Key = 123456789is usually a player's UserId. Search your scripts (Ctrl+Shift+F) forSetAsync,UpdateAsync,IncrementAsyncandGetAsync. - For each call, ask how often it runs. Anything inside a
Changedhandler, aTouchedhandler or a fast loop is the likely culprit. DataStoreService:GetRequestBudgetForRequestType(Enum.DataStoreRequestType.SetIncrementAsync)prints how many write requests are left right now, which helps you watch the budget while you test.
Questions
How many data store requests can I make?
Roblox publishes the limits: for standard reads and writes, 60 plus 40 per player, per minute, per server, plus a burst when a server starts.
Is the queue warning an error?
No, the request still runs, just later. The errors 301 to 306 are the ones to worry about: they mean a request was dropped and that data was not saved or loaded.
How often should I autosave?
Every few minutes is plenty, plus a save when the player leaves and when the server shuts down (game:BindToClose). Saving more often does not make data safer if it hits the limits.
Can RoCode fix it?
Yes. Paste the warning into RoCode. It finds the data store calls in your open place and rewrites them to save one table per player, on leave and on an autosave, with retries.
Sources and further reading
- Roblox Creator Docs: data store error codes and limits. codes 301 to 306, 30 requests per queue, 60 + numPlayers × 40 per minute
- Roblox Creator Docs: DataStoreService:GetRequestBudgetForRequestType
- Roblox DevForum: DataStore request was added to queue (thread)
- Roblox DevForum: DataStore request was added to queue whereas only one SetAsync
How the code was checked: every block marked Fixed passes Luau's strict type checker against Roblox's API definitions (luau-lsp, 23 October 2026), and every block marked Breaks compiles and fails only when it runs. The warning text is quoted as DevForum posts show it; newer Studio builds may word it differently, and the current Studio build also holds the shorter form "Request was throttled. Try sending fewer requests. Key = ...". The 301 to 306 messages were checked against the message strings in Roblox Studio itself (macOS build of 13 October 2026), and the limits against the data store error codes and limits page, on 23 October 2026. A type check catches misspelt APIs and wrong types, not game logic, so playtest in Studio before you publish.