Skip to content

Black Friday at Știri din Turism

One page for Romania's travel-agency Black Friday: 2,381 offers collected and checked by code, searched in plain words and compared side by side, with no invented discounts.

Visit stiridinturism.ro
Client
Știri din Turism
Industry
Travel news publisher
Scope
Design and build of a Black Friday offer hub
Platform
Astro on Cloudflare Workers
Duration
1 week
Location
Romania
Design
PixelMakers
Build
PixelMakers
Year
2026
stiridinturism.ro
The Black Friday la vacanțe page on Știri din Turism: a large serif headline and a search box over a dotted globe with gold flight routes

Știri din Turism is a Romanian travel news site. Every November the country's big travel agencies run Black Friday at the same moment, each on its own site, each with its own idea of what a discount is. We designed and built one page where readers can see all of it: describe the holiday you want, compare the packages, and book directly with the agency.

A departure hall, not a banner

The page opens at night. A large serif headline sits over a globe of dots, with a gold line for the routes on sale. Scrolling turns the globe and walks through the campaign in three beats: where you can leave from, where you can go, and why the prices can be trusted.

A dotted globe centered on Romania with gold routes to Europe, Africa and Asia, beside the headline Prețuri reale, nu promisiuni and the line 2381 de oferte de la 4 agenții
The globe carries the opening story, with each line a route someone can book.

Below it, a split-flap departure board lists the lowest price country by country, next to a countdown to the end of the campaign. Tap a row and you land on that package.

A split-flap departure board listing destinations, agencies, nights, departure dates and starting prices in amber letters, with a countdown clock at the top right
The departure board, with live prices and the campaign countdown.

Describe the holiday in your own words

The search box takes a sentence instead of a form. Someone types all inclusive in Egypt under €600, with kids, and the page answers with 110 offers. What it understood appears as chips that can each be removed, and the globe redraws to show only those routes.

Search results for all inclusive in Egypt under 600 euros with kids: filter chips for Egipt, All Inclusive, sub 600 euro and cu copii above hotel cards and a map of routes to Egypt
A sentence becomes filters the reader can see and undo.

The AI can only choose from values that exist in the catalog, and code checks its answer again, so it can't send a reader to a destination the catalog doesn't have. Preferences like somewhere warm rank the results but never hide any. Every call is paid for in advance from a fixed budget, and if that budget runs out, readers simply get keyword search instead.

Compare, without picking a winner

Readers can put up to four offers side by side: agency, price, departure, nights, board, transport and conditions, with a switch to show only the differences and a link to share the comparison.

Two hotels in different resorts are not the same product, and the page says so: these are different holidays, so it doesn't choose a winner. Package totals are never ranked against per-person prices.

A comparison dialog titled Vacanțe diferite, față în față, with three hotels in columns and rows for agency, price, destination, hotel and departure
Three offers side by side. The page names what differs and leaves the choice to the reader.

2,381 offers, no editor

Every two hours, a worker on Cloudflare visits each agency's campaign and reads its offers using saved maps of that agency's pages. AI writes a map only when a new page layout appears, and a second model reviews it once. Ordinary runs use no AI at all: after the maps were written on launch morning, collection made no further model calls.

Each offer passes checks in code before it goes live: an explicit currency and price basis, exact amounts, dates, a link to an approved domain, and proof that the text really appears on the agency's page. Anything that fails is set aside while the rest publish, and a failed or partial run can't wipe the catalog.

The offer catalog: hotel cards with discount badges, agency logos, from prices and old prices, next to a map labeling destinations with their lowest prices
Each card carries the agency's photo, its price basis and the time it was last verified.

A discount has to mean something

Black Friday pages are full of up to 65%. Here that claim stays on the agency's row, as the ceiling of its campaign. An offer shows a saving only when the agency displays an older price for that same offer, and the code works out the difference itself.

Everything else is labeled for what it is: a declared discount, a bonus, a payment option. From prices keep the word from. What an agency doesn't say stays blank, so a missing departure city shows a marker at the destination instead of an invented flight from Bucharest.

Each agency row shows when it was last checked and says so when an update is late. An offer that can't be confirmed for 12 hours leaves the page.

A list of agencies with logos, campaign status, announced discounts, offer counts and the time each was last verified
Every agency shows its own campaign terms, offer count and last check, including when an update runs late.

The challenge

The real offers didn't exist until the campaign opened. The day before launch, most agency pages were still teasers, and each agency built its campaign differently, with hotel grids, tour pages and ski pages. The page had to read all of them, stay correct while prices moved for three days, and run without anyone checking offers by hand.

Our approach

We started with what the page is allowed to say, then built the collection around those rules. The first plan had AI agents reading and checking every offer. We replaced it with scripts before launch: cheaper, repeatable and far easier to audit, with AI kept for the one job scripts can't do, which is learning a new page.

Then we audited the live data. The first import held 403 offers, and the audit caught that Karpaten's 37 entries were destination banners, not hotels. The collector now opens every collapsed section before reading, which brought in 1,152 real hotels. The same audit caught DERTOUR departure dates showing one day early and corrected them against the booking links.

Results

The page ran for the full campaign, 6 to 8 November 2026, as part of Știri din Turism. On its final day it carried 2,381 offers from Christian Tour, DERTOUR, Eturia and Karpaten across 258 destinations, on a two-hour schedule, with no editor approving offers. eMAG's one-day edition added agency offers on 6 November and closed on time.

2,381
Offers live on the campaign's final day, from four agencies
258
Destinations, with departures from 19 cities
2 h
Between scheduled checks of each agency
12 h
The longest an offer stays up without a fresh confirmation

Stack

Site
Astro on Cloudflare Workers
Collection
Cloudflare Workers, Workflows and Durable Objects, with Browserbase for pages that need a real browser
Data
Cloudflare D1, with photos and source evidence in R2
AI
OpenAI models for search and page maps, Workers AI embeddings, all under a fixed budget
Motion
Three.js globe, GSAP and Lenis