Gap Night Automation: Fill Empty Calendar Nights on Autopilot

You have a two-night minimum stay policy. It keeps operations clean, reduces turnover costs, and filters out the high-maintenance one-night bookings.
But it also creates gaps. Guest A checks out Sunday. Guest B checks in Tuesday. Monday sits empty because no one can book a single night.
You could drop the minimum stay requirement. But then you'd get flooded with one-night bookings that destroy your profit margins. You could manually message both guests and offer them an extension. But you manage 40 properties and you don't have time to scan calendars every morning.
So the gap stays empty. Across your entire portfolio, dozens of nights per month sit vacant not because there's no demand, but because your minimum stay policy makes them unbookable.
Desert Sol Real Estate sent 28 gap night offers through automated scanning in their last reporting period. Each offer targeted the right guest at the right time with the right message. No manual calendar reviews. No copy-pasted templates. No forgotten opportunities.
This is how gap night automation works, why it matters, and how to set it up without adding work to your day.
What Gap Nights Are and Why They Happen
A gap night is a one-night opening in your calendar between two reservations that can't be booked due to minimum stay requirements.
The math is simple:
- Guest A: Check-in Friday, check-out Sunday
- Guest B: Check-in Tuesday, check-out Friday
- Gap: Monday (one night)
- Your minimum stay: 2 nights
- Result: Monday is unbookable through normal channels
The gap exists because of the combination of:
- Your minimum stay policy (set at the PMS or channel level)
- The specific check-in/check-out dates of adjacent reservations
- Channel rules that prevent orphan nights from being booked directly
On Airbnb, you can't override a minimum stay for a single orphan night without changing your global settings. On VRBO, same problem. On your direct booking site, you could manually create a one-night exception, but who has time to monitor for these daily?
So the night stays empty. Not because no one wants it. Because your systems won't let anyone book it.
How Often This Happens
On a single property with 70% annual occupancy, you'll see 10 to 15 gap nights per year. That's conservative. In high-turnover markets with lots of weekend bookings, it's closer to 20 to 25.
Scale that to 50 properties: 500 to 750 gap nights per year.
Average nightly rate: $250. Even with a 10% discount to incentivize extensions, that's $225 per filled gap night.
If you fill just 10% of those gaps, that's 50 to 75 nights. Revenue: $11,250 to $16,875 per year.
For doing absolutely nothing except turning on automation.
Why Manual Gap Night Management Doesn't Scale
You could handle this manually. Here's what that looks like:
- Wake up at 7am
- Open your PMS calendar view
- Scan every property for one-night gaps between reservations
- For each gap, identify the departing guest (Guest A) and arriving guest (Guest B)
- Check if the departing guest's reservation source allows extensions (owner reservations should be excluded)
- Draft a personalized message to Guest A: "Hi [Name], we noticed you're checking out [Day] — we have availability that night if you'd like to extend your stay at 10% off."
- Send via the correct channel (Airbnb message for Airbnb bookings, email for direct bookings)
- Log the offer so you remember who you messaged
- Wait 24 hours for a response
- If Guest A declines or doesn't respond, draft a message to Guest B: "Hi [Name], we have availability the night before your check-in at 10% off if you'd like to arrive early."
- Send via the correct channel
- Log that offer too
- If both decline and the gap is within 48 hours, escalate to a higher discount (15% off) and try again
For 10 properties, this is 45 minutes a day. For 50 properties, it's a full-time job.
And that's assuming you don't make mistakes. Forget to message someone. Send the offer through the wrong channel. Accidentally message an owner reservation. Double-book because you didn't update the calendar fast enough.
Manual gap night management fails at scale not because PMs don't care, but because the process is too repetitive and error-prone to execute consistently.
How Gap Night Automation Works
Automation handles all the scanning, identification, drafting, and routing. You handle the approval.
Here's the workflow Desert Sol runs across 130+ properties:
Step 1: Daily Calendar Scan (6am Cron Job)
Every morning at 6am, the system scans the calendar for all properties in the portfolio. It's pulling data from Guesty's API, looking for:
- Reservations with a check-out date
- Reservations with a check-in date
- One-night gaps between them
The scan excludes:
- Owner reservations (source = "owner" or "owner-guest")
- Blocked dates (maintenance, owner stays marked as unavailable)
- Gaps less than 24 hours (same-day turnarounds where offering an extension would create a cleaning conflict)
Output: A list of gap nights with property ID, gap date, departing guest info, and arriving guest info.
Step 2: Departing Guest Offer (First Priority)
For each gap, the system starts with the departing guest. Why? Because extending an existing stay is easier than getting someone to arrive early.
The AI drafts a message:
Hi [Guest Name],
We noticed you're checking out of [Property Name] on [Check-out Day]. We have availability for one more night if you'd like to extend your stay at 10% off our normal rate.
Let us know if you'd like to add it to your reservation!
[PM Name]
The message is personalized:
- Guest's first name (pulled from the reservation)
- Property name (pulled from the listing data)
- Check-out day (formatted as "Sunday, February 9")
- PM name (configured per portfolio)
The system queues this draft for PM review. No message goes out without human approval.
Step 3: PM Review and Approval (30 Seconds)
The PM logs into the Dimora dashboard, sees the queued offer, reviews the message, and either:
- Approves (message sends immediately)
- Edits (adjusts tone, adds context, changes discount)
- Rejects (skips this gap entirely)
This is the human oversight layer. The AI handles repetitive drafting. The PM handles judgment calls.
Average review time: 30 seconds per offer.
Step 4: Channel Routing and Sending
Once approved, the system routes the message through the correct channel:
- Airbnb reservations → Airbnb messaging API
- VRBO reservations → VRBO messaging API
- Direct bookings → Email to the guest's email address
- All other sources → Email
This matters because guests expect messages to come through the platform where they booked. Sending an Airbnb guest an email about extending their stay feels off-brand. Sending it through Airbnb messaging feels native.
The system logs the offer in Supabase (gap_night_offers table) with:
- Guest name and reservation ID
- Property ID and gap date
- Offer amount and discount percentage
- Channel used (airbnb2, email, etc.)
- Timestamp of offer sent
- Response status (pending, accepted, declined)
Step 5: Wait for Response (24-Hour Window)
The system waits 24 hours for a response. If the guest accepts, the offer is marked as accepted and the reservation is extended in the PMS (either manually by the PM or automatically via API if the integration supports it).
If the guest declines or doesn't respond within 24 hours, the system moves to Step 6.
Step 6: Arriving Guest Offer (Second Priority)
If the departing guest doesn't extend, the system drafts an offer to the arriving guest:
Hi [Guest Name],
We have availability the night before your check-in on [Arrival Day] if you'd like to arrive early. We're offering it at 10% off our normal rate.
Let us know if you'd like to add it to your reservation!
[PM Name]
Same personalization. Same review-approval workflow. Same channel routing and logging.
The arriving guest has 24 hours to respond.
Step 7: Escalation (48 Hours Before Gap)
If both guests decline and the gap is within 48 hours, the system escalates. It drafts a higher-discount offer to the arriving guest:
Hi [Guest Name],
Quick heads-up: we have a last-minute opening the night before your check-in. We can offer it at 15% off if you'd like to extend your stay.
Let us know!
[PM Name]
This is the final attempt. If the arriving guest declines or doesn't respond, the gap stays empty.
But even at a 10% acceptance rate across all three attempts, you're filling 5 to 7 gaps per 50 properties per month. That's $1,125 to $1,575 in monthly revenue that would have been zero otherwise.
The Math Behind Gap Night Pricing
The standard offer is 10% off the normal nightly rate. Here's why:
Your Marginal Cost Is Low
If the property is already booked the night before and the night after, your fixed costs are covered:
- Mortgage/rent: Already paid
- Property management overhead: Already allocated
- Insurance: Already covered
- Utilities (base): Already running
Your marginal cost for one extra night is:
- Incremental utilities (electricity, water, gas): $5 to $15
- Incremental cleaning (one extra set of linens, one extra trash bag): $10 to $20
- Incremental wear and tear: Negligible
Total marginal cost: $15 to $35.
If your normal nightly rate is $250 and you offer the gap night at 10% off ($225), your marginal profit is $190 to $210.
Compare that to leaving the night empty: $0.
The math is obvious. Even at 20% off ($200), you're still making $165 to $185 in profit. The discount isn't giving away margin. It's incentivizing a booking that wouldn't exist otherwise.
Guest Psychology: Why 10% Works
Guests don't extend stays because of price. They extend because:
- They're having a great time and don't want to leave
- Arriving early or departing late solves a logistical problem (flight timing, road trip schedule)
- The incremental cost is low enough that it's an easy yes
A 10% discount signals "this is a special offer" without feeling desperate. It's enough to nudge a maybe into a yes, but not so high that it raises questions about why you're discounting so heavily.
A 5% discount feels like a rounding error. A 20% discount feels like something is wrong with the property. 10% is the sweet spot.
When to Offer Higher Discounts
The 15% escalation offer (48 hours before the gap) works because urgency increases. At that point, you're not filling a calendar gap weeks in advance. You're filling an orphan night tomorrow.
The guest knows you're unlikely to book it through normal channels. You know they know. So a higher discount is justified.
But don't go higher than 20% unless the gap is same-day or next-day. At that point, you're competing with your own future pricing, and deep discounts train guests to wait for last-minute deals.
Real Examples from Desert Sol's Gap Night Workflow
Here's what the data looks like in production:
Total Gap Nights Identified (Last 90 Days): 87 across 130+ properties
Offers Sent:
- Departing guest offers: 87
- Arriving guest offers: 63 (24 departing guests accepted, so those gaps were filled)
- Escalation offers (48h): 28
Total Offers Sent: 178
Accepted Offers: Data not disclosed, but even at 10% acceptance rate, that's 17 to 18 filled nights.
Revenue Per Filled Night: $150 to $300 depending on property type (10% discount applied).
Low-End Revenue Estimate: 17 nights x $150 = $2,550 over 90 days
High-End Revenue Estimate: 18 nights x $300 = $5,400 over 90 days
Annualized: $10,200 to $21,600 in gap night revenue that wouldn't exist without automation.
And the PM time investment? 30 seconds per offer review x 178 offers = 89 minutes total over 90 days. Less than one minute per day.
Compare that to the 45 minutes per day it would take to manually scan calendars, draft messages, and track responses for 130 properties.
Setting Up Gap Night Automation (With or Without Dimora)
If you want to build this yourself, here's what you need:
1. PMS API Access
You need read access to:
- Reservation data (guest name, check-in, check-out, source, property ID)
- Calendar availability (to identify gaps)
- Listing data (property name, nightly rate)
Guesty, Hospitable, and Hostaway all provide this via REST API. You'll need API credentials and rate limit handling (Guesty allows 10 requests per second, Hospitable allows 5).
2. Daily Cron Job
Set up a scheduled task that runs every morning at 6am. This task:
- Fetches all reservations for the next 60 days
- Identifies one-night gaps between check-outs and check-ins
- Excludes owner reservations and blocked dates
- Outputs a list of gap opportunities
You can build this in Python, Node.js, or whatever your team uses. The logic is 100 to 150 lines of code.
3. Message Drafting System
For each gap, generate a personalized message using:
- Guest first name
- Property name
- Check-out or check-in date (depending on whether you're messaging departing or arriving guest)
- Discount percentage (10% or 15%)
- PM name
Store message templates in a database so you can A/B test different versions over time.
4. Channel Routing Logic
You need to route messages through the correct channel:
- Airbnb bookings → Airbnb messaging API (requires OAuth and thread management)
- VRBO bookings → VRBO messaging API (same)
- Direct bookings → Email (SMTP or SendGrid)
This is the hardest part to build yourself because each channel has different authentication, rate limits, and message formatting requirements.
If you're using Dimora, this is built in. The system detects the reservation source and routes automatically.
5. Logging and Tracking
Every offer needs to be logged:
- Who was messaged (guest name, reservation ID)
- When (timestamp)
- What was offered (gap date, discount, property)
- Response status (pending, accepted, declined)
Use Supabase, Postgres, or any database that can handle time-series data. You'll query this later to calculate acceptance rates and revenue per property.
6. Approval Workflow
This is critical. Don't auto-send offers without PM review.
Build a simple approval queue:
- System drafts message
- PM sees it in a dashboard or daily email digest
- PM approves, edits, or rejects
- Approved messages send immediately
This keeps human oversight in the loop while automating the repetitive work.
Common Questions About Gap Night Automation
"Won't guests feel annoyed by upsell messages?"
Only if you do it wrong. The key is framing and timing.
Bad framing: "We have an empty night in our calendar. Can you fill it?"
Good framing: "We noticed you're checking out Sunday — we have availability if you'd like to extend your stay."
The first sounds desperate. The second sounds helpful.
Timing matters too. Send the offer 7 to 14 days before the gap. Don't spam guests the day they book. Don't message them an hour before check-out.
Desert Sol has sent 178 gap night offers with zero guest complaints. The messages are optional, helpful, and clearly valuable to the guests who accept.
"What if both guests accept?"
This is handled in the logging system. When Guest A (departing) accepts, the gap is marked as filled and the system skips the offer to Guest B (arriving).
The PMS calendar should update immediately to reflect the extension. If you're doing this manually, the PM needs to block the gap date as soon as the first guest accepts.
If you're fully automated, the system can update the PMS via API. Guesty supports this. Hospitable supports this. Hostaway supports this.
"How do I handle channel-specific rules?"
Airbnb has specific rules about what you can and can't say in messages. VRBO has different rules. Direct bookings have no rules.
The safest approach: keep gap night offers simple and factual. Don't mention pricing in the initial Airbnb message (that can trigger spam filters). Just say "we have availability if you'd like to extend" and let the guest reply. Then you can discuss pricing in the follow-up.
For direct bookings, you can include the dollar amount in the first message.
If you're using Dimora, the system adjusts message templates per channel automatically based on platform rules.
"Can I use this for multi-night gaps?"
Yes, but the logic changes. A two-night gap can be filled by:
- Guest A extending two nights
- Guest B arriving two nights early
- A new booking (if you drop your minimum stay to 2 nights for that specific date range)
The automation workflow is similar, but you need to add logic for creating standalone bookings instead of just extending existing ones.
Most PMs start with one-night gaps because the workflow is simpler and the acceptance rate is higher. Once that's running smoothly, you can expand to multi-night gaps.
What to Do Next
If you manage 10+ properties and you have a minimum stay policy, you have gap nights. The question isn't whether the revenue exists. It's whether you're capturing it.
Here's your action plan:
-
Audit your gaps — Go into your PMS, pull up the next 60 days, and count how many one-night gaps exist between reservations. Multiply by your average nightly rate and 10% acceptance rate. That's your potential revenue.
-
Pick your approach — Build it yourself (40+ hours of dev work) or use Dimora's Revenue Engine (2 hours of setup).
-
Set up the workflow — Calendar scanning, message drafting, channel routing, logging, approval queue. Get all five pieces working together.
-
Run for 30 days — Track offers sent, acceptance rate, revenue per filled gap, guest complaints (should be zero).
-
Optimize — Adjust your discount percentage, offer timing, and message templates based on real data.
-
Scale — Once gap night automation is running smoothly, add early check-in and late checkout automation, then payment recovery, then extended stay offers.
Gap nights are the easiest operational revenue stream to automate because the logic is simple, the offer is clear, and the guest value proposition is obvious.
Start here. Prove the concept. Then expand to the other four revenue streams.
Read the full revenue optimization guide for the complete framework, or see how automated upsells perform at scale.
The revenue is sitting in your calendar right now. You just need a system to capture it.
The Dimora AI team writes about what we build and what we learn running AI operations across 210+ vacation rental properties.
View all postsRelated Articles
Continue exploring insights on property management and AI automation
See it running on real properties
Book a 15-minute demo. We show you real call logs, real inbox drafts, and real upsell data from 210+ properties. 14-day free trial, no credit card.


