First-week onboarding
From: Brian @ PostureVision <brian@posture.vision>
Trigger: signup_completed event from `/auth/register`. Fires within 5 minutes.
Day
Subject
Body / CTA
Lands on
Stage
0
Welcome to PostureVision.Hand-feel founder note · names what they just signed up for
"Open the app and finish onboarding." Hits the unfinished onboarding state if they didn't complete; otherwise routes to today.
posture.vision/onboarding
?utm=welcome-d0
Onb
1
Your first Daily Check.If they did Day 0 check: celebrate. If not: gentle nudge.
"Take 60 seconds." CTA varies by state — primary action is always "open the app."
posture.vision/dailycheck
?utm=welcome-d1
Onb
3
A thing to try: Mirror Mode.Introduces the meditative session as the "wow" feature
"Try a 5-minute Mirror." Includes the founder-recorded 30-second intro video.
posture.vision/mirror
?utm=welcome-d3
Onb
7
One week in. Here's your line.First weekly Insights summary · personal data start
"See your week, read back." Pulls from /insights data.
posture.vision/insights
?utm=welcome-d7
Onb
14
Your first 14 days of practice.Recap + invite friend prompt
"Bring someone to rise with you." Personal invite link with reciprocal-month-free.
posture.vision/circle
?utm=welcome-d14&invite=yes
Onb
14-day card-on-file trial
From: Brian @ PostureVision · gentle reminder tone
Trigger: trial_started event with trial_type = "14day-card". Three reminders fire automatically before charge.
Day
Subject
Body / CTA
Lands on
Stage
11
Quick heads up: your trial ends Sunday.3-day reminder · "no surprise charges" promise honored
"Cancel in one tap, or keep practicing." Both options visible at-a-glance.
posture.vision/settings/billing
?utm=trial-end-3d
Trial
13
One day left in your trial.Last gentle nudge · option to extend by 7 if needed
"Pause anytime." Includes "extend my trial 7 days" magic link (one-time use).
posture.vision/settings/billing
?utm=trial-end-1d
Trial
14
Welcome to Premium · receipt.Charge confirmation · receipt PDF · what changes
Receipt + "see what unlocked." Same-day delivery if charge succeeds.
posture.vision/home
?utm=trial-converted
Tx
3-day no-card trial
From: Brian @ PostureVision · "no card was on file" framing
Trigger: trial_started with trial_type = "3day-no-card". Two emails — Day 2 reminder + Day 3 wrap.
Day
Subject
Body / CTA
Lands on
Stage
2
One day left of your taste.Reminder · the 3-day trial expires tomorrow
"Want to keep going? Pick a plan — both have free trials." Routes to pricing page.
posture.vision/pricing
?utm=3day-d2
Trial
3
Your taste of Premium ended.Tag pv-trial-3day-expired applied · drop into win-back
"You can still see your line on the free tier." Or upgrade. Two-button.
posture.vision/home
?utm=3day-end
Trial
Inactive user reactivation
From: Brian @ PostureVision · soft observational tone
Trigger: 14 days since last daily_check_completed event. Continues until reactivation OR 21 days reached, whichever first.
Day
Subject
Body / CTA
Lands on
Stage
14
Hey — your line is still here.Personal-tone · "we noticed you haven't been by"
"60 seconds is all it needs." Direct link to /dailycheck (no friction).
posture.vision/dailycheck
?utm=winback-d14
Winback
21
A different way back in.Lower-friction · suggest the lighter Daily Check or just the morning Mirror
"Try a 30-second check today." Halved-time variant for re-entry.
posture.vision/dailycheck
?utm=winback-d21&mode=quick
Winback
35
Take 50% off this month — on us.Last attempt · save offer for paid users; free users get persona-tailored content
"Offer expires in 7 days." Stripe coupon attached.
posture.vision/pricing
?utm=winback-d35&promo=COMEBACK50
Winback
Celebration + share moment
From: Brian @ PostureVision · genuine warm tone
Trigger: session_milestone_unlocked event with {streak_days: 7|30|90}. Same-day delivery.
Streak
Subject
Body / CTA
Lands on
Stage
7
Day 7. The chain begins.First major milestone · introduces share mechanic
"Share this rise." Pre-rendered shareable card with their data.
posture.vision/achievements
?utm=streak-7&badge=first-week
Streak
30
A month of practice. That's a thing.Bigger reveal · personal data summary + invite friend prompt
"Bring someone to rise with you." Reciprocal-month-free CTA.
posture.vision/circle
?utm=streak-30&invite=open
Streak
90
Three months. The line is a habit now.Major milestone · founder personal-touch · gift unlock
"Founder gift inside." 1 free month for them + 1 free month for a friend.
posture.vision/achievements
?utm=streak-90&gift=open
Streak
Save attempt at moment of cancel
From: Brian @ PostureVision · honest, low-pressure
Trigger: cancel_intent_clicked in-app · in-app modal fires first; this email fires 4 hours later if user is "Hot" lead-score and cancellation completed.
Hours
Subject
Body / CTA
Lands on
Stage
4h
Take a month on us. No strings.Save offer · 1 free month if they reactivate within 14 days
"Or just keep your data — free, forever." Honest two-option framing.
posture.vision/settings/billing
?utm=save&promo=ONEMONTHFREE
Save
7d
A few questions, when you have a minute.Cancellation feedback survey · "what could we have done"
"Tell me what didn't work." 4-question Typeform · founder-tier inbox.
posture.vision/feedback/cancellation
?utm=save-survey
Save
Friend invite lifecycle
From: PostureVision <hello@posture.vision> · transactional voice
Trigger: friend invite events from POST /friends/invite/email + POST /friends/invite/link redemptions.
Event
Subject
Body / CTA
Lands on
Stage
↑
{Inviter's name} invited you to PostureVision.Magic-link signup · prefills inviter context for the new user
"Sign up and start free." Magic-link goes straight to /onboarding.
posture.vision/r/{token}
→ /onboarding?invited_by=X
Friend
+5
You both unlocked the Rise Together streak.When invitee hits Poise +5 · both inviter and invitee receive
"See your shared streak." Routes to Circle page with both badges visible.
posture.vision/circle
?utm=rise-together-unlocked
Friend
paid
Free month, coming up. Thanks for the rise.When invitee converts to Premium · reciprocal credit applied
"Your next month is on us." Stripe coupon auto-applied to next invoice.
posture.vision/settings/billing
?utm=reciprocal-credit
Friend
Email verification
Verify your email · PostureVision
Sent immediately after signup. Magic link · 24h expiry · resends available.
→ posture.vision/verify-email?token={x}
Password reset
Reset your password · PostureVision
Triggered by /forgot-password. Magic link · 1h expiry · single use.
→ posture.vision/reset-password?token={x}
Payment success
Receipt · PostureVision Premium
Stripe webhook → receipt email with PDF attached. No marketing.
→ posture.vision/settings/billing
Payment failed
Action needed: update your payment method
Stripe webhook → 3-attempt dunning sequence (Day 0 / Day 3 / Day 7). After Day 7 → involuntary churn.
→ posture.vision/settings/billing?attention=payment
Household member added
{Primary's name} added you to their household plan
When primary user adds a Couples/Family member · invite to claim seat.
→ posture.vision/household/claim?token={x}
Parental consent (COPPA)
Approve your child's PostureVision account
When parent invites a minor (is_minor=true) · consent flow before any data collection.
→ posture.vision/household/consent?token={x}
"A tool I've been using"
From: Dr. Brian Hutcheson <brian@doctorhutcheson.com>
Trigger: manual send to Dr. H's existing patient list (existing business relationship per CAN-SPAM doctrine, FL CAN-SPAM compatible). Includes clear PostureVision identification + opt-out.
—
Subject
Body / CTA
Lands on
Stage
·
A tool I've been using in my own practice.Personal voice from Dr. H · references their last visit if relevant
"Try it free for 14 days." Goes to landing with utm=dh-warmlist for attribution.
posture.vision/
?utm=dh-warmlist&source=patients
Warm
Compliance: Florida CAN-SPAM compatible under "existing business relationship" doctrine. Sent from his practice email address. Clear PostureVision identification in body. Unsubscribe link prominent. Counsel review required before first send.
Sender infrastructure · what's wired vs. pending
From-name strategy
· Marketing: Brian @ PostureVision <brian@posture.vision>
· Transactional: PostureVision <hello@posture.vision>
· Warm-list (existing patients only): Dr. Brian Hutcheson <brian@doctorhutcheson.com>
Reply-to always routes to hello@posture.vision (Linda + Brian both monitor).
Required DNS · before scale
· MX records for posture.vision
· SPF record (Resend)
· DKIM (Resend-managed)
· DMARC policy = quarantine first 30d, then reject
Resend manages most of this; needs DNS records at the registrar before sending in volume.
Resend integration status
· Account created: yes
· API key in Vercel env: pending
· Webhook to PostHog: spec'd, not built
· Templates in code: 0 of ~25 specified above
Lead-seg session owns
Per NEW_SESSION_PROMPT_LEAD_SEGMENTATION.md · sequences, copy approval, GHL workflow wiring, and per-email persona variants. Frontend session owns landing pages each email points to. Backend owns the trigger events that fire each sequence.