Case study · SaaS and travel technology

Zayoto – SaaS Platform and Marketplace for Car Rental and Transfers

Our product: a multi-tenant SaaS platform for car rental and transfer agencies, a guest marketplace, cascading pricing and 21 languages. Read the case study.

Crna Gora Year: 2026 ME
Languages: 21Admin screens: 181Data models: 107

A product, not a commissioned project

Zayoto is the only project in this portfolio that was not built for a client. We built it because, while making websites for car rental and transfer agencies in Montenegro, we kept running into the same problem.

An agency has ten to thirty vehicles, tracks them in a spreadsheet, takes bookings over WhatsApp and the phone, and has a website that is a catalogue without payment. In summer they are too busy to change anything. In winter there is not enough revenue to pay for it. A bespoke build costs about half a season.

Zayoto is the answer to that: one platform the agency pays for monthly, which gives them their own site with payments, an admin panel for fleet and bookings, and access to a marketplace that brings guests in.


Two sides of the same platform

For guests, Zayoto is a marketplace. They enter a city and dates and get every offer from every agency in one view, at a price that is final. No surprises at the desk.

Search returns offers grouped by category and transmission, with the terms spelled out: unlimited mileage, deposit or no deposit, free cancellation, basic insurance, full-to-full fuel. The price is always shown both per day and as a total for the selected period.

For agencies, Zayoto is an operating system. Fleet, categories, seasonal pricing, bookings, customers, contracts with electronic signatures, invoices, discount codes, staff roles and an activity log. Plus SiteBuilder, a 21-screen module through which an agency configures the look and content of its own public booking site.


Transfers were the harder part

Car rental is logistics. Transfers are arithmetic.

A transfer price depends on the route, the distance, the vehicle class, the time of day and the season. We built a fare engine that takes the first rule that fits, across five rungs, in order:

  1. A price the agency typed on a listed route
  2. A zone-pair price from the matrix, one price, per vehicle class, or per kilometre
  3. The zone's own rate, for rides inside it
  4. The distance rate, with class bands or shared bands
  5. The minimum charge as a floor

Only then come the shared modifiers, always in the same order: class price level, season, time-of-day surcharge, location fees. The result is not just a number: the engine returns a readable line such as "base rate €1.20/km × 67 km", so the guest can see where the price comes from. Minimum lead time rules sit separately from price and decide whether a ride can be booked at all.

Zones are not a list of towns but real GeoJSON polygons, drawn by the agency with the mouse on a map in the admin. Distance is resolved through four fallbacks: a database cache (30 days, storing the route polyline), then Google Directions, then Distance Matrix, then the haversine formula. The idea is simple: the page always returns a price, even when Google is unavailable.

Podgorica and Tivat airports have their own hub pages, and every common route gets a programmatically generated page with a fixed price. We explain why that matters in our guide to building a car rental website.


21 languages, on two levels

Guests looking for a car in Montenegro come from all over Europe. The platform runs in 21 languages: English, Serbian, Montenegrin, Croatian, Bosnian, German, Russian, French, Italian, Spanish, Polish, Hungarian, Turkish, Albanian, Slovak, Slovenian, Ukrainian, Dutch, Danish, Swedish and Norwegian.

Translation works in two layers. The interface comes from language files, while content agencies enter themselves (category names, terms, pages) runs through a translation table in the database. How many languages an agency can switch on depends on its plan.


Subscriptions that are actually enforced

Three publicly priced plans, Starter at €99, Growth at €149 and Pro at €199 per month plus a per-vehicle fee, with Enterprise on request. Paying annually is billed as ten months. Every plan comes with a fifteen-day free trial.

The interesting part here was not the price list but the enforcement. We built per-tenant usage metering and a four-step escalation: fine, a soft warning at 80% of the limit, a seven-day grace period past 100%, then a hard block. There is no scenario where an agency loses access mid-season without a single warning.

Features unlock per plan through a separate gate, so webhooks or the transfers module can be switched on and off without touching code.

The marketplace has its own economics, separate from the subscription: a booking that arrives through the marketplace carries a commission, at a rate agreed per agency and with a minimum amount per booking.


Under the hood

Backend: PHP 8.4, Laravel 12, Inertia.js 2, Laravel Cashier with Stripe for subscriptions and payments, Spatie permission, Sentry, Twilio for SMS, Web Push, DomPDF for contracts and invoices, MySQL and Redis.

Admin: Vue 3.5 with TypeScript, Tailwind CSS, shadcn-vue components, Leaflet with leaflet-draw and Turf.js for drawing zones, FullCalendar for the booking calendar, signature_pad for electronic contract signing.

Public side: Blade on a separate bundle, Alpine.js, Swiper, Flatpickr.

Quality: 177 test files (Pest) and Playwright end-to-end tests.

Multi-tenancy is handled by an automatic global scope at the model level, with tenant resolution by domain, subdomain or context kept separate. Every agency can run on name.zayoto.com or on its own domain.

We describe how we approach systems like this on our System integrations and Strategy and architecture pages.


Scope

ItemValue
Data models107
Database migrations232
Controllers142
Service classes80
Admin screens (Vue)181
Vue components162
Blade templates295
Route definitions450
Supported languages21
Test files177

The transfers module alone accounts for 70 migrations and 24 models, which makes it the heaviest part of the platform.


Where Zayoto is today

The platform is in production behind Cloudflare, with a marketplace in 21 languages covering Podgorica, Tivat and Kotor. The first agency has been onboarded as a pilot.

Zayoto is also the brand under which we run our transfer projects. Podgorica Airport Taxi and Elite Ride carry the Zayoto mark in their footer, and the experience from both shaped the transfers module on the platform.

Work continues on OTA connectors and a partner API.


Visit the platform

zayoto.com


If you run a car rental or transfer agency and need a system that takes payments and brings in guests, get in touch. Have a look at the other projects in our portfolio.

Next step

Have an idea for a similar project or want a system review?

Based on projects like these, we build digital systems that give you back your time. Get in touch so we can see what's realistic for your business in the next 6-12 months.