Problem Summary (What is actually happening)
After upgrading from Mendix 9 to Mendix 10, a page:
Keeps loading forever (spinner never stops)
Shows no runtime errors
Shows no clear browser console errors
Works perfectly in Mendix 9
Fails consistently in Mendix 10 (including Test environment)
This is a classic Mendix 9 → 10 migration issue, and the key detail is this:
Mendix 10 introduced stricter client lifecycle handling, stricter data loading rules, and more async behavior in pages, nanoflows, and widgets.
So what Mendix 9 silently tolerated, Mendix 10 will wait on forever if something never resolves — without necessarily throwing an error.
Why This Happens in Mendix 10 (Root Causes)
An endless page loader in Mendix almost always means:
The page is waiting for something that never completes
In Mendix 10, this usually comes from one of the following five categories.
1. Page Datasource Microflow / Nanoflow Never Returns Properly
Why Mendix 10 behaves differently
In Mendix 9:
A datasource microflow could return empty, null, or partially loaded data
The client sometimes still rendered the page
In Mendix 10:
The page will not render until the datasource finishes cleanly
If the microflow:
Never reaches an End Event
Hits a loop condition
Waits on async logic
Returns an invalid object→ The loader spins forever
How to confirm
Open the page
Check:
Page → Data source
Context widget → Microflow/Nanoflow
Put a log statement at the very first and very last activity of the microflow
Start → Log "Datasource START"
End → Log "Datasource END"
If you see START but not END in the logs, you’ve found the issue.
Common mistakes after upgrade
Microflow returns empty list when page expects single object
Microflow returns null object
Exception is caught silently and flow ends without return
Retrieve with XPath that now fails due to security changes
Fix
Ensure the microflow:
Always reaches End Event
Always returns the correct type
Handles empty results explicitly
Best practice:
If retrieved object = empty
→ Create empty helper object
→ Return helper
2. Nanoflow + JavaScript Action Deadlock (Very Common in M10)
Why this breaks in Mendix 10
Mendix 10:
Uses modern async JS execution
Nanoflows are fully asynchronous
If a JavaScript action:
Never resolves
Never calls resolve()
Waits for something unavailable→ The nanoflow never finishes→ Page never loads
Mendix 9 was more forgiving and often ignored this.
How to identify
Check if the page has:
Nanoflow datasource
On Page Load nanoflow
Widgets that internally use nanoflows
Then inspect any JavaScript actions used inside.
Typical problematic JS code
return new Promise((resolve, reject) => {
// async logic
// resolve() is never called
});
Fix
Ensure every JavaScript action:
Calls resolve(value)
Or reject(error)
Never exits silently
Add logging inside JS actions:
console.log("JS Action started");
console.log("JS Action resolved");
3. Custom Widgets Not Fully Mendix 10 Compatible
This is one of the TOP causes
Even if:
Widget loads
No error in console
App compiles
The widget may:
Block page rendering
Break React lifecycle
Never notify Mendix that it is “ready”
Why no error is shown
React 18 (used in Mendix 10):
Suppresses some lifecycle errors
Fails silently in production mode
How to test quickly
Duplicate the page
Remove all custom widgets
Test page load
If it loads:
Add widgets back one by one
You’ll find the blocker
Typical problematic widgets
Old community widgets built for Mx 8/9
Widgets using:
mx.data.subscribe
Deprecated client APIs
Direct DOM manipulation
Fix
Upgrade widget to Mendix 10 compatible version
Replace with Marketplace alternative
Rebuild custom widget using Mx 10 widget framework
4. Conditional Visibility Depending on Data That Never Arrives
Subtle but dangerous change in Mendix 10
In Mendix 10:
Conditional visibility is evaluated asynchronously
If visibility depends on:
Attribute of a context object
Association retrieve
Expression referencing unloaded data→ Page waits
Example
Visible if: $CurrentObject/MyModule.Status = 'Active'
If:
$CurrentObject is empty
Or association is not retrieved yet→ Visibility condition never resolves
Fix
Guard all expressions:
$CurrentObject != empty and $CurrentObject/MyModule.Status = 'Active'
Avoid deep association chains in visibility
Preload required data in datasource microflow
5. Access Rules / Entity Security Change After Upgrade
Why Mendix 10 breaks silently
Mendix 10 enforces:
Entity access
Attribute access
Association access
More strictly at runtime.
If:
Page retrieves data the user role no longer has access to
Access error happens during page load→ Client waits for data→ No visible error
How to detect
Enable Trace logging for:
Client
Security
MicroflowEngine
Then reload page.
Fix
Re-validate:
Entity access rules
Attribute access
XPath constraints
Especially for:
Admin vs User roles
System.User associations
Cross-module associations
Recommended Step-by-Step Debug Strategy (Use This Order)
Check page datasource microflow
Add start/end logs
Disable all widgets
Confirm page loads
Check nanoflows and JS actions
Especially async ones
Simplify conditional visibility
Add empty checks
Revalidate security
Especially after domain model changes
Enable verbose logging
Client + MicroflowEngine
Why There Are No Errors (Important Insight)
This is not a bug — it is by design in Mendix 10.
The page loader spins because:
Mendix client is waiting
Nothing explicitly failed
Something never completed
Mendix 9 often:
Ignored incomplete promises
Rendered partial pages
Masked bad patterns
Mendix 10 exposes those flaws.
Could you check App Settings → Runtime → Use React Client and see whether it is set to Yes or Migration mode?
With Mendix 10, the client is moving from Dojo-based widgets to React, and this often causes client-side issues, especially after an upgrade. Problems like endless loading can happen because some legacy widgets or layouts behave differently in Migration mode.
Even when running locally, this issue can still occur. If this setting is currently enabled, could you try setting it to No, redeploy the app, and test again to see if the page loads correctly?