Firstly, I have a Module script that controls the DataStore functions (GetAsync, SetAsync, etc.), which is here;

local dataManipulation = {}
local dss=game:GetService("DataStoreService"):GetDataStore("HasPlayed","PlayerData")

function dataManipulation:GetPlayerData(player,key)
	dss:GetAsync(key)
	print("Got "..player.Name.."'s Data")
end

function dataManipulation:SavePlayerData(player,key,value)
	local success,message=pcall(function()
		dss:UpdateAsync(key,function(oldvalue)
			local newVal=oldvalue or 0
			newVal=value
			return newVal
		end)
	end)
	if not success then
		print("AN ERROR OCCURRED: "..'"'..message..'"')
	else
		print("Saved "..player.Name.."'s Data!")
	end
end

function dataManipulation:SaveForLeavingPlayer(player,key,value)
	dss:SetAsync(key,value)
	print("Saved "..player.Name.."'s Data (player left)")
end


return dataManipulation


What I'm trying to do is save a Value when the new player joins and says, "I understand", this is the Server Script;

game.Players.PlayerAdded:connect(function(player)
	player.PlayerGui:WaitForChild("Intro")
	player.Chatted:connect(function(msg)
		if string.sub(string.lower(msg),1,12)==string.lower("I Understand") then
			pu:FireClient(player)
		end
	end)
end)

This is the Local Script;

local player=game.Players.LocalPlayer
local pu=game.ReplicatedStorage:WaitForChild("PlayerUnderstands")
local ds=require(game:GetService("ServerScriptService"):WaitForChild("DataModule"))

local intro=script.Intro:Clone()
intro.Parent=player.PlayerGui

pu.OnClientEvent:connect(function()
	intro:Destroy()
	local hasPlayed=player.PlayerStats.HasPlayed
	hasPlayed.Value=true
	local valueToSave={hasPlayed.Value}
	ds:SavePlayerData(player,player.UserId,valueToSave)
end)

And I have the Load and Save script here;

local ds=require(game.ServerScriptService.DataModule)

game.Players.PlayerAdded:connect(function(player)
	local data=ds:GetPlayerData(player,player.UserId)
	if data then
		print("Data Found")
	else
		print("No data found")
	end
end)

game.Players.PlayerRemoving:connect(function(player)
	local valuesToSave={player.PlayerStats.HasPlayed.Value}
	ds:SaveForLeavingPlayer(player,player.UserId,valuesToSave)
end)

When I join and say "I understand" it says it saves, but when I join again it says "No data found".