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
BlocksLead scoring

Lead scoring

Pro

A lead scoring card where inbound B2B leads are ranked by an AI fit score, each with a score ring and a one-line reason. Open a lead to see its signals and score breakdown, then push it to HubSpot or Salesforce.

Live block · sample data

When to use

  • A sales inbox or SDR queue that ranks new inbound leads by fit.
  • Showing why a model scored a lead, with signals and a weighted breakdown.
  • Handing a qualified lead to HubSpot or Salesforce from the same view.

When not to use

  • Large tables of hundreds of leads with filters and bulk edits; use a data table.
  • Enriching columns of company data; use enrich-column.
  • Tracking the health of existing customers; use account-health.

Installation

Pro source and install commands unlock with a Pro plan.

Usage

Pass your leads newest first, each with a weighted `breakdown`, so the ring and the bars always agree (or set `score` directly). Mark a lead `scoring` while your model works on it. Wire `onPush(lead, crm, signal)` to your backend: resolve for the done state, reject for the error and retry state. `crms` picks the destinations, and `sort`/`onSortChange` control the order. `onRescore` shows a rescore button. With no props it plays a short intro once it scrolls into view: scores land, the list re-sorts by score, the top lead opens and is pushed to HubSpot. Every push in the demo is simulated.

example.tsx
1import { LeadScoring } from "@/components/arc/blocks/lead-scoring/lead-scoring";2 3export function InboundLeads({ leads }: { leads: Lead[] }) {4  return (5    <LeadScoring6      leads={leads}7      onPush={async (lead, crm, signal) => {8        const res = await fetch(`/api/crm/${crm}/leads`, { method: "POST", body: JSON.stringify({ id: lead.id }), signal });9        if (!res.ok) throw new Error("Push failed");10      }}11    />12  );13}
Built fromButtonSegmentedControlTextShimmerTooltip

API reference

2 parts. The first is the root.

LeadScoring

A card of inbound leads ranked by an AI fit score. Each row shows the company mark, the person, a score ring and the model's one-line reason; opening a row shows signal chips, the weighted score breakdown and a push to HubSpot or Salesforce. With no props it plays a short intro on first view with sample leads and simulated pushes.

PropTypeDefaultDescription
leadsLead[]leadScoringSamplesLeads to show, newest first. Each lead has id, name, title, company, mark, received, reason, and optional signals, breakdown, score, scoring and pushedTo.
titlestring"Inbound leads"Card title.
descriptionReactNode–Line under the title. Defaults to the scoring model and the lead count.
sort"score" | "newest"–Controlled sort. Newest keeps the array order.
defaultSort"score" | "newest""newest" while auto playing, else "score"Starting sort when uncontrolled.
onSortChange(sort: LeadSort) => void–Called when the sort control changes.
crmsLeadCrmId[]["hubspot", "salesforce"]CRMs a lead can be pushed to. The first is the default destination; one entry hides the picker.
onPush(lead: Lead, crm: LeadCrmId, signal: AbortSignal) => Promise<void>–Creates the contact and deal. Resolve for the done state, reject for the error state with a retry. The signal aborts on unmount. Without it pushes are simulated and announced as such.
onRescore() => void–Shows a rescore button. Mark leads scoring while you rescore them. The sample demo rescores on its own.
autoPlaybooleantrue for sample dataPlays the intro once when the card scrolls into view: scores land, the list sorts by score, the top lead opens and is pushed to the first CRM.
defaultExpandedIdstring | nullnullLead open on first render.
classNamestring–Class on the card.

Lead

One inbound lead.

PropTypeDefaultDescription
idRequiredstring–Stable id, used as the React key and for push state.
nameRequiredstring–Person's name.
titleRequiredstring–Job title. Hidden in the row on narrow cards.
companyRequiredstring–Company name.
markLeadCompanyMarkId | ReactNode–"vercel", "ramp", "linear", "notion", "retool", "figma", or your own 20px logo node. Falls back to a monogram.
receivedRequiredstring–Arrival time, already formatted ("6m ago").
reasonRequiredstring–The model's one-line reason for the score.
signals{ kind: LeadSignalKind; label: string }[]–Chips in the open row. Kinds: pricing, team, hiring, email, demo, stack, docs, repo, security.
breakdown{ id: string; label: string; value: number; weight: number }[]–Score factors, 0 to 100, with weights that add up to 1. The score is their weighted sum unless score is set.
scorenumber–0 to 100. Overrides the breakdown sum.
scoringboolean–Still being scored: the ring spins and the reason shimmers.
pushedToLeadCrmId[]–CRMs the lead already lives in. Shows Synced in the row.

Keyboard interactions

Tab
Moves through the sort control, rescore, each lead row and the open row's controls.
EnterorSpace
Opens or closes the focused lead.
ArrowDownorArrowUp
Moves focus between lead rows.
HomeorEnd
Jumps to the first or last lead row.
ArrowLeftorArrowRight
Switches the CRM destination inside the open row.

Accessibility

  • Each row is a button with aria-expanded and aria-controls; its label reads name, title, company, score, fit band and the reason.
  • The score ring is decorative; the number and the fit band are in the row label and the breakdown list label.
  • Status is never color alone: done and error states pair an icon with a short label.
  • The CRM picker is a radio group with roving focus and named options.
  • A polite live region announces pushes, errors and rescoring, and says when a push was simulated.

Motion

  • Re-sorting glides each row to its new place with a bounce-free spring (position only, text is never scaled).
  • The ring arc and number share one motion value, so they count up together in about 640ms with tabular numerals.
  • Opening a row springs the measured height with no bounce; breakdown bars grow with a 30ms stagger.
  • Time, synced, reason and status swaps are single crossfades in a fixed slot, so nothing changes size.
  • The scoring spinner pauses off screen. Reduced motion keeps every end state and drops travel, counting and the spinner.

Responsive behavior

  • Fits 360px to 640px. Below 460px the job title leaves the row, details start at the card edge and the push button fills the row.
  • Names, roles and reasons truncate with an ellipsis; scores and times keep fixed slots.

Performance

  • Designed for a short queue of 5 to 20 leads; every row is rendered.
  • Ring counting runs on motion values without React renders.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Use for ranking inbound leads, trial signups or accounts by an AI fit score with a reason and a CRM handoff.
  • Pass leads newest first; let the score come from a weighted breakdown so the bars and the ring always agree.
  • Keep the reason to one short line of evidence (funding stage, team size, intent), not a paragraph.
  • Wire onPush to your backend; never call a CRM from the client with secret keys.
/components/blocks/lead-scoring/markdown

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

Related

Account healthProBlockA 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.Enrich columnProComponentAn AI enrichment column for a data table, where one prompt runs down every row and each cell shimmers while it works, then settles into a value with its source or a failure you can retry.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.Agent approvalsProBlockOne approval card for agents: the waiting tool call reads like a permission prompt with the tool's mark, the agent's reason and its arguments, and you approve, deny or allow it from now on.Connector setupProComponentA "Connect your tools" card for an AI assistant. Each app connects inline: it redirects, authorizes and runs a first sync with a progress hairline, then lists the scopes it was granted and offers Disconnect with an inline confirm.
PreviousCall insightsNextDomain verify
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

Inbound leads

Scoring 6 leads with Claude Sonnet 5.5