Email preferences.
The page every email footer's "Manage preferences" and "Unsubscribe" links point to (they were dead href="#" before — a real CAN-SPAM gap). It's public and outside the app shell, since recipients may not be logged in. A granular preference center (per-type toggles), not all-or-nothing. Booking/transactional emails are non-optional by design (compliant + honest) — shown as always-on. Reuses set-cards, toggles, buttons, and the toast for save confirmation.
Preference center
Your email preferences
Choose what we send you. Changes save instantly when you hit Save.
taylor@example.comBooking & appointments
Essential messages about your actual appointments. These keep you informed about real bookings, so they can't be turned off.
Offers & updates
Optional emails that help you get more out of the service.
Account & product
Setup help and product news.
You'll always receive essential booking & transactional emails about your appointments, even if you unsubscribe from everything else.
Unsubscribed (with resubscribe / undo)
You've been unsubscribed
You won't get marketing or promotional emails from us anymore. We're sorry to see you go.
One-click unsubscribe (landed straight from an email link)
The simple state someone lands on from the footer "Unsubscribe" link — already done, no form. Offers a path to fine-tune instead.
You're unsubscribed from review requests
Done — taylor@example.com won't get review-request emails anymore.
Categories map to the emails we actually send. Non-optional (always on): booking confirmations + reschedule/cancellation notices (transactional — CAN-SPAM lets these stay). Toggleable: appointment reminders, offers/promotions, re-engagement, review requests, setup reminders, product updates. Save shows a success toast; "Unsubscribe from all marketing" + a one-click state + resubscribe/undo are all covered. The email footers' "Manage preferences"/"Unsubscribe" links now resolve here. Reuses .set-card, .toggle, buttons, window.sgToast.