PAINKILLER — store & warehouse in one
The streetwear brand PAINKILLER sold through marketplaces and lost to fees, a faceless storefront and someone else's rules. We built them their own platform — store, warehouse, accounting, delivery and AI try-on in one product — and moved sales to their own site.
Challenge
PAINKILLER depended on marketplaces: high fees, zero control over the storefront and customer, someone else's analytics. Accounting, stock and orders lived in scattered spreadsheets and tools.
They needed their own platform covering the full cycle — from product card to fiscal receipt and delivery — managed from a single admin.
Solution
We built a monorepo of three layers: a React + TypeScript SPA (Vite), an async FastAPI REST API and PostgreSQL. A separate admin SPA on the same stack — warehouse with per-store distribution, product uploads, accounting, order statuses.
Payments via Robokassa with 54-FZ fiscalization and snapshot prices on order lines: changing the price list never breaks sales history. Delivery via CDEK and Yandex, called in parallel; background jobs (emails, CDEK/Yandex requests, Telegram alerts) on Celery + Redis.
A user account with AI try-on: the customer uploads a photo and sees themselves in the product (kie.ai · SeedDream), plus size matching by parameters. Security — an audit log of suspicious events, rate limiting, CSRF, httpOnly cookies, CSP.
Outcome
Site, operations and warehouse closed by one product. PAINKILLER migrated from marketplaces to their own platform — owning the storefront, customer data and full margin.
The whole stack runs in Docker on a single server: nginx, auto-SSL and deploys via GitHub Actions. One repo, async wherever possible.
What's inside
AI try-on
The customer uploads a photo and sees themselves in the product — kie.ai · SeedDream. Plus size matching by parameters.
54-FZ & snapshot prices
Fiscal receipts via Robokassa. Price is frozen on the order line — sales history never drifts.
Warehouse with distribution
Per-store stock, reservation on payment, product uploads — all from the admin.
CDEK + Yandex delivery
Pickup points and couriers across Russia, express in Moscow, in-store pickup. APIs called in parallel.
User account
Orders, statuses, profile, history. The customer stays with the brand, not the marketplace.
Security
Audit log, rate limiting, CSRF, httpOnly cookies, CSP, captcha on signup.
Order, payment and delivery — in one transaction.
Async processing: snapshot prices, stock reservation, a 54-FZ fiscal receipt and a CDEK request — in parallel, with a Telegram alert to the team.
Three layers, all in Docker on one server.
Stack
- React 18
- TypeScript
- Vite 6
- React Router 7
- TanStack Query
- Zustand
- Tailwind
- Framer Motion
- PWA
- Python 3.12
- FastAPI
- SQLAlchemy 2 · async
- Alembic
- Pydantic v2
- Celery
- PostgreSQL 18
- PgBouncer
- Redis 7
- MinIO · S3
- Docker
- nginx
- Let's Encrypt
- GitHub Actions
- Timeweb Cloud
- Робокасса
- 54-ФЗ · ОФД
- СДЭК API
- Яндекс Доставка
- Самовывоз
- kie.ai
- SeedDream 4.5
- Resend
- Telegram Bot
- audit-log
- rate-limit
- CSRF · CSP