Hotel Universe is, at its core, a canonical hotel database with a matching engine bolted to the front of
it. Records are ingested from Google Hotels, Google Places, Booking.com, TripAdvisor and Expedia, validated
against schemas, and merged into a single canonical record per property in canonicalData6 — around a
million of them. The merge is field-group by field-group with a fixed source priority, and every group records which
source it came from, so the record carries its own provenance. Each property gets a ten-character
huId, and a resolution ladder walks reference IDs across sources to decide when two source records are
the same hotel. Search sits on a MongoDB Atlas Search index with geospatial, text, star, country, city, amenity and
data-availability filters, cursor-paginated and served through a REST API of roughly fifty endpoints. A scraping
service keeps the sources refreshed on a thirty-day staleness threshold, running batches of a hundred at fifty
concurrent requests.
On top of that sits the workflow the product actually sells: bring your own list. A customer
uploads a CSV and it is matched either exactly, by any of a long list of reference ID types — Google, Booking,
TripAdvisor, Expedia, Agoda, Trivago and around thirty more — or by similarity on names, addresses and coordinates
when no IDs exist. Confident rows land in the list; uncertain ones go to a review queue where a human sees the
uploaded row beside the candidate property with per-signal confidence on name, address, postcode and geography, and
approves or rejects. Lists can also be built from a saved search, from a selection, or by combining other lists, and
a saved search stays dynamic — it can be refreshed, diffed against what it would return today, and converted to a
static list. Exports stream out as gzipped JSON to Google Cloud Storage behind fifteen-minute signed URLs, with a
thirty-day file lifetime.
The two pricing products layer on from there. Metasearch proxies live OTA offers for a property
on given dates and guest configuration, with rate type, currency, locale and device controls, returning per-advertiser
offers with room detail, cancellation dates and per-night breakdowns. Around it the portal has grown a genuine
analytics surface: price insights with trend, volatility, weekend premium and a raise/soften/hold recommendation; a
competitor comp-set builder with weighted criteria across stars, rating, property type, amenities and distance; a
date-by-hotel price matrix with market medians; and market insights across a whole list. Direct ARI
pulls the hotel's own rates and availability from its booking engine — per room, per rate plan, with board basis and
cancellation terms, up to a year ahead — with a refresh flow that batches and polls, and coverage reporting per list.
Linking a property to its booking engine is currently an operation Ubio staff perform through internal screens.
Wrapped around all of it is a commercial and AI layer. Authentication is Google OAuth only; organisations are flat
lists of members with no roles, and multi-tenancy is enforced by scoping essentially every read and write to an
organisation ID from the token. Personal access tokens carry a narrower scope set for API and MCP use. Entitlement is
driven by tier plus quota, with usage counted from a time-series access log covering hotel views, review views,
metasearch queries, list creation and every export create and download; Stripe handles subscriptions across three
products, and the live portal exposes per-product plans, proration, cancellation and reactivation. The AI assistant
is no longer a side feature — it is the default search mode, streaming, with conversation history, a context meter,
typed artifacts for search results, hotels, images, lists and pricing, and one-click actions that turn a conversation
into a saved list. The same primitives are published as six MCP tools for Claude, ChatGPT, Cursor or a customer's own
agent.
The largest block of proposed work is not new features — it is closing the distance between what the
platform promises and what it enforces. Three endpoints ship with no authentication at all, the rate limiter
guards exactly one route, invitations are gated by the wrong permission, there are no per-user roles, and the internal
super-user check is a substring match on an email address. The landing page sells CSV export and webhook diffs;
neither exists. A three-hundred-and-sixty-five-day subscription has no expiry warning, no renewal path and no
freshness guarantee behind it, while the scraper refreshes on a flat thirty-day cadence that does not know which
hotels a customer is paying for. The API's own OpenAPI document is six versions stale and documents an endpoint that
was never built. None of these are hard problems; all of them are the sort of thing a serious customer's procurement
review finds in an afternoon. The proposed stories name each one, attach acceptance criteria to it, and Appendix A
collects them in a single table.
Beyond that, the proposed work pushes in three directions. Make the data defensible: a
source-agnostic canonical ID so identity no longer depends on Google, machine-learned matching with a measurable
precision and recall against a labelled set, a merge-and-split tool for properties that were wrongly conflated,
per-field trust scores instead of a fixed source ranking, and data-quality dashboards that show completeness,
freshness and conflict rates rather than asking customers to discover them. Make the data reachable:
outbound webhooks and a change feed keyed on huId, warehouse and bucket delivery, scheduled and
incremental exports, and a remote MCP server with OAuth, per-tool scopes and spend caps so an agent can be trusted
with a key. Make the commercial motion self-serve: real pricing visible before sign-up, sign-in that
does not require a Google account, a sandbox with fixture data, usage-based metering reported to Stripe, quota
warnings before the wall rather than a 402 at it, and self-serve booking-engine linking so Direct ARI stops being a
managed service. Taken together the proposed stories are less a wish list than a description of the product this one
is already trying to be.