Blended rates are convenient and dishonest in the same move. A buyer sees $X / hour and assumes the unit is comparable across vendors. The unit usually is not.
If a service is a stack, the price should be a stack:
type PriceQuote = {
currency: 'USD'
lines: Array<{
sku: 'direct_hours' | 'supervision' | 'training' | 'assessment' | 'travel' | 'fees'
unit: 'hour' | 'session' | 'month' | 'one_time'
quantity: number
unitAmount: number
}>
assumptions: string[] // setting, minimums, cancellation rules
}
Without that shape, "cheaper" often means "incomplete."
What to show in the UI
| Field | Why |
|---|---|
| Line SKU | Stops apple-to-orange rate comparisons |
| Unit + quantity | Makes monthly math reproducible |
| Assumptions | Surfaces travel, minimums, no-shows |
| What is excluded | Prevents silent underquotes |
Where this pattern shows up outside software
Healthcare private-pay quotes, agency retainers, and education support packages all fail the same way: the headline rate describes one labor type while the delivered program includes design, oversight, and setup fees. Buyers who only store the headline rate build budgets that break in month two.
A worked example of that failure mode for private-pay ABA is at How Much Does ABA Therapy Cost Without Insurance in 2026?.
If you ship a quoting surface, default to line items. Let users collapse to a blended rate only after they have seen the composition.
Special Needs Care Network operates a directory of special needs schools and therapy providers in the United States at specialneedsusa.com.
Top comments (0)