Catalog vs plans
The most common source of confusion in HUME billing is mixing up the tenant catalog (what exists) with a plan (what a subscriber gets and pays). They are separate layers. Reusing a metric on multiple plans does not copy quotas or prices between them.
One-line model: catalog = what you measure; plan = how much you include and what you charge on that tariff.
Two layers
| Layer | What it stores | Scope |
|---|---|---|
| Tenant catalog | Metric and feature definitions (code, name, unit) | One catalog per tenant — shared across all plans |
| Plan | Base fee, per-metric pricing, groups, classify, limits, feature bindings | Each plan has its own copy of the rules — independent of other plans |
Metrics
Catalog metric (POST /metrics)
Creates a billable meter once. The catalog record has no included_units, overage, or tiers — only identity:
POST /metrics
{
"code": "api_requests",
"name": "API Requests",
"unit": "request"
}Plan binding (POST /plans or POST /pricing/packages)
Attaches that meter to a specific plan with pricing for that plan only. The low-level API
references the catalog by metric_id:
POST /plans
{
"code": "pro",
"name": "Pro",
"monthly_price": 5000,
"metrics": [
{
"metric_id": "met_01J8ZK5BQY8XQ9R2M4V7W3N6T1",
"included_units": 100000,
"overage_unit_price": 1
}
]
}POST /pricing/packages can create catalog metrics inline (compact or verbose format) and
set plan pricing in one request — useful for a single plan. Bootstrap and multi-plan setups still
create shared catalog entries once, then bind different included / overage on each plan.
Same metric, different quotas
This is intentional. One api_requests meter in the catalog; each plan sets its own
included bucket and rates:
{
"plans": [
{
"code": "starter",
"price": 0,
"metrics": {
"api_requests": { "included": 1000, "overage": 2 }
}
},
{
"code": "pro",
"price": 5000,
"metrics": {
"api_requests": { "included": 100000, "overage": 1 }
}
},
{
"code": "enterprise",
"price": 20000,
"metrics": {
"api_requests": { "included": 1000000, "overage": 1 }
}
}
]
}Changing included units on Pro does not change Starter. Subscribers are billed against the plan they are on, not against a global quota on the metric.
Features
The same split applies to entitlements:
Catalog (POST /features) | Plan binding |
|---|---|
code, name — the entitlement exists in the tenant | Which features this plan grants (enabled, optional effective_from) |
exports can be on Pro and Enterprise but not Starter — each plan lists its own feature
bindings. Check access with POST /entitlements/check against the user's active plan.
Plan-only constructs
These never live in the tenant catalog. They are defined per plan:
monthly_price,billing_interval, minimum charge, commitment, rollover, seat pricingmetric_groups[]— shared included / group pricing across member metricsclassify,limits[]— ingest routing and hard caps- Per-metric
included_units, tiers, stairstep, aggregation on the plan binding
Two plans can both use api_requests from the catalog but only Pro might define a tokens metric group or classify routes — Starter stays simple.
Common misconceptions
| Assumption | Reality |
|---|---|
| Adding a metric to another plan copies its included units | No — you configure pricing again on that plan (or leave defaults such as 0 included until you set them) |
included_units is stored on the metric in the catalog | No — it lives on the plan–metric binding (PlanMetric) |
| Editing a plan changes all plans that use the same metric code | No — plans are edited independently (PUT /plans/{id} or package publish for that plan) |
| Quota groups are shared across plans | No — metric_groups are part of the plan JSON; Pro and Enterprise each define their own groups |
| Deleting a catalog metric removes it from plans automatically | No — DELETE /metrics/{id} returns 400 while any plan still references it |
Typical workflow
- Create metrics and features in the catalog (or inline on first plan via
/pricing/packages) - Create plans and bind catalog entities with plan-specific pricing
- Subscribe users to a plan — usage and entitlements evaluate against that plan's rules
- Add a new tier (e.g. Business) — reuse catalog codes, set new included/overage/groups on the new plan only
Billing rule editor
In the dashboard editor, Tenant metrics / Tenant features list catalog entries not yet on the open plan. Adding one copies identity onto the plan; you then set included units, groups, and limits for this plan only. Saving the plan does not alter other plans that share the same metric code.
Related
- Concepts — tenants, entities, event sourcing
- Pricing — packages, bootstrap, Luau
- Plan extensions — groups, classify, limits
- Recipes — copy-paste plan payloads by scenario
- HTTP API —
/metrics,/features,/plans