A modification email that only shows the new time creates two failure modes. First, customers who don't remember the original booking cannot tell what changed and assume the email is spam or a duplicate confirmation. Second, customers who misread the new time cannot cross-check it against the old one — they show up at the original hour. Before/after comparison is the only way the customer can verify the reschedule matches what they requested, and its absence directly generates support tickets and missed appointments.
Medium because ambiguous reschedule emails cause wrong-hour arrivals and support volume, but the booking record itself is correct.
Preserve the old booking state before the update, pass both old and new booking objects to the template, and render them side-by-side with <s> strikethrough on the old values plus explicit "Previous:" / "New:" labels. Edit src/emails/modification-template.ts:
export function modificationEmailTemplate(booking: Booking, oldBooking: Booking) {
return `
<p><strong>Previous:</strong></p>
<p><s>${formatDateTimeWithTimezone(oldBooking.start_time, oldBooking.timezone)}</s></p>
<p><strong>New:</strong></p>
<p>${formatDateTimeWithTimezone(booking.start_time, booking.timezone)}</p>
`
}
ID: booking-notifications-reminders.reminders.modification-email-before-after
Severity: medium
What to look for: Find the booking modification email template. Check whether the template receives BOTH old and new values as parameters. Enumerate 3 comparison fields: (1) original date/time vs. new date/time, (2) original location vs. new location (if location changed), (3) clear visual distinction between old and new values (strikethrough, "Previous:" / "New:" labels, color coding). Count how many comparison fields are present.
Pass criteria: Enumerate all comparison fields. Modification email must include at least 1 before-and-after pair (minimum 2 values: original AND new date/time) with clear labels distinguishing old from new. Quote the template variables or parameters that provide both values. If location change is supported, location should also show before/after. Report the count of comparison fields shown (e.g., "2 of 2: date/time before+after, location before+after"). An email that only shows the new values does NOT count as pass.
Fail criteria: Template shows only the new values — no original values for comparison. Template receives only current booking data (no old values parameter). Customer cannot tell what changed.
Skip (N/A) when: Booking modifications are not supported — no modification handler found in the codebase (searched for "modify", "reschedule", "update booking", PATCH/PUT routes for bookings).
Detail on fail: Quote the modification email template and its parameters. State which comparison fields are present or missing. Example: "modificationEmailTemplate() at src/emails/modification.tsx receives only 'booking' parameter (current state). No 'oldBooking' or 'previousTime' parameter. Email shows 'Your booking has been updated to 3:00 PM' with no mention of the original time.".
Remediation: Pass both old and new values to the modification email template:
// src/emails/modification-template.ts
export function modificationEmailTemplate(
booking: Booking, // New state
oldBooking: Booking // Previous state
) {
return `
<h2>Booking Modified</h2>
<p><strong>Previous:</strong></p>
<p>Date & Time: <s>${formatDateTimeWithTimezone(oldBooking.start_time, oldBooking.timezone)}</s></p>
<p>Location: <s>${oldBooking.location}</s></p>
<p><strong>New:</strong></p>
<p>Date & Time: ${formatDateTimeWithTimezone(booking.start_time, booking.timezone)}</p>
<p>Location: ${booking.location}</p>
`
}
Cross-reference: Content Quality audit checks email clarity and readability. Booking Flow & Lifecycle audit checks that old booking state is preserved before modification. Accessibility Fundamentals audit checks that strikethrough text is accessible.