Staaarter

Billing W9 Verification Status

A status tracker for a business's W-9 (or similar tax residency) verification. An overall status badge sits at the top next to the entity name and masked tax ID, a vertical timeline lists each step of the process with its own status and timestamp, and a footer shows the verified date and next renewal date once verification completes.

By Staaarter Team
Billing
Updated June 25, 2026
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its badge dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/billing-w9-verification-status.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/billing/billing148.tsx instead.

Usage

The file also exports billing148Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Billing148, billing148Demo } from "@/components/blocks/billing/billing148";

export default function Page() {
  return <Billing148 {...billing148Demo} />;
}

Props

PropTypeDefaultDescription
titlestring"W-9 verification"Heading at the top of the card.
entityNamestringnoneBusiness or individual name the W-9 was filed under.
taxIdMaskedstringnonePartially masked tax ID shown under the entity name, e.g. "•• •••4821".
overallStatus"pending" | "processing" | "verified" | "failed"noneDrives the top-right badge color and label, and whether the footer or failure note shows.
stepsW9Step[]noneTimeline entries rendered in the order given.
verifiedDatestringnoneShown in the footer when overallStatus is "verified".
renewalDatestringnoneShown in the footer alongside verifiedDate when overallStatus is "verified".
failureReasonstringnoneShown as an inline note in the header when overallStatus is "failed".
classNamestringnoneExtra classes for the outer container.

Types

type W9StepStatus = "complete" | "current" | "upcoming" | "failed";

interface W9Step {
  id: string;
  label: string;
  description?: string;
  status: W9StepStatus;
  timestamp?: string;
}

Behavior notes

  • The component is fully static and driven by props, there's no internal state; re-render it with a new steps array and overallStatus to reflect a status change.
  • Each step's icon and color come from its own status field (complete, current, upcoming, or failed), independent of the card-level overallStatus.
  • The verified/renewal footer only renders when overallStatus is exactly "verified" and at least one of verifiedDate or renewalDate is passed.
  • The failure note in the header only renders when overallStatus is "failed" and failureReason is passed; there's no default fallback message.

Frequently asked questions