// M08 — Pricing + Checkout
const Pricing = ({ setPage }) => {
const [billing, setBilling] = React.useState('monthly');
const [plan, setPlan] = React.useState('studio');
const tiers = [
{
id:'starter', name:'Starter', tag:'For solo founders',
m:1500, y:14400, accent:'#7c9bff',
headline:'A focused build, fixed scope.',
desc:'A landing page, a marketing site, or a quick rebuild — scoped, designed, shipped in 2 weeks.',
features:[
['Up to 5 pages', true],
['Design + build', true],
['Basic CMS setup', true],
['Stripe + Resend hookup', true],
['90-day support', true],
['Custom AI integration', false],
['Dedicated engineer', false],
['SLA', false],
]
},
{
id:'studio', name:'Studio', tag:'For funded teams',
m:6500, y:62400, accent:'#d4ff3a', featured:true,
headline:'A real product build.',
desc:'Web app, dashboard, or AI-native product. Dedicated team, two-week sprints, weekly demos.',
features:[
['Everything in Starter', true],
['Web app / dashboard', true],
['Full CMS + admin', true],
['AI integration', true],
['Auth + payments', true],
['Dedicated engineer', true],
['12-month support', true],
['Custom SLA', false],
]
},
{
id:'company', name:'Company', tag:'For scaling teams',
m:18500, y:177600, accent:'#a78bfa',
headline:'Embedded engineering team.',
desc:'2–4 engineers dropped into your stack. Runs alongside your team for a quarter or longer.',
features:[
['Everything in Studio', true],
['2–4 dedicated engineers', true],
['Embedded in your repo', true],
['Custom SLA (4h response)', true],
['Architecture review', true],
['Quarterly strategy', true],
['Code ownership transfer', true],
['On-call rotation', true],
]
},
];
return (
{/* Hero */}
Pricing · transparent, fixed-scope
Three ways to work together.
No hourly billing. No surprise invoices. Pick a tier, sign the scope, and we ship.
{/* Billing toggle */}
{['monthly','annual'].map(b => (
setBilling(b)} style={{
padding:'8px 18px',borderRadius:8,fontSize:13,fontWeight:500,
background: billing===b ? 'var(--accent)' : 'transparent',
color: billing===b ? '#0a0a0a' : 'var(--ink-2)',
textTransform:'capitalize',display:'flex',alignItems:'center',gap:8
}}>{b}{b==='annual' && −20% }
))}
{/* Pricing cards */}
{tiers.map(t => (
setPlan(t.id)} className="clickable" style={{
padding:'32px 32px 28px',
borderRadius:'var(--radius)',
border:'1px solid',
borderColor: t.featured ? 'var(--accent)' : 'var(--line)',
background: t.featured ? 'linear-gradient(180deg, rgba(212,255,58,0.06), var(--bg-2))' : 'var(--bg-2)',
position:'relative',
transform: t.featured ? 'translateY(-12px)' : 'none'
}}>
{t.featured && (
MOST POPULAR
)}
{t.name}
{t.tag.toUpperCase()}
{t.name[0]}
${(billing==='monthly' ? t.m : t.y/12).toLocaleString(undefined,{maximumFractionDigits:0})}
/ {billing==='monthly' ? 'project' : 'month'}
{billing==='annual' ? `$${t.y.toLocaleString()} billed annually` : 'fixed-scope, paid 50/50'}
{t.desc}
Choose {t.name} {Icon.arrow()}
{t.headline.toUpperCase()}
{t.features.map(([l,on],i) => (
{on ? Icon.check() : '○'}
{l}
))}
))}
{/* Comparison table */}
Full comparison.
Everything in every tier, side-by-side.
FEATURE
{tiers.map(t => (
{t.name}
))}
{[
['Discovery workshop','30 min','2 hrs','2 days'],
['Design system','Light','Full','Full + tokens'],
['Pages / screens','Up to 5','Up to 25','Unlimited'],
['CMS','Basic','Full admin','Full + custom collections'],
['Auth & payments','—','Stripe + standard','Stripe Connect, multi-tenant'],
['AI integration','—','✓','✓ + custom evals'],
['Dedicated engineer','—','1','2–4'],
['Support window','90 days','12 months','Ongoing'],
['Response SLA','Best effort','24h','4h business hours'],
['Code handoff','✓','✓','✓ + training'],
].map((row,i) => (
{row[0]}
{row.slice(1).map((v,j) => (
{v}
))}
))}
{/* Checkout preview */}
Checkout · powered by Stripe
Pay, sign, kick off — in two minutes.
Pick a tier, e-sign the SOW, pay the 50% deposit. The project kicks off the next business day with a calendar invite to your first standup.
{[
'50% deposit at signing, 50% at handoff',
'Card, ACH, or wire — your choice',
'PCI Level 1 compliant via Stripe',
'Money-back if we miss the launch date',
].map(l => (
{Icon.check()} {l}
))}
{/* Checkout mockup */}
t.id===plan) || tiers[1]} billing={billing}/>
{/* FAQ */}
FAQ
Questions, answered.
{[
['What if my project needs more than the tier covers?','We re-scope. We never let projects drift past the SOW — instead, we pause and write a Change Order with the new scope and new price. You approve before we proceed.'],
['Do you offer hourly contracts?','No. Fixed-scope only. Hourly billing aligns the wrong incentives — we get rewarded for slowness. Fixed-scope means we ship fast or we lose money.'],
['What happens after the project ships?','Every tier includes a support window (90 days / 12 months / ongoing). Bug fixes are free. New features are quoted separately.'],
['Can I pay in installments?','Yes — Starter & Studio are 50/50 by default. Company is monthly retainer. Custom arrangements via Stripe Invoicing if you need NET-30.'],
['Do you sign NDAs?','Yes, before discovery. We have a standard mutual NDA we can send, or sign yours.'],
].map(([q,a],i)=>(
{q} +
{a}
))}
);
};
const CheckoutMock = ({ tier, billing }) => {
const price = billing==='monthly' ? tier.m : tier.y/12;
const subtotal = price;
const tax = Math.round(price * 0.08);
const total = subtotal + tax;
return (
STRIPE
Secure checkout · 256-bit TLS
×
{/* Order */}
Order
{tier.name} · {billing}
${price.toLocaleString(undefined,{maximumFractionDigits:0})}
{tier.tag}
{/* Card */}
Card details
{/* Summary */}
{[['Subtotal',subtotal],['Tax (8%)',tax]].map(([l,v]) => (
{l} ${v.toLocaleString()}
))}
Total due today
${Math.round(total*0.5).toLocaleString()}
50% deposit · remainder at handoff
Pay & sign SOW {Icon.arrow()}
By continuing you agree to the SOW & terms.
);
};
window.Pricing = Pricing;