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.