Summary
Follow-up to app → CSA Member Calendar sync (v1). Add calendar → app updates so schedule/location edits on the shared CSA Member Calendar update the corresponding points event.
Background
v1 already pushes eligible org events (create/update/delete) to the Member Calendar via a service account and stores google_event_id on events. Mixers, Jiating Events, and Sports Spectator children are excluded.
Proposed approach
- Use Google Calendar push notifications (
events.watch) to a Next.js webhook (e.g. /api/google-calendar/webhook) with channel renewal, or periodic events.list with syncToken.
- Match Calendar events to app rows via
google_event_id.
- Update only fields the app allows today:
starts_at / ends_at / location (and maybe description / RSVP metadata).
- Conflict handling: last-write-wins with timestamps, or treat the app as authoritative for points metadata and Calendar as authoritative only for schedule/location.
- Ignore Spectator / non-mapped Calendar edits; do not auto-create points events from arbitrary Calendar creates unless an explicit mapping rule is added later.
Out of scope (unless revisited)
- Per-member personal calendar sync
- Expanding member Google OAuth scopes
- Editing event name/category from Calendar
- Auto-import of manually created Google events into the points app
Acceptance criteria
Summary
Follow-up to app → CSA Member Calendar sync (v1). Add calendar → app updates so schedule/location edits on the shared CSA Member Calendar update the corresponding points event.
Background
v1 already pushes eligible org events (create/update/delete) to the Member Calendar via a service account and stores
google_event_idonevents. Mixers, Jiating Events, and Sports Spectator children are excluded.Proposed approach
events.watch) to a Next.js webhook (e.g./api/google-calendar/webhook) with channel renewal, or periodicevents.listwithsyncToken.google_event_id.starts_at/ends_at/location(and maybe description / RSVP metadata).Out of scope (unless revisited)
Acceptance criteria