All cases
E-commerce · ERP

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.

1
site + stock + books
AI
try-on & size match
PAINKILLERAI-примерка
2 490 ₽
4 690 ₽
3 290 ₽

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.

Under the hood

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.

PYorders.pyFastAPI · async
$ POST /orders → 201 · чек в ОФД · трек СДЭК создан
Architecture

Three layers, all in Docker on one server.

nginxSPA · ReactAdmin SPAFastAPIasync RESTCeleryPostgreSQLsnapshot pricesRedis 7cache · brokerMinIO · S3product photos

Stack

Frontend
  • React 18
  • TypeScript
  • Vite 6
  • React Router 7
  • TanStack Query
  • Zustand
  • Tailwind
  • Framer Motion
  • PWA
Backend
  • Python 3.12
  • FastAPI
  • SQLAlchemy 2 · async
  • Alembic
  • Pydantic v2
  • Celery
Data
  • PostgreSQL 18
  • PgBouncer
  • Redis 7
  • MinIO · S3
Infrastructure
  • Docker
  • nginx
  • Let's Encrypt
  • GitHub Actions
  • Timeweb Cloud
Payments
  • Робокасса
  • 54-ФЗ · ОФД
Delivery
  • СДЭК API
  • Яндекс Доставка
  • Самовывоз
AI
  • kie.ai
  • SeedDream 4.5
Security
  • Resend
  • Telegram Bot
  • audit-log
  • rate-limit
  • CSRF · CSP
🥷 Код принят. Хочешь к нам — расшифруй и пришли разгадку на hello@itkiller.pro:
SVRLLVJFQURZLVRPLUJVSUxE