---
title: "Rental pricing, availability and security deposits"
description: "Rental pricing in Medusa: per-day price calculation, overlap checks to stop double bookings, and security deposit patterns with Stripe holds or refunds."
url: https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits
last_updated: 2026-10-29T06:55:50Z
topic: "marketplaces"
type: "concept"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/marketplaces/rental-marketplace.md"
  - "https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md"
  - "https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md"
sources:
  - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals"
  - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe"
  - "https://docs.medusajs.com/resources/infrastructure-modules/locking"
  - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-flow"
  - "https://docs.stripe.com/payments/place-a-hold-on-a-payment-method"
  - "https://docs.stripe.com/payments/extended-authorization"
  - "https://github.com/medusajs/medusa/issues/17287"
---

# Rental pricing, availability and security deposits

> Medusa's official rentals tutorial prices a rental as the variant's daily price times the number of days, and blocks dates that overlap an existing pending or active rental. Hourly pricing and security deposits are custom. Deposits usually use a separate card authorization or a charge that you refund after the return.

## How per-day rental pricing works in Medusa

Medusa's [product rentals tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) stores each product's regular price as the daily rate. When a customer picks dates, a custom add-to-cart workflow multiplies the variant's calculated price by the number of rental days and sets the result as the line item's `unit_price`. Rental items must have a quantity of 1, and non-rental products in the same cart keep their normal price.

A rental configuration per product sets `min_rental_days` and an optional `max_rental_days`. The tutorial also rejects dates in the past and end dates before start dates. Because pricing comes from Medusa's Pricing Module, the daily rate can differ by region or currency like any other price.

| Pricing need | How to do it in Medusa | Status |
| --- | --- | --- |
| Per-day price | Daily price times rental days | Official guide |
| Minimum and maximum rental length | Rental configuration per product | Official guide |
| Per-hour or per-night price | Store hours or nights instead of days and change the multiplier | Custom |
| Weekly or long-rental discounts | Your own rate rules in the price calculation step | Custom |
| Regional pricing | Prices per region or currency in the Pricing Module | Native |

## How rental availability and overlap checks work

The rentals tutorial treats a variant as unavailable when an existing rental overlaps the requested dates. Two date ranges overlap when the existing start is on or before the requested end and the existing end is on or after the requested start. The tutorial's Rental module service runs this check against rentals with a `pending` or `active` status:

```ts
const [, count] = await this.listAndCountRentals({
  variant_id,
  status: ["active", "pending"],
  $or: [{
    rental_start_date: { $lte: end_date },
    rental_end_date: { $gte: start_date },
  }],
})
```

The check runs in three places: an availability route that the storefront date picker calls, the add-to-cart workflow (against existing rentals and other items in the same cart), and the order creation workflow. Order creation holds a lock on the cart from Medusa's Locking Module. That lock is keyed on the cart, not the variant, so two different carts completing at the same moment can both pass; add a lock keyed on the variant if that risk matters to you.

Availability is tracked per variant, so one variant represents one rentable unit. If you own five identical cameras, either create one variant per unit or change the overlap check to count rentals against a quantity. Inventory management is optional for rental variants; the tutorial shows how to restock a variant when a rental is marked as returned.

## Security deposit patterns for rentals

A security deposit protects the owner against damage or late returns. Medusa has no built-in deposit feature, so every pattern below is custom work on top of your payment provider. The card hold limits come from [Stripe's documentation](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method), as of October 2026.

| Pattern | How it works | Limits | Status in Medusa |
| --- | --- | --- | --- |
| Authorize and hold | Create a separate Stripe PaymentIntent with manual capture, capture part of it if there's damage, cancel it otherwise | Online card holds usually last 7 days (Visa merchant-initiated: about 5 days); extended authorization reaches 30 days on eligible cards | Custom |
| Charge and refund | Charge the deposit with the order, refund it after the return | No time limit; the customer sees the full charge | Custom deposit, native refunds |
| Save card, charge on damage | Save the payment method at checkout and charge only if there's a claim | Needs clear terms and customer consent | Custom |

The hold pattern fits short rentals that end inside the authorization window. For a 2-week camera rental booked a month ahead, a hold placed at checkout expires before the return, so charge and refund or a hold placed at pickup works better.

## Payment holds in Medusa's Stripe provider

Medusa's [Stripe module provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe) authorizes the order payment at checkout and captures it later, unless you set its `capture` option to `true`. That is a hold on the whole order, not a separate deposit.

Don't settle a deposit by partially capturing the order payment. As of October 2026, an [open Medusa issue](https://github.com/medusajs/medusa/issues/17287) reports that capturing less than the authorized amount records the partial amount in Medusa while Stripe captures the full authorization. Keep the deposit in its own PaymentIntent, managed by a workflow you write.

## When this approach is not the right choice

- You need hourly slots, buffers, and staff calendars without writing code. A booking plugin or scheduling SaaS covers that out of the box.
- You need deposits held longer than 30 days on a card. No card hold lasts that long; use charge and refund.

## Common questions

### Can Medusa price rentals per hour?

Not in the official rentals tutorial, which works in days. You can adapt it to store hours and multiply an hourly rate, which is custom work.

### How long can Stripe hold a security deposit?

Stripe's documentation says online card authorizations usually last 7 days, and extended authorization reaches 30 days on eligible cards. Longer rentals need a charge and refund instead.

### Does Medusa capture payments automatically?

Medusa's Stripe provider authorizes the payment at checkout and captures it later unless its capture option is set to true. Merchants capture authorized payments from the order page in Medusa Admin.

### How does Medusa stop two customers renting the same item for the same dates?

The rentals tutorial checks for overlapping pending or active rentals on the date picker, on add to cart and when the order is created. The overlap check is per variant, so one variant represents one rentable unit.

## Documentation

- [Implement Product Rentals in Medusa](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals)
- [Stripe Module Provider](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider/stripe)
- [Locking Module](https://docs.medusajs.com/resources/infrastructure-modules/locking)

## Related

- [Build a peer-to-peer rental marketplace: build vs buy](https://medusajs.com/kb/marketplaces/rental-marketplace.md)
- [How to build a booking or reservation system on an ecommerce platform](https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations.md)
- [How do Stripe Connect payouts work for a marketplace?](https://medusajs.com/kb/marketplaces/stripe-connect-marketplace-payouts.md)
