Quick answer: Set the replication condition to COND_None for state visible to all clients. Use COND_OwnerOnly only for owner-private values (loadout details, inventory).

Health bar over enemies updates for the owning player but not for spectators. Variable is replicated — just with the wrong scope condition.

The Symptom

RepNotify fires on owner. Other clients don’t see the change. Server logs show the change applied authoritatively.

The Fix

// C++
void ACharacter::GetLifetimeReplicatedProps(
    TArray<FLifetimeProperty>& OutLifetimeProps) const {

    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(ACharacter, Health);   // COND_None implicit
    DOREPLIFETIME_CONDITION(ACharacter, Inventory, COND_OwnerOnly);
}

// Blueprint
// Variable Details → Replication: Replicated (or RepNotify)
// Replication Condition: None (for visible-to-all)

For Blueprint variables, the condition dropdown sits next to the Replication checkbox. Default is None — if you changed it, change it back unless you really want owner-only.

Common Wrong Choice

Players ticking OwnerOnly as a security thought. But health is publicly visible by gameplay; replicating only to owner just hides it from teammates’ UI. Use server-side validation for security, not client-side replication scope.

Verifying

Two-client PIE. Server damages enemy. Both clients see health update.

“Public state: COND_None. Private state: COND_OwnerOnly. RPC for events.”

Related Issues

For Anim BP state alias, see state alias. For Niagara collision event, see collision event.

Right scope. State propagates.