Overview
Rate Radar
How much we’re losing → what’s wrong → what to do
Loading…
Custom date range
Parity healthi
Parity Health

Your overall parity-health score, out of 100. It drops when OTAs undercut you — the more often, the bigger the hit; deeper cuts and big-OTA cuts hurt most. Plus a penalty when you’re not shown on Google.

Roughly: 100 − how often you’re undercut (weighted by how deep, and how major the OTA is) − a visibility-gap penalty.

/ 100
What’s lowering it
Disparity rate
Depth severity
Major-OTA hits
Visibility
Revenue at risk · monthly estimatei
Revenue at risk

A monthly run-rate, not a fact. The period only sets how the disparity rate is measured — the € is always shown per month so it stays comparable.

Counts only channels still undercutting now — a channel with no undercut in the last 7 days is “recovered” and stops adding to this estimate.

Per hotel: rooms × occupancy ÷ stay = bookings → × % booked online → × % who compare on Google → × how often an OTA beats you → the range spans how many of those switch. Refine in each hotel’s Revenue assumptions.

What you hand OTAs in commission on bookings that should have come to you directly.
An estimate, not an exact figure — only as accurate as each hotel’s assumptions. How the math works →
Disparity rate
Parity rate
We’re better
Not shown
Top actionspersistent & severe cases · ranked by impactView activity →
Disparity over time% of comparable checks an OTA beats direct
Who undercuts youtop 6 active channels · bar = est. lost € per monthView all →
Reseller / aggregator — trace to source OTAMajor OTA — direct contract
Recoveredchannels that stopped undercuttingView all →
Visibility gapsworst markets · % of checks where your direct site appearsView all →
Low / missingPartialHealthy visibility
Hotelsi
Health — and the “—”

Health is a price-parity score (0–100): it drops with frequent, deep and major-OTA undercuts plus a visibility penalty.

“—” means the hotel wasn’t visible in Google’s price block in this period — there are no comparable prices, so a parity score would be meaningless. Judge those rows by the Visible column instead.

The 30-day line: blue = improving, red = declining (the second half of the window vs the first).

top 10 by impactOpen Hotels →
HotelHealthChecksVisibleDisparityAvg depth30-day trendTop violatorStatus
30-day line: blue = improving, red = declining (second half of the window vs the first)
Active violators
channels undercutting now
Recovered
stopped undercutting (verified)
Est. € at risk
per month · conservative est. · active violators
Avg depth
across active violators
Undercutting channelsgrouped by channel · click a row
ChannelHotelsAvg depthEst. €/moSeen in30-dayStatus
Selected channel
est. lost / mo
hotels hit
worst depth
Markets seen
Affected hotels
Evidence (latest screenshots)
A reseller resells a major OTA’s rate. The test purchase to find which major OTA is the source, and the complaint to that source, happen offline — this gives you the proof and a pre-filled email. When the channel stops undercutting, later checks flip it to Recovered automatically.
What this screen does. It detects which channels undercut you, classifies them (reseller vs major OTA), and gives evidence + a ready complaint pack. It does not track the human steps (test purchase, sending the complaint) — those happen offline. It does verify the outcome: a channel that stops undercutting flips to Recovered from the data alone.
Overall visibility
of all checks we appear
Markets with gaps
of markets monitored
Hotel × market gaps
hotel-in-market pairs below 80% visibility
Worst market
Visibility by market
Low / missingPartialHealthy visibility
Selected market
visibility
with gaps
Hotels with gaps here
Anything below 100% means we’re sometimes absent from the Google block when guests search here — lost exposure, not just at 0%. The lower the score, the more often we’re missing. It’s usually a metasearch-ads / feed-setup issue (paid media), not a price problem: a whole market low points to that market’s feed/ads setup; a single hotel low in an otherwise-healthy market points to that hotel’s feed.
Visibility over time% of checks where we appear in the block · all markets
Problem B — we’re absent. Every time a guest searches and we’re not in the Google block while competitors are, that’s lost exposure — and it adds up the more often it happens (anything below 100%, not only at 0%). Usually a metasearch-ads / feed-setup issue, not a price problem — it routes to whoever runs paid media. All data-derived from the same checks.
Markets monitored
countries with checks
Costliest market
Most undercut market
Least visible market
By marketevery country · conservative € at risk · click a row
CountryHotels hitVisibleDisparity€/moTop violator
Selected market
€ at risk / mo
undercut rate
visibility
Hotels in this market
Who undercuts here
A market lens on your checks. A whole country undercut deeply usually means a reseller/wholesale leak that targets that market (the fix routes through the source OTA); a single hotel low in an otherwise-healthy market is that hotel’s issue. Visibility gaps here point to that market’s metasearch-ads / feed setup, not price.
The geographic view. Your price checks, grouped by country rather than by hotel or channel — so you can see which markets leak the most money, where you’re undercut most often, and where you’re missing from the block. Useful when one hotel behaves differently market to market, or when a problem belongs to a whole market rather than one property.
All hotelssorted by impact · click a row
HotelHealthVisibleDisparityAvg depthStatus
Selected hotel
Based on checks · last 30 days
at risk / mo · est
undercut rate
visibility
vs group avg i
vs group average

How this hotel compares to your hotels’ average, in percentage points. Undercut + = undercut more often than average (worse). Visibility = shown less often (worse). Blue = better than the group.

Parity trend
Top violators
Revenue assumptions · edit to refine the estimateDefault
Rooms *
Occupancy
Avg length of stay
ADR / night from data
% bookings online (OTA+web)
% online via Google
Guest switch rate when undercut auto · by gap size
OTA commissions (your contracted %)
Estimated loss / mo
Recent evidence
Per-hotel view. Both problems in one row: Visible (are we even shown) and Disparity (are we undercut). The panel benchmarks the hotel against the group average and links straight to its evidence + complaint pack.
i
Build evidence pack

A scoped, branded PDF of the screenshots you’ve filtered to — up to the 40 most recent. Not a bulk dump.

What shows up here
A channel newly undercuts a hotel — and it's confirmed: seen in ≥3 checks over 3 days, or it's a major OTA (Booking / Expedia / Agoda / Hotels / Trip), or a severe gap (≥€20 or ≥18%). An ongoing undercut re-surfaces only if it deepens by ≥€10.
A hotel drops out of the Google block in a market — confirmed by ≥2 checks in a row, never a single flicker.
A flagged channel stops undercutting, or a hotel reappears — confirmed by ≥2 clean checks. A verified win.
Note
Material changes only — gaps under €3 and 3% are filtered out as currency noise, so this stays signal, not every check. Read-only for now; push delivery (email / Telegram) and editable thresholds are a later step.
Profile

Your name as it appears across the dashboard.

Password

Set a new password for your account.

Team

People with access to this account. Owners can edit; viewers are read-only.

What “you’re losing €X / month” actually measures

When a guest comparing prices sees an online channel cheaper than your own site, some of those guests book there instead — and you pay a commission you’d otherwise keep. This page shows exactly how that number is built, so every figure on the dashboard is defensible to a revenue manager.

The funnel — five steps
  1. Monthly bookings the hotel makes — rooms × occupancy × 30 ÷ length-of-stay
  2. Those who compare online× % booked online × % who compare in the Google block
  3. Those actually under-cut — only the checks where a channel beat your price
  4. Those who switch — the guest switch rate, which scales with how deep the gap is (see below)
  5. Money lost per switchADR × nights × your OTA commission
Two ways to read it

Commission lost (default) — what you overpay in commission. Direct revenue touched — the full booking value that ran through a channel; useful for scale, but not a true “loss” since the room is still sold minus commission. The headline uses commission lost.

Guest switch rate — by how deep the gap is

A €3 gap on a €190 booking loses almost nobody; a 20% gap loses a real share. So the switch rate is not flat — it’s computed from the actual size of each undercut in your data (anchored to industry conversion-loss data; capped at ~40%, since even large gaps don’t move more than about a third of guests).

How much cheaper the channel isGuests who switch (cautious → aggressive)
under 2%0% → 5%
2–5%5% → 15%
5–10%15% → 30%
over 10%30% → 40%

Each hotel’s shown switch rate is the average of these across its own undercuts — so a hotel undercut deeply lands high, a hotel with tiny gaps lands low. The result is a cautious–aggressive range, never a single false-precise number.

Worked example — a sample hotel
357 rooms
× 70% occupancy
× 30 days
÷ 2-night average stay
3,750 bookings / month
3,750 bookings
× 75% booked online
× 25% who compare on Google
703 comparable bookings
703 comparable bookings
× 80% undercut incidence
562 undercut bookings
Average undercut depth ~20%
→ blended guest switch rate 28%–38%
562 undercut × 28%–38%
157–214 diverted bookings
ADR €97
× 2 nights
× 16% OTA commission
€31 per diverted booking
157–214 diverted bookings
× €31
€4.9k – €6.6k lost / month

For comparison, a flat “75–95% switch” (the old assumption) would have claimed ≈ €13k–€17k — about 2.5× higher. The live tile shows each hotel’s real figure on its current 30-day window.

Two different problems — split on purpose

Contracted OTAs (Booking, Expedia, Hotels.com, Trip.com) — when one of these is cheaper, it’s a direct parity break: complain to that OTA with the evidence. In your data these are largely at parity.

Gray-market resellers (Super.com, Vio.com, and similar) — these drive the large majority of undercutting. They don’t own rooms; they resell a rate sourced from a major OTA, so a booking there still costs you commission. The fix is different: run a test purchase to find the supplying OTA, then escalate to that partner. The complaint kit switches to this mode automatically for resellers.

Edge cases — what’s excluded, what’s labelled

Anomalous captures — excluded. A gap deeper than 40% is almost never a real public parity break — it’s usually a misread screenshot or a non-comparable (member/packaged) rate. These are marked Anomalous and excluded from undercutting and the € figure. (The 40% cutoff is a heuristic; it will be tuned in the calibration pass.)

Personalized prices — counted, and labelled ✳. Google marks some channel prices as “customised by the booking partner” (device/audience-targeted campaigns — a standard metasearch-ads feature). Guests in that segment really do see and book these prices, so they count toward undercutting and the € estimate — but every such capture carries a Personalized ✳ label in Evidence, and the complaint kit flags those instances, so the channel can’t dismiss the pack as untargeted.

It’s an estimate, not an invoice. The structure is fixed and defensible; the exact figure is only as good as each hotel’s assumptions (rooms, occupancy, online mix, commissions — all editable per hotel). The switch-rate bands will be re-calibrated on real booking data as history builds.
How the Hotels & Channels filters work

The top bar has two multi-selects — Hotels and Channels (the OTAs). Both narrow the whole dashboard, but they behave differently on purpose. Here’s exactly how, so a number never surprises you.

Hotels — a straight filter

Selecting hotels simply limits every screen to those hotels’ checks. All hotels = the full portfolio; none = no data. Nothing is recalculated — it’s a plain row filter.

Channels — “who undercut you”, not a straight filter

This is the important one. For each check we record only the single cheapest OTA — the one that undercut you — and its price. We do not store the price of every OTA on the page. So the channel selector answers “which undercutting OTAs should count” — it can’t “recompute your prices without an OTA”, because the other prices were never captured.

So: a check is a disparity only if the OTA that undercut you is selected. Deselect an OTA and its undercuts turn into parity — the check stays, only its label changes — so the disparity rate drops by that OTA’s share.

All channels selected = the full picture; none selected = nobody is blamed = 0% disparity.

Worked example — 5 checks, your price €100 each
#Cheapest OTA (who undercut)Its priceResult
1Super.com€90disparity
2Super.com€100parity
3Booking€95disparity
4Super.com€105we’re better
5Vio.com€92disparity

All channels selected: disparities = #1, #3, #5 = 3 of 5 = 60%.

Deselect Super.com: the check it undercut (#1) becomes parity; #2 and #4 were never undercuts. Disparities = #3, #5 = 2 of 5 = 40% — the rate drops, as you’d expect.

The trap the old behaviour had: dropping every Super.com check would delete #1, #2 and #4 entirely, leaving only #3 and #5 → a misleading 100%. That’s why deselecting the biggest violator used to push the rate up instead of down.

It’s a lower bound. Because only the single cheapest OTA is stored per check, if a second OTA also beat your price on the same check, deselecting the cheapest labels that check “parity” even though another OTA still undercut you. So excluding channels can slightly understate disparity. Fully precise per-channel maths needs every OTA’s price stored — a planned collector upgrade.