diff --git a/app/(app)/dashboard/page.tsx b/app/(app)/dashboard/page.tsx
index 601f34b..b072e01 100644
--- a/app/(app)/dashboard/page.tsx
+++ b/app/(app)/dashboard/page.tsx
@@ -96,6 +96,63 @@ export default async function DashboardPage() {
{ label: 'Unlinked Payments', value: unlinkedPayments ?? 0, Ico: IcoPay, sub: 'needs reconciliation', warn: (unlinkedPayments ?? 0) > 0 },
]
+ // First-run: an admin/board member alone in a space with nothing set up yet
+ // gets a guided checklist instead of a grid of zeros.
+ const isFirstRun =
+ isAdminOrBoard &&
+ (activeMembers ?? 0) <= 1 &&
+ (openTasks ?? 0) === 0 &&
+ (unlinkedPayments ?? 0) === 0 &&
+ (projects ?? []).length === 0 &&
+ (activity ?? []).length === 0 &&
+ pendingProposals.length === 0 &&
+ pendingIncidents.length === 0
+
+ if (isFirstRun) {
+ const steps = [
+ { href: '/members', Ico: IcoUsers, title: 'Invite or add members', desc: 'Add people directly, or share an invite code from Customize.' },
+ { href: '/customize', Ico: IcoPlus, title: 'Set up onboarding', desc: 'Decide what new members see and agree to when they join.' },
+ { href: '/tasks', Ico: IcoTask, title: 'Create your first task or chore', desc: 'Capture the recurring upkeep your space depends on.' },
+ { href: '/settings', Ico: IcoPay, title: 'Connect payments', desc: 'Link a payment platform to track dues and reconcile income.' },
+ ]
+ const firstName = member.display_name?.split(' ')[0] || 'there'
+ return (
+
+
+ Dashboard
+
+
+
+
+
+ Welcome, {firstName}. Let's set up your space.
+
+ Your space is empty. These first steps get it running. This panel goes away once there is activity.
+
+
+