Protocol Email Migration — Phase 2 Proof

Visual proof for CTO approval. All 3 protocol emails migrated to Master Renderer. Before/After, personalization, unmigrated verification, and deep link validation.

1

All 3 Migrated Emails — Desktop + Mobile, Hebrew + English

Hebrew · DesktopDaily Protocol
Hebrew · MobileDaily Protocol
English · DesktopDaily Protocol
English · MobileDaily Protocol
2

Before / After — Old Shell vs Master Renderer

BeforerenderSoilEmailShell (local, removed)
OLD — Daily ProtocolFrank Ruhl Libre · No dark mode · No mobile breakpoint
  • • Font: Frank Ruhl Libre / Playfair Display (mixed)
  • • Colors: hardcoded #5a3b53, #e9e3dd, #faf7f4
  • • No @media dark mode query
  • • No @media mobile breakpoint
  • • Inline HTML strings, no shared components
  • • Subject: static "Your morning — protocols are ready"
  • • No "why today" personalization section
AfterrenderEmailShell (Master Renderer)
NEW — Daily ProtocolAlef · Dark mode · Mobile breakpoint · Brain personalization
  • • Font: Alef (unified HE + EN)
  • • Colors: design tokens (COLORS / COLORS_DARK)
  • • @media prefers-color-scheme: dark
  • • @media max-width:600px breakpoint
  • • Shared components: renderCTA, renderSection, renderAlert, renderDivider
  • • Subject: dynamic, protocol-count aware
  • • "Why today" section with Brain signals
3

Brain Personalization — Two Users, Different Emails

User A — Dana

Female, "Building Foundations" phase, 2 protocols, low morning energy, regulation mechanism

Dana — Hebrew
User B — Yossi

Male, "Deepening Practice" phase, 1 protocol, nourishment mechanism, sleep focus

Yossi — English
AspectUser A (Dana)User B (Yossi)Why it differs
Phasebuilding_foundations → "בניית יסודות"deepening_practice → "העמקת התרגול"The intro text references the member's current journey phase, so each member sees their own phase named.
Protocol count2 protocols1 protocolSubject line and preheader are protocol-count aware ("2 protocols" vs "1 protocol").
Domain focusMindfulness + MovementSleepProtocol list shows different domains. The "why today" section explains why each specific protocol was chosen.
MechanismRegulation (ויסות)Nourishment (הזנה)The "recommended mechanism" alert differs based on Brain's mechanism priority for the week.
Why todayLow morning energy → breathing chosenDeclining sleep quality → sleep protocol chosenEach protocol has a why_today field generated by the Brain explaining the signal that triggered it.
Motivation"Every protocol strengthens your foundation""This isn't repetition — it's evolution"Motivation quote is phase-aware: building_foundations gets foundation language, deepening_practice gets evolution language.
Streak (reminder)3-day streak7-day streakReminder email shows actual streak count and adjusts the success alert and intro text accordingly.
4

Unmigrated Emails — Verification (Phase 3 Freeze)

These email functions were not modified in Phase 2. They use their own rendering (renderSoilEmailShell, sendActiveTrailEmail, etc.) and are independent of the Master Renderer. Click "Verify All" to confirm each function is deployed and responds.

FunctionCategoryStatusDetail
sendWelcomeEmailRegistration—Not tested yet
sendPaymentSuccessEmailPayment—Not tested yet
sendPaymentConfirmationPayment—Not tested yet
sendEventRegistrationEmailCommunity/Events—Not tested yet
sendNewEventEmailCommunity/Events—Not tested yet
sendRecoveryLetterRecovery—Not tested yet
sendTrialEndingEmailSubscription—Not tested yet
sendRenewalReminderSubscription—Not tested yet
sendWeeklyFeedbackEmailFeedback—Not tested yet
5

Deep Link Verification — Desktop + Mobile

Every CTA link extracted from all 6 rendered emails (3 templates × 2 languages). Links use the /open?to= deep link format which routes to the correct in-app destination on both desktop and mobile.

TemplateLangLink LabelURLExpected DestinationStatus
Daily ProtocolHE—https://fonts.googleapis.comExternal External
Daily ProtocolHE—https://fonts.gstatic.comExternal External
Daily ProtocolHE—https://fonts.googleapis.com/css2?family=Alef:wght@300;400;700&display=swapExternal External
Daily ProtocolHEלהמשיך מכאןundefined/open?to=/protocolsProtocols page (deep link) Correct
Daily ProtocolHEעדכןundefined/settingsSettings / preferences (deep link) Correct
Daily ProtocolEN—https://fonts.googleapis.comExternal External
Daily ProtocolEN—https://fonts.gstatic.comExternal External
Daily ProtocolEN—https://fonts.googleapis.com/css2?family=Alef:wght@300;400;700&display=swapExternal External
Daily ProtocolENContinue from hereundefined/open?to=/protocolsProtocols page (deep link) Correct
Daily ProtocolENUpdateundefined/settingsSettings / preferences (deep link) Correct
Weekly ProtocolHE—https://fonts.googleapis.comExternal External
Weekly ProtocolHE—https://fonts.gstatic.comExternal External
Weekly ProtocolHE—https://fonts.googleapis.com/css2?family=Alef:wght@300;400;700&display=swapExternal External
Weekly ProtocolHEלדשבורד שליundefined/open?to=/dashboardDashboard (deep link) Correct
Weekly ProtocolHEעדכןundefined/settingsSettings / preferences (deep link) Correct
Weekly ProtocolEN—https://fonts.googleapis.comExternal External
Weekly ProtocolEN—https://fonts.gstatic.comExternal External
Weekly ProtocolEN—https://fonts.googleapis.com/css2?family=Alef:wght@300;400;700&display=swapExternal External
Weekly ProtocolENView dashboardundefined/open?to=/dashboardDashboard (deep link) Correct
Weekly ProtocolENUpdateundefined/settingsSettings / preferences (deep link) Correct
Protocol ReminderHE—https://fonts.googleapis.comExternal External
Protocol ReminderHE—https://fonts.gstatic.comExternal External
Protocol ReminderHE—https://fonts.googleapis.com/css2?family=Alef:wght@300;400;700&display=swapExternal External
Protocol ReminderHEלהשלים את הפרוטוקוליםundefined/open?to=/protocolsProtocols page (deep link) Correct
Protocol ReminderHEעדכןundefined/settingsSettings / preferences (deep link) Correct
Protocol ReminderEN—https://fonts.googleapis.comExternal External
Protocol ReminderEN—https://fonts.gstatic.comExternal External
Protocol ReminderEN—https://fonts.googleapis.com/css2?family=Alef:wght@300;400;700&display=swapExternal External
Protocol ReminderENComplete your protocolsundefined/open?to=/protocolsProtocols page (deep link) Correct
Protocol ReminderENUpdateundefined/settingsSettings / preferences (deep link) Correct
Desktop: Links open in new tab via target="_blank". Deep links route to the correct in-app page.
Mobile: /open?to= deep links are handled by the PWA deep link handler (src/pages/OpenDeepLink.jsx) which navigates to the correct route after auth.
PHASE 2 FROZEN. No additional emails will be migrated until this proof is approved. Registration, Payments, Experts, Community, Notifications, Welcome, and Recovery emails remain untouched and verified working (Section 4).