Quick answer: Store the Timer Handle that “Set Timer by Event” returns into a variable. Clear with Clear and Invalidate Timer by Handle using that exact variable.
A repeating Blueprint timer keeps firing even after “Clear Timer”. The clear node got a fresh/empty handle instead of the one from Set Timer.
Capture the Handle
“Set Timer by Event” has a Return Value output of type Timer Handle. Promote it to a variable (e.g. SpawnTimerHandle). That variable is the timer.
Clear With the Same Handle
Clear and Invalidate Timer by Handle
Handle: SpawnTimerHandle <-- the stored variable
If you drag out a new, blank Timer Handle (the default), the clear node targets nothing — the real timer keeps running.
Don't Clear by Event Name
“Clear Timer by Function Name” works for function timers but is fragile for event-based ones. Handle-based clearing is exact and rename-safe.
Re-Setting Overwrites the Variable
If you call Set Timer by Event again, store the new return value back into the same variable — otherwise you lose the handle to the now-running timer and can never clear it.
Clear on EndPlay
Always clear active timers in EndPlay (or the actor’s destruction). A timer outliving its owner’s logic is the classic “ghost behaviour after death” bug.
Verifying
Start the repeating timer, then clear it — it stops immediately. Re-set and re-clear works each cycle. No leftover ticks after the owner is destroyed.
“The Timer Handle is the timer. Store it, clear by it, overwrite it when you re-set.”
Name handle variables after what they do (SpawnTimerHandle, RegenTimerHandle) — a graph full of generic ‘Timer Handle’ pins is a clearing bug waiting to happen.