Phase 2 Migration · CTO Final Approval Evidence · July 5, 2026
Confirmation: Rendered HTML = Production Sent HTML
The sending functions (sendMorningProtocolMessage, sendWeeklyReflection, sendProtocolReminder) call the same renderEmailTemplate Master Renderer shown in the iframes below. The HTML you see here IS the HTML sent to the inboxes — not preview-only, not iframe-only. In test mode, a [TEST] badge is added; in production, it is removed. All content, personalization, and structure are identical.
| Email Type | User | Template ID | Hash | Sent At (UTC) | Provider | Status |
|---|---|---|---|---|---|---|
| Daily Protocol | User A soilidantest@gmail.com | daily_protocol_v3 | 57c6603810a79ea4 | 2026-07-05 19:50:37 | ActiveTrail | Sent |
| Daily Protocol | User B idanshalevs@gmail.com | daily_protocol_v3 | b7ff323e435a22f7 | 2026-07-05 19:50:37 | ActiveTrail | Sent |
| Protocol Reminder | User A soilidantest@gmail.com | protocol_reminder_v3 | f9153dc1e12154a4 | 2026-07-05 19:50:36 | ActiveTrail | Sent |
| Protocol Reminder | User B idanshalevs@gmail.com | protocol_reminder_v3 | f7f97fa4d9ea9589 | 2026-07-05 19:50:36 | ActiveTrail | Sent |
| Weekly Reflection | User A soilidantest@gmail.com | weekly_protocol_v3 | 6912e7bf1adb4081 | 2026-07-05 19:51:09 | ActiveTrail | Sent |
| Weekly Reflection | User B idanshalevs@gmail.com | weekly_protocol_v3 | 24cfd7292634f24f | 2026-07-05 19:50:52 | ActiveTrail | Sent |
All 6 emails sent via production automation functions (test_email mode). HTML rendered by renderEmailTemplate — the same Master Renderer used in production. Each hash is unique per user, proving per-user personalization.
The HTML below is rendered by the same renderEmailTemplate function called by the production automation. In production mode, this exact HTML is sent via ActiveTrail. Each iframe shows the real user's personalized email — not sample data.
| Dimension | User A | User B | Why Different |
|---|---|---|---|
| Email Address | soilidantest@gmail.com | idanshalevs@gmail.com | Two different real member accounts |
| Week Theme | Permission to begin — showing up is enough | (none) | Journey assigns themes contextually — User A has one, User B doesn't |
| Domain Emphasis | mindfulness, movement | focus, nutrition | Different weekly focus areas from Journey data |
| Mechanism Priority | regulation | (none) | User A prioritizes regulation; User B has no mechanism priority |
| Protocol 1 | Short Walk After Your Meal (longevity, 12min) | Steadying First Plate (nutrition, 12min) | User A: recovery after yesterday's skips → longevity walk. User B: high energy → steadying nutrition |
| Protocol 2 | One Quiet Meal (nutrition, 10min) | One Song, One Task (mindfulness, 6min) | User A: missed nutrition → simplified to one meal. User B: flat momentum → short focus boundary |
| Protocol 3 | Dim the Evening Early (sleep, 8min) | Move Without Training (movement, 8min) | User A: sleep struggling → dim evening early. User B: high energy → movement without training |
| Why Today (P1) | Longevity was also skipped yesterday, so today it doesn't show up as a big habit but as a short walk that feels accessible. | With high energy and low stress, it's a good time to lock in physical steadiness that prevents energy crash later. | Different Brain signals: User A driven by yesterday's skips, User B driven by current energy/stress levels |
| Daily Protocol Hash | 57c6603810a79ea4 | b7ff323e435a22f7 | Different hashes = different rendered HTML = genuinely personalized emails |
| Reminder Hash | f9153dc1e12154a4 | f7f97fa4d9ea9589 | Different hashes confirm per-user rendering in reminder emails too |
| Weekly Hash | 6912e7bf1adb4081 | 24cfd7292634f24f | Different AI-generated letters produce different weekly emails |
Every CTA button in every email template routes through the SOIL deep-link router (/open?to=) which authenticates the member and redirects to the correct in-app page. The unsubscribe link goes directly to Settings.
| Email Template | CTA Button | Deep Link Path | Final Destination | Purpose | Verified |
|---|---|---|---|---|---|
| Daily Protocol | לפרוטוקולים שלי | /open?to=/protocols | /protocols | Member opens today's protocols | Routes correctly |
| Daily Protocol | עדכן (unsubscribe) | /settings | /settings | Notification preferences | Routes correctly |
| Protocol Reminder | להשלים את הפרוטוקולים | /open?to=/protocols | /protocols | Member completes pending protocols | Routes correctly |
| Protocol Reminder | עדכן (unsubscribe) | /settings | /settings | Notification preferences | Routes correctly |
| Weekly Reflection | לדשבורד שלי | /open?to=/dashboard | /dashboard | Member views weekly progress | Routes correctly |
| Weekly Reflection | עדכן (unsubscribe) | /settings | /settings | Notification preferences | Routes correctly |
/open route (in src/pages/OpenDeepLink.jsx) checks auth status, subscription, and onboarding completion. Authenticated + onboarded members are redirected to the to parameter. Unauthenticated users are sent to login first, then redirected after authentication. This works identically on desktop and mobile browsers, and inside the PWA.Gmail Screenshot Checklist — 4 Screenshots Required
6 emails were sent to two real Gmail inboxes on July 5, 2026 at 19:50-19:51 UTC. Subject lines start with [TEST]. Log into either inbox to capture the screenshots below.
1. Daily Protocol — Desktop
Inbox: soilidantest@gmail.com
[TEST] הפרוטוקולים שלך להיום מוכנים — 3 פרוטוקולים/protocols2. Daily Protocol — Mobile
Inbox: idanshalevs@gmail.com
[TEST] הפרוטוקולים שלך להיום מוכנים — 3 פרוטוקולים/protocols3. Weekly Reflection — Desktop
Inbox: soilidantest@gmail.com
[TEST] השבוע שלך — סיכום והתבוננות/dashboard4. Protocol Reminder — Mobile
Inbox: idanshalevs@gmail.com
[TEST] 3 פרוטוקולים מחכים לך/protocolsSOIL · Protocol Email Migration Phase 2 · Final Production Evidence · Registration emails NOT migrated (per CTO directive)