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.
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.jsonPrefer 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
| Prop | Type | Default | Description |
|---|---|---|---|
| heading | string | "Pricing" | Heading shown at the top of the card. |
| description | string | none | Optional supporting line under the heading. |
| planName | string | "Pro plan" | Plan name shown under the price. |
| period | string | "/month" | Suffix shown after the price. |
| features | string[] | none | Feature list rendered below the price with check icons. |
| currencies | RegionalPrice[] | none | Currencies rendered as toggle pills, each carrying its own fixed regional price. |
| defaultCurrencyCode | string | detectedCurrencyCode ?? currencies[0].code | Which currency is active on first render. |
| detectedCurrencyCode | string | none | When set, shows a 'Detected' badge with this currency code in the header. |
| ctaLabel | string | "Start free trial" | Label on the primary call-to-action button. |
| ctaHref | string | "#" | Href for the call-to-action button. |
| className | string | none | Extra 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
More Billing Blocks
View all →Billing Invoice List
Invoice history table with status badges, formatted amounts, and a per-row download link, built with shadcn/ui and Tailwind CSS.
Billing Failed Payment Alert
High-contrast failed-payment alert with a message, a retry button, and an optional update-payment-method button, built with shadcn/ui and Tailwind CSS.
Billing Credit Balance
Compact credit balance card with a large total, an optional purchased-versus-promotional breakdown, a low-balance notice, and a top-up button.
Billing Payment Methods
A saved payment method list for React and Next.js with brand icons, a default badge, near-expiry warnings, and remove/set-default actions per row.
Billing Add Card
A card entry form for React and Next.js with auto-formatted fields, internal brand detection, and per-field validation feedback built with shadcn/ui and Tailwind CSS.
Billing Coupon Code
An inline promo code input for React and Next.js with a simulated loading state, an applied summary showing the discount amount, and an invalid-code message.