I, and many other developers, prefer the method he does. I happen to use one RemoteEvent for everything and use it like this
ReplicatedStorage.RemoteEvent.OnServerEvent:Connect(function(player, request, ...)
local args = {...}
if request == "BuyItem" then
buy(player, args[1])
end
end)
It could be that the event that errors and the event that changes the color are separate.
Try adding in a print to see how many times in total the callback runs – it might be just the first time it runs where it errors, or a time after the first.