Conditional Navigation on Screen Load — without breaking Power Apps

April 13, 2026
By: Chad Schadewald

Summary: Power Apps blocks Navigate() inside OnVisible — and for good reason. Here's the clean workaround using a hidden timer that lets you auto-route users based on their security role.

The problem

What you actually want to do

Imagine your app has a main menu screen with a dropdown that routes users to different screens. Some users — based on their security role — only ever have access to a single option. Forcing them to click that one option every time is redundant. Ideally, the app detects this and sends them straight to their destination the moment the screen loads.

The natural instinct is to put a Navigate() call directly inside the screen's OnVisible behavior formula. But Power Apps won't let you do that.

Why Power Apps blocks this

Power Apps deliberately prevents Navigate() from running inside OnVisible as a guardrail against navigation loops — where two screens endlessly bounce users back and forth.

Classic navigation loop

Screen A's OnVisible navigates to Screen B. Screen B's OnVisible navigates back to Screen A. The app enters an unstable state with no way out.

Power Apps error: Navigate cannot be used in OnVisible since it would automatically always navigate away from this screen
Power Apps surfaces this error when you attempt to call Navigate() directly inside OnVisible

Even if your specific scenario has no loop risk, the platform enforces this restriction universally to prevent unpredictable app states.

The workaround — indirect navigation via a hidden timer

The trick is to break the direct connection between OnVisible and Navigate(). Instead of navigating directly, you use OnVisible to signal intent — setting a variable — and then a hidden Timer control responds to that signal and performs the actual navigation.

Screen becomes visible
OnVisible sets variable
Timer detects variable = true
OnTimerEnd navigates

This indirection is enough to satisfy Power Apps' restrictions, because Navigate() is no longer running inside OnVisible itself.

Step-by-step implementation

Step 1 — Set a variable in OnVisible

In your screen's OnVisible property, check the user's condition and set a navigation variable accordingly. Do not call Navigate() here.

Power Fx · OnVisible
If(
    varUserOption1,
    Set(
      varNavigationVariable,
      true
    ),
    Set(
      varNavigationVariable,
      false
    )
)
Power Apps formula bar showing OnVisible with If(varUserOption1, Set(varNavigationVariable, true), Set(varNavigationVariable, false))
OnVisible sets varNavigationVariable based on the user's condition — no Navigate() call in sight

Step 2 — Add a hidden Timer control

Insert a Timer control onto the screen. Configure its properties as follows:

PropertyValueReason
StartvarNavigationVariableTimer activates when the variable is true
Duration1010ms — fast enough to feel instant, slow enough to decouple from OnVisible
AutoStartfalsePrevents the timer from running on its own without the variable being set
RepeatfalseEnsures it only fires once per trigger, not on a loop
VisiblefalseHides the control from users — it's a background mechanism only
Power Apps formula bar showing the Timer's Start property set to varNavigationVariable
The Timer's Start property is set to varNavigationVariable — it activates the moment the variable becomes true

Step 3 — Navigate in OnTimerEnd

In the timer's OnTimerEnd property, reset the navigation variable and then call Navigate(). Resetting the variable first is important — it prevents the timer from re-triggering if the user returns to this screen later.

Power Fx · OnTimerEnd
// Reset the variable first to prevent re-trigger
Set(varNavigationVariable, false);

// Then navigate to the appropriate screen
Navigate(Screen1)
Power Apps formula bar showing OnTimerEnd with Set(varNavigationVariable, false) followed by Navigate(Screen1)
OnTimerEnd resets the variable first, then calls Navigate() — the variable reset is what prevents an infinite redirect loop
Important — reset before navigating

Always reset varNavigationVariable to false before calling Navigate(). If you navigate first and the variable is still true when the user returns to this screen, the timer will fire again and immediately redirect them, which is likely not what you want.

Why a duration of 10ms?

The timer duration can be anywhere in the range of 1–50ms. The exact value doesn't matter much — the key is that it's non-zero. Any positive duration is enough to break the synchronous chain between OnVisible and the navigation call, which is all Power Apps needs to allow it. Users won't perceive a 10ms delay.

The result

What you get

Users with a single available option are automatically routed to their destination the moment they land on the screen — no extra clicks required. Users with multiple options see the normal menu and experience no change. Both paths coexist cleanly in the same screen.

This pattern works for any conditional routing scenario on screen load: role-based redirects, first-time-use flows, feature flag gates, or A/B routing. Anywhere you'd want to say "if this condition is true when the screen opens, go somewhere else" — the hidden timer approach gets you there without fighting the platform.

Final thoughts

Power Apps is a powerful platform, but it has its share of guardrails that aren't always obvious — and working around them cleanly takes experience. The hidden timer pattern is just one example of the kind of institutional knowledge that separates a polished, production-ready app from one that fights its users.

At Strabo, we build and optimize Power Apps solutions for organizations that need them to actually work — not just technically function, but feel seamless to the people using them every day. If your team is running into limitations like this one, or you're not sure your current Power Apps implementation is as efficient as it could be, we'd love to take a look.

Reach out to the Strabo team to talk through your Power Apps environment. Whether you're starting from scratch or untangling an existing build, we'll help you find the right path forward.