Case StudyConsumer mobile · Native app · Commerce · Personalization
Made for Me

Made for Me: a native mobile companion that grows with every woman

A Czech-first native app for women across every life stage — pregnancy, postpartum, breastfeeding, motherhood, perimenopause, menopause, or simply wanting to feel good. The user picks a life stage and the whole app retunes: a personalized feed, curated products, editorial content, and a community forum. Together with the client we built a rich product on top of an existing Shoptet store — fast, from one modern TypeScript codebase.

Made for Me life-stage picker
Made for Me personalized “For You” home
Made for Me product detail

Delivery snapshot

A broad product surface, one small team

What QuantumSpring delivered as the engineering partner: a compiled native app spanning a personalized feed, shop, editorial content, a community forum, passwordless identity and order history — fronting an existing Shoptet store rather than rebuilding commerce. The full story is below.

Want a rich native app on top of the platform you already run? We can show you how we did it.

19 screens

Native mobile app, one codebase

7 life stages

The app retunes itself to each

cs / en

Bilingual, Czech-first

Shoptet-fronted

No commerce platform rebuilt

The Client & the Opportunity We Partnered to Build

A woman's needs change dramatically across life stages, yet generic commerce and content apps treat everyone the same. The client's vision for Made for Me made life stage the organizing idea: an app that grows with you, tuning its content and its care to exactly where you are — from pregnancy through menopause and beyond.

The catch: the client already runs an e-commerce business on Shoptet, a popular Czech hosted store platform. Shoptet is great at being a storefront, but it cannot deliver a personalized native app experience — there is no rich product API, the blog is only HTML, and orders come out as XML. QuantumSpring joined as the delivery partner to build that native experience around the platform, not to replace it.

The Core Challenge: a rich native product on a constrained platform

The hard part was the gap between ambition and platform. The product had to feel like a first-class native app — personalized feed, community, editorial content, identity, order history, saved items, referrals — while every piece of commerce data lived inside Shoptet and could only be reached through the seams it exposes: a scrapeable blog, an XML order export, a catalog export, and a web checkout that has to stay on the store. Designing rich features around those limitations, without a fragile integration, was the central engineering problem.

Platform reality

Design around the seams

Shoptet exposes commerce through a blog, an XML order feed, a catalog export and a web cart. The app had to turn those into a personalized, native experience.

The right answer was an anti-corruption layer: front the store, isolate its quirks, and keep the app talking only to clean, owned contracts.

Shoptet

Existing storefront to build around

No product API

Blog as HTML, orders as XML export

Web checkout

Cart has to stay on the store

Rich UX

Far beyond what the platform offers

Our Approach: a modern stack built for speed

The bet was to build genuinely native on a modern, uniform TypeScript stack running on Bun — one language end to end — so a tiny team could ship a broad product surface quickly and safely. The mobile app, backend, content service, admin SPA and a mock backend all live in one Bun workspace monorepo; a single install links them, and a single command runs every workspace's typecheck and tests. CI mirrors the exact same recipes, so “green locally” means “green in CI.”

Client and server never drift because they share one source of truth: TypeBox schemas in a shared workspace, consumed by every app at once. Change a field and everything re-types — a mistake fails typecheck, not production. Deterministic end-to-end tests run against a mock backend that fakes every route the app hits, and Maestro captures screens that are pixel-diffed against committed baselines. That guardrail stack is what turns a small team into a fast one.

Delivery model

Velocity without drift

One language, one install, one command, shared contracts, and mock-backed E2E — the setup exists so features ship fast and safely.

Hot reload everywhere and OTA updates keep the loop tight from first keystroke to shipped fix.

Bun

One TypeScript language, end to end

Contracts-first

Shared schemas kill client/server drift

One command

Same checks locally and in CI

Mock-backed E2E

Deterministic, zero external deps

What We Built: a rich feature set from one codebase

For its size, the product surface is broad and real: 19 native screens backed by 10 backend route groups over 12 Postgres tables, all typed against the shared contracts.

Personalized “For You” feed

A server-ranked, multi-section feed — editorial tips, product-of-the-week, product carousels, articles, community threads, routines, and expert quotes — assembled per life stage and re-ranked as the user marks content read.

Shop & product detail

Product grid with search and merchandising chips, NEW / SALE badges, per-variant pricing, and a product detail with a swipeable gallery and variant selection. Buy hands off cleanly to the Shoptet web store.

Content & community

Life-stage-filtered editorial articles plus a full community forum: threads with categories, pins, locks and reply counts, a composer, and reporting/moderation. Public reads, member writes gated by identity.

Passwordless identity & orders

Email OTP sign-in (request → 6-digit code → Bearer JWT), no passwords and no cookies. Signed-in members see their orders — synced from Shoptet — with line items, tracking, shipping and totals.

Personalization engine

Life stage is the organizing primitive across feed, catalog and content, and it is re-tunable anytime. Curation is stored as data (section order, pins, editorial), bound by a database constraint to the shared contract.

Saved, referral & share

A client-side wishlist and saved reading that also inform feed ranking, plus a referral code surfaced through the OS-native share sheet — real device integration, not a web modal.

Push notifications

Timely, segmented push built on Expo notifications over APNs and FCM: replenishment reminders when a favorite is due to run low, the weekly product-of-the-week, fresh life-stage content, and wishlist price drops — targeted by life stage so every message lands relevant.

Admin console

A staff-only web app on the same shared contracts: moderate community threads, curate the feed (section order, pins, editorial), review orders, and compose and schedule push campaigns — all without a developer in the loop.

Inside the App

Every screen is bespoke — editorial serif headings, a navy-and-paper palette with a single hot-pink accent, and hand-drawn illustrations. A tour of the surface:

Editorial onboarding with a bespoke serif wordmark and hand-drawn art — the app reads as a brand, not a template.
Editorial onboarding with a bespoke serif wordmark and hand-drawn art — the app reads as a brand, not a template.
The personalization primitive: seven life stages, each with its own illustration, re-tunable at any time.
The personalization primitive: seven life stages, each with its own illustration, re-tunable at any time.
“For You” home — a daily tip, promotions and a product of the week, all keyed to the chosen life stage.
“For You” home — a daily tip, promotions and a product of the week, all keyed to the chosen life stage.
The server-ranked feed weaves articles, community threads, routines and expert quotes into one stream.
The server-ranked feed weaves articles, community threads, routines and expert quotes into one stream.
Shop: product grid, search, merchandising chips and NEW/SALE badges over a Shoptet-sourced catalog.
Shop: product grid, search, merchandising chips and NEW/SALE badges over a Shoptet-sourced catalog.
Product detail with a swipeable gallery, variant chips and pricing — buy hands off to the web store.
Product detail with a swipeable gallery, variant chips and pricing — buy hands off to the web store.
Discover: editorial articles filtered by life stage, scraped from the Shoptet blog into a JSON feed.
Discover: editorial articles filtered by life stage, scraped from the Shoptet blog into a JSON feed.
The community forum — categories, threads and a composer, with member writes gated by identity.
The community forum — categories, threads and a composer, with member writes gated by identity.
Account hub: life-stage card, orders, referral code and saved items, with a language toggle.
Account hub: life-stage card, orders, referral code and saved items, with a language toggle.

Architecture & Tech Stack

A modern, all-TypeScript stack on Bun, with a deliberate anti-corruption layer isolating Shoptet so the app only ever talks to clean, owned contracts.

Native mobile
Expo SDK 55, React Native 0.83.4 and React 19.2.0 — a compiled app with typed native routing and OTA updates, not a webview wrapper.
Design system
NativeWind (Tailwind), custom brand fonts and hand-drawn per-life-stage illustrations for an editorial, bespoke feel.
Backend & data
Hono on Bun with Drizzle over Postgres 16 and passwordless HS256 JWT auth — 10 route groups over 12 tables.
Shared contracts
TypeBox schemas shared across mobile, backend and admin, so one edit re-types every app and drift fails typecheck.
Platform & infra
Shoptet blog, orders and catalog fronted behind owned contracts; three config-as-code services on Railway, with Maestro visual-regression E2E.

Working Around the Platform: Shoptet, fronted not fought

The most interesting engineering is in how the app coexists with Shoptet. Rather than a brittle direct dependency, each platform limitation is turned into a clean seam:

  • Blog with no API → a dedicated content service scrapes the Shoptet blog into a standard JSON Feed with a TTL cache and last-good fallback; the backend proxies it, and the app consumes a swappable content interface that never touches the scraper directly.
  • Orders as XML → a sync job ingests the Shoptet order export into owned, typed tables, so signed-in members get a clean native order history with line items and tracking.
  • Catalog as an export → products, variants, VAT and sale flags are imported and served through owned contracts, powering the grid, search and product detail.
  • Checkout on the web → buying opens the Shoptet store in an in-app browser, so the client keeps their proven, PCI-handled checkout while the app owns discovery and identity.

Results & Outcomes: a shipped native product

We frame results as delivered capability. The app is a compiled native product — not a webview wrapper — spanning 19 screens, with the personalization, content, community, identity and order features above, deployed as three config-as-code services behind health checks.

  • Broad surface, small team: a personalized feed, shop, content, forum, OTP identity and order sync, bilingual (cs/en), from one codebase.
  • Safe integration:Shoptet is isolated behind an anti-corruption layer, so the platform's quirks never leak into the app.
  • Engagement built in: push notifications — replenishment reminders, product-of-the-week, and life-stage content — are composed and scheduled from the same admin console the team uses for moderation and feed curation.

Results snapshot

Delivered capability

A native app with a broad, personalized surface, shipped fast and deployed as config-as-code services.

Adoption and commercial metrics will be confirmed with the client.

19 screens

Feed, shop, content, forum, account

12 tables

10 backend route groups behind them

OTA updates

Ship fixes without app-store waits

3 services

Config-as-code, deployed on Railway

Ondřej Šťastný
"The fun of this build was giving the client a rich native app without asking them to leave the platform they already run. We fronted Shoptet instead of fighting it, and a modern Bun/TypeScript stack with shared contracts let a very small team ship a genuinely broad product surface, fast."

Ondřej Šťastný, Co-founder & CEO, QuantumSpring

What Made This Work

Key takeaways

Three things that mattered most

Shipping a rich native product on a constrained platform, fast, came down to three principles.

Front the platform

Build around Shoptet, don’t rebuild it.Instead of replacing commerce, the app fronts the existing store — scraping its blog, syncing its orders, importing its catalog, and handing off checkout — so the client keeps their storefront and gains a rich native product.

Contracts-first velocity

One schema edit re-types everything.Shared TypeBox contracts, a one-command CI mirror, hot reload and mock-backed E2E let a very small team ship a broad surface fast, without client/server drift reaching production.

Native where it counts

Real device capabilities.Compiled native with secure storage, the OS-native share sheet, push notifications and OTA updates — while commerce stays on the client’s proven Shoptet checkout.

Next step

Want a native app on top of your platform?

Speak directly with Ondřej Šťastný

A short expert call to map what your existing platform can and can't expose, and the fastest path to a rich native product on top of it.

Clear guidance. Senior expertise. No sales talk.

Ondřej Šťastný

© 2026 QuantumSpring.ai. All rights reserved.