Quick answer: Check that timeout is connected to a handler, process_mode is not Disabled, and the Timer’s parent tree is not paused. Timers fire independently of your script — the problem is almost always signal wiring or a paused tree.

Here is how to fix Godot Timer autostart not firing. You add a Timer node, set wait_time to 2.0, check Autostart. You connect timeout to a method. You run the scene. Nothing happens. Two seconds pass, four, ten — the timeout handler never fires. Timer is one of Godot’s simpler nodes but has a few gotchas that produce silent silence.

The Symptom

A Timer with Autostart and a connected timeout signal does not produce any timeout events. The handler function never runs. No error. timer.is_stopped() may return true (it never started) or false (it is running but signal is not connected).

What Causes This

timeout signal not connected. Autostart starts the timer counting down. But without a connection to the timeout signal, nothing happens when it reaches zero except the signal fires into the void. In the editor, check the Node panel’s Signals tab — timeout should have a green dot indicating connection.

Handler method renamed or missing. If you had a connection to _on_timer_timeout and renamed the method to _on_my_timer_timeout, the signal connection still points to the old name. Godot silently leaves the connection broken.

Process mode disabled or wrong. A Timer with process_mode = PROCESS_MODE_DISABLED does not tick. A Timer in a paused tree also does not tick unless its process_mode is ALWAYS.

Autostart set in code after scene load. Setting autostart = true in _ready() is too late — autostart is a property read during node initialization, not when _ready fires. Set via editor or call start() explicitly in _ready.

one_shot with expectations of repeat. With one_shot = true, the timer fires once and stops. If you wanted recurring fires, the second timeout never comes.

The Fix

Step 1: Verify signal connection in editor. Select the Timer node. In the Node dock (right side), switch to the Signals tab. Find timeout(). Click to connect. Pick the script and method. The method appears in the script with a pre-filled body.

extends Node

@onready var timer: Timer = $Timer

func _ready():
    # Code-side connection as alternative
    timer.timeout.connect(_on_timer_timeout)

func _on_timer_timeout():
    print("Timer fired!")

Use either editor connection OR code connection — not both, or you get duplicate firings. If unsure, prefer code connections; they survive renames when you use the method reference.

Step 2: Configure Timer properties. In the Inspector:

Step 3: Trigger explicitly if autostart misbehaves. If Autostart is unreliable due to scene loading order, call start() in _ready:

func _ready():
    $Timer.start() # force-start regardless of autostart value

Step 4: Handle paused trees. For a Timer on a node tree that can be paused (game pause), set process_mode = PROCESS_MODE_ALWAYS so the timer keeps running:

func _ready():
    $PauseMenuTimer.process_mode = Node.PROCESS_MODE_ALWAYS

Without this, pause stops the timer along with gameplay, which may or may not be what you want.

Awaiting Timeout

An alternative to signals: await the timeout directly:

func do_delayed_action():
    var t = get_tree().create_timer(2.0)
    await t.timeout
    print("Two seconds later")

This uses SceneTree’s create_timer instead of a Timer node. Simpler for one-shot delays in coroutine-style code. No signal connection needed.

Debugging Checklist

If Timer still does not fire:

  1. Print state: print(timer.is_stopped(), timer.time_left) in _process — you see whether it is running
  2. Add a debug timeout.connect(func(): print("fired")) to verify at least one handler exists
  3. Check that the Timer is actually added to the tree — an orphaned Timer does not tick
  4. Confirm the scene is playing (F6 single scene or F5 project)

“Timers are simple. When one does not fire, the answer is almost always signal connection or process mode.”

Related Issues

For AnimationPlayer issues, see AnimationPlayer Not Playing on Ready. For await-based patterns, Await Signal Never Completing covers related async issues.

Signal connected, process_mode not disabled, scene not paused. Three checks, Timer fires.