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
When an attendee accepts or declines a single occurrence of a recurring event, a recurrence exception (VEVENT with RECURRENCE-ID) is created. This modification to the calendar object causes Nextcloud to send a METHOD:REQUEST email to all other attendees, even though nothing changed for them.
This does not happen for single (non-recurring) events, where a PARTSTAT change correctly results in only a METHOD:REPLY to the organizer.
All users on the same instance, invited via the internal user picker (principal-based scheduling).
Attendees use Thunderbird 128.x via CalDAV.
Reproduction
Case A: Attendee declines a single occurrence
User A creates a weekly recurring event "Weekly 3x" (3 occurrences), adds User B and User C as attendees via the user picker.
User B accepts the entire series via Thunderbird iMIP.
User C accepts the entire series via Thunderbird iMIP.
User B declines only the 2026-05-12 occurrence via Thunderbird ("Decline" on that single instance).
What User A (organizer) receives - correct:
A METHOD:REPLY with RECURRENCE-ID for 2026-05-12 and PARTSTAT=DECLINED. The mail says "User B has declined your invitation" with the correct date. This is perfect.
What User C (other attendee) receives - incorrect:
Result: User B receives a METHOD:REQUEST re-invite for the entire series. The mail says "admin would like to invite you to 'Daily Test'" with the date of the first occurrence (which is in the past).
Case C: Attendee removes event from calendar
Same setup as Case B. User C (attendee) deletes the event in Thunderbird.
Result: User B again receives a METHOD:REQUEST re-invite.
Control test: Single (non-recurring) event
User A creates a single event "Admin +2", adds User B and User C.
User B accepts via Thunderbird.
Result: User C does not receive any email. Only User A receives the METHOD:REPLY. This is the correct behavior.
Pattern
Case
Other attendee gets re-invite?
Correct?
Single event: attendee accepts
No
Yes
Recurring series: attendee accepts entire series
No
Yes
Recurring series: attendee accepts single instance
Yes
No
Recurring series: attendee declines single instance
Yes
No
Recurring series: attendee deletes event
Yes
No
The pattern is clear: whenever a PARTSTAT change on a recurring event creates a recurrence exception (VEVENT with RECURRENCE-ID), Nextcloud treats the modified calendar object as an organizer-initiated update and sends METHOD:REQUEST to all attendees. Operations that do not create exceptions (accepting the whole series, or any operation on a single event) behave correctly.
Expected behavior
A PARTSTAT change by one attendee should only generate a METHOD:REPLY to the organizer. Other attendees should not receive any email, regardless of whether the change creates a recurrence exception internally.
Impact
On a multi-user instance, a recurring meeting with N attendees generates up to N-1 unnecessary re-invite emails every time any single attendee changes their response to a single occurrence. With ~600 users, this creates significant email noise that causes users to ignore calendar notifications entirely.
Summary
When an attendee accepts or declines a single occurrence of a recurring event, a recurrence exception (VEVENT with RECURRENCE-ID) is created. This modification to the calendar object causes Nextcloud to send a
METHOD:REQUESTemail to all other attendees, even though nothing changed for them.This does not happen for single (non-recurring) events, where a PARTSTAT change correctly results in only a
METHOD:REPLYto the organizer.Related: nextcloud/calendar#6535 (notification spam), nextcloud/calendar#7771 (accept creates recurrence exception instead of updating master PARTSTAT), nextcloud/calendar#7850 (recurring event exception handling).
Setup
Reproduction
Case A: Attendee declines a single occurrence
What User A (organizer) receives - correct:
A
METHOD:REPLYwithRECURRENCE-IDfor 2026-05-12 andPARTSTAT=DECLINED. The mail says "User B has declined your invitation" with the correct date. This is perfect.What User C (other attendee) receives - incorrect:
A
METHOD:REQUESTre-invite for the entire series:Thunderbird at User C displays: "admin has invited you to Weekly 3x"
Nextcloud mail body at User C: "admin would like to invite you to 'Weekly 3x'."
User C already accepted. Nothing changed for User C. This email provides no useful information.
Case B: Attendee accepts a single occurrence
Result: User B receives a
METHOD:REQUESTre-invite for the entire series. The mail says "admin would like to invite you to 'Daily Test'" with the date of the first occurrence (which is in the past).Case C: Attendee removes event from calendar
Same setup as Case B. User C (attendee) deletes the event in Thunderbird.
Result: User B again receives a
METHOD:REQUESTre-invite.Control test: Single (non-recurring) event
Result: User C does not receive any email. Only User A receives the
METHOD:REPLY. This is the correct behavior.Pattern
The pattern is clear: whenever a PARTSTAT change on a recurring event creates a recurrence exception (VEVENT with RECURRENCE-ID), Nextcloud treats the modified calendar object as an organizer-initiated update and sends
METHOD:REQUESTto all attendees. Operations that do not create exceptions (accepting the whole series, or any operation on a single event) behave correctly.Expected behavior
A PARTSTAT change by one attendee should only generate a
METHOD:REPLYto the organizer. Other attendees should not receive any email, regardless of whether the change creates a recurrence exception internally.Impact
On a multi-user instance, a recurring meeting with N attendees generates up to N-1 unnecessary re-invite emails every time any single attendee changes their response to a single occurrence. With ~600 users, this creates significant email noise that causes users to ignore calendar notifications entirely.