Adjacent-Day Pricing: Nights Beside Reservations

Jun Zhou, Founder at AirROI
by Jun ZhouFounder at AirROI
Published: September 4, 2026
Updated: September 5, 2026

Adjacent-day pricing adjusts available nights near a reservation. It can help express a policy for extending bookings, but it does not itself modify a reservation or guarantee a longer stay.

Trace the search on the calendar

Follow the available nights beside each booking

Illustrative calendar: June 12–17, 2026. Calculation date June 13; $200 per night after model effects.

Fri 12
Reserved
Boundary
Sat 13
Available
$190.00
1-night gap
Sun 14
Reserved
Boundary
Mon 15
Available
$190.00
2-night gap
Tue 16
Available
$190.00
2-night gap
Wed 17
Reserved
Boundary
Available nights beside a reservation receive −5%, once per night. This chart runs the adjacent rule alone.
Labels carry the same meaning as colors. Reserved boundary nights are not discounted in this illustration. No other rules or price limits.

For a one-day search in each direction, June 13 qualifies both after June 12 and before June 14—but receives only one −5% adjustment. June 15 follows June 14. June 16 precedes June 17.

Switch to “Missing boundary.” June 16 no longer has a known reservation in its one-day search. That does not erase the separate evidence for June 15.

Choose the direction deliberately

Intended policydays_beforedays_after
Adjust nights leading into a reservation10
Adjust nights following a reservation01
Adjust either side11

Both directions cannot be zero. Increasing the search distance does not allow the search to jump over unknown or blocked nights. The rule requires calendar evidence along the path.

Combine with a gap rule carefully

Suppose June 13 receives a −15% gap adjustment. Its otherwise valid adjacent-day −5% is suppressed. The standalone result is $170, not $160 or $161.50. Other automatic rules may still join the shared percentage total, and owner limits can change the final rate.

Supply reservation evidence

The JSON below is an addition to this complete Calendar Prices request. Merge fields into one request; do not send a rule fragment by itself.

{
  "location": {
    "latitude": 25.7907,
    "longitude": -80.13
  },
  "currency": "USD",
  "base_price": 200
}

All worked prices use USD and assume a $200 price after model effects, with no other adjustments unless stated. They demonstrate arithmetic, not live forecasts.

Gap-day, adjacent-day, and occupancy-pacing rules need calendar. Each row requires a unique date and a status: available, reserved, or blocked. For this historical illustration, assume today is June 13, 2026:

{
  "calendar": [
    {"date": "2026-06-12", "status": "reserved", "reservation_id": "booking-a"},
    {"date": "2026-06-13", "status": "available", "price": 240, "min_stay": 1,
     "check_in_allowed": true, "check_out_allowed": true},
    {"date": "2026-06-14", "status": "reserved", "reservation_id": "booking-b"},
    {"date": "2026-06-15", "status": "available"},
    {"date": "2026-06-16", "status": "available"},
    {"date": "2026-06-17", "status": "reserved", "reservation_id": "booking-c"}
  ]
}

This creates a one-night gap on June 13 and a two-night gap on June 15–16. Use your current dates in a real request. Send up to 1,000 rows; order does not matter. Missing dates mean unknown, not available.

Optional min_stay (1–365), check_in_allowed, and check_out_allowed help test whether a gap is bookable when no corresponding custom stay rule is set; defaults are one night and both permissions true. price must be positive in the request currency but does not affect calculations. reservation_id must be nonblank and is allowed only on reserved or blocked rows; it is not currently used by pricing rules.

Add the rule

{
  "pricing_rules": {
    "adjacent_day": {
      "mode": "custom",
      "settings": {"days_before": 1, "days_after": 1, "adjustment_percent": -5},
      "apply_on_weekends": true
    }
  }
}

With the calendar above, June 13, 15, and 16 each receive −5% (200 → 190) when used alone. The adjustment applies once even if reservations are on both sides. days_before and days_after accept 0–30; zero disables that direction, and at least one must be positive. Blocked or unknown nights interrupt the search for a reservation.

If a gap-day rule already applied a nonzero adjustment, the adjacent-day adjustment is skipped for that date. Both accept percentages greater than −100 with at most two decimal places, and both require apply_on_weekends in custom mode.

Trace the example

Available nightWhy it qualifies with the rule aboveStandalone price
June 13After the June 12 reservation and before June 14$190, applied once
June 15After the June 14 reservation$190
June 16Before the June 17 reservation$190

These are synthetic calculations made on June 13, 2026. Replace dates with current booking evidence in a live request.

Boundaries and interactions

The search looks for reservations, not blocked nights. A blocked or unknown night interrupts it. In contrast, a gap rule can use a blocked night as a boundary. This difference is why “near something unavailable” is not enough to predict an adjacent-day adjustment.

A nonzero gap-day adjustment takes priority on that date. If the gap length is uncovered or its adjustment is zero, an otherwise eligible adjacent-day adjustment can still apply. The adjacent adjustment adds to the other automatic rules on the same post-model price basis.

With apply_on_weekends: false, Friday and Saturday are excluded. For scoped custom settings, provide the weekend flag again: it is not inherited from the top-level rule.

Test the direction, then the priority

Choose whether to target nights before a reservation, after it, or both. Test a date that also qualifies for gap-night pricing: a nonzero gap adjustment takes priority, rather than adding a second discount.