Quick answer: Use k_ELeaderboardUploadScoreMethodKeepBest for high-score boards and k_ELeaderboardUploadScoreMethodForceUpdate when you must always overwrite, and set the board's sort direction to match.
If a player's new score never appears, the upload method may be silently keeping the old one. KeepBest compares using the leaderboard's sort direction, which is easy to get backwards for lower-is-better times.
How to fix it
1. Pick the right method
Pass k_ELeaderboardUploadScoreMethodKeepBest to keep only improvements, or k_ELeaderboardUploadScoreMethodForceUpdate to always overwrite. ForceUpdate is correct for anti-cheat re-submission or non-score values.
2. Match the sort direction
Set the leaderboard's sort to Ascending for lower-is-better (lap times) so KeepBest treats a smaller value as better. A wrong direction makes it reject your real best.
3. Confirm the result
Check the LeaderboardScoreUploaded_t callback's m_bScoreChanged flag. If it is false with KeepBest, the score was not an improvement, not a bug.
Catching the ones you can't reproduce
The hardest version of this to fix is the one you can't reproduce — it only happens on a player's hardware, OS, driver, or save state, under conditions that simply aren't present on your machine. A report that says “it crashed” or “it froze” gives you nothing to act on, so the bug survives release after release while quietly costing you players.
Automatic error capture closes that gap. Each failure arrives with its full stack trace, the device and OS, the build number, and a breadcrumb trail of what the player did right before it broke, so even a failure you have never seen becomes a specific, reproducible issue. Fold identical failures into one signature ranked by how many players each hits, and your worklist sorts itself worst-first instead of arriving as a stream of vague complaints.
This is where a tool like Bugnet earns its place. Its SDK captures every error automatically with the full stack trace plus device, OS, memory, build, and game-state context, folds duplicates into one grouped issue with an occurrence count, and ties each to the build it first appeared on — so you fix the problem that hurts the most players first and confirm it is gone when its signature disappears from the next release.
Ship the fix, watch the signature disappear from the next build. That's how you know it's really gone.