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 embedFlow 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 InquiryFlow 4: Calendly Discovery Call
/contact → Calendly embed (inline) → Select available time slot → Calendly collects: Name, Email, Company, Topic → Confirmation email from CalendlyNavigation Structure
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
| Scenario | Message | Action |
|---|---|---|
| Form validation fails | Inline field errors | User 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 load | Fallback mailto link | No 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