Start with one calendar and one phone
For Home Assistant calendar notifications, use a calendar trigger that runs before each event starts. Read the title and time from the event that triggered the automation, then send them to your phone. Start with a dedicated calendar containing only the appointments you want announced.
You can use the built-in Local calendar, or an existing calendar connected through a supported integration. An integration adds a feature or connects a service to Home Assistant. First confirm the appointment appears in Home Assistant’s Calendar page. Then test a plain phone notification. Finally add the automation below and rehearse two appointments at the same time.
Choose Home Assistant when the reminder belongs with household routines or should reach a shared home display. If you only need your usual phone calendar’s own alert, keeping that alert is simpler. Keep an independent reminder for appointments you cannot afford to miss.
Researched from current Home Assistant documentation and the 2026.9.4 calendar implementation on September 30, 2026. The configuration and timing examples are illustrative, not a tested Tara installation or a measured delivery guarantee. Menu labels vary by installed version. The cover is an AI-generated editorial illustration.
1. Choose the calendar and check its dates
- For a calendar stored at home: go to Settings → Devices & services → Add integration → Local calendar. Name it “Household reminders.” The Local calendar documentation covers setup.
- For an existing Google calendar: connect it with the Google Calendar integration. This needs Google account authorization and developer credentials. Maintain the appointments in that calendar; do not also copy them into a local calendar unless you intend to maintain two copies.
- Find the actual calendar identifier. In the integration’s entity list, open the calendar and its settings. An entity is Home Assistant’s named representation of a device function or calendar. Copy its entity ID, such as
calendar.household_reminders; your name may differ. - Open Calendar in the sidebar. Select the calendar and confirm one ordinary timed appointment has the right date and time. Check Home Assistant’s configured time zone under Settings → System → Home information → Region (called General in older versions), especially if the source calendar uses another zone. The home-information guide shows the current location.
A Local calendar stores automation dates on your Home Assistant server. It does not automatically become a shared Google calendar or a full phone-calendar replacement. The calendar overview explains those different roles.
2. Send a plain test notification
Install and connect the Home Assistant Companion app on the receiving phone, and grant notification permission. Find its action in Settings → Tools → Actions; older versions call this Developer tools → Actions. The Companion notification documentation explains the phone-specific action name.
Switch the Actions tool to YAML mode and run this with your own phone’s action name:
action: notify.mobile_app_your_phone
data:
message: "Calendar setup test — no appointment attached."
Expected result: that text arrives on the selected phone. If it does not, fix permission, the selected phone action, or delivery connectivity before changing calendar settings. Our notification-delivery guide covers that next step.
3. Add the appointment automation
Under Settings → Automations & scenes, create a new empty automation. Open its menu and choose Edit in YAML. Replace the new automation’s contents with the complete example below, change the calendar and phone identifiers, then save and enable it. This goes in the automation editor, not directly in configuration.yaml.
alias: Calendar - appointment reminders
description: Notify 15 minutes before timed events
triggers:
- trigger: calendar
entity_id: calendar.household_reminders
event: start
offset: "-00:15:00"
conditions:
- condition: template
value_template: "{{ not trigger.calendar_event.all_day }}"
actions:
- variables:
reminder: >-
{{ trigger.calendar_event.summary }} starts at
{{ as_timestamp(trigger.calendar_event.start)
| timestamp_custom('%H:%M', true) }}.
- action: persistent_notification.create
data:
title: Calendar reminder
message: "{{ reminder }}"
- action: notify.mobile_app_your_phone
data:
title: Calendar reminder
message: "{{ reminder }}"
mode: queued
max: 10
The offset is the time shift from the appointment start: -00:15:00 means 15 minutes before. The condition excludes all-day entries. The message uses the triggering appointment’s title and formats its start time in Home Assistant’s time zone, in 24-hour form. For example, 15:00 means 3 pm. See the calendar trigger fields and time-formatting reference.
Queued means one run waits for the previous run to finish. The limit of 10 covers the active run plus waiting runs; further arrivals can be rejected if it fills. Keep this sequence short—adding a long wait would delay later reminders. The automation-mode documentation explains these limits.
The first action creates a notification inside Home Assistant; the second requests a phone notification. During setup, the in-app copy helps show that scheduling reached the message step. It is not proof that the phone received anything. After verification, you can remove the persistent_notification.create action if you only want phone messages.
Use the event, not the calendar’s current headline. A calendar’s state says whether an event is active, and its attributes show only one event. Reading those attributes can miss overlapping appointments. The recipe uses trigger.calendar_event, which belongs to this particular run. Google Calendar’s attribute warning explains the distinction.
4. Rehearse two appointments at the same time
Use harmless test appointments on the dedicated calendar, with no device-control automations attached. The calendar documentation says calendars are read every 15 minutes. With an advance reminder, leave time before the reminder, not just before the appointment.
For this worked example, finish saving the automation and both test events by 14:00. Give “TEST library visit” and “TEST parcel pickup” the same 15:00–15:30 slot. That leaves 45 minutes until the expected 14:45 reminders. If it is later than 14:00, move both events far enough ahead to keep that margin.
On a narrow screen, swipe the table sideways.
| Check | What you do | Expected result |
|---|---|---|
| Calendar input | View the selected calendar before the reminder time. | Both timed entries appear at 15:00. Correct a wrong date, zone or calendar here first. |
| Independent events | At 14:45, inspect this automation’s Traces and Home Assistant notifications. | Two runs, each with its own event title, and two in-app reminders. Equal-time events need no particular ordering. |
| Phone output | Check the receiving phone. | A reminder for each test title. Delivery can lag; a successful action is not a receipt from the phone. |
| All-day exclusion | Add a separate all-day “TEST day off” for tomorrow, well ahead of its trigger time. | The all-day condition stops that run before either message action. Do not wait for a midnight phone alert. |
The example deliberately sets no shared notification tag or fixed in-app notification ID. Reusing one identifier can replace an earlier message, making two successful runs look like only one alert. A phone may still visually group its notifications; expand the group before diagnosing a missing event.
Do not use “Run actions” as this recipe’s calendar test. It skips the trigger and supplies no calendar-event data. An undefined trigger error there does not prove the scheduled automation is broken. Let the future test appointments trigger it and inspect the automation traces, the step-by-step record of each run.
Find the stage that failed
On a narrow screen, swipe sideways to read the checks and next steps.
| What you see | Check first | Next step |
|---|---|---|
| No event in Home Assistant | Is the correct calendar selected, and is its connection working? | Correct the calendar source or authorization. Automation edits cannot retrieve an event that the calendar has not supplied. |
| Event visible, no run | Was the enabled automation ready before the reminder time, with enough time for a calendar read? | Create a new test 45–60 minutes ahead. Check the negative offset and calendar identifier. |
| Run stops at condition | Is all_day true in the trigger data? | This is intentional. Use a timed entry if you want this automation to notify. |
| In-app reminder, no phone alert | Does the plain phone test still arrive? Does the trace show an action error? | Check the phone action, notification permissions and quiet-mode settings. Calendar timing already reached the message step. |
| Only one of two events appears | Are there two traces? Are both timed? Did you change the mode or add a shared tag? | Restore per-event data and queued mode; remove an unintended shared tag. Do not infer a lost trigger from the phone display alone. |
| Reminder has the wrong hour | Compare the source event’s time zone with Home Assistant’s configured zone. | Correct the underlying zone, then schedule a new test. Changing the offset to hide a zone error can break later dates. |
Keep all-day dates and missed reminders explicit
All-day events start at midnight in Home Assistant’s time zone, as described in the calendar entity documentation. Without the exclusion, a 15-minute advance offset would target 23:45 the previous evening. For a birthday reminder at 09:00, create a separate timed “Birthday reminder” entry at 09:15 with this recipe. Keep the original all-day entry if it is useful on the calendar.
A restart before the reminder can resume future scheduling once the calendar and automation are ready. If Home Assistant was off at the reminder time, this example has no catch-up step or record of which reminders were delivered. The checked calendar implementation schedules upcoming triggers. Late event edits also need time to reach Home Assistant; a last-minute change may leave an old reminder scheduled. Keep your ordinary calendar alert for important appointments.
For an evening summary of tomorrow’s collection dates, follow the trash-calendar reminder guide. For a chore due a set number of days after you finish it, use the completion-based recurring chore setup.
Common questions
Does a local calendar mean offline phone notifications?
No. The dates and automation can stay local while ordinary phone push uses external delivery services. Local Push is a separate feature with connection and app requirements. Test the delivery path you intend to rely on.
Can I announce the appointment through a speaker?
Yes, with a supported speaker and a speech action. First verify the calendar message; then follow the TTS announcement guide for quiet hours and music handling. Avoid speaking private appointment names into shared rooms.
Who can see the reminder?
This example copies the appointment title into Home Assistant’s notifications and a phone notification. Consider shared screens and lock-screen previews. Use neutral event titles, or replace the message with “Check your calendar for an upcoming appointment.” The notification privacy documentation describes the external delivery path. Local calendar storage does not make every output private.
For a home automation kit with coordinated local routines, the useful handoff is straightforward: identify the calendar, the recipient, the advance notice and the fallback when the server is unavailable.
