Case study · 2026
Viaqui: 113,093 attractions in Europe, started from a Romanian site, in 11 days.
An English-language site for travellers: what is worth seeing in each European city, on a map, in routes and in a trip plan. It started as a copy of bilete.online, generalised for several countries, currencies and languages.
- Role
- Founder. Product, design, code, data
- Period
- 6 - 16 October 2026
- Status
- Live on viaqui.com since 8 October
- Built on
- ePAS, starting from the bilete.online code
- The problem
- I wanted to see how quickly bilete.online could become a product for all of Europe.
- What I built
- 113,093 attractions from 51 countries, from open data, with 17 currencies, maps, routes and a planner.
- The result
- Public after three days, finished in 11, with 80 commits. For now it earns from referrals to partners.
- 113,093 attractions in the catalogue
- 51 European countries
- 17 display currencies
- 11 days, from the first to the last commit
Attractions are counted in the data files in the repo; the rest on the site and in git, on 5 November 2026.
01 · The idea
The same product, but for all of Europe.
bilete.online already had the map, the routes, the planner and the operator panel, but only for Romania and only in Romanian. I wanted to see how quickly the same code could become an international product.
The answer: 80 commits in 11 days. On 8 October the site was public and indexable.
02 · The 11 days
How it grew, day by day.
- 6 Oct
The copy and the English skeleton
I started from the bilete.online code: English interface, 12 categories, Europe’s places from GeoNames, country and city pages, prices in euros.
- 7 Oct
All the attractions
Attractions from Wikidata for 50 countries, with description, dates, UNESCO badge and nearest neighbours. Country maps, 16 routes, a planner per country, partner experiences, flights, sitemaps.
- 8 Oct
Currencies, languages, launch
The visitor picks the currency. All texts go through a translation layer, including the operator panel. I automated sending pages to search engines and opened the site.
- 9-16 Oct
Speed and indexing
Rounds of PageSpeed, real modification dates in the sitemap, a 503 code instead of 404 when the platform behind is busy, unique descriptions for each page.
03 · The data
Open data only, with the source written on the page.
I did not copy photos and did not buy databases. The catalogue is built offline from openly licensed sources, then loaded into the platform by a seeder that never overwrites a cover chosen by hand.
- 01
GeoNames
- 51 countries, 585 regions
- 9,038 cities over 10,000 inhabitants
- CC BY 4.0 licence
- 02
Wikidata
- 113,093 attractions in 50 files
- Descriptions, coordinates, UNESCO
- CC0 licence
- 03
Wikimedia Commons
- Photos shown from the source, at 960 px
- Author and licence kept
- Photo credits page
- 04
ePAS and the site
- Idempotent seeder in the platform
- 161 static files for maps and the planner
- Pages served from cache
Germany has the most attractions (16,834), followed by Italy (15,471), France (12,428), Spain (12,302) and the United Kingdom (9,736).
04 · Components
What I added on top of bilete.online.
Currencies
The price appears in the country’s currency, and filters compare in euros.
- 17 currencies for the visitor to choose
- Daily rates, with a fallback table
- Separate page cache for each currency
- ECB rate in the platform for operator prices
Languages
The catalogue is in English for now, but the code is ready for any language.
- Every text goes through the translation function
- The same layer in JavaScript
- The language prefix is added to links automatically
- Language field on each marketplace in ePAS
Partners
Until operators arrive, the money comes from referrals to travel partners.
- Audio tours, flights, transfers, eSIM, cars
- A single exit point, with a list of allowed domains
- Partner scripts, only after marketing consent
- Attribution by page type and by city
Indexing
Almost 140,000 pages need to be found by search engines.
- Sitemaps split by country, under the 50,000 limit
- Real last-modified date, taken from git
- IndexNow and Search Console, daily, automatic
- Empty categories are not indexed
05 · Metrics
What I counted.
Measured in the repo and in the live sitemaps, on 5 November 2026. The attraction pages are informational: tickets are bought through partners for now.
- 113,093attractions, the sum of the 50 country filesmeasured
- 129,840URLs in the attraction sitemaps and city listsmeasured
- 9,087place pages: countries, regions, citiesmeasured
- 53sitemaps, the largest with about 17,500 URLsmeasured
- 80commits in 11 daysgit
- 0.24 shome page response time, a single measurementmeasured
How much code
- 224
- PHP files
- 68k
- lines of PHP
- 161
- data files for maps
- 23 MB
- data about Europe
- 17
- routes
- 12
- categories
06 · What I learned
What I take with me.
Generalise the second time, not the first
bilete.online was written for a single country. Only when I needed a second one did I know what had to move into configuration: currency, language, data source.
A false date in the sitemap breaks everything
If every page says it changed today, the search engine stops believing any of them. The date now comes from the git history of each file.
When the platform behind does not respond, say so correctly
A 404 removes the page from the index. A 503 only asks the crawler to come back later.
A product decision can change twice in three days
Euros everywhere, then the country’s currency, then the visitor’s choice. Each option was cheap to test because the price goes through a single place.
07 · Where it is now
A European catalogue, in English for now.
All texts already go through the translation layer, but the only published language is English. The cart, payment and operator panel are ready, but on 5 November 2026 the sitemap did not yet have any experience sold directly. Until then, Viaqui earns from referrals to partners.
Working on something similar?
I build web products from idea to launch, as a developer or as a technical co-founder. Write to me and we will see if it fits.