import { useState, useEffect, useRef } from 'react' import { Link } from 'react-router-dom' import { PageMeta } from '@/components/common/PageMeta' import { useAppConfig } from '@/hooks/useAppConfig' import '@/styles/landing.css' const FAQ_ITEMS = [ { q: 'How is this different from just using ChatGPT?', a: 'FlowPilot is purpose-built for MSP troubleshooting. It understands your stack (AD, Exchange, networking, VPN), captures every diagnostic step as you work, and generates formatted ticket notes ready for your PSA. ChatGPT doesn\u2019t build documentation and can\u2019t push notes to ConnectWise.', }, { q: 'Is my data safe?', a: 'Troubleshooting sessions are encrypted and isolated per team. We never use your data to train AI models. You control what gets documented and exported.', }, { q: 'What PSA tools do you integrate with?', a: 'Launching with ConnectWise PSA \u2014 session documentation exports directly as internal ticket notes. Atera and Syncro integrations are next. During beta, you can copy formatted notes into any PSA.', }, { q: 'What counts as a \u201csession\u201d?', a: 'One session = one troubleshooting conversation. Describe an issue, work through it with FlowPilot, resolve it. Whether that takes 2 minutes or 2 hours, it\u2019s one session. Free plan: 20 sessions/month. Pro and Team: unlimited.', }, { q: 'What if FlowPilot gets it wrong?', a: 'FlowPilot is a copilot, not autopilot. Every suggestion is a recommendation \u2014 you decide what to act on. And because every step is documented, you always have a full audit trail of what was tried and why.', }, ] export default function LandingPage() { const appConfig = useAppConfig() const [navScrolled, setNavScrolled] = useState(false) const [mobileMenuOpen, setMobileMenuOpen] = useState(false) const [openFaq, setOpenFaq] = useState(null) const mobileMenuRef = useRef(null) useEffect(() => { const handleScroll = () => setNavScrolled(window.scrollY > 40) window.addEventListener('scroll', handleScroll) return () => window.removeEventListener('scroll', handleScroll) }, []) useEffect(() => { function handleClickOutside(e: MouseEvent) { if (mobileMenuRef.current && !mobileMenuRef.current.contains(e.target as Node)) { setMobileMenuOpen(false) } } if (mobileMenuOpen) { document.addEventListener('mousedown', handleClickOutside) return () => document.removeEventListener('mousedown', handleClickOutside) } }, [mobileMenuOpen]) const handleMobileNavClick = () => setMobileMenuOpen(false) useEffect(() => { const els = document.querySelectorAll('.landing-reveal') const observer = new IntersectionObserver( (entries) => { entries.forEach(entry => { if (entry.isIntersecting) entry.target.classList.add('visible') }) }, { threshold: 0.15 } ) els.forEach(el => observer.observe(el)) return () => observer.disconnect() }, []) const toggleFaq = (index: number) => { setOpenFaq(prev => prev === index ? null : index) } return ( <>
Skip to content {/* Navigation */}
{/* Hero — left-aligned, two columns */}
Now in Beta

Resolve tickets faster.
Notes write themselves.

Your AI troubleshooting copilot for MSPs. Describe the issue, get expert guidance, and get clean ticket documentation — without writing a single note.

Start Free {appConfig.self_serve_enabled && ( See pricing )} See How It Works

Built by a 15-year MSP veteran who got tired of empty ticket notes.

{/* Problem — asymmetric: headline left, cards right */}
The Problem

Documentation is broken.
Everyone knows it.

Engineers don't want to write it. Managers hate chasing it. Clients never see it. The same issues get solved from scratch — every time.

{/* Equation */}
The Answer
Resolution + Documentation Time = ResolutionFlow

What if documentation was a byproduct of solving the issue — not a separate task?

{/* How It Works — zigzag */}
How It Works

Three steps. Zero note-writing.

01

Describe the Issue

Type what's happening, paste an error, or drop a screenshot. FlowPilot understands MSP environments — AD, Exchange, networking, VPN, you name it.

💬 User can't access shared drive after password reset, getting Access Denied in Event Viewer
02

Troubleshoot Together

FlowPilot acts like a senior engineer on the call. It suggests next steps, provides commands, and captures every action — documentation builds itself as you work.

FlowPilot Is the user on VPN?
You Yes, Cisco AnyConnect
FlowPilot Check split tunnel config →
Auto-doc Step captured ✓
03

Resolve & Document

Hit resolve and get clean, timestamped ticket notes — ready to paste into ConnectWise, Atera, or Syncro. Every step documented automatically.

ConnectWise Ticket #48291
10:04Verified VPN connection active
10:06Split tunnel misconfigured — fixed
10:08Confirmed Outlook sync restored
10:09Resolution: VPN split tunnel updated
{/* Features */}
Features

Everything you need to troubleshoot faster.

FlowPilot — Your AI Copilot

Like having a senior engineer on every call. Describe the issue, get expert troubleshooting guidance, and documentation writes itself — as a byproduct of solving the problem.

} title="Guided Flows" description="Build step-by-step troubleshooting paths your team can follow. Great for onboarding and consistency." /> } title="Zero Empty Tickets" description="Every session generates timestamped notes, formatted for your PSA. No more empty ticket closures." /> } title="Team Knowledge" description="Solutions are saved and surfaced when the next engineer hits a similar issue." /> } title="Session Analytics" description="Track resolution times, identify recurring issues, and measure team performance." /> } title="PSA Integration" description="Connect to ConnectWise, Atera, and Syncro. Push session docs straight to tickets." />
{/* Pricing */}
Pricing

Simple pricing. No surprises.

Start free. Upgrade when your team is ready.

One session = one troubleshooting conversation, regardless of length.

Enterprise (25+ techs, SSO, custom branding)?{' '} Let's talk

{/* FAQ */}
FAQ

Common questions

{FAQ_ITEMS.map((item, i) => (

{item.a}

))}
{/* Founder — replaces anonymous testimonial */}
Why We Built This
After 15 years in the MSP trenches, I got tired of the same cycle: solve the issue in 10 minutes, spend 20 minutes writing notes about it. Or worse — close the ticket with “Fixed issue” because there's no time. ResolutionFlow is the tool I wanted on every call.
— Michael, Founder
{/* CTA */}

Ready to stop writing ticket notes?

Get early access. Troubleshoot your next ticket with FlowPilot.

Get started

Free to start. No credit card required.

{/* Footer */}
© 2026 ResolutionFlow
) } /* ---- Sub-components ---- */ function ProblemCard({ icon, color, title, description }: { icon: string; color: string; title: string; description: string }) { return (
{icon}

{title}

{description}

) } function FeatureCard({ icon, title, description }: { icon: React.ReactNode; title: string; description: string }) { return (
{icon}

{title}

{description}

) } function PricingCard({ name, target, amount, period, note, features, btnLabel, btnStyle, featured, plan }: { name: string; target: string; amount: string; period?: string; note: string features: string[]; btnLabel: string; btnStyle: 'outline' | 'filled'; featured?: boolean; plan: string }) { return (
{featured &&
Most Popular
}
{name}
{target}
{amount} {period && {period}}
{note}
    {features.map(f =>
  • {f}
  • )}
{btnLabel}
) }