# Extra charges calculation and conditions

**Understand the extra charges such as city tax, cleaning fees, or VAT and when they apply, how charges are calculated based on charge modes and conditions.**

## Overview

This guide complements the [Accommodation pricing guide](/demand/docs/accommodations/prices-accommodations), focusing on how extra charges are calculated using the `charge_mode` field and when conditional charges apply.

This guide helps you:

* Identify when extra charges apply (`included`, `excluded`, `conditional`, or `non_conditional`).
* Understand how the total amount is calculated using the `charge_mode`
* Use condition IDs to handle dynamic guest-dependent charges.
* Properly display or disclose charges across your booking flow.


## What are extra charges?

Extra charges are additional costs applied to the `base` accommodation price.

These can include mandatory fees like VAT and city taxes, or optional and conditional charges like cleaning fees, pet fees, or usage-based charges (e.g., spa or internet usage).

These charges can appear differently depending on endpoint context:

div
div
h3
svg
g
path
defs
clippath
rect

    Pre-booking stage
    
ul

    In accommodations/search and accommodations/availability endpoints:
      
li
Charges that might be 
code
Included
 or 
code
Excluded
 from the 
code
book
 price (display price).
li
code
Conditional
 charges, only charged if specific conditions apply.
div
h3
svg
path

      Booking stage
    
ul

      When using orders/preview endpoint:
      
li
The 
code
non_conditional
 charges include all the mandatory charges, added to the 
code
total
 price.
All extra charges are grouped by charge type, that is identified by an ID.

### Key concepts

Each additional charge is defined in the appropriate category under `extra_charges`.

These are the fields used to describe each extra charge category, including its purpose, amount, and calculation method.

| **Field**  | **Description** | **Best practice** |
|  --- | --- | --- |
| `charge` | Numeric ID of the charge type (e.g., 22 = city tax) - Identifies the type of charge using a unique ID. | Use /accommodations/constants to resolve the charge name.
Example: city tax is "charge": 22 |
| `condition` | Only for `conditional` charges. A number that uniquely identifies the condition that applies to this conditional charge. | See the full list of conditions and equivalent conditional change, in the [Condition ids reference](/demand/docs/accommodations/charge-calculation#condition-id-reference). |
| `mode` | Determines how the `total_amount` is calculated (example: per night or percentage) | See [Charge calculation modes section](#charge-calculation) for more details. |
| `total_amount` | The total amount to be paid for the charge. | It is always defined for `excluded` and `included` charges, but it is `null` for incalculable charges. |
| `unit_amount` | The price per unit for this charge. | Only applicable when `mode` is `per_night`, `per_person_per_night`, or `per_person_per_stay`. |


### Example: Accommodations/availability response with extra charges


```json
        "price": {
          "base": 6166.67,
          "book": 7640,
          "extra_charges": {
            "conditional": [
              {
                "charge": 3,
                "condition": 28,
                "mode": "per_stay",
                "percentage": null,
                "total_amount": 200.00,
                "unit_amount": 200.00
              }
            ],
            "excluded": [],
            "included": [
              {
                "charge": 1,
                "mode": "per_stay",
                "percentage": null,
                "total_amount": 40,
                "unit_amount": null
              },
              {
                "charge": 21,
                "mode": "percentage",
                "percentage": 20,
                "total_amount": 1233.33,
                "unit_amount": null
              }
            ]
          },
          "total": 7640
        },
```

## Conditional charges

Conditional charges only apply if specific guest actions or property conditions are met.

When there is a conditional charge, the `condition` field is displayed under the charge breakdown and identifies the [type of condition](/demand/docs/accommodations/charge-calculation#condition-id-reference).

Example:


```json
{
  "extra_charges": {
    "conditional": [
      {
        "charge": 3,
        "condition": 28,
        "mode": "per_stay",
        "percentage": null,
        "total_amount": 25.00,
        "unit_amount": 25.00
      }
    ]
  }
}
```

Important
Conditional charges are always excluded from the `base`, `book` and `total` prices, as (if applicable) they are usually paid by the traveller at the accommodation.

Using the [Condition ID reference](/demand/docs/accommodations/prices-accommodations#condition-ids):

* 3 = "Cleaning fee"
* 28 = "A cleaning fee will be charged if you don’t clean before checkout"


The cleaning fee (`total_amount`) in this example is 25, only paid at the accommodation when checking out if the traveller does not clean the room.

### Common conditional charges

* **Pet fee** - Applied if the guest brings a pet to the stay.
* **Smoking fee** - Charged if the guest smokes in a non-smoking room.
* **Late checkout fee** - Applied if the guest checks out later than the agreed time.
* **Cleaning fee** – If the guest doesn’t clean before leaving.


### Condition id reference

Each conditional charge is associated with a condition ID. Use this table to interpret them:

| **Condition id** | **Description** | **Applies to charge_types (ids)** |
|  --- | --- | --- |
| 5 | A fee is applicable if you do not bring your own items. | TOWELFEE (4), BEDLINEN (6), LINENPACKAGEFEE (100), KITCHENLINNENFEE (103) |
| 28 | A cleaning fee will be charged if you don't clean before checking out. | CLEANINGFEE (3) |
| 29 | A cleaning fee is applicable, per pet, if you bring your pet to the accommodation. | CLEANINGFEE (3) |
| 30 | A cleaning fee is applicable if you smoke in the accommodation. | CLEANINGFEE (3) |
| 35 | A fee is applicable if you use a credit card of any type. | CREDITCARDFEE (116) |
| 37 | A fee is applicable if you use a credit card of a specific type. | CREDITCARDFEE (116) |
| 39 | A fee is applicable if you use a credit card of a list of types. | CREDITCARDFEE (116) |
| 126 | An internet fee is applicable if you use it, per hour of use. | INTERNETFEE (118) |
| 136 | Parking fee - start time to end time | PARKINGFEE (119) |
| 142 | Parking fee - day of week | PARKINGFEE (119) |
| 210 | Mandatory Israel VAT for domestic users | VAT (21) |
| 211 | Optional Israel VAT for all users | VAT (21) |
| 215 | A fee is applicable if you use the indicated facility. | SPA (180), SAUNA (181), HOTTUB (182), GOLFCOURSE (199), SUNBED (200), POOL (204) |
| 504 | A city tax is applicable. Business travellers can be exempt from this charge under certain conditions. Please check the city's official website for details prior to arrival. | CITYTAX (22) |
| 542 | A city tax is applicable if you are an adult. | CITYTAX (22) |
| 543 | A city tax is applicable for a maximum of *n* consecutive nights. Further consecutive nights at the same accommodation are exempt. | CITYTAX (22) |


## Charge calculation mode

The `charge_mode` determines how the total of the charge (`total_amount`) is derived.

| Charge mode value  | How `total_amount` is calculated? |
|  --- | --- |
| `incalculable` | Always appears in `extra_charges.excluded`.* Amount unknown — `total_amount` will be `null`.

 |
| `percentage` | This field indicates the value percentage at which the charge is applied against the `price.base` value.* `percentage` x `base` price.

 |
| `per_night` | `unit_amount` x number of nights. |
| `per_person_per_night` | `unit_amount` x number of guests x number of nights. |
| `per_person_per_stay` | `unit_amount` x number of guests. |
| `per_stay` | Flat `unit_amount` for the entire stay. |


## Included, and excluded charges

Depending on the user’s country and local tax laws, a charge on a product may appear as `included` or `excluded` from the `book` price.

* `included` - This value must be part of the displayed price (`book` price)
* `excluded` - This charge can be left out of the `book` price displayed to the the user in pre-booking stages.


Included/Excluded from display
Important: `excluded` and `included` refer to how charges are displayed in relation to the `book` price, not how much Booking.com will charge".

Therefore, the `book` price for the same product, with the same request criteria, may vary depending on the origin of the request.

* The `book` price represent our (strong) recommendation on how to display a price and the extra charges, for a given booker, based on a mix of the property preferences, overiden by country laws etc.


Note: The `included` or `excluded` charges are only retrieved when calling accommodations/search and /availability endpoints.

## Non-conditional charges in /orders

When using the /orders/preview and /orders/create  endpoints, `included` and `excluded` extra charges are consolidated into `non_conditional` charges.

* The distinction between `included` and `excluded` charges is no longer needed in the booking phase, as all extra charges that are mandatory and must be paid regardless of any conditions are grouped under the `non_conditional` category.
* `non_conditional` represents the fees that are always applicable to the booking and included in the `total` price.


(Exemption: `incalculable` charges are excluded from the `total` price).

### Example: Preview response with extra charges

In the following orders/preview response the extra charge types are identified with these ids: 3, 142, 21 and 22.


```json
{
  "price": {
    "base": {
      "accommodation_currency": 162.98,
      "booker_currency": null
    },
    "extra_charges": {
      "conditional": [
        {
          "charge": 3,
          "condition": 30,
          "mode": "per_stay",
          "percentage": null,
          "total_amount": {
            "accommodation_currency": 10,
            "booker_currency": null
          },
          "unit_amount": null
        }
      ],
      "non_conditional": [
        {
          "charge": 142,
          "chargeable_online": false,
          "mode": "per_person_per_night",
          "percentage": null,
          "total_amount": {
            "accommodation_currency": 6,
            "booker_currency": null
          },
          "unit_amount": {
            "accommodation_currency": 3,
            "booker_currency": null
          }
        },
        {
          "charge": 21,
          "chargeable_online": true,
          "mode": "percentage",
          "percentage": 9,
          "total_amount": {
            "accommodation_currency": 14.67,
            "booker_currency": null
          },
          "unit_amount": null
        },
        {
          "charge": 22, // City tax
          "chargeable_online": false,
          "mode": "percentage",  // Applied as % of base price
          "percentage": 7,
          "total_amount": {
            "accommodation_currency": 11.41,
            "booker_currency": null
          },
          "unit_amount": null
        }
      ]
    },
    "total": {
      "accommodation_currency": 195.06,
      "booker_currency": null
    }
  }
}
```

→ Call the [accommodations/constants](/demand/docs/open-api/demand-api/accommodations/accommodations/constants) endpoint to get the name of each charge type ID (e.g., charge: 22 = City Tax).

For the given example, the accommodations/constants response retrieves:


```json
  [
  {
    "id": 3,
    "name": {
      "en-gb": "Restaurant"
    }
  },
  {
    "id": 21,
    "name": {
      "en-gb": "Babysitting/child services"
    }
  },
  {
    "id": 22,
    "name": {
      "en-gb": "Laundry"
    }
  },
  {
    "id": 142,
    "name": {
      "en-gb": "Child safety socket covers"
    }
  }
]
```

Best practice - store constants
* Store /accommodations/constants responses and refresh daily to reduce API traffic and ensure optimal performance.


Important
The traveller *may* have to pay additional [conditional](#conditional-charges) or [incalculable](#charge-calculation) charges *in addition to* the `total` price.

## Included vs. excluded vs. conditional

| Category | Description | Appears in |
|  --- | --- | --- |
| `included` | Required to show in advertised price. | `book`, `total` |
| `excluded` | Not required to be included in price, display it separately. | Only in `total` |
| `conditional` | Based on guest behaviour or context. | Not in price totals |
| `non_conditional` | Always applied in orders. | Included in `total` |


## Display tips

* Show `non_conditional` charges before checkout.
* For accurate charge names, map `charge` IDs using /accommodations/constants endpoint.
  * Store /accommodations/constants once per day to avoid redundant traffic.
* Conditional charges should be **labelled as “might apply”** and never added to totals.
* For fluctuating totals (due to currency or rounding), **authorise a buffer** (e.g. +1%) when processing payments.


## Next steps

Looking to implement or optimise pricing display and booking flows? Here are some helpful resources:

* [Accommodation pricing guide](/demand/docs/accommodations/prices-accommodations)
* [Displaying pricing guide](/demand/docs/accommodations/display-prices)
* [Pricing and charges use cases](/demand/docs/accommodations/pricing-examples)
* [Search for accommodation guide](/demand/docs/accommodations/search-for-available-properties)
* [Orders guide](/demand/docs/orders-api/order-preview-create)