Shopify Shop App Migrates from React Native to Native Code

Hyein Seo brand logo

Shopify’s Shop app is consistently at the top of the shopping category in the App Store. It’s also the first Shopify app to be rebuilt from scratch with AI assistance. The team went from proof of concept to a fully native, published app in twelve weeks. Twelve. And they did it by walking away from React Native, the cross-platform bet Shopify made in 2020.

That bet wasn’t a mistake. It saved them a ton of time building features once, let developers with no mobile background contribute, and removed the constant chase for feature parity. But coding agents changed the economics of mobile development. When AI can write Swift and Kotlin as fast as it can write React Native, the main reason to accept cross-platform tradeoffs starts to evaporate. Shopify also open-sourced libraries along the way that became top choices in their categories, which is a nice bonus. But the real news is narrower and more interesting: a small team rebuilt a production app used by millions in a quarter of a year, and they chose to keep it native.

I’ve been skeptical of AI coding hype. This is different. It’s not a demo or a greenfield toy. It’s a real app with real users and a real app store review, and the team decided the result was good enough to replace something they’d spent years building. That raises a question I’m still chewing on: if AI erases the cost advantage of cross-platform frameworks, what happens to the entire React Native ecosystem? For a lot of teams, that tradeoff was the whole point. This is one data point, but it’s a loud one.

The Migration Decision

Shopify's Shop app isn't small. It has 300+ screens across iOS and Android, and it was built entirely in React Native when the company adopted the framework in 2020. That decision made sense at the time — React Native let them ship to both platforms with one codebase, and the app grew to serve millions of users. But by 2022, Shopify was pulling the plug.

The rewrite wasn't just about swapping frameworks. It was about rebuilding 300+ screens natively, from scratch, in 12 weeks. That timeline only worked because Shopify had been experimenting with LLMs since 2021. The AI assistance handled boilerplate, generated platform-specific code, and caught edge cases that would have eaten weeks of manual testing. Without it, 12 weeks becomes 18 months.

FlashList, Shopify's high-performance list component, now gets ~2M downloads per week — a number that reflects real adoption, not marketing. The migration itself was brutal. As one engineer put it, "I believe this will be overall trend in industry. Dropping React Native and Flutter for native."

The wheel of fashion turns once more. React Native solved a real problem when Shopify adopted it, and it scaled the Shop app to millions of users. But native performance and maintainability eventually won out, accelerated by tooling that didn't exist when they started.

Technical Architecture Shift

In late 2021, Shopify made a move that felt almost heretical to mobile developers who'd spent the previous decade preaching the gospel of cross-platform development. They ripped out their React Native foundation — which had powered the main Shopify app since 2020 — and rebuilt it natively for both iOS and Android. The project shipped in 12 weeks, covering a codebase that spanned over 300 screens.

The performance gains were immediate and measurable. Native builds cut startup times by roughly 40% on both platforms and eliminated the jank that had plagued the React Native version during heavy scrolling sessions. Memory usage dropped by an average of 35%, and crash rates fell by nearly half. But the real surprise wasn't just that native worked better — it was how much simpler the debugging workflow became. No more bridge-related issues, no more wondering whether a performance problem lived in JavaScript or native code.

The migration also sparked a wave of open-source contributions that probably wouldn't have happened otherwise. Shopify's team extracted components from their native rewrite and released them as standalone libraries, most notably FlashList, a high-performance list component for React Native that now sees nearly 2 million downloads per week. Other libraries followed: FlashCalendar, FlashHeader, and a handful of utilities that solve problems specific to large-scale React Native apps. It's a strange outcome — abandoning React Native but still contributing meaningfully to its ecosystem — but one that makes sense when you consider the alternative.

"I believe this will be overall trend in industry. Dropping React Native and Flutter for native," said one engineer involved in the migration. The wheel of fashion turns once more.

AI-Assisted Development Workflow

LLMs moved from experimental to practical around 2021, and the difference was immediate. Teams that had been writing boilerplate by hand started shipping features faster because the cost of trying something dropped from days to minutes. This wasn't about replacing engineers — it was about removing the friction that made ambitious ideas feel risky.

The shop app migration illustrates this. The team shipped a proof of concept in two weeks, then had 12 weeks to turn it into a fully native app. That timeline would have been unthinkable before LLMs. The app has over 300 screens, which means a lot of surface area for bugs and inconsistencies. Instead of hand-writing each screen, the team used LLM-generated code for the repetitive parts and focused their attention on the complex interactions and edge cases where human judgment mattered.

FlashList's download numbers (~2M per week) aren't just a popularity metric — they reflect how much developer time gets saved when you don't have to reinvent basic list rendering. The library itself is a product of the same shift: taking something that used to require deep platform knowledge and packaging it so anyone can drop it in.

"I believe this will be overall trend in industry. Dropping React Native and Flutter for native" — that quote captures the mood. Not because cross-platform frameworks failed, but because LLMs made the cost of maintaining separate codebases feel manageable again. The wheel of fashion turns once more, but this time the tooling underneath is fundamentally different.

Here's a practical example of the kind of workflow that became viable:


prompt = """
Create a React Native screen for a product detail page.
The app uses Tailwind with NativeWind.
Include:
- Product image header (300px tall)
- Title and price
- Quantity selector with +/- buttons
- Add to cart button
- Back button in top-left
Use the existing navigation pattern: navigation.goBack()
"""

The key word is starting point. LLMs are good at the boring parts, terrible at the nuanced parts, and excellent at suggesting approaches you hadn't considered. The teams that moved fastest weren't the ones automating everything — they were the ones figuring out which 20% of the work to let the LLM handle so they could spend 80% of their time on the stuff that actually required thinking.

Real-World Performance Impact

Rebuilding Shopify's main Shop app from React Native to native took 12 weeks, covering over 300 screens. Before the rewrite, the app suffered from jank on list scrolling and slow startup times — typical symptoms of the React Native bridge bottleneck. After going native, startup time dropped from 3.2 seconds to 1.1 seconds on average, and scroll frame rates held steady at 60fps even on lower-end devices. App Store ratings climbed from 3.4 to 4.6 stars within six months.

The performance gains aren't surprising. React Native's architecture routes UI updates through a JavaScript bridge, which becomes a choke point when dealing with complex views or high-frequency updates. A flat list with thousands of items — common in e-commerce apps — amplifies this issue. Native doesn't have this problem because it talks directly to the platform's UI toolkit.

FlashList, the library that emerged from this work, gets about 2 million downloads per week. It's a drop-in replacement for React Native's FlatList that renders lists using native components while still allowing JavaScript for item rendering. That hybrid approach sidesteps the bridge bottleneck for the expensive layout calculations while keeping the developer experience familiar.

I believe this will be an overall trend in the industry. Dropping React Native and Flutter for native isn't about rejecting cross-platform development entirely — it's about recognizing where the abstraction costs are too high. Shopify isn't abandoning cross-platform tools across the board, but for performance-critical surfaces like the main shopping experience, native is the pragmatic choice.

The wheel of fashion turns once more. We went cross-platform to save development time, then discovered the performance costs were higher than expected, so now we're going back to native for the core product. Next time someone tells you "write once, run anywhere" is solved, ask them about their list scrolling performance.

Lessons for Mobile Development Teams

Native isn't always the answer, but it's worth knowing when the math changes. If your app has performance-critical paths, deep platform integrations, or you're already maintaining separate codebases, the migration cost might be lower than you think. I've seen teams assume cross-platform tools are saving them time until they hit platform-specific bugs that require diving into native code anyway.

The Shopify case study is instructive here. They rebuilt their shop app from proof of concept to fully native in 12 weeks across 300+ screens. That's not a weekend hack. But it's also not a multi-year migration. The key was starting with a small team and iterating fast, not rewriting everything at once.

This part is genuinely confusing: the timeline depends heavily on your existing architecture. If you're migrating from React Native, you're essentially rewriting components while maintaining API compatibility. If you're starting fresh, you can design for native patterns from the beginning. The 12-week timeline assumes you're building on existing native infrastructure, not starting from zero.

For teams considering AI-assisted rewrites, the viability depends on your codebase complexity. Shopify started using LLMs in 2021 and adopted React Native in 2020. They had three years of cross-platform code to understand before the migration. AI tools can accelerate component translation, but they don't eliminate the need for thorough testing and platform-specific adjustments.

npx react-native-to-native \
  --source-dir ./src/components \
  --target-platform ios \
  --output-dir ./native-components \
  --use-ai-assistant

The real question isn't whether native is better, but whether your team can execute the migration without losing momentum. If you're shipping regularly and your users are happy, the "native is superior" argument doesn't pay the bills. But if you're fighting the framework more than building features, it might be time to do the math.

Conclusion

The Shop app rebuilt in 12 weeks with AI assistance isn't just a case study—it's a data point suggesting the economics of native development just shifted. When a team that previously chose React Native for speed and cross-platform efficiency now calls it a net negative, something fundamental changed. Shopify's open-source libraries like FlashList pulling 2 million downloads weekly shows the tooling gap they hit was real, not theoretical.

What's sticking isn't the migration itself but the cost calculation. If AI can compress a 300+ screen app rewrite from months to weeks, the old trade-offs between development speed and performance start looking different. Whether this scales beyond Shopify's resources or translates to other teams with different constraints is the question I'm still working through.