Staaarter

Billing Setup Fee Breakdown

A billing summary block that keeps one-time implementation costs, like SSO configuration or a data migration, visually separate from the recurring annual subscription. Each section lists its own line items and subtotal, followed by an optional tax row and a highlighted total due today. Built for enterprise checkout flows and custom plan quotes where the difference between a one-time and a recurring charge needs to be obvious.

By Staaarter Team
Billing
Updated April 27, 2026
Docs
Live preview

Docs

Installation

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

npx shadcn add https://staaarter.com/r/billing-setup-fee-breakdown.json

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

Usage

The file also exports billing123Demo, 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 { Billing123, billing123Demo } from "@/components/blocks/billing/billing123";

export default function Page() {
  return <Billing123 {...billing123Demo} />;
}

Props

PropTypeDefaultDescription
headingstring"Setup & subscription summary"Heading shown at the top.
descriptionstringnoneOptional note under the heading.
setupLabelstring"One-time setup fee"Label for the one-time fee section.
setupItemsFeeLineItem[]noneOne-time line items, for example onboarding or data migration.
setupSubtotalstringnonePre-formatted subtotal for the one-time section, shown as-is.
recurringLabelstring"Annual subscription"Label for the recurring section.
recurringItemsFeeLineItem[]noneRecurring line items, for example seats and add-ons.
recurringSubtotalstringnonePre-formatted subtotal for the recurring section, shown as-is.
taxLabelstring"Estimated tax"Label for the tax row.
taxAmountstringnonePre-formatted tax amount. The tax row is omitted entirely when this is not passed.
totalLabelstring"Total due today"Label for the highlighted total row.
totalDueTodaystringnonePre-formatted grand total shown in the highlighted box at the bottom.
classNamestringnoneExtra classes for the outer container.

Types

interface FeeLineItem {
  label: string;
  amount: string;
  description?: string;
}

Behavior notes

  • All amounts, including both subtotals, the tax row, and the grand total, are passed in as pre-formatted strings rather than numbers, so the component never sums or formats currency itself.
  • The tax row only renders when taxAmount is provided, so quotes without tax collapse cleanly.
  • Line items support an optional description shown as a smaller line underneath the label, useful for explaining what a fee covers.
  • Setup and recurring sections use identical layout and styling, reinforcing that they're two separate totals rather than one combined list.

Frequently asked questions