Taobao.at: 600+ orders a month by handover


- Role
- Fullstack Developer
- Team
- 2 fullstack developers and a junior frontend developer
- Timeline
- January 2026 – March 2026
- Status
- Completed, the site is live
What I did
- Design and UI kitThe site design is entirely mine. The UI kit is built on Tailwind and daisyUI with a custom theme, so the look changes by switching the theme. For the business, this means a new style for a promotion or a rebranding can be shown and rolled out in a day, without redoing the layout.
- Storefront in NuxtI proposed making the storefront a separate Nuxt application with server-side rendering: pages open faster and are indexed better by search engines, and search is a direct source of customers for the store. I built its client side myself: Pinia, Russian and English interface, the layer of API requests.
- Admin panelThe client side of the operator workspace and its requests to the backend. The faster an operator processes an order, the sooner the customer gets the product, so the speed of the whole service depends directly on how convenient the admin panel is.
- Storefront APILaravel endpoints that feed the storefront. The cart and favorites work without signing up, so the customer gets to the order without an extra step, and the business loses fewer customers along the way.
Context
Business
The client purchases and delivers products from China and Hong Kong. Its customers live in Russia, and for many of them the service is a way to buy what has become unavailable or noticeably more expensive in Russian stores. China and Hong Kong are major trade hubs: they sell products of global brands, including European and American ones, often cheaper than in Russia. So customers order not only Chinese products through the service, but also IKEA furniture, Apple devices for the Hong Kong market, clothing and shoes from Farfetch, and computer components.
If an item is not in the catalog, it can be ordered with a purchase request.
Process, architecture and decisions
The order flow
The catalog price is in rubles right away and already includes duties, the service fee and delivery. After that an order goes through four steps.
- 01OrderFrom the catalog or with a purchase request. The cart and favorites work without signing up
- 02PaymentBy a MIR card or via SBP
- 03CheckThe order is checked for completeness before shipping
- 04Delivery17–28 days to Russia, the status is visible in the personal account. Pickup point or courier
Architecture
The storefront lives separately from the backend. It is easier to develop, and mobile apps can be built from the same code by adding Capacitor.
- STOREFRONTStorefront
Nuxt 4 with server-side rendering, Pinia and Nuxt i18n, a UI kit on Tailwind and daisyUI. The server sends the browser a ready page instead of building it on the customer's device. So the catalog opens faster even on a low-end phone, and search engines see every product and bring customers from search.
- ADMINAdmin panel
An internal site for the service staff that customers never see. In it, operators receive and process orders and purchase requests, check that orders are complete before shipping and update the delivery statuses the customer sees in their account.
- APIPublic API
Cart, favorites and product blocks for the home page. The guest session relies on a signed cookie, so the customer does not have to sign up in advance.
/api/public/v1catalog/block-products
- BACKENDServices and data
Laravel and Go, queues on RabbitMQ. Data in PostgreSQL, Redis, Elasticsearch, ClickHouse and S3 / MinIO.
- INFRAInfrastructure
Docker and Kubernetes, rollout via GitLab CI and Argo CD, traffic through Traefik and Envoy. Monitoring on Grafana, Prometheus and ELK.
Pages are built from the API
The structure and content of a page can change without a storefront release. The backend returns a JSON array shaped like an abstract syntax tree, and the storefront builds the page from it.
The home page is built this way, and its product blocks come from catalog/block-products. Any other page can be built the same way.
Data security
For customs clearance the service stores customers' personal data. Sensitive fields are encrypted in the database with Laravel's built-in tools, and the key is stored separately from both the code and the database. Permissions are split between customers, operators and administrators.
Quality and releases
I was responsible for three kinds of tests: component tests on Vitest, visual regression tests that compare blocks against reference screenshots, and E2E tests on Playwright for critical scenarios. The junior frontend developer's code went through my review.
A task from its own branch goes into develop, passes the automated tests and code quality checks and is deployed to the test environment. On the planned release date the finished tasks are gathered into preprod, where final testing and acceptance run in an environment identical to production. Then the release is merged into master and updates production without downtime. If something breaks in production, it is possible to quickly return to the previous stable version.
- develop test environment
- preprod acceptance
- master production without downtime
Sprints lasted two weeks. At the end of each one the client saw what was done, what was not and why, and what was planned for the next two weeks.
Challenges
Accessibility in the UI kit
- Problem
- The storefront is used by very different customers: on a phone on the go, with a keyboard only, with a screen reader or with low vision. Ready-made daisyUI components do not guarantee accessibility on their own. If it is not built into the UI kit from the start, the issues spread to every page, and some customers cannot place an order.
- Solution
- Accessibility is built into the UI kit itself: semantic page regions, a visible focus and a logical keyboard order, alt text on images, accessible names on buttons and links. Zooming is allowed, and the screen notch on phones is taken into account.
- Result
- An axe-core check against WCAG 2.2 AA and a manual keyboard pass on the home page, a category and a product page, on desktop and on a phone, found one violation. The brand red gives a contrast of 4.1:1 against the required 4.5:1, which is fixed by darkening the red a couple of shades in the daisyUI theme.
A new look in a day
- Problem
- The client came with requests for a new storefront style, and it had to be shown and rolled out quickly.
- Solution
- I chose Tailwind and daisyUI: the UI kit components take their look from a theme, the custom taobao_v2 or the standard light and dark. The prototype of a new theme was generated with GPT-4.
- Result
- By my estimate, without measurements: a prototype page in the new style is ready in under an hour after the request, and rebuilding the site takes no more than a day.
Metrics and results
- 600+orders a month at handover
- 2M+products in the catalog at handover
Need a cross-border delivery service or a storefront that can be restyled in a day?
I will design an accessible UI kit, build the storefront in Nuxt and the API behind it.