Skip to content

Turlo: a travel marketplace app for web, iOS and Android

Turlo is a commission-free travel marketplace app: travellers search organized trips from travel agencies and guides, then contact the organizer directly. For a travel-tech client I wrote the backend, the web app, the Android app and the native 2.0 apps for iOS and Android, plus an AI import that turns a link to a tour into a complete draft listing, ready for approval.

Wooden swing on a beach on Saona Island, Dominican Republic: a destination photo from the Turlo app
Saona
Winding mountain road through green hills in Romania: a destination photo from the Turlo app
Romania
Turlo 2.0 offer page in the mobile app: a 13-day Sicily tour, 13–25 October 2026, PLN 2,590 per person, with the Ask about this offer button
The Turlo 2.0 offer page (iOS/Android) and two destination photos from the app. Rebuilt from turlo.holiday with live data (Sept 2026); offer photo replaced by a Turlo destination photo.
Industry
Travel tech: organized tours from travel agencies and guides
Scope
Backend, web app, Android app, native 2.0 apps for iOS and Android, AI import and admin tools
Platforms and stack
Web, iOS and Android. Spring Boot, MySQL, Elasticsearch, Angular 22, SwiftUI, Jetpack Compose
Timeline
September 2025 to September 2026, one engineer
Status
Live at turlo.holiday, apps in the App Store and Google Play
  • 16languages, for the interface and every offer
  • 11display currencies, at daily National Bank of Poland rates
  • 3platforms on one API: web, iOS and Android
  • 52klines of backend tests, more than the 44k lines of Java they test

Counted in the repository, October 2026.

The problem

Turlo’s organizers are small travel agencies, independent guides and Polish-speaking operators abroad. Each of them published tours only on its own website, usually in one language and in its own currency.

Cliffs above a turquoise cove on the coast of Spain
Spain
Colourful wooden houses on the harbour in Bergen, Norway
Bergen, Norway
Pyramid in the Egyptian desert with camel riders in the distance
Egypt

Organizers

Getting listed elsewhere meant retyping every tour by hand: the itinerary, what is and isn’t included, each departure with its price and free spots, and the photos. Translation was out of reach.

Travellers

To compare dates and prices, they opened one agency site after another, with PLN, EUR and USD side by side. The big booking platforms solve that, but they charge a commission.

The operator

Run by hand, the catalogue would mean approving every listing, syncing 16 language versions after each edit, collecting reviews only from real participants and feeding social media.

What I built

Six modules on one backend. The web app and both store apps share one Spring Boot API; organizers and the operator work in web panels.

Search in plain language

A traveller types a sentence instead of setting filters. gpt-4o-mini pulls out the destination, budget, dates and trip length. Elasticsearch then matches the text, allows one typo and re-ranks the results by meaning.

Italy in October under $3000

  • Destination: Italy
  • Departure: October
  • Max price: $3000
  • Trip length: any
The query from the screenshot below, and the filters the parser takes from it.
Turlo search results for “Italy in October under $3000”: three trips from Biuro Podróży Piast-Tourist, AS TRAVEL and Mozaika Tours, priced in złoty and euro with approximate dollar amounts (open the full-size screenshot)
Search results for a plain-language query (web, desktop). Rebuilt from turlo.holiday with live data (Sept 2026); offer photos replaced by a Turlo destination photo and the app’s no-photo state.
Turlo panel, Import offers from links: four pasted tour URLs with their status: two imported, one failed, one importing (open the full-size screenshot)
Import offers from links — AI reads the organizer’s page (organizer/admin panel). App screenshot, sample data.

Import from a link

An organizer pastes links to tours on their own website, one per line. A headless browser screenshots each page and collects text and photos. GPT-4o vision turns that into an offer with the itinerary, departures, prices and inclusions, which stays inactive until approved.

16 languages, 11 currencies

gpt-4o-mini translates each offer into 15 more languages and, after an edit, only the fields that changed. Each language gets its own search index, URLs and sitemap. Prices stay in the organizer’s currency, with an approximate conversion at the daily National Bank of Poland rate.

  • pl
  • en
  • fr
  • de
  • es
  • it
  • pt
  • nl
  • sv
  • tr
  • uk
  • el
  • ja
  • id
  • zh-Hant
  • zh-Hans

Social posts on a schedule

The operator connects one Meta account for Facebook and Instagram. GPT-4o drafts each post and gpt-image-1 makes three images. Scheduled slots publish on their own or wait for the operator’s approval.

Moderation and reviews

New offers wait for approval, and an edit sends a live offer back only if its content changed. While a change is copied to the other 15 languages, the offer is locked. Review links go only to people who enquired about a departure that has ended, and every review is moderated.

Turlo admin panel: a review waiting to be published or rejected, and the offers table with status, organizer, dates, price per person and spots (open the full-size screenshot)
Admin panel — moderation of offers and reviews. App screenshot, sample data. The top offer is locked while its edit is copied to the other 15 languages.

Enquiries without commission, on the web and in the apps

An enquiry carries the departure, group size and preferred contact, and goes by e-mail straight to the organizer. Turlo takes no payment and no commission. The 2.0 apps, SwiftUI on iOS and Jetpack Compose on Android, share the web’s API and translations.

Enquiry bar of the Turlo 2.0 offer page: PLN 2,590 per person, Only 3 left, No commission, a group-size stepper and the Ask about this offer button (open the full-size screenshot)
The enquiry bar of the 2.0 offer page (iOS/Android). Live data from turlo.holiday, Sept 2026.

Real listings as of September 2026: the organizer’s Polish title, and the English title Turlo generated from it.

  • Hola Dominikana

    Perła Dominikany - Wyspa Saona

    ENPearl of the Dominican Republic - Saona Island

    7–28 Nov 2026, 4 dates

    from$145

  • Mozaika Tours

    ANDALUZJA Semana Santa na południu Hiszpanii

    ENANDALUSIA Semana Santa in southern Spain

    19–24 Mar 2027, 6 days

    €1,420

  • ADBER

    Podróż przez tysiąclecia

    ENJourney Through the Millennia

    5 Oct and 5 Dec 2026, 12 days

    fromPLN 9,500

One API, three apps

One Spring Boot 3.5 backend on Java 21, built with DDD and CQRS, serves all three apps. Writes go to MySQL; searches read from Elasticsearch, which holds every offer in all 16 languages.

  • Web appAngular 22, at turlo.holiday
  • iOS appSwiftUI (2.0)
  • Android appJetpack Compose (2.0)

REST API: v2 for the web and the 2.0 apps, v1 frozen for installed 1.x apps

On the server, in Docker Compose

  • Backend: Java 21, Spring Boot 3.5, DDD with CQRS
  • MySQL 8: offers, departures, organizers, enquiries and reviews
  • Elasticsearch 9: 16 language indexes for text and vector search
  • Scheduled jobs: exchange rates, review invitations, social posts

Cloud services

  • OpenAI: GPT-4o, gpt-4o-mini, embeddings, gpt-image-1
  • AWS S3: offer and itinerary photos
  • Mailgun: enquiries, confirmations and approval notices
  • NBP API: daily exchange rates
  • Meta Graph API: Facebook and Instagram posts

Where the data goes

The AI steps call OpenAI’s API in the cloud and see listing content and search phrases. Enquiries, with travellers’ names and e-mail addresses, never pass through a model: Mailgun e-mails them straight to the organizer.

What guards each release

The backend has four tiers of tests, and golden-file tests freeze the v1 API. A contract test checks the Angular models against the Java DTOs, and 26 Playwright specs test the web end to end.

Timeline

From the first commit on 13 September 2025 to the 2.0 apps in September 2026.

  1. Sept – Oct 2025

    Backend core

    Offers, departures, itineraries and inclusions in MySQL, organizer accounts and enquiries.

  2. Dec 2025 – Jan 2026

    First AI features

    Reading offers from organizers’ pages, and Facebook and Instagram posts with generated images.

  3. Feb – Mar 2026

    The platform

    Web panels, Elasticsearch search, link import, 16 languages, currencies, the sentence parser and the Android app.

  4. Apr – Jul 2026

    Upkeep

    Maintenance, the social-media scheduler, and the iOS app added to the same repository.

  5. Aug 2026

    New public site

    A search-first site for travellers: home, offer and organizer pages, localized URLs and sitemaps.

  6. Sept 2026

    Version 2.0

    Reviews, saved trips, destination pages, end-to-end tests, the native 2.0 apps and bulk import for the operator.

What changes for organizers and travellers

  • Adding a tour takes a pasted link and a check, not retyping it field by field.
  • Every approved offer goes out in 16 languages, with no translation work for the organizer.
  • Travellers compare trips from different organizers in one place and in one currency.
  • Organizers get enquiries directly and pay no commission; only invited participants can review.
  • One backend and one set of translations serve the web app and both store apps.

Checked before the 2.0 release

  • 0errors and 0 code warnings in the clean iOS Debug and Release builds
  • 2,323of 2,323 checks passed in the iOS app’s self-test
  • 114Android unit tests passed, 0 failures

A clean re-run of every build and test of version 2.0, 22 September 2026.

Questions clients ask before a build like this

How much does a travel marketplace app like Turlo cost?

The price follows the scope, and Turlo’s scope (a backend, a web app, two native apps and the AI pipeline) grew in stages over twelve months. Most projects start smaller: a proof of concept on your data costs PLN 10,000–25,000 net (≈ €2,300–5,700) and takes 2–4 weeks, and a system built on your company’s data is usually PLN 40,000–120,000 net (≈ €9,100–27,400) over 2–3 months. Euro amounts use the NBP mid rate of 9 Oct 2026 (1 EUR = 4.3775 PLN), rounded. For the full breakdown, read How much does it cost to build an app in Poland? Real budgets for 2026.

How long does it take?

A focused first version usually takes 2–3 months. Turlo, by contrast, grew in stages over twelve months: the backend first, then the AI import, search and translations, and the native 2.0 apps last.

Is our data safe if the app uses AI in the cloud?

It can be, if you decide early what the model may see. Turlo sends OpenAI listing content and search phrases, never enquiries, and keeps photos on AWS S3 in Frankfurt (eu-central-1). When the data is confidential, I run local models on the client’s own server; Turlo’s embedding step can already switch to one under Ollama.

Can it connect to the systems we already use?

Yes. Turlo talks to OpenAI, Mailgun, AWS S3, Meta and the National Bank of Poland, and its import reads organizers’ websites that have no API. If you run an ERP such as Comarch ERP, SAP or IFS, I connect to it through its API or SQL views. We agree the scope of the connection on the first call.

Will a new version break the apps people already installed?

No. Installed 1.x apps still use a frozen v1 API, and contract tests fail the build if a v1 response changes. New features ship under v2.

Rafał Szewc

Planning something similar?

Tell me what your product should do. You talk to me, the engineer who writes the code, and I reply within one business hour on WhatsApp.

WhatsApp +48 517 297 217 (opens in a new tab)

WhatsApp