From 96524780932e12738834c2d16872b8c0bcecde45 Mon Sep 17 00:00:00 2001
From: MaheshtheDev <38828053+MaheshtheDev@users.noreply.github.com>
Date: Wed, 26 Aug 2026 07:43:48 +0000
Subject: [PATCH] feat(web): offer a setup call alongside Slack install (#1599)
- First-landing modal on the Company Brain home: book a 30-min setup call, or install Slack yourself. Dismissal stored in localStorage.
- Setup call also reachable from a header icon, the user menu, and the onboarding research rail.
- Drops the desktop Invite button from the header; invite stays in the stats row and mobile menu.
---
.../components/brain-home/brain-home-view.tsx | 11 +-
.../brain-home/connections-board.tsx | 4 +-
apps/web/components/brain-setup-modal.tsx | 178 ++++++++++++++++++
apps/web/components/company-brain-header.tsx | 25 +--
.../onboarding-brain/research-action-rail.tsx | 9 +
.../onboarding-brain/setup-call-button.tsx | 32 ++++
apps/web/components/setup-call-link.tsx | 45 +++++
apps/web/components/user-profile-menu.tsx | 20 ++
apps/web/lib/analytics.ts | 6 +
apps/web/lib/cal.ts | 8 +
10 files changed, 311 insertions(+), 27 deletions(-)
create mode 100644 apps/web/components/brain-setup-modal.tsx
create mode 100644 apps/web/components/onboarding-brain/setup-call-button.tsx
create mode 100644 apps/web/components/setup-call-link.tsx
create mode 100644 apps/web/lib/cal.ts
diff --git a/apps/web/components/brain-home/brain-home-view.tsx b/apps/web/components/brain-home/brain-home-view.tsx
index 3501c5e8..18e5b6f1 100644
--- a/apps/web/components/brain-home/brain-home-view.tsx
+++ b/apps/web/components/brain-home/brain-home-view.tsx
@@ -9,6 +9,7 @@ import { useQueryState } from "nuqs"
import { useSettingsModal } from "@/components/settings/settings-modal"
import { useBrainTrial } from "@/hooks/use-brain-trial"
import { TrialSetupBanner } from "@/components/trial-setup-banner"
+import { BrainSetupModal } from "@/components/brain-setup-modal"
import { useTrialStatus } from "@/hooks/use-trial-status"
import { dmSans125ClassName } from "@/lib/fonts"
import { useViewMode } from "@/lib/view-mode-context"
@@ -172,7 +173,8 @@ export function BrainHomeView() {
const o = useBrainOverview()
const trial = useBrainTrial()
const board = useConnectionsBoard()
- const { needsSetup } = useTrialStatus()
+ const { data: trialStatus } = useTrialStatus()
+ const { org: activeOrg } = useAuth()
// Rows with no reported state (older orgs, pre-Slack) don't count or render.
const milestones = [
...(o.researchStatus != null ? [o.researchStatus === "done"] : []),
@@ -184,6 +186,10 @@ export function BrainHomeView() {
]
const milestonesDone = milestones.filter(Boolean).length
const milestonesTotal = milestones.length
+ // Positive gate: a slow trial request would otherwise prompt an expired org.
+ const showSetupPrompt = Boolean(
+ board.slack && !board.slack.connected && trialStatus?.active,
+ )
const showTimeline =
!o.loading && (trial.state !== "none" || milestonesDone < milestonesTotal)
@@ -199,7 +205,7 @@ export function BrainHomeView() {
setupTotal={milestonesTotal}
lastUpdatedAt={o.lastUpdatedAt}
/>
- {board.slack && !board.slack.connected && !needsSetup && }
+
{board.showBoard &&
}
@@ -221,6 +227,7 @@ export function BrainHomeView() {
+ {showSetupPrompt && }
)
}
diff --git a/apps/web/components/brain-home/connections-board.tsx b/apps/web/components/brain-home/connections-board.tsx
index 3c79256e..7124781a 100644
--- a/apps/web/components/brain-home/connections-board.tsx
+++ b/apps/web/components/brain-home/connections-board.tsx
@@ -18,11 +18,11 @@ const BACKEND =
process.env.NEXT_PUBLIC_BACKEND_URL ?? "https://api.supermemory.ai"
const MCP_BASE = `${BACKEND}/brain/mcp-connections`
-const cardStyle = {
+export const cardStyle = {
boxShadow:
"0 2.842px 14.211px 0 rgba(0, 0, 0, 0.25), 0.711px 0.711px 0.711px 0 rgba(255, 255, 255, 0.10) inset",
}
-const tileStyle = {
+export const tileStyle = {
boxShadow:
"0px 1px 2px 0px rgba(0,43,87,0.1), inset 0px 0px 0px 1px rgba(43,49,67,0.08), inset 0px 1px 1px 0px rgba(0,0,0,0.08), inset 0px 2px 4px 0px rgba(0,0,0,0.02)",
}
diff --git a/apps/web/components/brain-setup-modal.tsx b/apps/web/components/brain-setup-modal.tsx
new file mode 100644
index 00000000..f20a1816
--- /dev/null
+++ b/apps/web/components/brain-setup-modal.tsx
@@ -0,0 +1,178 @@
+"use client"
+
+import { Check } from "lucide-react"
+import { useEffect, useState } from "react"
+import { Dialog, DialogContent, DialogTitle } from "@ui/components/dialog"
+import { cn } from "@lib/utils"
+import { SlackMark } from "@/components/brain-connector-icons"
+import { cardStyle, tileStyle } from "@/components/brain-home/connections-board"
+import { analytics } from "@/lib/analytics"
+import { COMPANY_BRAIN_CAL_HREF } from "@/lib/cal"
+import { dmSans125ClassName, dmSansClassName } from "@/lib/fonts"
+
+const BACKEND =
+ process.env.NEXT_PUBLIC_BACKEND_URL ?? "https://api.supermemory.ai"
+const dismissKey = (orgId: string) => `sm_brain_setup_modal_dismissed:${orgId}`
+
+const CALL_FEATURES = [
+ "We install Slack with you, live",
+ "Connect Gmail, Notion, Linear and the rest",
+ "Wire up plugins and answer your questions",
+]
+
+export function BrainSetupModal({
+ enabled,
+ orgId,
+}: {
+ enabled: boolean
+ orgId: string | undefined
+}) {
+ const [open, setOpen] = useState(false)
+
+ useEffect(() => {
+ // Also closes if the org stops being eligible while the dialog is open.
+ if (!enabled || !orgId) {
+ setOpen(false)
+ return
+ }
+ let dismissed = false
+ try {
+ dismissed = localStorage.getItem(dismissKey(orgId)) === "1"
+ } catch {}
+ if (dismissed) return
+ setOpen(true)
+ analytics.brainSetupModalSeen()
+ }, [enabled, orgId])
+
+ const close = () => {
+ setOpen(false)
+ if (!orgId) return
+ try {
+ localStorage.setItem(dismissKey(orgId), "1")
+ } catch {}
+ }
+
+ return (
+
+ )
+}
diff --git a/apps/web/components/company-brain-header.tsx b/apps/web/components/company-brain-header.tsx
index e7c9258a..07c8215b 100644
--- a/apps/web/components/company-brain-header.tsx
+++ b/apps/web/components/company-brain-header.tsx
@@ -37,6 +37,7 @@ import { FeedbackModal } from "@/components/feedback-modal"
import { OrgPlanBadge, resolveOrgPlan } from "@/components/org-plan-badge"
import { SlackMark } from "@/components/brain-connector-icons"
import { BrainTrialPill } from "@/components/brain-trial-pill"
+import { SetupCallLink } from "@/components/setup-call-link"
import { GraphIcon } from "@/components/integration-icons"
import { SpaceSelector } from "@/components/space-selector"
import { UserProfileMenu } from "@/components/user-profile-menu"
@@ -538,29 +539,7 @@ export function CompanyBrainHeader({
)}
- {canInvite && (
-
-
-
-
-
- Invite teammates
-
-
- )}
+