Roblox Studio warning

DataStore request was added to queue

What DataStore request was added to queue means in Roblox Studio, the three things that cause it with the code that triggers each, and the fix for each one.

Updated 23 October 20264 min readWarningLuau

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 × players requests a minute per server (from Roblox's limits page), plus a burst when the server starts.
On this page
  1. What it means
  2. Causes and fixes
  3. Fix it with RoCode
  4. Find the line
  5. Questions
  6. Sources

What the message means

Output (example)
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 = 123456789
  • 302: 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.

Breaks Script in ServerScriptService named SaveData
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.

Fixed Script in ServerScriptService named SaveData
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.

Breaks Script in ServerScriptService named SaveData
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.

Fixed Script in ServerScriptService named SaveData
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.

Breaks Script in ServerScriptService named Stats
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.

Fixed Script in ServerScriptService named Stats
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.

For example: DataStore request was added to queue. If request queue fills, further requests will be dropped. Try sending fewer requests.Key = 123456789

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

  1. The warning names the key: Key = 123456789 is usually a player's UserId. Search your scripts (Ctrl+Shift+F) for SetAsync, UpdateAsync, IncrementAsync and GetAsync.
  2. For each call, ask how often it runs. Anything inside a Changed handler, a Touched handler or a fast loop is the likely culprit.
  3. 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

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.

Stop hunting errors line by line.

RoCode reads the scripts in your open place, fixes the error where it happens and tells you what it changed. Free every day, no card required.