Routing and Navigation
Routing determines where a visitor goes next when they click a “Continue” button (or any element with a Go to Next Page action). Each page defines its own routes — a list of possible destinations evaluated against the visitor’s current variable state.
How Routing Works
Every page has a Routes list in the editor. When the goToNextPage action fires, the system evaluates these routes top to bottom:
- Sort routes by their defined order
- For each route, check its condition against the current variables
- The first route whose condition matches wins — the visitor navigates to that route’s target page
- A route with no condition always matches — this is the fallback
This is the same if/else-if/else model used by Dynamic Properties. Order matters: put your most specific conditions first and your fallback last.
Insert image: The Routes panel in the editor showing a list of routes for a page, with conditional routes (variable, operator, value fields) and a fallback route at the bottom
Always include a fallback route (a route with no condition) as the last entry. If no route matches, the visitor stays on the current page with no navigation — which is almost never the intended behavior.
Simple Linear Routes
Most funnel pages use straightforward sequential routing: Page A goes to Page B, Page B goes to Page C, and so on.
To set up a linear route, add a single route on the page with:
- Target page: the next page in the sequence
- Condition: none (leave empty)
Page: Welcome
└─ Route 1: → Quiz Page (no condition)
Page: Quiz Page
└─ Route 1: → Email Page (no condition)
Page: Email Page
└─ Route 1: → Paywall (no condition)For a simple linear funnel, every page has exactly one route with no condition. The visitor progresses straight through.
Conditional Branching
Conditional routes let you send visitors down different paths based on their answers, behavior, or any variable value. This is where routing becomes powerful.
Example: Skill-Based Branching
After a quiz question asking about experience level, route experienced users to an advanced product pitch and beginners to an educational intro:
Page: Experience Level
├─ Route 1: → Advanced Path (condition: answers.experience equals "advanced")
├─ Route 2: → Advanced Path (condition: answers.experience equals "intermediate")
└─ Route 3: → Beginner Intro (no condition — fallback)The system checks Route 1 first. If answers.experience is "advanced", the visitor goes to Advanced Path. If not, it checks Route 2. If neither matches, Route 3 (the fallback) sends them to Beginner Intro.
Example: Goal-Based Branching
Route visitors to different paywall pages based on their stated goal:
Page: Income Goal
├─ Route 1: → High-Tier Paywall (condition: answers.incomeGoal greaterThan 5000)
├─ Route 2: → Mid-Tier Paywall (condition: answers.incomeGoal greaterThan 1000)
└─ Route 3: → Starter Paywall (no condition — fallback)Example: Multi-Condition Routes
Routes support condition groups with AND/OR logic for complex branching:
Page: Qualification
├─ Route 1: → Premium Offer
│ Condition Group (AND):
│ - answers.experience equals "advanced"
│ - answers.incomeGoal greaterThan 5000
└─ Route 2: → Standard Offer (no condition — fallback)Both conditions must be true for Route 1 to match.
Condition Operators
Route conditions use the same operators as variable conditions — equals, notEquals, contains, greaterThan, lessThan, exists, includes, and more. See the Condition Operator Reference for the full list.
Conditions also support Liquid expressions as the left-hand value for computed comparisons.
Back Navigation
The Go Back action does not evaluate routes in reverse. Instead, it navigates the visitor’s actual page history.
AppFunnel maintains a history stack per session. Every time a visitor navigates forward (via a route), the current page is pushed onto the stack. Go Back pops the most recent entry and returns to that page.
This means:
- If a visitor skipped pages due to conditional routing, Go Back returns to the page they actually came from — not the page that would be “previous” in the page list
- The history persists across the session, so it survives page refreshes
- If the history stack is empty (visitor is on the first page), Go Back does nothing
Visitor path: Welcome → Quiz → Advanced Path → Paywall
Go Back from Paywall → Advanced Path
Go Back from Advanced Path → Quiz
Go Back from Quiz → WelcomeA different visitor who took the beginner path would have a different history:
Visitor path: Welcome → Quiz → Beginner Intro → Paywall
Go Back from Paywall → Beginner IntroBest Practices
- Put specific conditions first, fallback last. Routes evaluate top-to-bottom — if your fallback is first, conditional routes below it will never be reached.
- Test every branch. Use the editor preview with different variable values to verify that each conditional path works as intended.
- Use route conditions for navigation, not visibility. If you need to show or hide content on the same page based on variables, use Dynamic Properties instead. Routes are for deciding which page comes next.
- Keep branching shallow. Deep branching trees (3+ levels) become difficult to maintain. Consider merging paths back to shared pages where possible.