How to Fix a RemoteEvent Not Firing in Roblox

Quick answer: A RemoteEvent that seems not to fire usually did fire: nobody was listening, or the listener ran in the wrong VM. Verify both scripts run where they should, connect before the first fire, and match instance names exactly.

If FireServer runs and nothing happens, the event usually did fire. Nobody was listening, or the listener is in the wrong VM. Roblox will not error just because zero functions are connected. You get silence.

A RemoteEvent is a one-way message across the client-server boundary. The Instance has to exist in a replicated container (almost always ReplicatedStorage). A LocalScript calls FireServer. A server Script connects OnServerEvent. Swap those roles and the message goes nowhere.

Luablox.dev is a Luau course with a live editor and practice problems, not an exploit or executor. luablox.com is a different site.

Sanity-check the plumbing first

Walk this list before you change game logic.

1. The Instance exists and both sides wait for it.

-- LocalScript (client)
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local buyItem = ReplicatedStorage:WaitForChild("BuyItem")
print("client firing")
buyItem:FireServer("Sword")
-- Script in ServerScriptService
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local buyItem = ReplicatedStorage:WaitForChild("BuyItem")

buyItem.OnServerEvent:Connect(function(player, itemName)
	print("server got", player.Name, itemName)
end)

If the client print runs and the server print does not, you have the wrong remote, the wrong event (OnClientEvent on the server), or the server script is not running.

2. Script types and locations.

You wroteMust live inListens withFires with
Server handlerScript in ServerScriptServiceOnServerEventFireClient / FireAllClients
Client handlerLocalScript in PlayerScripts, character, or PlayerGuiOnClientEventFireServer

A Script under ReplicatedStorage does not run. A LocalScript under ServerScriptService does not run. That pair is the most common "it never fires" setup: the remote is real, the code never started.

3. Connect before the first fire. Connect is not retroactive. If the server yields for three seconds, then connects, a client that fired on join already missed it. Connect at the top of the server script.

4. Names match exactly. BuyItem and buyItem are different Instances. WaitForChild on the wrong string hangs (you will see Infinite yield possible) and FireServer never runs.

5. You used a RemoteEvent, not a BindableEvent. Bindables stay inside one VM. They will not cross client and server.

Sanity-check the arguments second

When the server print does run, the next failures look like "not firing" because your handler returns immediately. The first argument on the server is always the Player. If you treat that player as your item name, type checks fail and you return.

buyItem.OnServerEvent:Connect(function(player, itemName)
	if typeof(itemName) ~= "string" then
		return
	end
	if itemName ~= "Sword" and itemName ~= "Shield" then
		return
	end
	-- grant the item on the server only
end)

Validate type, then an allow-list, then any quantity range. Do that on the server every time. The client can send anything. The server decides what is real. That is the same rule as the remotes theory lesson: never trust client input.

If you need a value back, that is a RemoteFunction and InvokeServer, not a RemoteEvent. Mixing them is another way to get silence.

Quick Output test

Add the two print lines above. Play Solo and watch the Output switcher for Client vs Server. Client print only: the server script is not running or not connected. Server print only: you are firing from the server with FireServer (that API is for the client). Both prints: the remote works, and the bug is inside the handler.

The free remotes theory page is the client-server map for FireServer, OnServerEvent, and why validation belongs on the server. First lessons are free. Premium unlocks the full curriculum. You can keep practicing in the live editor, where plain-English errors flag a missing type check.

Next: RemoteEvents & RemoteFunctions

Frequently asked questions

Why does my RemoteEvent fire but nothing happens?

Usually nobody is listening, or the listener never started. A Script inside ReplicatedStorage does not run, and a LocalScript inside ServerScriptService does not either. Check that both scripts sit in a container that runs for their own VM.

What is the first argument of OnServerEvent?

The Player who fired the event. If you treat that player as your first payload argument, type checks fail and the handler returns silently. Payload arguments start from the second parameter.

Should I use WaitForChild with RemoteEvents?

Yes, when the client needs a remote that replicates after LocalScripts start. A missing or misspelled name shows the Infinite yield possible warning, which points at the wrong path or parent container.

When should I use a RemoteFunction instead?

When the caller needs a value back. RemoteEvent is one-way messaging with FireServer and OnServerEvent, while RemoteFunction uses InvokeServer and returns the server result to the client.

Explore Luau networking concepts in Roblox Studio, covering RemoteEvents, RemoteFunctions, and secure client-server replication.

Related pages