diff --git a/packages/features/ee/workflows/api/scheduleEmailReminders.ts b/packages/features/ee/workflows/api/scheduleEmailReminders.ts index 7914739d46..9b31468416 100644 --- a/packages/features/ee/workflows/api/scheduleEmailReminders.ts +++ b/packages/features/ee/workflows/api/scheduleEmailReminders.ts @@ -21,6 +21,7 @@ import { getAllRemindersToCancel, getAllRemindersToDelete, getAllUnscheduledReminders, + getWorkflowRecipientEmail, } from "../lib/getWorkflowReminders"; import { sendOrScheduleWorkflowEmails } from "../lib/reminders/providers/emailProvider"; import { @@ -187,6 +188,13 @@ export async function handler(req: NextRequest) { reminder.booking.eventType?.team?.parentId ?? organizerOrganizationId ?? null ); + const recipientEmail = getWorkflowRecipientEmail({ + action: reminder.workflowStep.action || WorkflowActions.EMAIL_ADDRESS, + attendeeEmail: reminder.booking.attendees[0].email, + organizerEmail: reminder.booking.user?.email, + sendToEmail: reminder.workflowStep.sendTo, + }); + const variables: VariablesType = { eventName: reminder.booking.eventType?.title || "", organizerName: reminder.booking.user?.name || "", @@ -199,8 +207,12 @@ export async function handler(req: NextRequest) { additionalNotes: reminder.booking.description, responses: responses, meetingUrl: bookingMetadataSchema.parse(reminder.booking.metadata || {})?.videoCallUrl, - cancelLink: `${bookerUrl}/booking/${reminder.booking.uid}?cancel=true`, - rescheduleLink: `${bookerUrl}/reschedule/${reminder.booking.uid}`, + cancelLink: `${bookerUrl}/booking/${reminder.booking.uid}?cancel=true${ + recipientEmail ? `&cancelledBy=${encodeURIComponent(recipientEmail)}` : "" + }`, + rescheduleLink: `${bookerUrl}/reschedule/${reminder.booking.uid}${ + recipientEmail ? `?rescheduledBy=${encodeURIComponent(recipientEmail)}` : "" + }`, ratingUrl: `${bookerUrl}/booking/${reminder.booking.uid}?rating`, noShowUrl: `${bookerUrl}/booking/${reminder.booking.uid}?noShow=true`, attendeeTimezone: reminder.booking.attendees[0].timeZone, diff --git a/packages/features/ee/workflows/api/scheduleSMSReminders.ts b/packages/features/ee/workflows/api/scheduleSMSReminders.ts index feb6a69ae4..d3ed23d6a1 100644 --- a/packages/features/ee/workflows/api/scheduleSMSReminders.ts +++ b/packages/features/ee/workflows/api/scheduleSMSReminders.ts @@ -16,7 +16,7 @@ import { bookingMetadataSchema } from "@calcom/prisma/zod-utils"; import { getSenderId } from "../lib/alphanumericSenderIdSupport"; import type { PartialWorkflowReminder } from "../lib/getWorkflowReminders"; -import { select } from "../lib/getWorkflowReminders"; +import { select, getWorkflowRecipientEmail } from "../lib/getWorkflowReminders"; import type { VariablesType } from "../lib/reminders/templates/customTemplate"; import customTemplate from "../lib/reminders/templates/customTemplate"; import smsReminderTemplate from "../lib/reminders/templates/smsReminderTemplate"; @@ -108,10 +108,20 @@ export async function handler(req: NextRequest) { reminder.booking.eventType?.team?.parentId ?? organizerOrganizationId ?? null ); + const recipientEmail = getWorkflowRecipientEmail({ + action: reminder.workflowStep.action || WorkflowActions.SMS_NUMBER, + attendeeEmail: reminder.booking.attendees[0].email, + organizerEmail: reminder.booking.user?.email, + }); + const urls = { meetingUrl: bookingMetadataSchema.parse(reminder.booking?.metadata || {})?.videoCallUrl || "", - cancelLink: `${bookerUrl}/booking/${reminder.booking.uid}?cancel=true` || "", - rescheduleLink: `${bookerUrl}/reschedule/${reminder.booking.uid}` || "", + cancelLink: `${bookerUrl}/booking/${reminder.booking.uid}?cancel=true${ + recipientEmail ? `&cancelledBy=${recipientEmail}` : "" + }`, + rescheduleLink: `${bookerUrl}/reschedule/${reminder.booking.uid}${ + recipientEmail ? `?rescheduledBy=${recipientEmail}` : "" + }`, }; const [{ shortLink: meetingUrl }, { shortLink: cancelLink }, { shortLink: rescheduleLink }] = diff --git a/packages/features/ee/workflows/lib/getWorkflowReminders.ts b/packages/features/ee/workflows/lib/getWorkflowReminders.ts index ca246583a3..4d4e89b3ec 100644 --- a/packages/features/ee/workflows/lib/getWorkflowReminders.ts +++ b/packages/features/ee/workflows/lib/getWorkflowReminders.ts @@ -4,7 +4,12 @@ import type { EventType, User, WorkflowReminder, WorkflowStep, Prisma } from "@c import { WorkflowMethods } from "@calcom/prisma/enums"; type PartialWorkflowStep = - | (Partial & { workflow: { userId?: number; teamId?: number } }) + | (Partial & { + workflow: { + userId?: number; + teamId?: number; + }; + }) | null; type Booking = Prisma.BookingGetPayload<{ @@ -219,3 +224,35 @@ export async function getAllUnscheduledReminders(): Promise const bookerUrl = evt.bookerUrl ?? WEBSITE_URL; if (emailBody) { + const recipientEmail = getWorkflowRecipientEmail({ + action, + attendeeEmail: attendeeToBeUsedInMail.email, + organizerEmail: evt.organizer.email, + sendToEmail: sendTo[0], + }); const variables: VariablesType = { eventName: evt.title || "", organizerName: evt.organizer.name, @@ -153,9 +160,13 @@ export const scheduleEmailReminder = async (args: scheduleEmailReminderArgs) => additionalNotes: evt.additionalNotes, responses: evt.responses, meetingUrl: bookingMetadataSchema.parse(evt.metadata || {})?.videoCallUrl, - cancelLink: `${bookerUrl}/booking/${evt.uid}?cancel=true`, + cancelLink: `${bookerUrl}/booking/${evt.uid}?cancel=true${ + recipientEmail ? `&cancelledBy=${encodeURIComponent(recipientEmail)}` : "" + }`, cancelReason: evt.cancellationReason, - rescheduleLink: `${bookerUrl}/reschedule/${evt.uid}`, + rescheduleLink: `${bookerUrl}/reschedule/${evt.uid}${ + recipientEmail ? `?rescheduledBy=${encodeURIComponent(recipientEmail)}` : "" + }`, rescheduleReason: evt.rescheduleReason, ratingUrl: `${bookerUrl}/booking/${evt.uid}?rating`, noShowUrl: `${bookerUrl}/booking/${evt.uid}?noShow=true`, diff --git a/packages/features/ee/workflows/lib/reminders/utils.ts b/packages/features/ee/workflows/lib/reminders/utils.ts index 2255ae5faf..2ff24bcf0b 100644 --- a/packages/features/ee/workflows/lib/reminders/utils.ts +++ b/packages/features/ee/workflows/lib/reminders/utils.ts @@ -4,6 +4,7 @@ import { WEBSITE_URL } from "@calcom/lib/constants"; import { WorkflowActions, WorkflowTriggerEvents } from "@calcom/prisma/enums"; import { bookingMetadataSchema } from "@calcom/prisma/zod-utils"; +import { getWorkflowRecipientEmail } from "../getWorkflowReminders"; import type { AttendeeInBookingInfo, BookingInfo } from "./smsReminderManager"; import type { VariablesType } from "./templates/customTemplate"; import customTemplate from "./templates/customTemplate"; @@ -40,10 +41,18 @@ export const getSMSMessageWithVariables = async ( attendeeToBeUsedInSMS: AttendeeInBookingInfo, action: WorkflowActions ) => { + const recipientEmail = getWorkflowRecipientEmail({ + action, + attendeeEmail: attendeeToBeUsedInSMS.email, + }); const urls = { meetingUrl: bookingMetadataSchema.parse(evt.metadata || {})?.videoCallUrl || "", - cancelLink: `${evt.bookerUrl ?? WEBSITE_URL}/booking/${evt.uid}?cancel=true`, - rescheduleLink: `${evt.bookerUrl ?? WEBSITE_URL}/reschedule/${evt.uid}`, + cancelLink: `${evt.bookerUrl ?? WEBSITE_URL}/booking/${evt.uid}?cancel=true${ + recipientEmail ? `&cancelledBy=${recipientEmail}` : "" + }`, + rescheduleLink: `${evt.bookerUrl ?? WEBSITE_URL}/reschedule/${evt.uid}${ + recipientEmail ? `?rescheduledBy=${recipientEmail}` : "" + }`, }; const [{ shortLink: meetingUrl }, { shortLink: cancelLink }, { shortLink: rescheduleLink }] =