Billing Tax Exemption Form
A form for nonprofits, government entities, and educational institutions to apply for tax-exempt billing status. It collects an organization name and tax ID, a reason for exemption picked from a radiogroup, and an optional supporting document. Submitting shows a loading state followed by a pending-review confirmation, since exemption status typically needs manual approval rather than being granted instantly. Built to integrate with Stripe Tax or a custom billing engine's exemption workflow.
Docs
Installation
A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its button, input, label dependencies and any missing npm packages, and installs them straight into your project.
npx shadcn add https://staaarter.com/r/billing-tax-exemption-form.jsonPrefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/billing/billing137.tsx instead.
Usage
The file also exports billing137Demo, 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 { Billing137, billing137Demo } from "@/components/blocks/billing/billing137"; export default function Page() { return <Billing137 {...billing137Demo} />; }
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| heading | string | "Apply for tax exemption" | Form heading. |
| description | string | (see source) | Supporting line under the heading. |
| reasons | ExemptionReason[] | none | Exemption reasons rendered as a radiogroup, for example nonprofit, government, or educational. |
| defaultReasonId | string | reasons[0].id | Which reason is selected when the form first renders. |
| submitLabel | string | "Submit for review" | Label on the submit button. |
| className | string | none | Extra classes for the outer form container. |
Types
interface ExemptionReason { id: string; label: string; description?: string; }
Behavior notes
- Organization name, tax ID, and a selected reason are all required before the submit button enables; the supporting document is optional.
- The reason picker is a radiogroup of buttons rather than a native select, so only one reason can be chosen and it works with keyboard navigation.
- The document upload button triggers a hidden native file input via a ref and click(), then shows the selected file's name next to the button. No file is actually uploaded anywhere, wire an onChange handler of your own if you need to send it to storage.
- Submitting sets a loading state for about 800ms, then replaces the whole form with a confirmation that explicitly says the request is pending review, not approved, since exemption status needs a human to sign off.
- There's no callback prop for the submitted data, lift state up or handle the request inside your own onSubmit if you fork the component to actually send it to your backend.
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.