[{"data":1,"prerenderedAt":482},["ShallowReactive",2],{"portfolio-en-/en/portfolio/zayoto":3},{"project":4,"isFallback":462},{"id":5,"title":6,"body":7,"description":421,"extension":433,"head":434,"meta":435,"navigation":468,"path":469,"schemaOrg":434,"seo":470,"sitemap":473,"stem":480,"__hash__":481},"portfolio_en/en/portfolio/zayoto.md","Zayoto – SaaS Platform and Marketplace for Car Rental and Transfers",{"type":8,"value":9,"toc":420},"minimark",[10,15,19,22,30,33,37,43,50,53,63,65,69,72,78,85,118,121,128,134,143,145,149,156,175,178,180,184,187,193,200,203,206,208,212,218,224,230,236,244,257,259,263,363,366,368,372,375,387,390,392,396,406,408],[11,12,14],"h2",{"id":13},"a-product-not-a-commissioned-project","A product, not a commissioned project",[16,17,18],"p",{},"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.",[16,20,21],{},"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.",[16,23,24,25,29],{},"Zayoto is the answer to that: ",[26,27,28],"strong",{},"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.",[31,32],"hr",{},[11,34,36],{"id":35},"two-sides-of-the-same-platform","Two sides of the same platform",[16,38,39,42],{},[26,40,41],{},"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.",[16,44,45],{},[46,47],"img",{"alt":48,"src":49},"Zayoto – vehicle search results with prices from multiple agencies","/portfolio/zayoto/search.webp",[16,51,52],{},"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.",[16,54,55,58,59,62],{},[26,56,57],{},"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 ",[26,60,61],{},"SiteBuilder",", a 21-screen module through which an agency configures the look and content of its own public booking site.",[31,64],{},[11,66,68],{"id":67},"transfers-were-the-harder-part","Transfers were the harder part",[16,70,71],{},"Car rental is logistics. Transfers are arithmetic.",[16,73,74],{},[46,75],{"alt":76,"src":77},"Zayoto – transfer search with fixed prices per route","/portfolio/zayoto/transfers.webp",[16,79,80,81,84],{},"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 ",[26,82,83],{},"five rungs, in order",":",[86,87,88,94,100,106,112],"ol",{},[89,90,91],"li",{},[26,92,93],{},"A price the agency typed on a listed route",[89,95,96,99],{},[26,97,98],{},"A zone-pair price from the matrix",", one price, per vehicle class, or per kilometre",[89,101,102,105],{},[26,103,104],{},"The zone's own rate",", for rides inside it",[89,107,108,111],{},[26,109,110],{},"The distance rate",", with class bands or shared bands",[89,113,114,117],{},[26,115,116],{},"The minimum charge"," as a floor",[16,119,120],{},"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.",[16,122,123,124,127],{},"Zones are not a list of towns but ",[26,125,126],{},"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.",[16,129,130],{},[46,131],{"alt":132,"src":133},"Zayoto – SEO landing page for Podgorica Airport transfers","/portfolio/zayoto/airport-hub.webp",[16,135,136,137,142],{},"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 ",[138,139,141],"a",{"href":140},"/en/blog/rent-a-car-website-development-guide","building a car rental website",".",[31,144],{},[11,146,148],{"id":147},"_21-languages-on-two-levels","21 languages, on two levels",[16,150,151,152,155],{},"Guests looking for a car in Montenegro come from all over Europe. The platform runs in ",[26,153,154],{},"21 languages",": English, Serbian, Montenegrin, Croatian, Bosnian, German, Russian, French, Italian, Spanish, Polish, Hungarian, Turkish, Albanian, Slovak, Slovenian, Ukrainian, Dutch, Danish, Swedish and Norwegian.",[157,158,162,163,162,167,162,171],"div",{"className":159},[160,161],"markdown-image-grid","markdown-image-grid--thumbs","\n  ",[46,164],{"src":165,"alt":166},"/portfolio/zayoto/lang-me.webp","Zayoto – homepage in Montenegrin",[46,168],{"src":169,"alt":170},"/portfolio/zayoto/lang-de.webp","Zayoto – homepage in German",[46,172],{"src":173,"alt":174},"/portfolio/zayoto/lang-ru.webp","Zayoto – homepage in Russian",[16,176,177],{},"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.",[31,179],{},[11,181,183],{"id":182},"subscriptions-that-are-actually-enforced","Subscriptions that are actually enforced",[16,185,186],{},"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.",[16,188,189],{},[46,190],{"alt":191,"src":192},"Zayoto – subscription plans for agencies","/portfolio/zayoto/pricing.webp",[16,194,195,196,199],{},"The interesting part here was not the price list but the enforcement. We built per-tenant usage metering and a ",[26,197,198],{},"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.",[16,201,202],{},"Features unlock per plan through a separate gate, so webhooks or the transfers module can be switched on and off without touching code.",[16,204,205],{},"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.",[31,207],{},[11,209,211],{"id":210},"under-the-hood","Under the hood",[16,213,214,217],{},[26,215,216],{},"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.",[16,219,220,223],{},[26,221,222],{},"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.",[16,225,226,229],{},[26,227,228],{},"Public side:"," Blade on a separate bundle, Alpine.js, Swiper, Flatpickr.",[16,231,232,235],{},[26,233,234],{},"Quality:"," 177 test files (Pest) and Playwright end-to-end tests.",[16,237,238,239,243],{},"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 ",[240,241,242],"code",{},"name.zayoto.com"," or on its own domain.",[16,245,246,247,251,252,256],{},"We describe how we approach systems like this on our ",[138,248,250],{"href":249},"/en/services/system-integrations","System integrations"," and ",[138,253,255],{"href":254},"/en/services/strategy-architecture","Strategy and architecture"," pages.",[31,258],{},[11,260,262],{"id":261},"scope","Scope",[264,265,266,279],"table",{},[267,268,269],"thead",{},[270,271,272,276],"tr",{},[273,274,275],"th",{},"Item",[273,277,278],{},"Value",[280,281,282,291,299,307,315,323,331,339,347,355],"tbody",{},[270,283,284,288],{},[285,286,287],"td",{},"Data models",[285,289,290],{},"107",[270,292,293,296],{},[285,294,295],{},"Database migrations",[285,297,298],{},"232",[270,300,301,304],{},[285,302,303],{},"Controllers",[285,305,306],{},"142",[270,308,309,312],{},[285,310,311],{},"Service classes",[285,313,314],{},"80",[270,316,317,320],{},[285,318,319],{},"Admin screens (Vue)",[285,321,322],{},"181",[270,324,325,328],{},[285,326,327],{},"Vue components",[285,329,330],{},"162",[270,332,333,336],{},[285,334,335],{},"Blade templates",[285,337,338],{},"295",[270,340,341,344],{},[285,342,343],{},"Route definitions",[285,345,346],{},"450",[270,348,349,352],{},[285,350,351],{},"Supported languages",[285,353,354],{},"21",[270,356,357,360],{},[285,358,359],{},"Test files",[285,361,362],{},"177",[16,364,365],{},"The transfers module alone accounts for 70 migrations and 24 models, which makes it the heaviest part of the platform.",[31,367],{},[11,369,371],{"id":370},"where-zayoto-is-today","Where Zayoto is today",[16,373,374],{},"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.",[16,376,377,378,251,382,386],{},"Zayoto is also the brand under which we run our transfer projects. ",[138,379,381],{"href":380},"/en/portfolio/podgorica-airport-taxi","Podgorica Airport Taxi",[138,383,385],{"href":384},"/en/portfolio/elite-ride","Elite Ride"," carry the Zayoto mark in their footer, and the experience from both shaped the transfers module on the platform.",[16,388,389],{},"Work continues on OTA connectors and a partner API.",[31,391],{},[11,393,395],{"id":394},"visit-the-platform","Visit the platform",[16,397,398],{},[26,399,400],{},[138,401,405],{"href":402,"rel":403},"https://zayoto.com",[404],"nofollow","zayoto.com",[31,407],{},[16,409,410,411,415,416,142],{},"If you run a car rental or transfer agency and need a system that takes payments and brings in guests, ",[138,412,414],{"href":413},"/en/contact","get in touch",". Have a look at the other ",[138,417,419],{"href":418},"/en/portfolio","projects in our portfolio",{"title":421,"searchDepth":422,"depth":422,"links":423},"",2,[424,425,426,427,428,429,430,431,432],{"id":13,"depth":422,"text":14},{"id":35,"depth":422,"text":36},{"id":67,"depth":422,"text":68},{"id":147,"depth":422,"text":148},{"id":182,"depth":422,"text":183},{"id":210,"depth":422,"text":211},{"id":261,"depth":422,"text":262},{"id":370,"depth":422,"text":371},{"id":394,"depth":422,"text":395},"md",null,{"slug":436,"industry":437,"location":438,"countryCode":439,"year":440,"date":441,"cover":442,"gallery":445,"results":448,"pattern":457,"draft":462,"readingTime":463},"zayoto","SaaS and travel technology","Crna Gora","ME",2026,"2026-07-28",{"src":443,"alt":444},"/portfolio/zayoto/cover.webp","The Zayoto platform shown on a laptop, tablet and phone",[446,49,77,133,192,447],"/portfolio/zayoto/home.webp","/portfolio/zayoto/mobile.webp",[449,451,453,454],{"label":450,"value":354},"Languages",{"label":452,"value":322},"Admin screens",{"label":287,"value":290},{"label":455,"value":456},"Subscription plans","4",{"context":458,"challenge":459,"solution":460,"results":461},"Zayoto is our own product: a SaaS platform for car rental and transfer agencies, with a public marketplace where a guest compares offers from several agencies and books in one place.","Small agencies across the region run their fleet and bookings on spreadsheets and messages. They have neither a website that takes payment nor a channel that brings guests outside the season.","We built a multi-tenant Laravel platform: every agency gets its own public booking site, an admin panel and a subscription, while Zayoto runs a marketplace on top with a per-booking commission.","The platform is in production in 21 languages, with 181 admin screens, a cascading transfer pricing engine and the first agency onboarded as a pilot.",false,{"text":464,"minutes":465,"time":466,"words":467},"5 min read",4.98,298800,996,true,"/en/portfolio/zayoto",{"title":471,"description":472},"Zayoto – SaaS 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.",{"loc":469,"priority":474,"changefreq":475,"lastmod":441,"images":476},0.9,"monthly",[477],{"loc":478,"caption":479},"https://leovacdigital.me/portfolio/zayoto/cover.webp","Zayoto – SaaS platform and marketplace for car rental and transfers","en/portfolio/zayoto","PytNBtpx3x0I93vHIUMiHUP952_25dt2MclaeElj4Mw",1785756106717]