See which meetings are wrecking your sleep and recovery

A board that lines up twelve weeks of meeting load against the sleep and recovery that followed, so you can finally see which days cost you.

App
Google HealthGoogle CalendarPersonal ProductivityMeeting WorkflowsAI Reports
PromptCreate

Build me an app I open at the end of each week to understand how my meeting load is actually affecting my recovery. This is a retrospective analytics board, not a daily automation. Nothing runs on a schedule. I open it, look across the last twelve weeks, and figure out which meeting patterns are costing me sleep.

The main view is a table where each row is one day across the last twelve weeks. The left half of the row is meeting load computed from Google Calendar, using List Events. Show meeting hours, meeting count, longest uninterrupted gap and back to back count. Longest uninterrupted gap is the longest stretch of unbooked time inside my working hours, which should be a setting and default to 9am to 6pm in my calendar timezone. Back to back count is the number of adjacent meeting pairs separated by less than a configurable buffer, defaulting to five minutes.

When reading events, call List Events with singleEvents set to true so recurring series expand into individual instances, and keep the recurringEventId on each instance because the analysis step later needs to group instances back into their series. Page through with nextPageToken rather than assuming one response covers the window. Exclude all day events, which are the ones carrying a date instead of a dateTime, and exclude any event where my own attendee entry has a declined response status. Both exclusions should be visible toggles in the UI so I can turn them off and see how the numbers change. Use List Calendars to let me pick which calendars count toward meeting load, defaulting to my primary calendar, so subscribed and personal calendars do not pollute the math.

The right half of the row is recovery from Google Health. Show that night's sleep duration and sleep efficiency, read from List Data Points on the sleep data type, plus the next morning's resting heart rate and heart rate variability, read from Daily Roll-Up Data Points on the daily-resting-heart-rate and daily-heart-rate-variability data types.

Two fetching constraints matter and I want them handled properly rather than discovered at runtime. First, the closed-open range on the aggregation methods is capped at fourteen days, so a twelve week board has to page through the window in chunks of fourteen days or fewer and stitch the results together. Do not request twelve weeks in one call. Second, the sleep data type defaults and caps at a pageSize of twenty five, unlike the 1440 default on other types, so sleep reads must follow nextPageToken until the window is fully covered. Fetch the chunks in parallel where you can and show a progress indicator, since the first load spans a lot of requests.

Getting the day alignment right is the core of the whole app. A given day's meeting load pairs with the sleep session that began that night, meaning the session ending on the following morning, and with the resting heart rate and heart rate variability reported for that following morning. A Tuesday packed with meetings is judged against Tuesday night's sleep and Wednesday morning's heart numbers. Make this rule explicit in a tooltip on the table header so I trust what I am reading.

Give each day a single recovery index so the board can be sorted by worst recovery. Compute it by scoring sleep duration, sleep efficiency, resting heart rate inverted and heart rate variability against my own twelve week baseline rather than any population norm, then averaging them. Sorting by worst recovery is the default view and is the thing that surfaces the days that cost me most. Days missing health data should be marked as incomplete and sorted out of the way rather than scored as if they were good days.

Clicking a day expands it to show the actual meetings that ran that day, with title, time, duration and attendee count, alongside the sleep that followed, including the session start and end times and the efficiency figure. This is where I go to sanity check a bad row and see what really happened.

Add a Protect recovery time button that blocks time using Google Calendar Create Event. Let me pick the date, start time and duration, prefill a sensible default such as a ninety minute block, create it as a focus time event, and refresh the board afterwards so the new block is reflected. Confirm the details with me before creating anything, since this is the only thing in the app that writes to my calendar.

Add an Analyze this block button that kicks off a background agent over whatever date range I have selected on the board. The agent reads that range across both systems, using List Events for the meetings and List Data Points plus Daily Roll-Up Data Points for the sleep and heart metrics, respecting the same fourteen day chunking and sleep paging rules. It groups meeting instances by their recurring series, compares the recovery index of days containing each series against days without it, and writes a rebalancing recommendation back into the app naming which recurring meetings track with my worst sleep and what specifically to move, shorten or drop. Store each recommendation with its date range and timestamp, show it in a panel in the app, and keep the previous ones so I can see whether the advice changed after I acted on it. Show a clear running state on the button while the agent works, since it takes a while.

Cache fetched days so reopening the board does not refetch the entire twelve weeks every time, with a manual refresh control and a visible note of when the data was last pulled. Keep the framing throughout on understanding which meeting patterns wreck my recovery.

What does this prompt do?

  • Shows one row per day for the last twelve weeks, with how many hours you spent in meetings, how many meetings you had, your longest uninterrupted stretch of free time and how many meetings ran back to back
  • Puts that night's sleep length and sleep quality, plus the next morning's resting heart rate and heart rate variability, right next to the day that caused them
  • Sorts by worst recovery so the days that actually cost you rise to the top, and lets you click any day to see the real meetings that ran and the sleep that followed
  • Gives you a Protect recovery time button that blocks the time straight into your calendar
  • Includes an Analyze this block button that sends a background assistant through the range you picked and writes back which of your recurring meetings line up with your worst sleep

What do I need to use this?

  • A Google Calendar account with the meetings you want measured
  • A Google Health account with sleep and heart data flowing in from a Fitbit, Pixel Watch or another connected device
  • At least a few weeks of history in both, since the board compares each day against your own personal baseline
  • Permission to add events to your calendar if you want to use the Protect recovery time button

How can I customize it?

  • Choose which calendars count toward meeting load, so personal or subscribed calendars do not skew the numbers
  • Change the window from twelve weeks to whatever range you want to study, and set the working hours used for the longest free gap
  • Adjust what counts as back to back, and decide whether short one to one meetings should count the same as long group meetings
  • Change the default length and title of the block created by the Protect recovery time button

FAQs

Do I need a Fitbit or Pixel Watch for this to work?
You need some device that sends sleep and heart data into Google Health. Fitbit and Pixel Watch are the most common, and other connected devices that write into Google Health work too. Without sleep and heart data the calendar side still works, but the recovery columns will be empty.
Will it count meetings I declined?
No. Invitations you declined are left out of the meeting load math by default, along with all day events like holidays, out of office markers and birthdays, since neither one reflects time you actually spent in a meeting.
Does this change my calendar without asking?
No. The board only reads your calendar. The single exception is the Protect recovery time button, which creates a block only when you click it and confirm the time.
Why twelve weeks instead of just the last month?
Sleep and heart data are noisy night to night, so a short window mostly shows randomness. Twelve weeks is long enough for a repeating meeting pattern to separate itself from the noise, which is the whole point of the board.
Can it really tell which recurring meeting is the problem?
The Analyze this block button looks at the range you selected, groups your meetings by the recurring series they belong to, and reports which series show up most often on your worst recovery days. Treat it as a strong lead worth acting on rather than a medical finding.
How often should I open it?
Most people open it once at the end of the week. It is a review surface rather than something that runs on its own, so nothing is lost if you skip a week and come back to a fuller picture.

Related templates

Plan a field sales day around drive time and neglected accounts

Pick a date, a starting point and a radius, then build a sequenced day of customer visits that lands straight on your calendar.

Geolocation
HubSpot
Google Calendar
App
Short-term rental turnover console for Home Assistant

Open one screen each morning to see every rental's locks, temperature, humidity, and next check-in, then prep the next stay in a single click.

Home Assistant
Google Calendar
Slack Bot
App
Run your HoneyBook booking season from one calendar

A month by month view of every booked date, what it is worth, and which weekends are still open, with your personal calendar layered on top.

HoneyBook
Google Calendar
App
A keep in touch board built on your Google Contacts

See which relationships are going cold, set how often you want to reach out to each person, and let the board sort itself from then on.

Google Contacts
Gmail
Google Calendar
App
See who actually joined your recurring Google Meet calls

An attendance register built from real join and leave times, flagging the people who accepted the invite and then never showed up.

Google Meet
Google Calendar
Google Sheets
+1
App
See which of your recurring meetings are one person talking

Open one board to see how speaking time was really split in every standing meeting, then get facilitation notes you can act on next time.

Google Meet
Google Calendar
Slack Bot
+1
App

Stop guessing why you feel wrecked on Thursdays.

Put twelve weeks of meeting load and recovery side by side and let the pattern show itself.