Skip to content
shadcn.io

shadcn.io is not affiliated with official shadcn/ui

Negotiable Pricing Block for React

Pricing that starts from a range: seats and contract length produce a per-seat estimate drawn as a band on a scale with the list price marked, and a field for your own target price that sends it to sales.

Framework
UI library

Preview

Preview width

Installation

Part of Pro
Pro unlocks the code and one-line install of every Pro button and text effect, plus the MCP for your AI editor.
Have Pro already? Sign in to open it.Opens here as soon as you're Pro.

Overview

Show negotiated pricing honestly with this range estimator, here for an intranet called Atrium Intranet that lists at $26 a seat. A compact header holds the headline, one sentence and a Segment Group for the contract length: 1, 2 or 3 years. One panel sits under it, two cells that share a hairline and carry + marks on their corners. The left cell is the answer: a per-seat monthly estimate such as "$20–$22" in display type that rolls to each new number with Sliding Number, a scale under it that draws the range as a bar with a ruler, the list price marked with a tick and, once you type a target, your own price as a ring, and a line with the monthly total for the team. The right cell holds the inputs: a Slider that steps through team sizes from 25 to 2,000 seats, a field for the price you'd like to pay with a one-sentence verdict (inside the range, above it, below it), and a Shine Button, the block's only primary control, that sends the estimate and your target to sales. On a phone the range and the call to action ride a sticky bar. Built with Segment Group, Slider, Field, Input, Sliding Number, Shine Button and Guides, with CSS transitions only. For enterprise and team plans priced by volume and term, sales-assisted checkouts and any pricing that is a conversation rather than a list.

FAQ

How do I change the list price, the discounts and the range?

Edit the constants at the top of the file. LIST_PRICE is the price per seat per month and the marked tick. SEATS lists the team sizes the slider steps through and VOLUME_DISCOUNTS the discount each size earns, in the same order. TERMS lists the contract lengths with their discounts. NEGOTIATING_ROOM is how many dollars below the typical quote a negotiated one can go, which sets the low end of the band. SCALE is the span the bar and the ruler cover: keep the list price and the lowest quote inside it.

How is the estimate worked out?

typicalOf takes the list price and applies the size's discount and the term's discount one after the other. highOf rounds that to whole dollars: the top of the range, the typical quote. lowOf rounds it NEGOTIATING_ROOM dollars lower: the bottom. At 250 seats on a 2-year term the discounts are 12% and 5%, which gives $22 at most and $20 at best, so the block shows "$20–$22". These are example numbers: replace typicalOf with your own pricing rules, and keep it a pure function, as the estimate, the scale and the phone's bar all read it.

What does the target price field do?

Whatever you type becomes a ring on the scale, labelled "You $21", and a sentence under the field compares it with the band: inside the range, above it (we'd quote you less) or below it (sales will need to approve it). The button's label then names the number ("Send my $21 to sales"). Build the link from the state: seatIndex and termId pick the estimate and targetText is the target as typed, so a link like /contact-sales?seats=250&term=2&target=21 gives sales the whole conversation before the call. The field is a number input, so a phone shows a numeric keyboard.

How do the controls differ between the four UI bases?

Base UI's Slider takes value as an array and calls onValueChange with the new value, and the block names it with aria-labelledby. The target input's id matches its label's htmlFor.

Is the estimator accessible?

Yes. The slider is named "Seats" and reads its value as "250 seats", and it moves with the arrow keys, Page Up and Page Down, Home and End. The contract length is a radio group named "Contract term". The field has a visible label and the verdict follows it. The scale and the large range are decorative copies, hidden from screen readers, which hear "$20 to $22 per seat per month" instead. When a drag or a key press ends, when the term changes and when the field is left, a polite live region says the estimate once, so a screen reader doesn't announce every step. The scale reads left to right even in right-to-left pages, as prices do.

How does it look on a phone?

The cells stack: the estimate and its scale first, then the seats slider and the target field. The in-panel button is hidden below the md breakpoint and a sticky bar at the foot of the screen shows the range, the seat count and the button, so a visitor can reach the call to action from any point in the section. The estimate scales down to fit at 320 pixels, and the ruler under it keeps its labels.

  • Pro

    Enterprise Custom Pricing

    Sales and partners

    An enterprise pricing band for a cloud that follows the page theme: the title beside a raised card with a Custom price and a call to sales, then three columns of capabilities and customer wordmarks, with the list collapsed on phones.

  • Pro

    Enterprise pricing by conversation: a scheduler with a strip of the next five working days and a grid of time slots in the visitor's own time zone, then a confirmation.

  • Pro

    Custom Quote Pricing

    Sales and partners

    A quote request for a security platform: the pitch and three ruled points beside a short form whose submit button sits inside the first screen, and a confirmation that takes focus once it's sent.

  • Pro

    A seat calculator: a slider sets the team size with its count riding the thumb, ticks at the 10, 25 and 50 seat discounts, shortcuts to them, and a panel that rolls the seat price and monthly total.

  • Pro

    A split pricing section for a VPN with a contract length slider from 1 to 24 months in a card in a card, where the monthly price at display size, the discount, total and savings roll to each term, and a sticky bar on phones.

  • Pro

    Per-seat pricing that falls across four team-size brackets, drawn as a descending bar chart beside compact rows with the saving on each bracket and a call to action per row.