Back to Projects
ReleasedWeb + App · Commerce

E Sangdan

Korean brands, bought for you and shipped abroad. Browse the catalogue on the web or in the app, pay for your items, then pay international shipping separately once the parcel is packed.

App Store · In reviewGoogle PlayWebsite
Platforms
Web · iOS · Android
Built with
Flutter · Python · SQL Server · Firebase push · PayPal
Fees
Free app · shipping quoted after packing
Languages
Website in 10 languages · app in English

Korean brands are easy to find from abroad and hard to buy from: many shops sell only inside Korea, in Korean, with domestic payment and delivery. esangdan is a personal-shopping service that closes the gap. You pick items and options on an English-first store, we buy them from the Korean retailer, pack them in Seoul and ship abroad. The price you see up front is only the item; shipping is quoted separately once the parcel is weighed, so nothing is guessed.

What it does

Design choices

Two payments, not one

Item payment happens at checkout through PayPal. International shipping is a separate quote issued after the parcel is inspected, packed and measured, paid in USD before dispatch with an expiry date and never charged automatically. The dispatch fee is 5% of the converted transport cost with a USD 2 minimum, and customs duties stay outside the quote.

Estimates advise, quotes bind

At checkout the shipping amount is an estimate. If the tariff is stale or missing, the order can still go ahead with explicit consent and no invented number; a zero or free estimate is never shown. The server stores the consent, and the actual quote still requires strict current rates or a documented manual quote.

The server decides money and payment

The mobile app never holds a PayPal secret and has no checkout WebView. PayPal opens in the system browser, and the app saves the order reference first. Parameters in a return link never prove success: returning only re-checks status, and capture needs a user action plus server verification of owner, amount, currency and payee.

Curation labelled as virtual

Editorial posts are written under three fictional curator personas, each marked "Virtual curator", and the images are labelled AI-generated. The editorial standard forbids passing them off as real experts, users or brand staff, and each daily run records sources, dates and the reason for the pick.

How it's built

One backend for web and app

The website, the Flutter app and the admin all use one Python server and one SQL Server database. Accounts, the bag, orders and notifications are shared, and the app talks to a versioned /api/v1 mobile API. Logic and money live in stored procedures rather than the client.

Catalogue collection and brand identity

Products come from per-retailer collectors that record the official store page, price basis and observation time. The operator can paste up to 20 official-store URLs into the admin inbox for a scheduled agent to collect. Brand and merchant are being separated so a retailer is never presented as the brand.

Ten languages, honest fallbacks

The storefront supports ten locales, loading only the selected language's file, and falls back to English for untranslated catalogue or editorial text. Legal documents stay English and say so in the interface. The native app interface is English; its notifications use the member's language.

Admin that refuses to guess

The Korean-language admin is Google sign-in only with an allowlist. It handles purchase locks, partial cancellation and refunds, tracking, support replies and shipping quotes that need inspection confirmation. Uncertain payment, refund or email states are surfaced as attention items and never retried blindly.

All Projects Contact