Jovira: Travel Agency Operations Platform
Self-hosted operations platform for a start-up travel agency: reservations, hotel and tour inventory, agency and public pricing, an internal Work Desk and financial reports. Includes a public website and an agency portal, built as a Django REST API with two Next.js apps.
- Axios
- Django
- Django REST Framework
- Docker
- Docker Compose
- Gunicorn
- Let's Encrypt
- next-intl
- Next.js
- Nginx
- PostgreSQL
- React
- SimpleJWT
- Tailwind CSS
- TanStack Query
- TanStack Table
- TypeScript
- Zod

Problem
Jovira Travel Agency is a start-up that needed one system to run its daily operations: reservations, hotel and tour inventory, pricing, internal task handover between staff, and management reporting.
The agency also sells through two channels with different prices: approved partner agencies and the general public. The system had to keep these strictly separated, support English, Russian and Turkish, and be fully self-hosted with no third-party SaaS.
Solution
The platform is split into three separate repositories, each with its own concerns:
- Backend: Django REST Framework API on PostgreSQL with JWT authentication and role-based access control.
- Admin panel: Next.js (App Router, TypeScript) for staff: reservation grid, inventory, Work Desk and reports.
- Public website: Next.js site with hotel and tour search, booking requests and an agency portal.
Key decisions:
- Pricing: every sellable item has a public and an agency price. Approved agencies see the agency price, everyone else sees the public price, and an unapproved agency never sees agency pricing. If no public price is set, the site shows "Price on request" and the customer can still submit a request.
- Website bookings: requests from the site create a real reservation in the same admin grid, so staff work in one place. Visitors are linked to an existing customer by email, and accounts are never created automatically.
- Reservation numbers: generated server-side as a year-based sequence (for example JV2609-00001), so staff can tell reservations apart easily.
- Work Desk: a four-panel internal workspace (pins, reminders, received requests, sent requests) for handing work between departments. Sender fields are set on the server and cannot be spoofed.
- Tour inventory: one tour holds a rate matrix (duration, hotel star category, room type) with a mandatory validity period on each rate.
- Hotel special offers: date-range pricing that applies automatically to a matching stay and falls back to the standard room price when a value is empty.
- Reporting: a management reports module with eight tabs and CSV export, restricted to admin and finance roles.
- Internationalisation: English, Russian and Turkish in both frontends, with a script that checks all translation files stay in sync.
- Deployment: Docker and Docker Compose on a single VPS behind Nginx with Let's Encrypt SSL. PostgreSQL runs on the host, outside Docker, so backups stay independent.
Result
The three applications went into production on 12 September 2026 and run over HTTPS on separate subdomains for the public site, the admin panel and the API.
The main flows were tested end to end, from hotel search and booking as an anonymous visitor and as an agency through to the resulting reservation in the admin grid.
The client keeps adding features, including tour rate matrices, special offers and room availability indicators, and real inventory is being entered into the live system.
Still planned: voucher generation, cancellation and approval actions, and reservation amendments.