Client Work

Magic Car — a modern layer around an existing system, not a replacement.

A B2B platform for car-accessory traders, built around an ERP that stays the source of truth. We built the trader experience, the admin tools, and the integration layer that connects the two.

Client
Magic Car
Platforms
Flutter · Web · iOS · Android
Users
Traders · admin team
Existing system
ERP — authoritative for products, prices and accounts
Magic Car catalog: products with price, availability and item number
01Catalog
Trader cart with an estimated total and a submit-order button
02Cart
Trader orders list with states: accepted, rejected, in review
03Orders

01Context & constraint

Business context

Magic Car sells to wholesale traders, and its daily operation runs on an existing ERP that manages products, prices and accounts. Traders needed a modern way to browse and order, and the team needed tools to review orders and run campaigns.

The core constraint

The existing system works and holds the real business data. Replacing it would add risk with no benefit. So it stayed authoritative, and the new layer had to respect its boundaries.

02Integration boundaries

What the existing system owns, and what the new layer owns.

The ERP stays the source of truth. The integration layer reads from it, keeps a reliable copy of the catalog, and returns to it on every order before any commercial commitment.

Simplified architecture · Magic Carexternal diagram · v1
Existing business systemNawa integration layerTrader experiencesynccatalog readsplace orderlive validationadmin actionsERPAuthoritative for products,prices, accounts and ordersRemains in placeCatalog syncLast-known-goodcatalog cacheLive validationafter admin reviewAdmin · campaigns · accountsOperational workflows around the ERPFlutter clientWeb · iOS · AndroidCatalog · cart · ordersAccount workflowsS3LambdaCloudFrontMedia pipeline
Existing business system
ERP
Authoritative for products, prices, accounts
live validation ↑ · sync ↓
Nawa integration layer
Last-known-good catalog
Admin review + live validation
catalog reads · place order
Trader experience
Flutter client
Web · iOS · Android

media: S3 → Lambda → CloudFront

A product catalog that holds

ERP data · reliable cache · cloud media

Resilient catalog — Magic Carresilient product catalog · internal view, simplified

ERP

source of truth

  • ItemID
  • Barcode
  • Price
  • Stock / availability
authoritative commercial data

Catalog refresh

full-snapshot validation

  • Fetch catalog
  • Validate completeness & linkage
  • Build candidate snapshot
Refresh fails → current snapshot stays

Last-known-good

last-known-good · atomic swap

  • In-memory stable snapshot
  • Durably persisted good copy
  • Restored on startup

Product composition

enrich product with campaigns & media

S3 → Lambda → CloudFront

Safe product API

a safe trader contract — no stock quantity, no cost

  • ItemID
  • Name
  • Price
  • Campaign price
  • Availability
  • Image URL

Flutter apps

Web · iOS · Android

Order-acceptance pathbypasses the cache · live ERP validation
01
Trader orderarrives after submit
02
Admin reviewreview & accept the order
03
Live product validationre-check price & availability
04
ERPsource of truth
A cache for reliable reads, and the live ERP for commercial decisions.Performance and availability without weakening transaction correctness.

03A catalog that holds

The app stays honest even when the source is down.

  1. D-01

    Last-known-good catalog

    If the ERP is unreachable, the app shows the last good catalog instead of a blank screen or invented data.

  2. D-02

    Live validation at order time

    The stored catalog is for browsing only. The order-acceptance path bypasses it: admin reviews the order, then price and availability are re-validated against the existing system directly. That is why the cart total is shown as “estimated”.

  3. D-03

    Sensitive data is never exposed

    A trader sees only “available” or “unavailable” — never the real stock quantity or cost price — and an unknown price is never shown as zero.

  4. D-04

    Independent media pipeline

    Images and video are uploaded to S3, processed through Lambda, and served via CloudFront, away from the existing system.

S3 → Lambda → CloudFront · last-known-good cache · live validation

04Trader experience

Fast ordering, with numbers that don’t claim what they don’t know.

The cart shows quantities, a note per line and an estimated total, with a clear warning that prices are subject to Magic Car’s confirmation. After submitting, the trader tracks each order’s state: in review, accepted, or rejected.

Trader cart with an estimated total and a submit-order button
Fig. 04Cart — “prices and total are estimated”
Trader orders list with states: accepted, rejected, in review
Fig. 05Orders — a clear state per order

05Operational workflow

Admin sees what needs attention first.

The admin dashboard starts with what is waiting on a decision — and from there the team reviews orders, links customers to ERP trader accounts, and runs campaigns and announcements, all in the same app.

Magic Car admin dashboard: what needs attention and core operations
Fig. 06Admin dashboard — starts with what needs a decision

06Engineering lessons

Respect the source of truth

A modern layer around an existing system reduces risk and speeds delivery — provided the ownership boundaries are clear from day one.