Best next move Skim the setup path, then jump to the section that matches the problem in front of you.
At a glance
Time
15-45 min
Difficulty
Beginner-friendly
Best for
Short-term rental hosts
Next step
Choose one workflow to improve

Home Assistant Checkout Automation

It is 11:07am on a Sunday in July. Your guests just pulled out of the driveway, and the AC is still set to 64°F because they wanted it "cold for sleeping." Every overhead light upstairs is on. The bathroom fan is humming. The Yale Assure SL guest code is still active until you remember to expire it tonight. And your cleaner is texting "am I clear to come in?" because she has no idea whether the place is empty. You can sit there and manually fix all of that, or you can build one home assistant checkout automation that does the whole sequence the moment checkout happens. This guide walks through the exact recipe — the triggers that actually work, the order operations should run in, the sensors and helpers you need, and the fallback so it does not strand a late-leaving guest in a freezing house.

Who this recipe is for

This is for hosts already running Home Assistant who have at least a smart lock (Schlage Encode, Yale Assure SL, or August Wi-Fi Smart Lock), a smart thermostat (Ecobee Premium, Nest Learning, or Honeywell T9), and a few smart bulbs or plugs (Philips Hue, TP-Link Kasa, or Sonoff Zigbee). Bonus credit if you also have door sensors (Aqara P2, Aeotec ZW189) and a Wi-Fi presence integration. If you are still standing up the foundation, work through our Home Assistant short term rental setup overview first — this recipe expects most of those pieces to already be in place.

You also want a working Home Assistant guest mode helper and dashboard, because the checkout automation is essentially the "turn it off" half of that pattern. If guest mode is the "on" switch when guests arrive, checkout automation is the "off" switch and reset routine that fires when they leave.

What this solves for hosts

Done right, a single checkout automation kills the four pieces of work that eat the most time on a turnover day:

  • Energy bleed. Lights left on, AC running at 64, fans humming for hours.
  • Lock-code housekeeping. Old guest codes that should have been expired the moment the booking ended.
  • Cleaner coordination. The endless "is it empty yet?" texts and the worry about walking in on a late checkout.
  • State drift. Your normal automations being half-suppressed because guest mode never properly turned off.

The decision path: what triggers checkout?

Before you write the automation, decide what actually counts as "checkout." You have three reasonable options, and the right answer for most hosts is a hybrid.

  1. Time-based. Fires at 11:00am (or your stated checkout time) every day there is a checkout on the calendar. Predictable, but trips on late checkouts.
  2. Sensor-based. Fires when a door has been closed and motion has been quiet for 30 minutes after the stated checkout time. More accurate, more moving parts.
  3. Hybrid. Fires when EITHER (a) the calendar says checkout day AND motion has been quiet for 30+ minutes after checkout time, OR (b) a manual "Guests Gone" button is pressed. This is the recipe below.

The hybrid pattern handles the messy real world: late checkouts, early departures, weird stays where the guest never left the house until 1pm. For deeper presence logic, see our vacation rental occupancy automation guide — the mmWave and door-sensor patterns there feed straight into this trigger.

Step-by-step setup

1. Helpers you will need

Create these in Settings → Devices & services → Helpers:

  • input_boolean.guest_mode — the master toggle (already exists if you followed the guest mode guide).
  • input_boolean.checkout_done — flips on after a successful run, prevents double-firing.
  • input_button.checkout_now — your manual "Guests Gone" button.
  • input_datetime.checkout_time — default 11:00am, easy to override per booking.

2. The motion-quiet sensor

Create a template binary sensor named binary_sensor.house_quiet that is "on" when no motion sensor in the house has reported activity for 30 minutes. If you have multiple Aqara P1 or Hue Indoor Motion sensors, group them and check the group's last_changed time. This sensor is the heart of the automation.

3. The trigger

Build an automation with three triggers (any one fires it):

  • Trigger A: binary_sensor.house_quiet turns on AND current time is later than input_datetime.checkout_time.
  • Trigger B: input_button.checkout_now is pressed.
  • Trigger C: time hits 2:00pm on a confirmed checkout day, regardless of sensor state (the safety net).

Add a top-level condition: only run if input_boolean.checkout_done is off and input_boolean.guest_mode is on. That stops the automation from running twice or running on days with no guests.

4. The action sequence

Inside the automation, run these steps in order:

  1. Turn off all interior lights and the bathroom fan.
  2. Set the thermostat to your between-stays setpoint (commonly 78 in summer, 60 in winter; coordinate with the Ecobee and Nest seasonal setpoint patterns we use for rentals).
  3. Disable the current guest's lock code, per the Schlage Encode and Yale Assure code-rotation recipe.
  4. Confirm exterior door is locked. If not, lock it.
  5. Send a notification to your cleaner: "Property is empty and ready. Door code for today is XXXX."
  6. Send a notification to you: timestamp, motion-quiet duration, indoor temp at checkout.
  7. Turn off input_boolean.guest_mode.
  8. Turn on input_boolean.checkout_done.

5. The next-booking reset

Add a second tiny automation that flips input_boolean.checkout_done back to off whenever input_boolean.guest_mode turns on again. That way next booking's checkout can fire normally.

AI Lab: drafting the YAML safely

This is a good automation to draft with Claude Code or Codex because the action list is long and the YAML indentation is easy to fat-finger. Hand the model your real entity IDs (do not let it invent climate.thermostat generically), the order of operations above, and ask for one trigger group at a time. After you paste the result into a YAML file, comment out the cleaner notification and the lock-code disable lines, then test the rest end-to-end on a fake checkout.

Once you have watched it run cleanly twice in a row with the safe steps, uncomment the lock and notification actions and test once more. Never let a freshly-generated automation expire a real lock code or notify a real cleaner before you have seen the trigger fire correctly with sandbox actions in place. Our copy-paste Airbnb automation templates ship a pre-tested checkout block you can use as a sanity reference.

Privacy and safety notes

This automation reads motion sensors. Disclose those in your listing — "motion sensors in common areas, used only to detect occupancy for HVAC control" is honest and reassuring. Do not use indoor cameras or microphones to determine occupancy; HomeScript Labs editorial policy recommends outdoor doorbell cameras (Ring Battery Doorbell Plus, Google Nest Doorbell) or floodlight cameras only. The 2:00pm safety-net trigger exists so a sensor failure does not strand the property in guest mode forever; it should be late enough that you are not racing a slow-departing guest.

For lock-code expiration, build in a soft expire: the code stops working at checkout, but a manual override from your phone can re-enable it for ten minutes if a guest forgot something. Do not just delete the code outright in the automation — that creates a support-ticket nightmare. For the broader privacy framework on what to disclose and how to position monitoring with guests, see our privacy-safe monitoring pillar.

Common mistakes

  • Firing the cleaner notification before confirming the door is locked. Order matters.
  • Using a 5-minute motion timeout. Guests load suitcases for 20 minutes; you will get false positives all day.
  • Not gating on input_boolean.checkout_done. The automation will retrigger every time the house goes quiet again.
  • Hardcoding the thermostat setpoint instead of pulling from a between-stays helper. Seasonal adjustments become painful.
  • Skipping the manual button. You will absolutely need it the day a guest checks out at 8am and you want the cleaner there by 9.

Host checklist

  • All four helpers exist and the automation references them by exact entity ID.
  • The house_quiet binary sensor has been verified by walking out and watching it flip on after 30 minutes.
  • Manual "Guests Gone" button is on your phone dashboard.
  • Cleaner notification has been tested end-to-end and the code in the message rotates per booking.
  • 2:00pm safety-net trigger is enabled and you have confirmed it only fires on actual checkout days.
  • Lock-code expiration uses a soft-expire pattern, not a hard delete.

FAQ

What if I do not have motion sensors yet?

Use a door sensor (Aqara P2 or Aeotec ZW189) on the front door instead. The trigger becomes "door has been closed for 30+ minutes after checkout time AND no door open events have happened." It is slightly less accurate — a guest who never left their car would not register — but it works for the 95% case. Add motion sensors when you can; they pay for themselves in better automations across the whole house.

Can the home assistant checkout automation handle back-to-back bookings?

Yes, as long as the "next booking" reset automation flips input_boolean.checkout_done back to off when guest mode turns on for the new arrival. If you have same-day turnovers (checkout at 11, check-in at 4), a 2:00pm safety net is fine because it will run once and the system will be ready to flip into guest mode again before the next code is used.

How do I keep the cleaner from getting notified on my personal stays?

Add an input_boolean.personal_stay helper. When that is on, your check-in flow does not turn on guest mode, so the checkout automation never satisfies its conditions. Keep one big visible toggle on your phone dashboard for personal stays so you do not forget.

What if the guest never returned the house to occupied state?

The 2:00pm safety net handles this. If by then the system has not detected motion-quiet plus a confirmed checkout day, it fires anyway with a slightly different notification: "Forced checkout fired at 2pm. Verify property is empty before sending cleaner." That preserves your cleaner workflow but adds a human eyeballs step.

How do I show checkout status on the host dashboard?

Use a conditional Lovelace card that appears only when input_boolean.checkout_done is on, with the timestamp of the last run and a button to manually re-arm. The full layout pattern is in our vacation rental dashboard guide.

Related reading

Next steps

Pair this checkout flow with the cleaner notification recipe so the SMS or push to your cleaning team includes today's code, supply notes, and any guest-reported issues. Then layer in occupancy automation so your house knows the difference between "empty between stays" and "guests just stepped out for dinner." Grab the Home Assistant rental automation starter pack from the resources page if you want pre-built YAML for all of these.