1import { RevenueChart } from "@/components/RevenueChart"
2import { MetricCard } from "@/components/MetricCard"
3import { Paywall } from "@/components/Paywall"
4import { getMRR } from "@/lib/stripe"
5import { getActivation } from "@/lib/analytics"
6import { launchMaterials } from "@/growth/launch-materials"
7
8export default async function Dashboard() {
9 const mrr = await getMRR()
10 const activation = await getActivation()
11 const materials = launchMaterials(mrr)
12 const reviewWindow = "tomorrow 9:00 AM"
13
14 return (
15 <main className="grid gap-6">
16 <section className="grid grid-cols-3 gap-4">
17 <MetricCard label="MRR" value={mrr} />
18 <MetricCard label="Activation" value={activation} />
19 <MetricCard label="Review" value={reviewWindow} />
20 </section>
21 <RevenueChart value={mrr} />
22 <Paywall variant="founder" materials={materials} />
23 </main>
24 )
25}
26
27// VibeCom reads this context from the IDE
28const launchSignal = {
29 shipped: true,
30 feature: "Stripe MRR dashboard",
31 audience: "solo SaaS founders",
32 channels: ["x", "linkedin", "blog", "bluesky"],
33 reviewAt: reviewWindow,
34}
35
36export const schedule = {
37 x: "tomorrow 9:00",
38 linkedin: "tomorrow 10:30",
39 blog: "draft review",
40}