Skip to main content

Type Alias: SendingStopState

SendingStopState = typeof SendingStopState[keyof typeof SendingStopState]

Defined in: packages/sdk/src/types/generated/credit_stop_service.ts:56

Whether outbound sending is stopped for credits, and why (GRA-9085).

The credit states that must not be conflated, plus the healthy one:

  • OK — nothing is stopped on the credit axis.
  • CREDITS_SUSPENDED — the hard credit gate fired: Subscription.usage_suspended with reason credit_exhaustion. The platform IS refusing operations right now (HTTP 402, the outbound credits_suspended pre-dispatch block).
  • OUT_OF_CREDITS — the balance is empty but nothing has suspended the org (soft enforcement, or before a hard gate's next check persists). Sending has NOT necessarily stopped, and copy must not claim it has.
  • OPERATOR_SUSPENSIONusage_suspended for any other reason (operator, dunning, dispute, cancel), including a NULL reason, which is treated as operator-controlled — the same conservative default the exhaustion UPDATE uses in lib/services/budget_enforcement_helpers.py. A top-up does NOT clear this.
  • BILLING_UNRESOLVED — the organization has subscription history but no resolvable metered subscription. This is the case the usage gate fail-closes on: check_credits_before_operation refuses the operation precisely when it finds no metered subscription for an org with prior subscription rows. A surface that reported this as OK would show "sending is fine" for a workspace the gate is refusing — the exact invisibility GRA-9085 exists to remove, so the state is explicit rather than folded into health.

A provider/Twilio outage is deliberately NOT a member. credits_suspended and the systemic-terminal provider reasons are disjoint, and the credit surface must never attribute a message-delivery fault to billing.