Staaarter

Billing Multi Currency Pricing

A single-plan pricing card with a currency toggle that switches between fixed, region-specific prices rather than a live exchange-rate conversion. An optional badge notes which currency was auto-detected from the visitor's location, while still letting them pick a different one manually. Built for SaaS pricing pages targeting multiple countries with intentional regional pricing instead of a straight currency conversion.

By Staaarter Team
Billing
Updated May 22, 2026
Docs
Live preview

Docs

Installation

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

npx shadcn add https://staaarter.com/r/billing-multi-currency-pricing.json

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

Usage

The file also exports billing76Demo, 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 { Billing76, billing76Demo } from "@/components/blocks/billing/billing76";

export default function Page() {
  return <Billing76 {...billing76Demo} />;
}

Props

PropTypeDefaultDescription
headingstring"Pricing"Heading shown at the top of the card.
descriptionstringnoneOptional supporting line under the heading.
planNamestring"Pro plan"Plan name shown under the price.
periodstring"/month"Suffix shown after the price.
featuresstring[]noneFeature list rendered below the price with check icons.
currenciesRegionalPrice[]noneCurrencies rendered as toggle pills, each carrying its own fixed regional price.
defaultCurrencyCodestringdetectedCurrencyCode ?? currencies[0].codeWhich currency is active on first render.
detectedCurrencyCodestringnoneWhen set, shows a 'Detected' badge with this currency code in the header.
ctaLabelstring"Start free trial"Label on the primary call-to-action button.
ctaHrefstring"#"Href for the call-to-action button.
classNamestringnoneExtra classes for the outer card.

Types

interface RegionalPrice {
  code: string;
  symbol: string;
  label: string;
  price: number;
}

Behavior notes

  • Each currency carries its own fixed price rather than a rate applied to a base amount, so switching currencies shows the exact regional price you defined, not a mathematical conversion.
  • The active currency is local component state; it defaults to defaultCurrencyCode, falling back to detectedCurrencyCode, then to the first entry in currencies.
  • The 'Detected' badge is purely informational, based on detectedCurrencyCode; it doesn't run any geolocation itself and stays visible regardless of which currency the visitor later picks.
  • The call-to-action button is a next/link, not a form submit, so it works as a direct navigation to a checkout URL out of the box.

Frequently asked questions