Skip to content

Case study · Built by our founder

Sunaulo Shopping

A full Nepal marketplace: shopping app, admin, GraphQL backend, and local payments, in one monorepo.

A two-sided commerce platform for Nepal. Shoppers browse and buy in a React Native app, sellers list and get paid, a franchise network distributes, and internal teams run the whole thing from a Next.js admin, with eSewa and Khalti as the payment rails.

  • Founder portfolio
  • Commerce and marketplace
  • React Native
  • Next.js admin
  • GraphQL (Apollo)
  • Lerna monorepo
  • eSewa and Khalti
  • AWS + Docker
Sunaulo Shopping marketplace marketing visual
Engagement type
Founder portfolio (personal build, pre-Inseed)
Platforms
Mobile shopping app (React Native, iOS and Android) + Next.js admin web
Architecture
Single Lerna + Yarn Workspaces monorepo
Industry
Commerce and marketplace
Backend
GraphQL on Node and MongoDB
Search
Algolia (text plus image-based product search)
Payments
eSewa and Khalti (Nepal gateways)
Infrastructure
Docker on AWS (ECS, EC2, S3, CloudFront)

The story

A whole marketplace, not just a shopping app.

Sunaulo Shopping predates Inseed. Our founder built it as a personal, full-stack project, owning it across the entire stack: the mobile app, the admin web platform, the GraphQL backends, the shared packages, and the infrastructure. It is founder-portfolio work, not an Inseed client project, and it is the "I can build the whole thing" story the team leans on.

The brief was bigger than a storefront. Nepali shoppers needed to browse and buy on mobile, sellers needed to list products and get paid, a franchise network needed to distribute and earn, and internal staff needed to moderate products, process orders, and see stats. That is four different audiences on one platform, each with its own screens, permissions, and money flows.

On top of that, it had to work for Nepal specifically. That meant local payment gateways rather than international cards, discovery that could keep up with a large catalog, and a way to ship fixes to phones quickly in a market where users do not always update apps on their own.

What we built

One codebase for four audiences.

The whole system shipped as a single Lerna and Yarn Workspaces monorepo. The consumer side is a bare React Native app for iOS and Android; the back office is a Next.js admin; two GraphQL services sit behind them; and a set of shared internal packages (theme, utilities, Firebase, S3, Algolia) keep logic and types consistent across every surface. GraphQL codegen generated typed operations so the mobile app, the admin, and the backend all spoke the same contract.

The commerce model went well past a simple cart. The platform modelled sellers (onboarding, stats, payouts) and a franchise network (franchise areas, shareable franchise links, franchise payments and stats) as first-class systems, on top of the usual catalog, cart, checkout, wishlist, reviews, and a "Sunaulo Coin" loyalty layer. Accounts used OTP login, and push notifications ran through Firebase.

Discovery leaned on Algolia for both text and image-based product search, so a shopper could find items by typing or by photo. Checkout ran on eSewa and Khalti, the payment methods Nepali buyers actually use, with cash on delivery as a fallback. To keep the app current in the field, releases went out through CodePush over-the-air updates with Fastlane release lanes.

Architecture

GraphQL in the middle, everything shared around it.

GraphQL is the spine of the system. The client layer (the React Native app and the Next.js website and admin) talks to a core backend service through Apollo, using apollo-client on the front and apollo-server with Express on the back. That single contract is what let one person keep mobile, web, and backend moving in step without them drifting apart.

The backend service is built from the shared monorepo packages: Mongoose over MongoDB for data, Algolia for search, a Firebase SDK for messaging and analytics, Sparrow SMS for OTP delivery, and the AWS S3 SDK for media. MongoDB itself runs in Docker (with a MongoDB Atlas path), and the service is deployed on an ECS cluster managed with the AWS Copilot CLI. Images are served through CloudFront with on-the-fly resizing driven by query parameters, so the app can request the exact size it needs rather than shipping full-resolution assets.

The development and operations stack is deliberately boring and repeatable: Docker Compose for local work, Git and GitHub, Lerna for the monorepo, Yarn for workspaces, and TypeScript throughout, with Jest and Sentry for testing and error tracking. It is a broad build, and the architecture is what keeps that breadth maintainable.

Sunaulo Shopping system architecture diagram
The monorepo at a glance: an Apollo GraphQL contract between the React Native app and Next.js clients and a core Node backend, with MongoDB, Algolia, Firebase, AWS S3 and CloudFront, all deployed on ECS via Docker.

Selected screens

Selected screens.

Storefront home and featured collections (web)
Storefront home and featured collections (web)
Product catalog with filters (web)
Product catalog with filters (web)
Product detail with reviews (web)
Product detail with reviews (web)
Cart and order summary (web)
Cart and order summary (web)
Checkout: delivery address (web)
Checkout: delivery address (web)
Checkout: eSewa and Khalti payment (web)
Checkout: eSewa and Khalti payment (web)
My account dashboard (web)
My account dashboard (web)
Shopping app home (mobile)
Shopping app home (mobile)
Browsing products (mobile)
Browsing products (mobile)
Filtering by size, colour, and category (mobile)
Filtering by size, colour, and category (mobile)
Seller and franchise membership sign-up (mobile)
Seller and franchise membership sign-up (mobile)

Stack

Stack and integrations.

Monorepo
Lerna 4 + Yarn Workspaces (shared theme, utils, Firebase, S3, Algolia packages)
Mobile
Bare React Native + TypeScript, React Navigation, Redux Toolkit + redux-persist
Admin web
Next.js + React + TypeScript, Tailwind + Headless UI, next-auth
API
GraphQL via Apollo (apollo-server + Express), typed with GraphQL codegen
Data
MongoDB via Mongoose and Prisma
Search
Algolia (text plus image-based product search)
Payments
eSewa and Khalti, with cash on delivery
Media
AWS S3 storage + CloudFront with on-the-fly image resizing
Auth and messaging
OTP login (Sparrow SMS), Firebase auth, analytics, and push
Mobile delivery
CodePush OTA updates + Fastlane release lanes
Infrastructure
Docker + Compose, AWS ECS (Copilot CLI) and EC2

One decision worth telling

One monorepo instead of four repos.

A marketplace like this could easily have become four separate codebases: a mobile repo, an admin repo, and a repo per backend. That path spreads the same product across four dependency trees and four sets of types, and it is exactly how a solo build turns into a maintenance problem.

The call was to keep everything in one Lerna and Yarn Workspaces monorepo with shared internal packages, so the theme, the Algolia client, the S3 helpers, and the Firebase setup were written once and imported everywhere. Paired with GraphQL codegen for typed operations, it meant a change to the data contract propagated to the app and the admin in the same pass. For one person owning mobile, web, backend, and infra, that shared core is what made the breadth survivable.

What we would do differently

What we would do differently.

Most agencies skip this section. We include it because honest hindsight is the kind of credibility you cannot buy.

Pin fewer, longer-lived foundations.

The build was spread across a wide surface of pinned versions, from a bare React Native app to a Next.js admin to a Prisma-over-MongoDB layer. Some of those aged faster than others. Choosing fewer core foundations and treating their upgrade path as a first-class concern would have kept the whole monorepo easier to move forward as a unit.

Lean harder on managed infrastructure from the start.

Owning Docker, ECS, EC2, S3, and CloudFront as a solo builder is a lot of operational surface to carry alongside the product itself. It was great for learning, and it proved the "whole stack" story, but reaching for managed services earlier on the pieces that were not differentiating would have freed more time for the marketplace logic that actually was.

De-risk the high-variance integrations sooner.

Image-based search, two local payment gateways, and OTA delivery were each real integration risks, and the multi-party model of buyers, sellers, and franchises added its own edge cases around payouts and stats. Standing up thin end-to-end tests across those seams earlier, rather than hardening them feature by feature, would have surfaced the tricky cases before they reached production.

Related work

Other case studies.

Built by Inseed

The LYVE App

Zero to App Store in under 4 months. Past 3,000 users in the next 3.

Read the case study

Built by Inseed

Playlists

Vibe search shipped in 3 weeks. AI searches up ~200%.

Read the case study

Building a marketplace or a multi-sided platform?

Two-sided commerce, GraphQL, local payment gateways, image search, one team owning mobile, web, and backend. Tell us what you are shipping and we will tell you what the first four weeks can de-risk.

Book your audit