Quick answer: Both Area3Ds need monitoring and monitorable = true. Match collision_layer / collision_mask. Connect to area_entered, not body_entered. CollisionShape3D resources must be set.

Two Area3Ds overlap. Neither emits area_entered. The seer's monitoring is on, but the seen Area has monitorable disabled, so the seer doesn't see it.

The Symptom

Area-to-Area overlap doesn’t fire signals. Body-to-Area works, just not Area-to-Area.

The Fix

Sensor (Area3D - the seer):
  monitoring:    true      # detect other Areas/Bodies
  monitorable:   true      # can be seen too (optional but symmetric)
  collision_mask: bit 3     # detect things on layer 3

Trigger (Area3D - the seen):
  monitoring:     false    # doesn't need to see anything
  monitorable:    true     # MUST be true to be seen
  collision_layer: bit 3    # sits on layer 3

Connect the signal.

extends Area3D

func _ready() -> void:
    area_entered.connect(_on_area_entered)

func _on_area_entered(other: Area3D) -> void:
    print("Area entered: ", other.name)

Spawned-Inside Edge Case

area_entered fires only on transition. If a trigger spawns already overlapping a sensor, the signal doesn’t retroactively fire. Use get_overlapping_areas() in _ready for initial state.

Verifying

Drop two Area3Ds into a scene with overlapping shapes. Run; print should fire. Toggle monitorable off on one; print stops. Confirms each flag’s contribution.

“monitoring on seer. monitorable on seen. Layers match. area_entered fires.”

Related Issues

For Area2D body_entered, see Area2D signals. For physics interpolation, see interpolation.

Both flags. Layers align. Signals fire.