Base Rates
Part of the Anaya Care Handbook — the source of truth for how the product must behave. When the product needs to change, change this document first, then make the system match it.
What this covers
This page governs the pricing catalog behind every initial assessment's and care proposal's rate calculation: a single (the standard hourly, overtime, and live-in prices plus a price for each value-added service) and per-city that override it where local pricing differs.
Key terms
- Base rate — the single standard price list: hourly rate, overtime rate, live-in rate, and one rate per value-added service.
- City rate — an override of the base rate for one state + city pair.
- Value-added service (VAS) — one of the six branded service add-ons, each with its own rate: Montessori Care (MD), Caring Touch (CT), Healing Ally (HA), Always Fresh (AF), Care Bliss (CB), and Care Mentor (CM).
- Same as base rate — the flag on a city rate recording whether its prices currently match the base rate exactly.
How it works
Staff with rate access maintain the base rate and a table of city rates on the web dashboard. When an initial assessment or a care proposal needs prices, the system looks up the rate for the client's state and city: if a city rate exists it is used; otherwise the base rate applies. The looked-up rate is then adjusted per proposal by the client's assessment score and blended across the weekly hours — that computation lives with the proposal and is described on Care Proposals (); this page owns only the catalog. Each city rate carries a "same as base rate" flag, and whenever the base rate is changed the system re-checks the cities used by existing proposals and updates that flag, so staff can see at a glance which cities have genuinely local pricing.
Rules
Implementation status — audited against
apps/backend/src/base-rateson 2026-06-12. ✅ In code · ⚠️ Partial (built, but doesn't fully match the rule) · 🚧 Spec only (not yet built).
- RATE-1 — There is one base rate, defining the standard hourly, overtime, and live-in prices plus a price for each of the six value-added services. All of its prices are required. (✅ In code — the service always reads/writes a single base-rate document, and every price including all six VAS rates is a required number in the create DTO)
- RATE-2 — A city rate overrides the base rate for exactly one state + city pair. A proposal's rate lookup uses the client's city rate when one exists and falls back to the base rate otherwise. (✅ In code — city rates are keyed and upserted by state + city, and the lookup returns the matching city rate or falls back to base-rate values)
- RATE-3 — Every city rate records whether it still matches the base rate, and changing the base rate must re-evaluate that flag for the affected cities. (⚠️ Partial — the flag is stored and recomputed, but the re-evaluation only covers cities referenced by an existing proposal (city rates not used by any proposal keep a stale flag), and on a base-rate update the comparison runs against the previous base rate because the recompute happens before the new values are saved)
- RATE-4 — Viewing rates requires the base-rates view permission; creating, overriding, or deleting them requires the manage permission. A proposal editor may additionally look up the single city rate their proposal needs. (✅ In code — view/manage permissions gate every endpoint, and the single-city lookup also accepts the care-proposals edit permission)
- RATE-5 — Every change to the base rate is recorded in the activity log: who changed it and when. (✅ In code — saving the base rate emits a
BASE_RATE_UPDATEDactivity-log event with the acting user and timestamp)
Who can do what
| Action | Who |
|---|---|
| View the base rate and city rates | Staff with the base-rates view permission |
| Set the base rate; create, override, or delete city rates | Staff with the base-rates manage permission |
| Look up one city's rate while editing a proposal | Staff with the care-proposals edit permission |
Decisions needed
- Should rates be per-agency? Today there is a single global rate table (see Known gaps). Options: keep one platform-wide price list that every agency shares; give each agency its own base rate and city rates; platform-wide defaults that each agency can override.
- Should a rate change reprice existing proposals? Today changing rates re-checks the "same as base rate" flags but does not touch proposal prices. Options: leave sent proposals untouched (price locked at creation); recalculate drafts only; prompt staff to review affected proposals.
How is this page?
Last updated on