Quick answer: Clamp the elapsed offline time to a maximum accrual window before multiplying by the rate, so income tops out at the designed cap no matter how long the player was away.

If a player who returns after a week instantly affords everything, your offline accrual has no ceiling. Capping elapsed offline time before computing income keeps idle rewards in line. Here is how.

How to fix it

1. Clamp elapsed time

Compute elapsed offline seconds, then clamp it to a maximum accrual window (e.g. 8 or 24 hours) before multiplying by the production rate.

2. Use a trusted clock

Base elapsed time on server UTC or a monotonic source where possible, so a forward clock change cannot inflate the accrued window.

3. Show the capped amount

Display the actual capped income on return and, if you want retention pressure, tell the player the cap was reached so they know to come back sooner.

4. Reset the accrual anchor

After granting, store the current timestamp as the new anchor so the next offline period starts fresh and income is not double-counted.

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 Godot 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.

The bug you can't reproduce isn't gone — it's just invisible until you capture it from the player's device.