Logistics ERP / CRM

InterRail

ERP and CRM platforms built from zero to fully automate core business processes for an international rail-freight logistics company — accounting, contract management, KPI tracking, and AI-powered document processing.

Overview

InterRail is a suite of ERP and CRM systems I built from scratch for an international rail-freight logistics company operating across Central Asia and Russia. Before these tools existed, the team tracked orders, contracts, and KPIs in spreadsheets. Now everything — from inquiry through shipment to financial settlement — lives in one place, used daily across 6+ countries.

What I built

  • Built both ERP backends from scratch in Django — all data models, REST APIs, and async background jobs for a company that tracks rail freight across Central Asia.

  • Owned all three Vue 3 frontends — the admin CRM, the tracking dashboard, and a Telegram mini-app — including multi-language support and end-to-end tests.

  • Integrated an AI assistant so staff can ask about orders and inquiries in plain language — it reads from the live database and tracks cost per user.

  • Built the document pipeline that parses rail waybill PDFs, spreadsheets, and Word files into structured records — saving hours of manual data entry per shipment.

Architecture

Two independent full-stack systems — one for the Central Asia ERP, one for the tracking platform — each following the same pattern: a Django REST backend with real-time WebSocket support, PostgreSQL, Redis, and a Celery worker for background tasks, all in Docker Compose. Vue 3 SPAs talk to their respective backend over JWT auth, and MinIO handles file storage so waybill documents stay accessible without bloating the database.

Under the hood

  • Contract and act accounting with automatic completion signals: when all line items on an act are filled in, a background task marks it complete automatically — no one needs to remember to close it manually. Django signals keep denormalized totals on the company record in sync without expensive re-aggregation queries.

  • Polymorphic order model: a single order table covers container shipments, wagon loads, and empty wagon returns — each with its own shipment and payment status lifecycle — so the ops team works in one view regardless of cargo type.

  • AI-assisted waybill extraction: the document pipeline dispatches by file type — PDF, spreadsheet, or Word — extracts the text within safe size caps, and feeds it to the AI to produce structured waybill records. Staff went from entering 30+ fields per document by hand to reviewing the AI's output and clicking confirm.

What I learned

  • ERP scope always expands — the most important engineering decision was keeping each subsystem (contracts, orders, finance) cleanly separated so new requirements didn't cascade everywhere.

  • Adding an AI layer to document processing revealed that the bottleneck wasn't extraction accuracy — it was data quality upstream. Garbage in, garbage out applies even with good models.

Built with

Frontend

  • Vue 3
  • Vuex 4
  • Vue Router 4
  • Bootstrap 5
  • ApexCharts
  • Leaflet
  • Playwright

Backend

  • Python 3.11
  • Django 4.1
  • Django REST Framework 3.14
  • Daphne/ASGI
  • Celery 5.3
  • openai-agents

Data & Search

  • PostgreSQL 14
  • Redis 7
  • Elasticsearch 7
  • MinIO

Infra & Tools

  • Docker Compose
  • Docker Swarm
  • GitHub Actions
  • ruff
  • mypy