CodingStack
← Index
Real EstateFintechFractional OwnershipReactReact NativeNode.js

LetsCoInvest

Real estate is a top-performing asset class that most people can't actually buy into — direct ownership means large lump sums, illiquid capital, and landlord overhead. LetsCoInvest turns it into something you can buy a slice of: investors fund an in-app wallet, commit any amount toward a property's funding goal, and automatically receive a proportional ownership stake they track in a live portfolio as valuations move. CodingStack built the entire product end-to-end — a Node/Express + MongoDB API serving a React investor web app, a React Native (Expo) mobile app, and an admin back office — with layered auth (JWT, Google, email 2FA, RBAC), a bank-transfer wallet with admin reconciliation, KYC document verification, and admin-scheduled exit windows for liquidity, all self-hosted on a Dockerized VPS behind Nginx with automated TLS.

Role End-to-end build — full-stack web, mobile & API, deployment & DevOps

letscoinvest.co
LetsCoInvest, primary screen
Home

Problem

Real estate consistently outperforms but stays out of reach for ordinary investors: buying outright takes large capital, locks money up illiquidly, and saddles owners with management overhead. LetsCoInvest lets people pool capital to co-own vetted properties — taking a fractional share for a small commitment and earning proportional exposure to appreciation and rental yield. The hard part was building every rail that makes that trustworthy and usable: identity and KYC, a funded wallet with auditable money movement, fractional purchase mechanics, portfolio valuation, and liquidity windows — consistently across web, mobile, and an admin console.

Architecture

  1. H01

    Wallet-backed fractional co-investment

    The core money flow lives in order checkout: it verifies wallet balance, writes an internal 'completed' transaction and an order, then for each property computes the buyer's share (amount ÷ funding goal, capped at 100%), increments investor count and total raised, auto-marks the property 'funded' once the goal is hit, bulk-inserts Investment records, and atomically decrements the wallet with $inc. Because the stack runs single-node MongoDB (Mongoose 5, no multi-document transactions), these writes are fanned out with Promise.all and atomicity is handled deliberately at the application layer.

  2. H02

    Manual bank-transfer rails with admin reconciliation

    With no card processor in the loop, deposits are real bank transfers: the user uploads an invoice as proof, creating a pending transaction; an admin then approves, rejects, or reverts it, each path mutating the wallet balance and transaction status (credit/debit/internal). The deposit controller implements compensating rollback — if saving bank details fails after the transaction is created, it deletes the orphaned records — and the full ledger is exportable to CSV for off-platform accounting.

  3. H03

    Layered auth and RBAC across three clients

    Authentication is built on Passport with JWT access tokens plus DB-persisted refresh tokens that rotate on every refresh and are revoked on logout. Google sign-in runs two distinct paths — an OAuth redirect for web and google-auth-library ID-token verification for the native app — while email 2FA issues bcrypt-hashed, 10-minute codes. A role-rights map (user/admin/superAdmin) is enforced in middleware, and deactivated accounts are rejected at the JWT strategy itself so a stale token can't be reused.

  4. H04

    One API, three front ends

    A single Express/MongoDB backend serves a React 19 web app (marketing site + investor dashboard), a React Native (Expo SDK 54) mobile app, and a separate admin console — each with its own Redux Toolkit store and a shared axios layer that injects bearer tokens. Routes are auto-discovered: the router scans the routes directory at boot and mounts every folder's route.js, so adding a domain is a matter of dropping in a folder. Reusable Mongoose plugins handle JSON serialization (stripping private fields like passwords and 2FA codes) and pagination across every model.

  5. H05

    Compliance-grade identity and account lifecycle

    Onboarding is a step machine — a steps counter on the user gates the dashboard until employment/income profiling and ID-document upload (front+back, CNIC/passport) are done, with admin verification flags. The same rigor extends to offboarding: users can deactivate and silently reactivate on next login, or file a deletion request that schedules removal 30 days out and lands in an admin review queue — the kind of controls a regulated financial product needs.

  6. H06

    Self-hosted, Dockerized deployment with automated TLS

    The whole platform ships as one Docker Compose stack — web, admin, API, and MongoDB 6 containers behind an Nginx reverse proxy that terminates TLS for three subdomains (apex, admin., api.) with Let's Encrypt certificates auto-renewed by a Certbot sidecar. The Vite SPAs use multi-stage builds (build, then serve static from nginx:alpine); the API runs under PM2 as a non-root user with a persistent uploads volume; deploys run a build-then-swap script (build --no-cache while old containers serve, then down/up); and the mobile app ships updates over-the-air via expo-updates.

Key features

Stack

Frontend (Web)

React 19ViteRedux ToolkitReact Router 7Formik + YupBootstrap / React-BootstrapFramer MotionAxiosIntercom

Mobile

React Native 0.81 (Expo SDK 54)Expo Routergluestack-uiNativeWind / TailwindReanimatedRedux Toolkitexpo-image-picker / document-pickerexpo-updates (OTA)

Backend

Node.jsExpressMongoosePassport (JWT + Google OAuth)bcryptJoiNodemailer (SMTP)MulterPM2helmet / xss-clean / mongo-sanitize / rate-limit

Data

MongoDB 6Local volume-backed file storage (images / documents)

Infra

Docker & Docker ComposeNginx (reverse proxy + TLS termination)Let's Encrypt / CertbotVPS (self-hosted)Multi-stage Docker builds

Status

Live

An idea, an existing app, or something in between?

Tell us what you're trying to ship. We reply within one business day with a written take on scope and timeline, not a sales pitch.