Arc
ComponentsBlocksDocsPricingTry the demo
Get Pro
Introduction
Installation
Theming
Motion
AI and MCP
Changelog
Metrics dashboardPro
KPI drilldownPro
Metric explorerPro
Revenue explorerPro
MRR waterfallPro
Cohort retentionPro
Usage forecastPro
Journey flowPro
Uptime statusNewPro
Choropleth explorerPro
Connected scatterPro
Horizon chartPro
Account healthNewPro
Market terminalPro
Budget variancePro
Small multiplesPro
Line replayPro
AI chatPro
AI composerPro
AI answerPro
Model pickerPro
Model arenaPro
Prompt studioPro
Document extractionPro
Agent memoryPro
AI side panelPro
Research runPro
AI insight cardNewPro
Catch upNewPro
AI feature launchNewPro
AI search barNewPro
AI setup wizardNewPro
Call insightsNewPro
Lead scoringNewPro
Agent runPro
Agent tasksPro
Agent approvalsPro
Agent routinesPro
Agent orchestratorPro
MCP serversPro
Knowledge basePro
Eval suitePro
Agent builderNewPro
Agent galleryNewPro
SidebarPro4
Page header
Command palette
Notification center
Selection toolbarPro
Empty states
Search resultsPro
Login and sign up5, free and Pro variants
Onboarding illustrationPro
OTP input
Multi-step formPro
Two-factor setupNewPro
Magic linkNewPro
Settings pagePro
Settings commandPro
Security settingsPro
Billing overviewPro
Usage billingPro
Cancel flowPro
Onboarding surveyNewPro
Spend alertNewPro
Team membersPro
Invite peoplePro
Team directoryPro
Roles and permissionsPro
Profile pageNewPro
API keysPro
WebhooksPro
IntegrationsPro
Environment variablesPro
Domain verifyNewPro
Webhook testerNewPro
Plan comparison
Pricing calculatorPro
Usage pricingPro
Cart drawerPro
Checkout summaryPro
Live checkoutPro
Seat managerNewPro
Credit top-upNewPro
Invoice studioPro
Wallet cardPro
Delivery trackerPro
Product listingPro
Product detailPro
Activity feedNewPro
Inbox triagePro
Support conversationPro
Support widgetPro
Help centerPro
Feature votingNewPro
File upload
Media playerPro
Week calendarPro
Availability pickerPro
Project boardPro
Release readinessPro
Kanban boardPro
Smart schedulerNewPro
Task breakdownNewPro
Goal trackerNewPro
Hero section
Hero signupPro
Scroll storyPro
Spotlight gridPro
Feature bentoPro
Comparison table
Logo marquee
Studio perspectivesPro
Stats band
Changelog feed
FAQ section
Contact section
Team showcasePro
Blog grid
Site header
Site footer
CTA section
Newsletter signup
Activity terrainPro
Revenue globePro
Customer galaxyPro
Semantic zoomPro
Layout morphPro
Exploded viewPro
What’s new74 new
BlocksAccount health

Account health

Pro

A customer success card where a health score gauge, a renewal countdown and five sourced signals with sparklines lead into an AI risk summary and one recommended next step, like scheduling a QBR before usage slips further.

Live block · sample data

When to use

  • A customer success or account page that needs a score, the signals behind it and a next step.
  • Renewal prep views where the countdown and risk drivers matter more than raw metrics.
  • Showing an AI written risk summary next to the evidence it was written from.

When not to use

  • Portfolio views across many accounts; use a table with a score column instead.
  • Deep metric exploration with axes and ranges; use a full chart.
  • Single KPI tiles with no recommendation; use a stat card.

Installation

Pro source and install commands unlock with a Pro plan.

Usage

Drop it into an account or renewal page and pass `account` (name, plan, ARR, logo, term start and renewal date) and `periods` (one per time range, each with a score, the previous score, signals, a summary and an action). Pass `summarize(input, signal)` to return the summary text from your model. The card handles the thinking, streaming, abort and error states. Pass `onAction(action, input, signal)` to book the QBR for real, and reject it to show the retry state. `period`/`onPeriodChange` control the time range, and `asOf` fixes the countdown date. Keep the same number of trend points in every period so the sparklines morph from one to the next. With no props it plays a sample Linear Enterprise account.

example.tsx
1import { AccountHealth } from "@/components/arc/blocks/account-health/account-health";2 3export function CustomerPanel({ account, periods }) {4  return (5    <AccountHealth6      account={account}7      periods={periods}8      summarize={async ({ account, period }, signal) => {9        const res = await fetch("/api/health-summary", { method: "POST", body: JSON.stringify({ id: account.name, period: period.id }), signal });10        return (await res.json()).text;11      }}12      onAction={async (action, { account }, signal) => {13        await fetch("/api/qbr", { method: "POST", body: JSON.stringify({ account: account.name }), signal });14      }}15    />16  );17}
Built fromButtonSegmentedControlTextShimmer

API reference

3 parts. The first is the root.

AccountHealth

A customer success card: customer and plan, a health score gauge with trend, a renewal countdown, signal rows with sparklines and status, and an AI risk summary that ends in one recommended next step. With no props it plays a sample Linear Enterprise account.

PropTypeDefaultDescription
accountAccountHealthAccountLinear sampleThe customer: name, plan, arr (formatted string), logo (ReactNode, about 24px), termStart and renewalDate (Date or ISO date).
periodsAccountHealthPeriod[]30d and 90d samplesOne entry per time range: id, label, spanLabel, score, previousScore, signals, summary and action. Keep the same number of trend points across periods so sparklines morph.
periodstring–Controls the selected period id. Pair with onPeriodChange.
defaultPeriodstringfirst periodThe period selected on mount when uncontrolled.
onPeriodChange(period: string) => void–Called when someone picks another time range.
summarize(input: { account, period }, signal: AbortSignal) => Promise<string>–Writes the risk summary. Return the full text and the card streams it in. Aborted when the period changes or the summary is regenerated. Leave it out to use each period's summary, simulated.
onAction(action, input: { account, period }, signal: AbortSignal) => Promise<void> | void–Runs the recommended action, such as booking a QBR. Reject to show the error state with a retry. Leave it out to simulate it.
model{ name: string; mark?: ReactNode }{ name: "Claude Sonnet 5.5" }The model credited on the summary, with its 14px mark. Defaults to the Claude mark.
asOfDate | stringtodayThe date the renewal countdown counts from. The sample account uses Oct 27, 2026.
classNamestring–Extra class on the card.

AccountHealthSignal

One signal row.

PropTypeDefaultDescription
idRequiredstring–Stable key, shared across periods.
labelRequiredstring–"Product usage", "Seat utilization", "Support tickets", "NPS", "Invoice status".
detailstring–One short line of evidence: "Analytics down 18%".
valueRequiredstring–The headline value, right aligned in tabular numerals.
statusRequired"good" | "watch" | "risk"–Shown as an icon plus Good, Watch or At risk, and colors the sparkline when not good.
trendnumber[]–Sparkline points, oldest first.
sourceReactNode–The source's 14px mark, such as PostHog, Okta, Zendesk, Intercom or Stripe.
sourceLabelstring–Names the source for screen readers: "From Zendesk".

AccountHealthAction

The recommended next step under the summary.

PropTypeDefaultDescription
labelRequiredstring–Button label: "Schedule QBR".
titleRequiredstring–The recommendation as a sentence: "Schedule a QBR with Linear".
reasonRequiredstring–Why, in a few words: "Usage dropped 18% in Analytics".
doneLabelstring–Shown once the action has run: "Invite drafted for Tue, Nov 3, 10:00".

Keyboard interactions

Tab
Moves through the time range, regenerate and action buttons.
ArrowLeftorArrowRight
Switches the time range inside the segmented control.
EnterorSpace
Regenerates the summary or runs the recommended action.

Accessibility

  • The card is a labelled section; the gauge is one image with the score and band in its label.
  • Every status pairs an icon with a word (Good, Watch, At risk, Needs attention), never color alone.
  • Signal sources are named for screen readers; sparklines are decorative and hidden.
  • A polite live region reports the action result and says when it was simulated ("Simulated, no invite was sent").
  • The summary is aria-busy while it is written; the action row stays inert until it appears.

Motion

  • On first view the gauge sweeps and the score counts up from one motion value (560ms ease-out), sparklines draw in with a 40ms stagger, and the term bar fills.
  • The summary thinks for about 0.9s with a shimmer on the label, then streams 3 to 6 words every 34ms, each chunk fading in over 140ms.
  • Switching the time range morphs each sparkline point to point and crossfades the trend line; no element changes size.
  • Reduced motion jumps to end states, shows the summary at once and keeps all feedback.

Responsive behavior

  • Holds 600px at most and fills narrower containers.
  • Below 520px card width the sparklines step aside and padding drops to 16px; below 440px the score and renewal stack.
  • Labels and details truncate with an ellipsis; values and status keep fixed columns.

Performance

  • Pure SVG and CSS; one motion value drives the gauge and number.
  • The entrance starts on first intersection and runs once; no loops besides the label shimmer while thinking.
  • Summary runs are aborted on period change, regenerate and unmount.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Pick this for a customer success, account management or renewal view about one customer.
  • Pass real signals per period; keep 5 signals or fewer so the card stays one glance.
  • Return plain text from summarize; the card handles thinking, streaming, abort and error states.
  • The action button uses the accent; keep destructive actions out of this slot.
/components/blocks/account-health/markdown

The full library index for assistants is at /llms.txt.

Related

Agent statusProComponentA compact live status pill for a running AI agent: the agent's mark in a live ring, the current activity and an elapsed timer, opening into the steps so far.AI insight cardProBlockA KPI card that explains itself. Explain streams a short reason for the change and ranks three drivers with contribution bars. A numbered annotation lights up on the sparkline as each driver is read, and follow-up chips ask the next question in place.Call insightsProBlockA sales call insights card where talk time, flagged pricing, competitor and objection moments, an AI summary and owned next steps sit in one view. Selecting a moment plays its quote, and checking off next steps lowers the deal risk.Goal trackerProBlockA team goals card where objectives open into key results with owners, confidence and progress bars. A weekly check-in updates a value, confidence and note in place, fills the bar and recalculates the objective, and a quarter selector steps from last quarter's final scores to next quarter's planning.Generation statsProComponentA live stats strip for a streaming LLM response where time to first token, speed with a sparkline, output tokens and cost count up in tabular numerals beside the model's real mark, then settle and open into a latency and token cost breakdown.
PreviousSeat managerNextMagic link
Arc · 129 block pagesllms.txt

On this page

  • Preview
  • When to use
  • When not to use
  • Installation
  • Usage
  • API reference
  • Keyboard
  • Accessibility
  • Motion
  • Responsive behavior
  • Performance
  • Notes for AI
  • Related
View as Markdown

Linear

Enterprise · $184,000 ARR

0
Needs attentionDown 9 pts in 30 days

Renews Dec 13, 2026

47days left

  • Product usage, from posthogAnalytics down 18%61%At risk
  • Seat utilization, from okta188 of 212 seats active89%Good
  • Support tickets, from zendesk3 P1 on CSV exports14 openAt risk
  • NPS, from intercomWas +41 last quarter+32Watch
  • Invoice status, from stripePaid Oct 1, net 30PaidGood
Reading 5 signalsClaude Sonnet 5.5

Analytics usage fell 18% after their data team moved weekly reporting to Looker, and 3 P1 tickets about CSV export timeouts are still open. Seats and billing are healthy, so this reads as a product gap, not a budget cut.

Health has slid for a full quarter. Analytics usage is down 31% since July while tickets tripled, mostly CSV export timeouts. Seat growth and on time payments show the budget is there, so fix exports before the December renewal.

Schedule a QBR with Linear

Usage dropped 18% in Analytics