Billing catalog — pricing + Stripe sync
PROD-02 introduced packages/billing-catalog/ as the single source of truth for everything billable on the Cavaridge™ platform. Stripe is downstream — the catalog is upstream.
What’s in the catalog
Section titled “What’s in the catalog”| Product | Pro | Team |
|---|---|---|
| Build (Forge / Cavaridge AI) | $99/mo | $129/mo |
| Operations (Meridian + supporting) | $149/mo | $199/mo |
| Security (AEGIS + supporting) | $149/mo | $199/mo |
| Healthcare (HIPAA mode add-on) | $199/mo | $249/mo |
| Platform (full-suite admin) | $349/mo | $449/mo |
| PawVault (consumer) | $4.99/mo | — |
GM-floor (55%)
Section titled “GM-floor (55%)”Every price has a cogs_cents_per_seat_month companion entry in cogs.ts. CI enforces gross margin ≥ 55% at the catalog level — drop a price below floor and the build fails.
Stripe sync
Section titled “Stripe sync”sync-to-stripe.ts is one-direction: catalog → Stripe. Stripe products + prices are matched via metadata.catalog_id, not Stripe ID. So a catalog change updates Stripe; a manual Stripe edit is overwritten on next sync.
The Customer Portal is configured via configure-stripe-portal.ts. Note: Pro+Team currently share a Stripe product, so portal-driven subscription_update is disabled in v1 — upgrades/downgrades go through the in-app billing page.
Tax + BAA
Section titled “Tax + BAA”- Florida-registered for Stripe Tax. Sales tax computed at checkout.
- Pax8 partnership for MSP resellers (PROD-02 closed the partnership-side configuration).
- Standard BAA in place for healthcare tenants.
Pitfalls
Section titled “Pitfalls”- Don’t hardcode prices anywhere outside
packages/billing-catalog/. - Don’t edit prices in the Stripe dashboard — the next sync clobbers them.
- Don’t add a price below GM-floor without raising the floor in CI first (and writing the why).