Two prices for the same hotel on the same night can differ for reasons that have nothing to do with who is cheaper. Before any comparison, parity check or repricing rule means anything, both numbers have to be on the same basis. Here is what to normalise, in order.
Published 18 September 2026
Whether a displayed price includes tax is not a design choice you can assume away. It depends on where the traveller is and which rules the seller follows.
| Market | What the rule says | What it means for your data |
|---|---|---|
| United States | Since 12 May 2025, the FTC's Rule on Unfair or Deceptive Fees requires short-term lodging to show a total price up front that includes mandatory fees such as resort or cleaning fees. Taxes and other government charges may be left out of that total, as long as they are disclosed before payment. | A US "total" can still be pre-tax. Two compliant sites can show different totals for the same stay if one includes tax and the other does not. |
| India | Since 22 September 2025, GST on hotel accommodation is 5% (without input tax credit) where the transaction value is ₹7,500 or less per unit per day, and 18% above that. The test is the actual price charged, not a declared tariff. | The tax rate itself can change between two listings of the same room, if one discount pushes the price below ₹7,500. |
The Indian threshold produces a step that surprises people. A room at ₹7,400 a night carries 5% GST, so ₹7,770 all-in. The same room at ₹7,600 carries 18%, so ₹8,968 all-in. A ₹200 difference before tax becomes a ₹1,198 difference after it. If your pipeline compares pre-tax numbers, it will get the size of that gap wrong in either direction.
Resort, facility and cleaning fees are part of the price whether or not a page puts them in the headline number. The US rule treats any fee a guest cannot reasonably avoid as part of the total. Your schema should record, for every price, whether mandatory fees are included, so a fee-inclusive total is never compared with a fee-exclusive one.
Some sources show an average nightly rate, some the first night's rate, and some the total for the stay. On a stay where the nightly rate varies, these are three different numbers. Store the total for the exact dates and derive a nightly average yourself if you need one.
One adult and two adults are different prices at many properties, and children's ages can change the rate again. Google's price accuracy checks list "room not available for occupancy" as a mismatch reason in its own right. Fix the occupancy in the request, and record it with the result.
The cheapest price shown for a hotel is often a different room, or a non-refundable rate, or a rate without breakfast. Comparing "cheapest on OTA A" with "cheapest on OTA B" compares whatever each site happened to put first. Compare like for like: same room type, same cancellation terms, same meal plan.
| Field | Why it is not optional |
|---|---|
price_total + stay dates | The only number that survives a variable nightly rate. |
tax_inclusive | Decides whether a gap is real or an artefact of comparing pre-tax with post-tax. |
fees_included | Resort and cleaning fees can be larger than the gap you are looking for. |
currency + point of sale | The same room on the same date is priced by market, before any exchange rate. |
adults, children | Occupancy changes the rate and the availability. |
room_type, refundable, meal_plan | Without these, "cheapest" compares different products. |
captured_at | A comparison across a long collection window measures time as much as price. |
| Property ID | Both rows must be the same hotel. See matching hotels across OTAs. |
These are field names to use in your own schema; each source exposes the underlying information differently.
Full disclosure: this is our product. The OTA Hotel Rates APIs return exact per-room-type prices from Agoda, Booking.com, MakeMyTrip, Expedia and Goibibo, rather than one headline number per hotel, so you can compare the same room across sources. Batch requests take up to 20 hotels that share the same dates, which keeps the dates and occupancy identical across every row in a comparison. Check each endpoint's response schema in the API docs for the tax and fee detail it returns, and use the Rate Shop API to price many hotels across many dates in one call.
Not necessarily. The FTC rule in force since 12 May 2025 requires mandatory fees in the up-front total for short-term lodging, but lets taxes and government charges be shown separately before payment.
Since 22 September 2025: 5% without input tax credit where the transaction value is ₹7,500 or less per unit per day, and 18% above that. Check current CBIC notifications before relying on it, as rates can change.
Because the GST rate follows the actual price charged. If one OTA's discount takes the room to ₹7,500 or below and the other's does not, they fall into different tax slabs.
Rarely. Each site's cheapest price can be a different room type, occupancy or cancellation policy. Compare the same room, guests and rate conditions.