React · Case Study
React Fintech Portal: Improving a Slow Investment Dashboard Without Rebuilding the Platform
A detailed production-style case study showing how a fintech company optimized a React investment portal, reduced JavaScript payload, fixed slow portfolio interactions, stabilized real-time market updates, and improved dashboard performance without a complete rewrite.
ClientWealthBridge
IndustryFinancial Technology
Project typeReact Performance Optimization, Dashboard Architecture Refactoring, and Real-Time UI Stabilization
Duration17 weeks
Overview
Project: React Performance Optimization, Dashboard Architecture Refactoring, and Real-Time UI Stabilization
Duration: 17 weeks
WealthBridge is an investment platform that allows customers to track portfolios, review holdings, compare funds, view transaction history, manage recurring deposits, and monitor real-time market movements. The platform began as a simple account dashboard but evolved into a complex React application with interactive charts, personalized insights, risk scoring, tax documents, watchlists, alerts, advisor messaging, and portfolio simulations. As the product expanded, the front end became harder to maintain and slower for users. Customers could see rich financial information, but the experience felt heavy. Portfolio pages took too long to become interactive, charts delayed rendering, transaction tables froze on older laptops, and real-time price updates caused parts of the dashboard to re-render too often.
The core problem
The React portal had become too dashboard-heavy and too dependent on broad shared state. Real-time market data, portfolio summaries, chart state, user preferences, alerts, advisor messages, and account status were all connected too closely. A small update to one holding could trigger unnecessary re-renders across charts, tables, summary cards, and navigation badges. Heavy charting libraries and reporting modules loaded too early, while transaction tables rendered far more rows than users could see.
Issues we addressed
Business signals
- Customers reported that portfolio dashboards felt slow during market open hours.
- Support tickets increased around delayed chart loading and frozen transaction tables.
- Mobile users abandoned portfolio review flows before reaching detailed holdings.
- Advisor teams had difficulty encouraging customers to use deeper planning tools because the dashboard already felt heavy.
- Product managers were hesitant to add new financial insights because every widget increased page cost.
- Compliance teams needed confidence that performance changes would not affect data accuracy.
- Marketing campaign traffic to investment landing pages had weaker conversion when pages loaded slowly.
- Engineering teams lacked clear performance budgets for dashboard features.
Technical signals
- Initial JavaScript payload on portfolio dashboard routes was too large.
- Charting libraries loaded before users interacted with chart-heavy sections.
- Real-time price updates caused broad React re-render cascades.
- Transaction history rendered hundreds of rows during initial page load.
- Global Context providers mixed user session, account status, watchlist, portfolio data, alerts, and UI preferences.
- Derived portfolio values recalculated too frequently.
- Tax document modules loaded on routes where they were not needed.
- Advisor messaging widgets hydrated during the initial dashboard load.
- Analytics events fired during high-priority interactions.
- Tables used expensive formatting for currency, percentage, and dates on every render.
- Chart tooltips and hover states caused unnecessary state updates.
- Skeleton loaders did not reserve consistent space, creating layout shifts.
- Bundle growth was not visible during pull requests.
Baseline & measurement
Metrics C L S: 0.18 on portfolio summary pages
I N P: 446ms at p75 on portfolio and holdings pages
L C P: 4.8s at p75 on mobile dashboard routes
Average Hydration Time: 3.5s on mobile dashboard routes
Watchlist Update Delay: Visible lag during real-time market updates
Chart Interaction Delay: 300ms to 650ms delay on tooltip and time-range interactions
Transaction Table Delay: Rows froze or scrolled poorly when transaction history exceeded several hundred records
Holding Update Render Cost: Large dashboard sections re-rendered after frequent price updates
Initial Java Script Payload: 1.12MB compressed on portfolio dashboard
Pages Measured
- Portfolio dashboard
- Holdings page
- Transaction history
- Fund comparison page
- Watchlist
- Advisor messages
- Investment insights
- Tax documents
Primary Audience: Retail investors using mobile Safari, mid-range Android devices, and older personal laptops
Measurement Window: 30 days before optimization
Discovery & diagnosis
The team began by measuring actual customer workflows instead of assuming the backend or market data feed was the main issue. Browser traces, React Profiler sessions, and route-level bundle reports showed that most delays came from JavaScript cost, expensive rendering, broad state updates, and heavy chart modules loading too early.
What we inspected
-
Title: Workflow-level monitoring
Description: The team tracked portfolio load time, holdings interaction delay, chart range selection, transaction table scrolling, watchlist updates, and advisor message opening. This created visibility into the parts of the financial journey that users touched most often.
-
Title: React Profiler analysis
Description: Profiling showed that live price updates caused entire dashboard regions to re-render. Summary cards, holdings tables, charts, alerts, and navigation counters were updating together even when only one holding changed.
-
Title: Bundle analysis
Description: The bundle report revealed that charting libraries, tax document viewers, advisor messaging tools, and simulation modules were included too early in the dashboard experience.
-
Title: Transaction table tracing
Description: Performance traces showed that large transaction lists created excessive DOM work. Currency formatting, status badges, and date formatting repeated on every render.
-
Title: Real-time market update review
Description: The team reviewed WebSocket update flow and found that price ticks were pushed into broad shared state, which forced unrelated components to update during high-frequency market periods.
-
Title: Layout stability audit
Description: Portfolio values, chart containers, alerts, and balance cards were loading asynchronously without consistent reserved space, which caused layout movement on slower devices.
The challenge
The main challenge was improving speed and reliability without disrupting a regulated financial product. WealthBridge could not pause trading-related workflows, break reporting screens, or risk inconsistencies in displayed balances and transactions. The engineering team needed to make the existing React and Next.js application faster while preserving compliance requirements, auditability, data accuracy, and secure user flows. The work also had to support customers using older personal devices, not just high-performance machines used by developers.
Approach
The solution was a targeted React architecture recovery. WealthBridge kept its existing stack but reduced initial JavaScript, isolated real-time updates, virtualized financial tables, delayed heavy modules, improved chart interaction performance, and added release-time performance governance.
Strategy
- Ship less JavaScript on first dashboard load.
- Delay chart-heavy and document-heavy modules until needed.
- Virtualize holdings and transaction tables.
- Move real-time updates closer to affected components.
- Split broad shared state into focused state boundaries.
- Memoize expensive derived financial values carefully.
- Keep urgent interactions separate from lower-priority recalculations.
- Reserve layout space for balances, charts, and alerts.
- Measure customer workflows with real-user data.
- Add performance budgets to prevent regression.
Implementation playbook
Phase1 Title: Route-level dashboard cleanup
Actions
- Reduced client-side rendering on static dashboard content.
- Moved tax document viewers out of the default dashboard bundle.
- Delayed advisor messaging until the user opened the message panel.
- Lazy-loaded investment simulation modules.
- Added Suspense boundaries around secondary dashboard widgets.
- Split fund comparison tools into a separate route bundle.
- Removed unused promotional widgets from logged-in dashboard routes.
Description: The team separated the critical portfolio overview from secondary modules such as tax documents, advisor messaging, simulations, and advanced reports.
Phase2 Title: JavaScript payload reduction
Actions
- Lazy-loaded charting libraries only when chart sections entered the viewport.
- Replaced duplicate currency and percentage formatting helpers.
- Changed broad icon imports to direct icon imports.
- Split tax, reporting, messaging, and simulation logic by route.
- Removed unused legacy dashboard components.
- Deferred non-essential analytics until after the dashboard became interactive.
- Added pull request bundle reports.
- Added CI checks for route-level JavaScript budgets.
Description: The application loaded too much code before customers could review their portfolio. The team reduced first-load JavaScript by splitting heavy modules and removing duplicate utilities.
Phase3 Title: Real-time price update isolation
Actions
- Separated portfolio summary state from individual holding price state.
- Updated only affected holding rows after price ticks.
- Batched rapid market updates during high-frequency periods.
- Paused offscreen watchlist updates until the panel became visible.
- Used memoized selectors for portfolio totals and allocation summaries.
- Separated urgent account alerts from routine price changes.
- Prevented navigation badges from recalculating after unrelated market ticks.
Description: Live market data was valuable, but the update flow was too expensive. The team changed how price ticks moved through the UI.
Phase4 Title: Holdings and transaction table virtualization
Actions
- Virtualized holdings tables.
- Virtualized transaction history rows.
- Reduced DOM depth inside table rows.
- Memoized formatted currency, percentage, and date values.
- Moved secondary transaction details behind expandable rows.
- Lazy-rendered row actions until focus or interaction.
- Reserved space for status badges and pending transaction labels.
- Reduced unnecessary table-wide re-renders after single-row updates.
Description: Large financial tables caused heavy DOM and rendering work. The team virtualized tables and reduced row complexity.
Phase5 Title: Chart interaction optimization
Actions
- Lazy-loaded advanced chart features after the basic chart rendered.
- Separated chart hover state from global portfolio state.
- Debounced time-range changes.
- Reduced tooltip recalculation during mouse movement.
- Cached common time-series transformations.
- Used simpler chart rendering for small mobile screens.
- Deferred non-visible chart legends and annotations.
- Prevented chart updates from forcing summary card re-renders.
Description: Charts were central to the product, but they caused heavy interaction delays. The team optimized how charts loaded and updated.
Phase6 Title: State management refactor
Actions
- Split user session, portfolio data, watchlist, alerts, advisor messaging, and UI preference state.
- Moved local panel state into route-level components.
- Separated stable account metadata from real-time market values.
- Stabilized function references passed to table rows and chart controls.
- Used memoized selectors for derived allocation and gain-loss values.
- Removed wrapper components that caused unnecessary render depth.
- Applied React.memo only where profiling showed measurable improvement.
Description: The team split broad providers and clarified ownership of stable versus frequently changing data.
Phase7 Title: Interaction path cleanup
Actions
- Moved analytics events into a lightweight queue.
- Separated immediate UI feedback from slower recalculations.
- Deferred advisor message unread recalculation after route transitions.
- Reduced synchronous work after watchlist edits.
- Delayed non-critical notification grouping.
- Optimized account switcher interactions.
- Reduced expensive permission checks during repeated UI events.
Description: The team removed non-critical work from high-priority user actions such as changing chart ranges, opening holdings, updating watchlists, and reviewing transactions.
Phase8 Title: Layout stability improvements
Actions
- Reserved fixed space for portfolio balance cards.
- Standardized chart container heights.
- Prevented alert banners from pushing dashboard content after load.
- Reserved space for gain-loss labels and market status badges.
- Improved skeleton loaders for holdings and transaction tables.
- Prioritized the main portfolio summary content.
- Reduced late layout changes after market data arrived.
Description: Financial dashboards must feel stable and trustworthy. The team reduced layout movement during loading and live updates.
Results
- INP improved from 446ms to 169ms at p75 on portfolio and holdings pages.
- LCP improved from 4.8s to 2.4s at p75 on mobile dashboard routes.
- CLS improved from 0.18 to 0.05 on portfolio summary pages.
- Initial JavaScript payload on the portfolio dashboard dropped from 1.12MB to 421KB compressed.
- Average hydration time on mobile dashboard routes dropped from 3.5s to 1.5s.
- Transaction history scrolling became smooth with large account histories.
- Holding price updates no longer forced full dashboard re-renders.
- Chart interaction delay dropped from 300-650ms to mostly under 150ms.
- Watchlist updates became more stable during market open periods.
- Tax document and simulation modules were removed from the default dashboard load.
- Advisor messaging no longer blocked first dashboard interaction.
- Layout shifts were reduced across balance cards, charts, and alert banners.
- Performance regressions became easier to detect before release.
Business impact
The optimization made the investment experience feel more reliable and professional. Customers could review balances, inspect holdings, compare performance, and navigate transactions without the dashboard feeling frozen during important financial decisions.
Outcomes
- Higher engagement with holdings and transaction history on mobile.
- Fewer support complaints about slow dashboards and frozen tables.
- Improved trust in real-time portfolio updates.
- Better usability during market open hours.
- More confidence for product teams launching financial insight widgets.
- Reduced engineering time spent investigating repeated rendering issues.
- Clearer performance governance for regulated dashboard features.
- Improved readiness for paid acquisition landing pages and logged-in conversion flows.
Before & after
| Area | Before | After |
|---|---|---|
| User Experience | The dashboard displayed valuable financial data, but it often felt heavy. Portfolio pages loaded slowly, charts delayed interaction, transaction tables froze on older devices, and live price updates made the interface feel unstable. | The portal loaded faster, holdings updated smoothly, charts responded sooner, and transaction tables remained usable even with large histories. Customers could review financial data without waiting for unrelated modules to load. |
| Business Experience | The company had strong investment features, but the slow interface weakened customer confidence and made teams hesitant to add more personalized insights. | WealthBridge could continue expanding investment tools while protecting dashboard speed, customer trust, and regulated workflow stability. |
| Engineering Experience | Developers struggled to isolate bottlenecks because real-time data, account state, alerts, messages, and chart behavior were too tightly connected. Performance fixes were reactive and difficult to verify. | The React architecture became clearer. Real-time updates were isolated, heavy modules were split by route, tables were virtualized, and performance became visible in the release process. |
Engineering decisions
-
Avoid a full platform rewrite.
A rewrite would have introduced unnecessary product and compliance risk. Targeted React refactoring solved the most expensive bottlenecks faster.
-
Delay charting and document modules.
Charts, reports, and document viewers were important, but they did not need to block the first portfolio interaction.
-
Virtualize financial tables.
Rendering hundreds of holdings or transaction rows upfront created avoidable DOM and React work.
-
Isolate real-time market updates.
Price ticks should update affected holdings and summaries without forcing unrelated dashboard sections to re-render.
-
Split broad shared state.
Stable account data and high-frequency market data have different update patterns and should not live in the same broad provider.
-
Measure workflow-level performance.
The team needed to track real actions such as chart interaction, transaction scrolling, and holdings updates, not only generic page scores.
Lessons learned
- Financial dashboards must optimize both loading speed and update stability.
- Real-time data can damage React performance when update boundaries are too broad.
- Heavy charting libraries should not load before users need them.
- Large transaction tables require virtualization and careful formatting.
- A dashboard can look trustworthy visually while still feeling unreliable because of interaction delay.
- Memoization should follow profiling evidence, not guesswork.
- Stable account data and frequent market data should be separated.
- Performance budgets protect product teams from gradual JavaScript growth.
- Workflow-level monitoring is essential for complex logged-in applications.
- Targeted architecture recovery is often safer than a full rewrite in regulated products.
Role: Head of Front-End Engineering
Quote: The project gave us the speed improvements we needed without taking unnecessary platform risk. We kept our React stack, fixed the expensive rendering paths, and created a release process that helps protect performance going forward.
Person: Daniel Foster
Company: WealthBridge
Summary
WealthBridge's React optimization project showed that a complex fintech portal can become much faster without a full rebuild. By reducing JavaScript, delaying heavy modules, virtualizing transaction and holdings tables, isolating real-time market updates, improving chart interactions, stabilizing layouts, and adding performance governance, the team transformed a slow investment dashboard into a smoother and more trustworthy financial experience. The result was better Core Web Vitals, faster portfolio review, more stable market updates, and a front-end architecture that could support future fintech features with less performance risk.
About the Author
Author icon By Federico R.
- ✓ Verified Expert
Experience icon 9 years of experience
My name is Federico R. and I have over 9 years of experience in the tech industry. I specialize in the following technologies: JavaScript, HTML5 Canvas, Computer Graphics, Animation, Games, etc.. I hold a degree in Bachelor of Engineering (B.Eng.). Some of the notable projects I’ve worked on include: Waves - HTML5 Effect, HTML5 Game - Shooting Gallery, Airplane Package Drop Simulation, Stock Charts, Online Payment Gateway, etc.. I am based in Montevideo, Uruguay. I've successfully completed 6 projects while developing at Softaims.
I thrive on project diversity, possessing the adaptability to seamlessly transition between different technical stacks, industries, and team structures. This wide-ranging experience allows me to bring unique perspectives and proven solutions from one domain to another, significantly enhancing the problem-solving process.
I quickly become proficient in new technologies as required, focusing on delivering immediate, high-quality value. At Softaims, I leverage this adaptability to ensure project continuity and success, regardless of the evolving technical landscape.
My work philosophy centers on being a resilient and resourceful team member. I prioritize finding pragmatic, scalable solutions that not only meet the current needs but also provide a flexible foundation for future development and changes.
