Skip to content

User Flows

Primary Flows

Flow 1: Speaking Inquiry

Landing (Hero)
→ [ BOOK A SPEAKING ENGAGEMENT ] CTA
→ /contact — fill form (Name, Org, Email, Type, Budget, Date, Message)
→ Turnstile bot challenge (invisible)
→ Form submitted → Server Action
→ Success: confirmation email + internal notification
lead in Supabase + HubSpot
→ Optional: Book discovery call via Calendly embed

Flow 2: Media Kit Download

/media page
→ [ DOWNLOAD MEDIA KIT ]
→ Email gate modal (Name, Email, Org, Media Type)
→ Email sent with signed Cloudflare R2 URL (1-hour TTL)
→ User clicks link → direct download (PDF + headshots ZIP)

Flow 3: Podcast Discovery → Booking

/podcast
→ Browse / search episodes
→ Play episode
→ "Work with Brett" CTA in episode footer
→ → Flow 1: Speaking Inquiry

Flow 4: Calendly Discovery Call

/contact
→ Calendly embed (inline)
→ Select available time slot
→ Calendly collects: Name, Email, Company, Topic
→ Confirmation email from Calendly
brettjohnson.xyz (Home)
├── /speaking → Services detail
├── /consulting → Enterprise consulting
├── /podcast → Episode archive
├── /media → Press kit + appearances
└── /contact → Booking form + Calendly
Footer:
├── /media → Press kit
└── /privacy → Privacy policy (static)

Error States

ScenarioMessageAction
Form validation failsInline field errorsUser corrects + resubmits
Turnstile fails”Please verify you’re human”Retry
Network error”Something went wrong. Try again.”Retry button
Duplicate submission”We already received your inquiry.”No duplicate lead
Media kit email fails”Contact us directly.”Support email shown
Calendly fails to loadFallback mailto linkNo broken state

Mobile Considerations

  • Single-column forms on mobile
  • Native <select> for dropdown fields on mobile
  • Sticky “Book Brett” CTA bar after scrolling past hero
  • All tap targets ≥ 44px