The script is perfect but it just doesn't change cash value in-game I honestly don't know what's wrong with it. Cash is stored in Serverstorage called "Moneystorage"

This is the script for the GUI to buy money

Market = game:GetService("MarketplaceService")
Player = game.Players.LocalPlayer
GUI = script.Parent
Buttons = GUI:WaitForChild("Buttons")
DevProds = {
	{"1K",43938448};
	{"2.5K",43938430};
	{"5K",43938361};
	{"10K",43938334};
	{"100K",0};
	{"250K",0};
	{"1M",0};
	{"2M",0};
}
GamePasses = {
	{"Bonus",551506583};
	{"Infinite",551507212};
}

for k,v in pairs(DevProds) do
	local button = Buttons:WaitForChild(v[1])
	button.MouseButton1Click:connect(function()
		Market:PromptProductPurchase(Player,v[2])
	end)
end

for k,v in pairs(GamePasses) do
	local button = Buttons:WaitForChild(v[1])
	button.MouseButton1Click:connect(function()
		Market:PromptPurchase(Player,v[2])
	end)
end

And here is the Event handler

local Market,PurchaseHistory
testing = false
DevProds = {
	{1000,43938448};
	{5000,43938430};
	{10000,43938361};
	{25000,43938334};
}
GamePasses = {
	{14000,551506583};
	{1e7,551507212};
}

function AddMoney(player,amount)
	local cashmoney = game.ServerStorage:WaitForChild("MoneyStorage"):WaitForChild(player.Name)
	cashmoney.Value = cashmoney.Value+amount
end

function updateValues()
	if Market == nil then
		Market = game:GetService("MarketplaceService")
	end
	if PurchaseHistory == nil and testing == false then
		PurchaseHistory = game:GetService("DataStoreService"):GetDataStore("PurchaseHistory")
	end
end

game.Players.PlayerAdded:connect(function(player)
	updateValues()
	if player:IsInGroup(2767505) then
		local cashmoney = game.ServerStorage.MoneyStorage:FindFirstChild(plr.Name)
		if cashmoney then
			cashmoney.Value = cashmoney.Value + 500
		end
	end
	for _,v in pairs(GamePasses) do
		if Market:PlayerOwnsAsset(player,v[2]) or v.userId == 157510912 then
			AddMoney(player,v[1])
		end
	end
end)

function Market.ProcessReceipt(receiptInfo)
	updateValues()
	local playerProductKey = receiptInfo.PlayerId..":"..receiptInfo.PurchaseId
	if testing == false and PurchaseHistory:GetAsync(playerProductKey) then
		return Enum.ProductPurchaseDecision.PurchaseGranted
	end
	local player = game:GetService("Players"):GetPlayerByUserId(receiptInfo.PlayerId)
	if player == nil then
		return Enum.ProductPurchaseDecision.NotProcessedYet
	end
	for _,v in pairs(DevProds) do
		if v[2] == receiptInfo.ProductId then
			AddMoney(player,v[1])
		end
	end
	if testing == false then
		PurchaseHistory:SetAsync(playerProductKey,true)
	end
	return Enum.ProductPurchaseDecision.PurchaseGranted	
end

Market.PromptPurchaseFinished:connect(function(player,assetId,purchased)
	if not purchased then
		return
	end
	for _,v in pairs(GamePasses) do
		if v[2] == assetId then
			AddMoney(player,v[1])
		end
	end
end)