Is your proposal related to a problem?
Yes.
On the app.cal.eu instance, the system booking confirmation email sent to attendees contains reschedule and cancel links pointing to cal.com instead of cal.eu.
Expected: https://app.cal.eu/reschedule/{uid}
Actual: https://app.cal.com/reschedule/{uid}
Expected: https://app.cal.eu/booking/{uid}?cancel=true
Actual: https://app.cal.com/booking/{uid}?cancel=true
Because booking data is isolated to the EU shard database, clicking these links results in "Booking not found" / 404. Attendees cannot reschedule or cancel using the links in the confirmation email.
Describe the solution you'd like
The bookerUrl used to construct reschedule and cancel links in system emails (packages/core/builders/CalendarEvent/builder.ts) must resolve from the shard's origin, not fall back to a hardcoded or globally defaulted cal.com domain.
When a booking originates from app.cal.eu, all derived links must use app.cal.eu as the base URL.
Describe alternatives you've considered
Workflow-based overrides ({RESCHEDULE_URL} / {CANCEL_URL} variables in custom email templates) can work around this — but this is a regression in core system email behaviour that should not require a workaround.
Additional context
Instance: app.cal.eu
Affected email: booking confirmation sent to attendee after BOOKING_CREATED
Affected links: rescheduleLink and cancel link constructed in packages/core/builders/CalendarEvent/builder.ts via bookerUrl
Impact: all attendees on the EU instance receive broken action links in confirmation emails
A similar bookerUrl resolution bug was previously fixed for team events in #12147 / PR #12261. This may be the same root cause affecting the EU shard specifically.
Requirement/Document
The fix should ensure that bookerUrl in CalendarEvent/builder.ts is derived from the shard's runtime origin (NEXT_PUBLIC_WEBAPP_URL for app.cal.eu), not from any hardcoded global constant.
Is your proposal related to a problem?
Yes.
On the app.cal.eu instance, the system booking confirmation email sent to attendees contains reschedule and cancel links pointing to cal.com instead of cal.eu.
Expected: https://app.cal.eu/reschedule/{uid}
Actual: https://app.cal.com/reschedule/{uid}
Expected: https://app.cal.eu/booking/{uid}?cancel=true
Actual: https://app.cal.com/booking/{uid}?cancel=true
Because booking data is isolated to the EU shard database, clicking these links results in "Booking not found" / 404. Attendees cannot reschedule or cancel using the links in the confirmation email.
Describe the solution you'd like
The
bookerUrlused to construct reschedule and cancel links in system emails (packages/core/builders/CalendarEvent/builder.ts) must resolve from the shard's origin, not fall back to a hardcoded or globally defaulted cal.com domain.When a booking originates from app.cal.eu, all derived links must use app.cal.eu as the base URL.
Describe alternatives you've considered
Workflow-based overrides ({RESCHEDULE_URL} / {CANCEL_URL} variables in custom email templates) can work around this — but this is a regression in core system email behaviour that should not require a workaround.
Additional context
Instance: app.cal.eu
Affected email: booking confirmation sent to attendee after BOOKING_CREATED
Affected links: rescheduleLink and cancel link constructed in packages/core/builders/CalendarEvent/builder.ts via bookerUrl
Impact: all attendees on the EU instance receive broken action links in confirmation emails
A similar bookerUrl resolution bug was previously fixed for team events in #12147 / PR #12261. This may be the same root cause affecting the EU shard specifically.
Requirement/Document
The fix should ensure that bookerUrl in CalendarEvent/builder.ts is derived from the shard's runtime origin (NEXT_PUBLIC_WEBAPP_URL for app.cal.eu), not from any hardcoded global constant.