New Pro + Launch: pick a template and our developers set up your site in 2 business days.
See how it works
Case studies / Build
Vivi City Network Travel · Comparison platform
Build Platform back end

The Back End Behind a Travel Comparison Platform

vivi.city compares tours, tickets and activities from GetYourGuide, Viator, Tiqets and Musement in eight languages. On its custom Laravel platform we keep the supplier data flowing with a scheduled product sync and an automated location sync, reworked the filters and location tools, and opened the data up through a product API and a Google Things To Do feed.

  • Laravel
  • adminNova
  • suppliers4 APIs
  • languages8
  • feedGoogle Things To Do

2026 · ongoingPhase 1 of the Things To Do feed built, next phases in progress

ClientVivi City Network
Timeline2026 · ongoing
ScopeLaravel back end · Supplier sync · Product API · Google feed
Live sitevivi.city
Results

What changed

4

Supplier APIs in one sync week. GetYourGuide, Musement, Tiqets and Viator, one a day, plus manual sync per location.

8

Languages per location. Titles and descriptions now edited per language in the back end.

1

Feed for Google Things To Do. Phase 1 built: feed generator, POI mapping and a validation report.

01 The brief

A comparison site is only as good as its product data

vivi.city helps travellers find, compare and book tours, tickets and activities in eight languages. It runs on a custom Laravel platform with a Laravel Nova back end, and every product it shows comes from a supplier API.

Each product gets its own vivi.city ID and takes its name, main picture, price, duration and rating from the supplier. Products are attached to locations along the URL structure language / country / city / point of interest. When the data is late, wrong or hard to sort, the comparison stops working.

The front-end redesign of vivi.city is its own case study: Global Travel Comparison Platform Redesign.

Where the products come from
  • GetYourGuidemain partner
  • Viatorthe largest
  • Tiqetssupplier API
  • Musementsupplier API
What each product takes from the API
namemain picturepricediscounted pricedurationrating
GoalKeep four suppliers’ products in sync at a sensible cost, give the team better tools to shape each location – and get the data in front of more people, on partner sites and in Google.
02 What had to be built

Three jobs for one back end

Bring the data in

Product and location sync from four supplier APIs, automatic and on demand.

Shape every location

Filters, display logic and editor tools so each city and POI shows the right products.

Send the data out

A vivi.city product API for widgets, and a Google Things To Do feed.

  1. R1Scheduled product syncOne supplier per day, plus a manual sync per location or POI.
  2. R2Automated location syncReplace the costly manual runs on Google Cloud Platform.
  3. R3Viator API updateA high-level update of the Viator sync for full API compatibility.
  4. R4Filters & display logicA reworked filter system and product ordering, desktop and mobile.
  5. R5Location tools in NovaAttach products, top attractions, titles and descriptions per language.
  6. R6Product API & feedWidgets fed by vivi.city, and a feed for Google Things To Do.
03 How it fits together

Suppliers in, locations in the middle, three ways out

Supplier APIs
GetYourGuide
Musement
Tiqets
Viator
Sync
Product syncscheduled per supplier · manual per location / POI
Location syncautomated location ↔ supplier mapping
Platform
Laravel + Novaproducts with their own ID · locations: language / country / city / POI · 8 languages
Out
vivi.cityfilters, search, top attractions
Product APIembeddable widgets
Things To DoJSON feed for Google
The sync week
  1. Mon–
  2. TueGetYourGuide
  3. WedMusement
  4. ThuTiqets
  5. FriViator largest
  6. Sat–
  7. Sun–

One supplier a day, automatically. Viator, the largest, closes the week on Friday.

On demand, per location or POI
$ php artisan products:sync <location> \
    --supplier=viator
04 The build

Data that arrives on time, locations the team can steer

Location sync

From expensive manual runs to an automated job

BeforeManual syncs on Google Cloud PlatformA high cost for every run, and little documentation on how it worked.
AfterAutomated location syncLocation suppliers stay in step without anyone starting a run by hand.
Product sync for Viator

The largest catalogue, on an up-to-date API

A high-level update of the Viator integration for full compatibility with its API, running in Friday’s slot of the sync week.

Inside every location

Top attractions pick themselves

Each location now carries a Top attractions module. It fills itself from the rules below – unless an editor sets it by hand.

  1. 1Only approved POIs
  2. 2Each with 100+ products
  3. 3At most 10 per location
  4. orSet manually in the back end
  • Filter system reworkDesktop and mobile, an on-sale button, and the option to exclude a filter or a single product from a location.
  • Product display logicA new algorithm for which products show first.
  • Search inside a locationFind a product without leaving the city or POI.
  • Attach products to a locationAn easy way for the team to connect products and places.
  • Titles & descriptions per languageA back-end page to edit them for each of the eight languages.
  • Tour language & extra infoShown with each product.
  • “No product found” pageFor locations or filters with no matching products.
vivi.city
vivi.city home page: Find, Compare, Book, with the supplier logos below the search
What it all feedsFind → Compare → Book on vivi.city, with the partner suppliers listed under the search.
05 Opening the data up

The same products, on partner pages and in Google

Widgets · phase 0

A vivi.city product API

An API that returns vivi.city products for embeddable widgets – a test of whether vivi.city widgets in place of GetYourGuide’s help SEO and traffic.

Returns
titleimagepricelink
Filter by
city / locationproduct IDs
Tracking
campaign parameters
Product cards picked by the travel team on vivilondra.it, a VIVI city guide
Product cards on vivilondra.it, one of the VIVI city guides.
Google Things To Do · phase 1

A feed generator with a validation report

Tours and activities export to a Things To Do JSON feed, with POI mapping and a report that shows which products are ready and which need fixing first.

// one entry per product
{
  "id", "title", "description", "image",
  "city", "country", "related_poi",
  "booking_url", "price", "currency", "option"
}
  1. Map POIsproducts to Google’s points of interest
  2. Validateready · needs fixing
  3. Exportthe JSON feed

Phase 1 built · next phases in progress

06 Keeping it running

The quieter work behind a live platform

  • Cache issuefixed
  • Cloudflare IP whitelistset up
  • NinjaFirewall & Sendyupdated
  • Site down (error 500)fixed
  1. EarlierRedesign & Laravel upgradeThe front end and the Laravel core – separate case study.
  2. 2026Sync, filters & location toolsLocation sync, Viator update, filter rework, display logic, top attractions.
  3. Jun 2026Things To Do · phase 1Feed generator, POI mapping and validation report.
  4. NowNext phasesThe Things To Do feed and the widget test continue.
  • Laravel
  • Laravel Nova
  • PHP
  • Supplier APIs
  • Google Things To Do
  • Cloudflare
  • NinjaFirewall
  • Sendy

Running a platform on supplier data?

Syncs, APIs, feeds and admin tools – tell us what your platform needs and we’ll plan the back end with you.