InTouch Hub · Blue Isle Software

Birthday Reminder (Google Calendar)

Calendar-driven birthday reminder. Reads today's events from your Google Calendar, filters by title prefix (default \"Birthday:\"), and sends a single summary to the owner. Generalizes to any annual milestone \u2014 change the prefix for anniversaries, holidays, work events.

calendarbirthdayanniversaryreminderdailypersonalfamily

birthday-reminder-gcal

Calendar-driven birthday reminder. Reads today's events from your Google Calendar, filters by a configurable title prefix (default Birthday:), and sends a single summary message to the owner once a day. Generalizes to any annual milestone — change the prefix to Anniversary: for wedding anniversaries, Work: for hire-date check-ins, Holiday: for personal observances, anything.

Why Calendar-driven, not Contacts-driven

The cleaner design would be to read birthdays straight from Google Contacts via the People API. That doesn't work today: gog (v0.19.0) does NOT surface the birthdays field on any of contacts list, contacts get, or people get (verified — --select "birthdays,..." returns {} even with the People API enabled in the GCP project). The auto-populated "Birthdays" sub-calendar Google can build from Contacts is also not reachable via gog (addressbook#[email protected] returns unrecognized calendar name).

Calendar events you create yourself ARE first-class. So this workflow uses that pattern. The bonus: the same workflow handles every other kind of annual reminder without modification — just change the prefix.

Use case

You forget birthdays. You feel terrible when you do. Setting a daily morning ping that reads "Today is Mom's birthday" buys you back the relationships dental-appointment automation already buys you back.

This is the personal-use cousin of appointment-reminder-gcal — same Calendar-reading pattern, different goal (reminding yourself vs reminding customers).

Setup

  1. Credentials (Credentials view): - google-workspace — Google Workspace service-account JSON
  2. Runtime environment (Runtime Environments view): - python — auto-created on every OS install
  3. Calendar events — for each birthday/anniversary you want remembered, add an annual recurring all-day event to any calendar you own, with the title prefixed by your chosen tag: Birthday: Mom Birthday: Dad Birthday: Sarah K. Birthday: Mike (work) Anniversary: Jane & John Set each to repeat yearly. The workflow ignores the year and reads month/day.
  4. Edit workflow.yaml — replace the three placeholders: - <<CALENDAR_ID>>primary for your main calendar, or any calendar ID you own - <<BIRTHDAY_PREFIX>>Birthday: (default), or Anniversary:, Holiday:, 🎂, etc. Match the prefix you use in event titles. Case-insensitive. - <<OWNER_PUBLISHER>> — user name linked to your contact (email, SMS, Slack, etc.)
  5. Schedule the workflow once daily at 8:00 AM (or whenever you read your morning notifications).

Pipeline

  1. find-todayruntimeenv (python). Queries Calendar for today's events via gog calendar events --today, filters events whose title starts with the configured prefix (case-insensitive), extracts the name from each (Birthday: Sarah K.Sarah K.), and prints a formatted summary. Empty days print "No 'Birthday:' events today" and exit cleanly.
  2. notifymessage. Pipes the summary to the owner contact.

Sample output

Today is Friday, May 14, 2026.

2 people to remember:
  - Mom
  - Sarah K.

Reach out — a 30-second message lands harder than you'd think.

Customization

Companion patterns

Verified

gog calendar events --today --cal <id> shape verified against the real Workspace account (2026-05-10): events return id, summary, start, attendees. The "no birthdays via People API in gog" gap was confirmed by direct testing — contacts list, contacts get, people get, and --select "birthdays" all return field sets without birthday data. That gap is the reason this workflow is Calendar-driven rather than Contacts-driven.

Source

See workflow.yaml.