You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Suggested by Benedikt. It works the way Teams rooms do.
The idea
Someone creates an ordinary meeting in their own Outlook, invites [email protected], and puts the space's name in the Location field (e.g. "President's Corner"). Chambers books that space for the meeting's time and accepts the invite. If it can't, it declines and says why.
Why
Changing a meeting is hard today. Moving a meeting online means making a whole new one, because the booking and the Outlook meeting are separate things.
Response tracking. Invites generated by Chambers can't show who accepted: they go out Bcc with no organizer or attendees, and Outlook doesn't track responses for app-generated invites anyway. A meeting created in the organizer's own Outlook gets attendees and response tracking natively.
Cheaper. Chambers sends one reply per invite instead of one confirmation per recipient, which Resend counts against its quota.
How it could work
Receiving: incoming mail for northeasternsga.com already goes through Mailgun (its MX records point there). A Mailgun Route forwards mail for chambers.notify@ to a new endpoint, e.g. /api/inbound/calendar, with attachments included, so no DNS change is needed.
Reading the invite: take the text/calendar part and read METHOD, UID, SEQUENCE, ORGANIZER, DTSTART/DTEND, LOCATION, and RRULE/RECURRENCE-ID/EXDATE.
Handling it by method:
REQUEST with a new UID: create the booking.
REQUEST for a known UID with a higher SEQUENCE: update it. If the location no longer names a space (e.g. moved to Teams), release the booking.
CANCEL: delete the booking.
RRULE: create a weekly series (SGA Spaces recurring creation #112). Weeks changed on their own come as RECURRENCE-ID entries, and cancelled weeks as EXDATE.
Checking: the same rules as booking in the app: advance notice, overlaps, blackouts, the weekly hours limit, and the 12–7 AM window.
Replying: send METHOD:REPLY with PARTSTAT=ACCEPTED or DECLINED to the organizer. A decline also carries a short email explaining why.
Needs
Stored link to the Outlook meeting: store the meeting's UID (plus RECURRENCE-ID for a week of a series) on space_bookings, so later updates and cancellations find the right booking.
Only real, allowed organizers:
Only act on mail that passes SPF/DKIM, using the verification results Mailgun attaches.
Verify Mailgun's webhook signature.
Map ORGANIZER to a Leadership user, either by users.email or by an SGA inbox they're allowed to use (bodies.sga_emails, The Benedikt Option (TM) #109).
Ignore everything else.
Ignore our own mail: Chambers' confirmation emails are currently sent To chambers.notify@ with recipients in Bcc, so Chambers will receive copies of its own invites.
Loose location matching: ignore case and punctuation ("Presidents Corner" = "President's Corner"). Handle locations that list several places, e.g. "Microsoft Teams; President's Corner".
Idempotency: Outlook can send the same update more than once; key on UID + SEQUENCE.
Open questions
Mailgun: who has access to the account to set up the route?
Location vs. attendee: should a booking also require chambers.notify@ as an attendee, or is the location enough?
Bookings made in the app: do they keep sending invites, or does Outlook become the main way to book?
Tentative: what should happen when a decline would come too late to be useful, e.g. a change made inside the advance-notice window?
Suggested first step
Try it with one space. Send a few real invites from a Northeastern Outlook account, including an update, a location change, a recurring meeting and a cancellation. Log what arrives before building on it.
Suggested by Benedikt. It works the way Teams rooms do.
The idea
Someone creates an ordinary meeting in their own Outlook, invites
[email protected], and puts the space's name in the Location field (e.g. "President's Corner"). Chambers books that space for the meeting's time and accepts the invite. If it can't, it declines and says why.Why
How it could work
northeasternsga.comalready goes through Mailgun (its MX records point there). A Mailgun Route forwards mail forchambers.notify@to a new endpoint, e.g./api/inbound/calendar, with attachments included, so no DNS change is needed.text/calendarpart and readMETHOD,UID,SEQUENCE,ORGANIZER,DTSTART/DTEND,LOCATION, andRRULE/RECURRENCE-ID/EXDATE.REQUESTwith a new UID: create the booking.REQUESTfor a known UID with a higherSEQUENCE: update it. If the location no longer names a space (e.g. moved to Teams), release the booking.CANCEL: delete the booking.RRULE: create a weekly series (SGA Spaces recurring creation #112). Weeks changed on their own come asRECURRENCE-IDentries, and cancelled weeks asEXDATE.METHOD:REPLYwithPARTSTAT=ACCEPTEDorDECLINEDto the organizer. A decline also carries a short email explaining why.Needs
UID(plusRECURRENCE-IDfor a week of a series) onspace_bookings, so later updates and cancellations find the right booking.ORGANIZERto a Leadership user, either byusers.emailor by an SGA inbox they're allowed to use (bodies.sga_emails, The Benedikt Option (TM) #109).chambers.notify@with recipients in Bcc, so Chambers will receive copies of its own invites.UID+SEQUENCE.Open questions
chambers.notify@as an attendee, or is the location enough?Suggested first step
Try it with one space. Send a few real invites from a Northeastern Outlook account, including an update, a location change, a recurring meeting and a cancellation. Log what arrives before building on it.