> For the complete documentation index, see [llms.txt](https://ovatheme.gitbook.io/brw/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ovatheme.gitbook.io/brw/create-a-product/rental-type-config/by-hour.md).

# By Hour

<figure><img src="/files/Ci38MpkMCr6pmxHVVpVe" alt=""><figcaption></figcaption></figure>

The **Rental by Hour** type calculates rental cost based on the number of hours between the pickup time and the dropoff time. It supports a base hourly rate, volume discounts per number of hours, and seasonal special pricing.

{% hint style="info" %}
Use this type when your product is rented for a few hours at a time and the price per hour is the primary variable. For full-day rentals use **Rental by Day**. For combined day + hour pricing use **Rental by Mixed**.
{% endhint %}

#### How it differs from Rental by Day

| Aspect              | By Day                         | By Hour                                           |
| ------------------- | ------------------------------ | ------------------------------------------------- |
| Base price field    | Regular price / Day            | Regular price / Hour                              |
| Daily pricing plan  | ✓ Per-weekday prices           | — Not available                                   |
| GD duration unit    | Day(s)                         | Hour(s)                                           |
| ST price column     | Price/Day (`rt_price[]`)       | Price/Hour (`rt_price_hour[]`)                    |
| DST duration unit   | Day(s)                         | Hour(s)                                           |
| Booking conditions  | Min/max days, preparation days | Min/max hours, preparation minutes, same-day only |
| Services applicable | /Day or /Order                 | /Hour or /Order                                   |

## 1: Quick Start

{% stepper %}
{% step %}

### Add General fields

Read in [overview](/brw/create-a-product/overview.md)
{% endstep %}

{% step %}

### [Choose Rental Type](#id-2-choose-rental-type)

{% endstep %}

{% step %}

### [Pricing Settings](#id-3-pricing-settings)

{% endstep %}

{% step %}

### [Shared Fields](#id-4-shared-fields)

The following fields are shared across multiple rental types.
{% endstep %}

{% step %}

### [Common Fields](#id-5-common-fields)

The following fields are shared across all rental types.&#x20;
{% endstep %}

{% step %}

### [Customize Fields in Product Editing](#id-6-customize-fields-in-product-editing)

You can add/remove fields in product editing.
{% endstep %}

{% step %}

### Publish

Set a WooCommerce Regular Price for display purposes, then click **Publish**. The actual booking price is always calculated by BRW settings.
{% endstep %}
{% endstepper %}

## 2: Choose Rental Type

* Step 1: Add new product
* Step 2: Setup&#x20;
  * Product data: Rental
  * Rental Type: Hour

<figure><img src="/files/IuwDYfdfKzRE2nKoSRMJ" alt=""><figcaption></figcaption></figure>

## 3: Pricing Settings

Rental by Hour has three pricing layers. They stack in priority order — higher layers override lower ones when their conditions are met.

### 3.1: Regular price / Hour  <a class="button primary">regul\_price\_hour</a>

The base price charged per hour of rental. This is the fallback price used whenever no Global Discount or Special Time rule applies.

| Field                                   | Description                                                                             |
| --------------------------------------- | --------------------------------------------------------------------------------------- |
| Regular price / Hour `regul_price_hour` | Price per hour (WooCommerce price field). Displayed on the product page as *$X / Hour*. |

{% hint style="info" %}
Unlike Rental by Day, there is no "Daily pricing plan" for the Hour type. Use **Special Time (ST)** if you need different rates for specific date/time windows.
{% endhint %}

<figure><img src="/files/pxNv26BFcVoZJa7JKac6" alt=""><figcaption></figcaption></figure>

### 3.2: Global discount (GD)  <a class="button primary">discounts</a>

Set volume discounts based on the number of hours booked. When a booking's duration falls within a GD row's range, the *Price/Hour* in that row replaces the regular price.

| Column                                             | Description                                                                                        |
| -------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| Price/Hour `global_discount_price[]`               | The discounted price per hour applied when the duration matches the From–To range.                 |
| From (number) `global_discount_duration_val_min[]` | Minimum number of hours (inclusive) for this discount to apply.                                    |
| To (number) `global_discount_duration_val_max[]`   | Maximum number of hours (inclusive). Use a large number (e.g. 9999) for open-ended upper limits.   |
| Duration `global_discount_duration_type[]`         | Fixed to **Hour(s)** for the Hour rental type. Rows are matched against the booking's total hours. |

{% hint style="danger" %} <mark style="color:red;">GD is overridden by</mark> <mark style="color:red;"></mark><mark style="color:red;">**Special Time (ST)**</mark> <mark style="color:red;"></mark><mark style="color:red;">— when a booking falls inside an ST window, the ST price applies and GD is ignored for that booking. Within an ST window, use the</mark> <mark style="color:red;"></mark><mark style="color:red;">**DST**</mark> <mark style="color:red;"></mark><mark style="color:red;">sub-table for hour-range discounts.</mark>
{% endhint %}

{% hint style="info" icon="lightbulb-exclamation" %}
Click **Add GD** to add a row. Rows are drag-sortable. If multiple rows match, the plugin uses the first matching row (by sort order).
{% endhint %}

<figure><img src="/files/PphmwpUbi0oQHQk7UGq5" alt=""><figcaption></figcaption></figure>

### 3.3: Special time (ST)<a class="button primary">special-timeslots</a>

Define date/time windows with a different hourly rate — useful for peak seasons, holidays, or off-peak promotions. Each ST row can optionally contain its own volume discount table (DST).

\
**ST columns:**

| Column                         | Description                                                                                              |
| ------------------------------ | -------------------------------------------------------------------------------------------------------- |
| Price/Hour `rt_price_hour[]`   | The hourly rate applied when the booking falls inside this ST window. Replaces the regular price and GD. |
| Start Date `rt_startdate[]`    | Start of the special pricing window — datetime picker (date + time).                                     |
| End Date `rt_enddate[]`        | End of the special pricing window — datetime picker (date + time).                                       |
| Discount in special time (DST) | Optional nested volume discount table active only within this ST window. See below.                      |

**DST sub-table columns** (per ST row):

| Column                                     | Description                                                               |
| ------------------------------------------ | ------------------------------------------------------------------------- |
| Price/Hour `rt_discount[i][price][]`       | Discounted price per hour within this ST window for the given hour range. |
| From (number) `rt_discount[i][min][]`      | Minimum hours for this DST row to activate.                               |
| To (number) `rt_discount[i][max][]`        | Maximum hours for this DST row to activate.                               |
| Duration `rt_discount[i][duration_type][]` | Fixed to **Hour(s)**.                                                     |

{% hint style="info" icon="thumbtack-angle" %}
**Note:** When a booking is inside an ST window, GD is ignored. DST acts as the discount table *within* the ST window. Click **Add ST** to add an ST row, then **Add PST** within each row to add DST entries.
{% endhint %}

<figure><img src="/files/03e1RJ8UtNEVJBimSL4a" alt=""><figcaption></figcaption></figure>

### 3.4: 🏆Pricing Priority

When multiple pricing layers apply to a booking, the plugin uses the **highest-priority rule that matches** and ignores lower ones.

<a class="button primary">Special Time (ST)</a> >  <a class="button primary">DST (within ST)</a> >  <a class="button primary">Global Discount (GD)</a> >  <a class="button primary">Regular price / Hour</a>

| Rule                 | Condition                                                                    | What it sets                                              |
| -------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------- |
| Special Time (ST)    | Booking window overlaps an ST date/time range                                | Replaces regular price with ST Price/Hour. GD is skipped. |
| DST (within ST)      | Booking is in an ST window AND total hours match a DST row                   | Replaces ST price with DST Price/Hour.                    |
| Global Discount (GD) | Total booking hours fall within a GD row's From–To range (and no ST applies) | Replaces regular price with GD Price/Hour.                |
| Regular price / Hour | No ST or GD matches                                                          | Base hourly rate applies.                                 |

{% hint style="success" icon="square-check" %}
**Final price =** winning price/hour × number of hours + services/resources + deposit + insurance + location surcharges.
{% endhint %}

## 4: Shared Fields

The following fields are shared across multiple rental types and are documented on the **Shared Fields** page to avoid repetition. Click any card to go directly to that section.

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-cover data-type="image">Cover image</th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Locations</strong></td><td><em>Pickup/dropoff pairs + price</em></td><td data-object-fit="contain"><a href="/files/QJ6Fl2X4Dx2g3uUmj2gI">/files/QJ6Fl2X4Dx2g3uUmj2gI</a></td><td><a href="/pages/fIJxNdnB3WMNAIzPhO03">/pages/fIJxNdnB3WMNAIzPhO03</a></td></tr><tr><td><strong>Location surcharge</strong></td><td><em>Extra fee per location</em></td><td data-object-fit="contain"><a href="/files/cdySSZykZ2ZjYt1j6qof">/files/cdySSZykZ2ZjYt1j6qof</a></td><td><a href="/pages/BymGnGJuRfRqJAZ5YZTM">/pages/BymGnGJuRfRqJAZ5YZTM</a></td></tr><tr><td><strong>Pick-up location</strong></td><td><em>Show/rename on booking form</em></td><td data-object-fit="contain"><a href="/files/VRQp1fDrjb1yHNfjnyAC">/files/VRQp1fDrjb1yHNfjnyAC</a></td><td><a href="/pages/ROpztnKp5QzYsxP5DWDK">/pages/ROpztnKp5QzYsxP5DWDK</a></td></tr><tr><td><strong>Drop-off location</strong></td><td><em>Show/rename on booking form</em></td><td data-object-fit="contain"><a href="/files/PhpU87D8QCJO1pbkBJft">/files/PhpU87D8QCJO1pbkBJft</a></td><td><a href="/pages/ltbC4MGgvMzSq92SUZto">/pages/ltbC4MGgvMzSq92SUZto</a></td></tr><tr><td><strong>Round-trip</strong></td><td><em>Toggle + extra fee</em></td><td data-object-fit="contain"><a href="/files/Cdx8hnVoPefS5C4MAJ2Q">/files/Cdx8hnVoPefS5C4MAJ2Q</a></td><td><a href="/pages/5we2hwAvj3QZ1sgzCGNu">/pages/5we2hwAvj3QZ1sgzCGNu</a></td></tr><tr><td><strong>Guests options</strong></td><td><em>show/hide guest</em></td><td data-object-fit="contain"><a href="/files/pUrvaxIOVMndrA110lNm">/files/pUrvaxIOVMndrA110lNm</a></td><td><a href="/pages/cfkdHXKLMvGjuCQYgb6X">/pages/cfkdHXKLMvGjuCQYgb6X</a></td></tr><tr><td><strong>Guests fields</strong></td><td><em>Form fields + min/max</em></td><td data-object-fit="contain"><a href="/files/LIgxm2xMIr5RpWbiiIza">/files/LIgxm2xMIr5RpWbiiIza</a></td><td><a href="/pages/0SZ4g1xj4G8OqWD7Pkl4">/pages/0SZ4g1xj4G8OqWD7Pkl4</a></td></tr><tr><td><strong>Pick-up date</strong></td><td><em>Time slots, label, defautls</em></td><td data-object-fit="contain"><a href="/files/EfKepudwm942CZujRdPN">/files/EfKepudwm942CZujRdPN</a></td><td><a href="/pages/R9BCAAY0ZePEoQ0S2Oyd">/pages/R9BCAAY0ZePEoQ0S2Oyd</a></td></tr><tr><td><strong>Drop-off date</strong></td><td><em>Show/rename on booking form</em></td><td data-object-fit="contain"><a href="/files/sJup7bwcHJog6g4DpS6r">/files/sJup7bwcHJog6g4DpS6r</a></td><td><a href="/pages/mJPOpCi9StgB7sXpXFXA">/pages/mJPOpCi9StgB7sXpXFXA</a></td></tr><tr><td><strong>Booking Conditions</strong></td><td><em>Min/max days, preparation, advance</em></td><td data-object-fit="contain"><a href="/files/RP6bC5CznDEnDTAZplUU">/files/RP6bC5CznDEnDTAZplUU</a></td><td><a href="/pages/j3PSoiHi0c2ZmunW3JtQ">/pages/j3PSoiHi0c2ZmunW3JtQ</a></td></tr></tbody></table>

## 5: Common Fields

These fields are shared across all rental types and documented on a dedicated reference page. Click any card to go directly to that section.

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="image">Cover image</th></tr></thead><tbody><tr><td><strong>Availability</strong></td><td><em>Allowed dates, disabled dates, iCal</em></td><td><a href="/pages/se2SdKU1oGq12QOILLtJ">/pages/se2SdKU1oGq12QOILLtJ</a></td><td><a href="/files/sJup7bwcHJog6g4DpS6r">/files/sJup7bwcHJog6g4DpS6r</a></td></tr><tr><td><strong>Services &#x26; Resources</strong></td><td><em>Add-on pricing with /Day or /Order</em></td><td><a href="/pages/wDir5HOVkeGp8zrl58u1">/pages/wDir5HOVkeGp8zrl58u1</a></td><td data-object-fit="contain"><a href="/files/foB7SCXWfrz6YIBMxKEN">/files/foB7SCXWfrz6YIBMxKEN</a></td></tr><tr><td><strong>Deposit</strong></td><td><em>Fixed or percentage upfront payment</em></td><td><a href="/pages/unYXdPY2dLE1s9Ft0ZfC">/pages/unYXdPY2dLE1s9Ft0ZfC</a></td><td data-object-fit="contain"><a href="/files/M3Dd2NBocdXTDiMua10L">/files/M3Dd2NBocdXTDiMua10L</a></td></tr><tr><td><strong>Insurance</strong></td><td><em>Fixed fee added to every booking</em></td><td><a href="/pages/LxEaPJ5y15dPC7sHj2YB">/pages/LxEaPJ5y15dPC7sHj2YB</a></td><td data-object-fit="contain"><a href="/files/3SoE1Zpurcy3jQB8XDL0">/files/3SoE1Zpurcy3jQB8XDL0</a></td></tr><tr><td><strong>Inventory &#x26; Quantity</strong></td><td><em>Stock count, named vehicles</em></td><td><a href="/pages/RISVNcmzpxhDDvDCRwuJ">/pages/RISVNcmzpxhDDvDCRwuJ</a></td><td data-object-fit="contain"><a href="/files/SibMoPJmOEVt0RnSNZdP">/files/SibMoPJmOEVt0RnSNZdP</a></td></tr><tr><td><strong>Booking Form</strong></td><td><em>Custom checkout fields</em></td><td><a href="/pages/JVKPwpDA7CcnfWhAmlSV">/pages/JVKPwpDA7CcnfWhAmlSV</a></td><td data-object-fit="contain"><a href="/files/RIYx8VUjC3GavvqtQWo0">/files/RIYx8VUjC3GavvqtQWo0</a></td></tr><tr><td><strong>Map / Place</strong></td><td><em>Maps pin on product page</em></td><td><a href="/pages/V9Fs957iBL1hyL5oKwnD">/pages/V9Fs957iBL1hyL5oKwnD</a></td><td data-object-fit="contain"><a href="/files/TrfIY2OrNMClVGIwauDK">/files/TrfIY2OrNMClVGIwauDK</a></td></tr><tr><td><strong>Display &#x26; Layout</strong></td><td><em>Price format, template, extra tab</em></td><td><a href="/pages/kCaBW7VaB4tTWpA56rBc">/pages/kCaBW7VaB4tTWpA56rBc</a></td><td data-object-fit="contain"><a href="/files/0r8vbxkjli9ZBQqmj1xV">/files/0r8vbxkjli9ZBQqmj1xV</a></td></tr><tr><td><strong>Product Content</strong></td><td><em>Specifications, features list</em></td><td><a href="/pages/jlHZjKdIAPVSXDvqNIPw">/pages/jlHZjKdIAPVSXDvqNIPw</a></td><td data-object-fit="contain"><a href="/files/P4Z9VNYwCaf9JiUfuyyS">/files/P4Z9VNYwCaf9JiUfuyyS</a></td></tr></tbody></table>

## 6: Customize Fields in Product Editing

When you create a product and want to remove unnecessary fields, you can follow these steps in [Customize - Rental Type](/brw/customize-rental-type.md)
