Skip to content

Billing

System → Billing (/billing) is the shared Runink Billing page from org-runink/ui. PULSE serves its API, runink.ui.billing.v1.BillingService, over the org-runink/billing library, with PULSE-specific hooks.

Where the subscription comes from

PULSE runs one deployment per tenant. The subscription is read from environment variables that CORE’s operator projects onto the pod:

VariableMeaningWhen missing
TENANT_IDThe tenantNo subscription on record
SUBSCRIPTION_TIERThe plan tierlite
SUBSCRIPTION_SEATSNumber of seats1
SUBSCRIPTION_STATUSSubscription statusactive

The tier, seat, and status defaults apply only when TENANT_ID is set. Without TENANT_ID, the page shows that no subscription is on record. It does not invent a Lite plan.

The environment has no billing period and no annual flag, so the page shows no period and prices the month-to-month rate.

What works and what does not

FeatureIn PULSE
Plan catalog and price quotes (ListPlans, QuotePlan)Work. Pricing is arithmetic, done on the server.
Overview of your subscription (GetOverview)Works, from the variables above.
Checkout and the billing portal (StartCheckout, OpenPortal)There is no payment provider. Both answer “not configured”. Nothing can charge.
Seats (ListSeats, AssignSeat, RevokeSeat)PULSE keeps no seat roster. The page shows no seats section.
UsageNot metered. PULSE records no compute-unit usage, and the page says so.

Billing actions are logged to the process log as billing audit lines.

The deprecated MeteringService

pulse.v1.MeteringService is kept for one release as an alias. It is honest about what it does not know:

  • GetResourceUsage answers UNIMPLEMENTED: compute-unit consumption is not metered by PULSE.
  • GetComputeBudget returns the tier and seats, and leaves consumed and remaining units unset. They are unmeasured, not zero.
  • SetComputeBudget always answers UNIMPLEMENTED. The allowance comes from paid seats.
  • Without TENANT_ID, both reads answer FAILED_PRECONDITION: no subscription is on record for this deployment (TENANT_ID is not projected).

New clients should call runink.ui.billing.v1.BillingService/GetOverview.