Skip to content

feat: add billing: "subscription" config option to suppress inflated costs - #1281

Closed
jnelken wants to merge 1 commit into
ccusage:mainfrom
jnelken:feat/subscription-billing-type
Closed

jnelken wants to merge 1 commit into
ccusage:mainfrom
jnelken:feat/subscription-billing-type

Conversation

@jnelken

@jnelken jnelken commented Jun 11, 2026 •

Copy link
Copy Markdown

Summary

Subscription users on Claude Team / Max / Pro pay a flat monthly fee, so the token-calculated dollar amounts ccusage shows are misleading — no API bill is being generated. This adds billing: "subscription" to ccusage.json as an explicit opt-in that forces all cost output to $0.00 while keeping token counts intact.

Closes #1280. Relates to #658 (block display for subscription users), #1112 (Hermes subscription $0 billing), and #4 (costUSD removed from JSONL).

Changes

  • New billing top-level config key ("api" | "subscription") in ccusage.json
  • billing: "subscription" activates an internal CostMode::Subscription that short-circuits all cost computation to 0.0 without loading pricing data
  • JSON schema updated (config_schema.rs) so the key appears in IDE autocomplete
  • CostMode::skips_pricing() helper avoids redundant pricing loads in adapters that support subscription
  • Snapshot and unit tests updated

Background: why existing approaches don't work

The auth/billing type is not recorded in local JSONL files:

  • service_tier is always "standard" for both API-key and subscription accounts (confirmed across 44k+ JSONL entries)
  • --mode display returns cost_usd ?? 0.0 which is $0 for everyone now that Claude Code dropped costUSD from JSONL in v1.0.9 (issue Claude Code 1.0.9 no longer reports the costUSD field #4)
  • No other JSONL field distinguishes billing type

An explicit user-declared opt-in is the only reliable approach.

Known limitations

Three adapters that compute costs without threading mode through their internal functions (goose, hermes, droid) will not have costs zeroed under subscription billing. This affects multi-agent users who also use those specific agents alongside Claude Code. The Claude adapter — the primary use case for this feature — handles it correctly.

Validation

  • Add "billing": "subscription" to ccusage.json, run ccusage daily — cost column shows $0.00
  • Run ccusage daily without the billing key — existing token-calculated costs unchanged
  • Run ccusage claude daily with and without billing — same behaviour

View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Add billing: "subscription" to ccusage.json to show $0.00 for subscription plans while keeping token counts. This avoids misleading token-based costs and skips pricing loads.

  • New Features

    • New root billing config ("api" | "subscription"); "subscription" maps to CostMode::Subscription and forces zero cost.
    • Added CostMode::skips_pricing() and updated adapters to bypass pricing loads (Claude, Codebuff, Gemini, Kilo, Kimi, OpenCode, Qwen).
    • Updated config schema so billing autocompletes; added tests; CLI exposes BillingType.
  • Migration

    • To suppress costs, set "billing": "subscription" in ccusage.json. Leave unset or set "api" to keep current behavior.
    • Note: goose, hermes, and droid are not yet subscription-aware; their costs may not zero.

Written for commit 8a32054. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Added subscription billing mode that displays all computed costs as $0.00.
    • Added top-level billing configuration option supporting both API and subscription modes.
    • When subscription billing is configured, the cost calculation mode is automatically set to subscription.
  • Refactor

    • Updated cost calculation across all adapters to consistently use the new billing mode logic.

…costs

Subscription users on Claude Team / Max / Pro pay a flat monthly fee, so
token-calculated dollar amounts are misleading. There is no usable signal
in local JSONL files to detect subscription accounts automatically, so this
adds an explicit opt-in: set `"billing": "subscription"` in `ccusage.json`
to force all cost output to $0.00 while keeping token counts intact.

Closes ccusage#1280 (relates to ccusage#658, ccusage#1112, ccusage#4)

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
@coderabbitai

coderabbitai Bot commented Jun 11, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR adds a billing configuration option to allow users on flat-fee subscription plans to display costs as $0.00. A new CostMode::Subscription mode is introduced alongside BillingType, and skips_pricing() unifies pricing-skip logic. The core cost calculation and all model adapters are updated to respect this mode, bypassing pricing-table lookups when subscription is active.

Changes

Subscription Billing Feature

Layer / File(s) Summary
Type contracts and CLI exports
rust/crates/ccusage-cli/src/types.rs, rust/crates/ccusage-cli/src/lib.rs
SharedArgs now includes a billing: BillingType field; CostMode adds Subscription variant with skips_pricing() method that returns true for Display and Subscription; new BillingType enum (default Api, plus Subscription) documents that subscription forces costs to zero.
Config schema for billing selection
rust/crates/ccusage/src/config_schema.rs
CcusageConfig adds optional billing field typed as new ConfigBillingType enum with api and subscription variants; schema test expectations updated to include the new billing key.
Config loading and billing enforcement
rust/crates/ccusage/src/config.rs
New root_billing() accessor extracts and deserializes the root billing config field; apply_config_to_shared() maps root billing to SharedArgs.billing and forces SharedArgs.mode = CostMode::Subscription when billing is subscription; new From<ConfigBillingType> for BillingType conversion; tests validate subscription billing forces subscription cost mode and API billing leaves mode unchanged.
Core cost calculation for subscription mode
rust/crates/ccusage/src/cost.rs
calculate_cost_for_usage() returns 0.0 for CostMode::Subscription; missing_pricing_model_for_usage() skips missing-pricing detection for subscription mode; new test verifies subscription mode yields 0.0 regardless of token counts and explicit cost_usd.
Adapter cost-calculation updates
rust/crates/ccusage/src/adapter/claude/daily.rs, rust/crates/ccusage/src/adapter/claude/mod.rs, rust/crates/ccusage/src/adapter/codebuff/loader.rs, rust/crates/ccusage/src/adapter/gemini/parser.rs, rust/crates/ccusage/src/adapter/kilo/parser.rs, rust/crates/ccusage/src/adapter/kimi/parser.rs, rust/crates/ccusage/src/adapter/opencode/loader.rs, rust/crates/ccusage/src/adapter/opencode/parser.rs, rust/crates/ccusage/src/adapter/qwen/parser.rs
All adapters replace direct CostMode::Display equality checks with mode.skips_pricing() calls in cost-calculation and missing-pricing-detection logic; Codebuff's to_loaded_entry() signature extends to accept mode parameter and conditionally returns 0.0 cost and suppresses missing-pricing-model when subscription is active.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A subscription mode so bright,
No pricing tables in the night,
Costs vanish into zero's glow,
Flat-fee users now know,
What bills truly show.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 24.24% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: adding a billing configuration option for subscriptions to suppress costs.
Linked Issues check ✅ Passed All key requirements from issue #1280 are met: billing config key added with api/subscription enum, CostMode::Subscription implemented, pricing skipped appropriately, and token counts preserved.
Out of Scope Changes check ✅ Passed All changes are directly related to implementing subscription billing. The lib.rs reformatting is a minor in-scope cleanup accompanying the API changes.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
rust/crates/ccusage/src/adapter/opencode/parser.rs (1)

98-127: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Subscription billing is not enforced in OpenCode cost calculation.

Line 103 ignores mode (_mode), so subscription can still emit positive costs via stored cost_usd (Lines 106-108). That breaks the billing: "subscription" zero-cost guarantee.

Proposed fix
 fn calculate_open_code_cost(
     model: &str,
     provider: &str,
     usage: TokenUsageRaw,
     cost_usd: Option<f64>,
-    _mode: CostMode,
+    mode: CostMode,
     pricing: Option<&PricingMap>,
 ) -> f64 {
+    if mode == CostMode::Subscription {
+        return 0.0;
+    }
     if let Some(cost) = cost_usd.filter(|cost| *cost > 0.0) {
         return cost;
     }
     for candidate in open_code_model_candidates(model, provider) {
         let cost =
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@rust/crates/ccusage/src/adapter/opencode/parser.rs` around lines 98 - 127,
calculate_open_code_cost currently ignores the CostMode by naming the parameter
_mode and immediately returning stored cost_usd, which allows
subscription-billed calls to produce non-zero costs; change the signature to use
mode (remove the underscore) and at the start of calculate_open_code_cost check
if mode.skips_pricing() and if so return 0.0 (do not honor stored cost_usd),
otherwise proceed to use cost_usd and the open_code_model_candidates path; this
ensures subscription billing stays zero while missing_open_code_pricing can
still rely on mode.skips_pricing().
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@rust/crates/ccusage/src/config.rs`:
- Around line 278-281: The current config application sets shared.mode =
CostMode::Subscription when shared.billing == BillingType::Subscription, but
that can be overridden later by CLI `--mode`; move or reapply this enforcement
after CLI flags are parsed (or, alternatively, when merging CLI flags into
config, ignore/override any CLI-provided mode if shared.billing ==
BillingType::Subscription). Concretely, ensure the invariant is enforced
post-CLI-parse by checking shared.billing == BillingType::Subscription and then
setting shared.mode = CostMode::Subscription (or rejecting a conflicting CLI
`--mode`) so billing remains authoritative.

---

Outside diff comments:
In `@rust/crates/ccusage/src/adapter/opencode/parser.rs`:
- Around line 98-127: calculate_open_code_cost currently ignores the CostMode by
naming the parameter _mode and immediately returning stored cost_usd, which
allows subscription-billed calls to produce non-zero costs; change the signature
to use mode (remove the underscore) and at the start of calculate_open_code_cost
check if mode.skips_pricing() and if so return 0.0 (do not honor stored
cost_usd), otherwise proceed to use cost_usd and the open_code_model_candidates
path; this ensures subscription billing stays zero while
missing_open_code_pricing can still rely on mode.skips_pricing().
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: f415315a-b2e5-457c-ba24-83ef12c889ae

📥 Commits

Reviewing files that changed from the base of the PR and between f28fa45 and 8a32054.

⛔ Files ignored due to path filters (1)
  • rust/crates/ccusage/src/snapshots/ccusage__config_schema__tests__snapshots_schema_agent_specific_option_edges.snap is excluded by !**/*.snap
📒 Files selected for processing (14)
  • rust/crates/ccusage-cli/src/lib.rs
  • rust/crates/ccusage-cli/src/types.rs
  • rust/crates/ccusage/src/adapter/claude/daily.rs
  • rust/crates/ccusage/src/adapter/claude/mod.rs
  • rust/crates/ccusage/src/adapter/codebuff/loader.rs
  • rust/crates/ccusage/src/adapter/gemini/parser.rs
  • rust/crates/ccusage/src/adapter/kilo/parser.rs
  • rust/crates/ccusage/src/adapter/kimi/parser.rs
  • rust/crates/ccusage/src/adapter/opencode/loader.rs
  • rust/crates/ccusage/src/adapter/opencode/parser.rs
  • rust/crates/ccusage/src/adapter/qwen/parser.rs
  • rust/crates/ccusage/src/config.rs
  • rust/crates/ccusage/src/config_schema.rs
  • rust/crates/ccusage/src/cost.rs

Comment on lines +278 to +281
// Billing is a stronger signal than mode: subscription always forces zero costs.
if shared.billing == BillingType::Subscription {
shared.mode = CostMode::Subscription;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Subscription enforcement can be overridden by later CLI --mode.

Line 280 forces CostMode::Subscription during config application, but parser flow applies config before CLI flag parsing. A later --mode calculate can overwrite this and re-enable cost computation even with billing: "subscription". Enforce this invariant after CLI parsing (or ignore --mode when shared.billing == Subscription) so billing remains authoritative.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@rust/crates/ccusage/src/config.rs` around lines 278 - 281, The current config
application sets shared.mode = CostMode::Subscription when shared.billing ==
BillingType::Subscription, but that can be overridden later by CLI `--mode`;
move or reapply this enforcement after CLI flags are parsed (or, alternatively,
when merging CLI flags into config, ignore/override any CLI-provided mode if
shared.billing == BillingType::Subscription). Concretely, ensure the invariant
is enforced post-CLI-parse by checking shared.billing ==
BillingType::Subscription and then setting shared.mode = CostMode::Subscription
(or rejecting a conflicting CLI `--mode`) so billing remains authoritative.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

4 issues found across 15 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="rust/crates/ccusage/src/adapter/opencode/parser.rs">

<violation number="1" location="rust/crates/ccusage/src/adapter/opencode/parser.rs:127">
P1: Subscription mode is recognized for pricing-skips but OpenCode cost calculation still returns stored positive `cost_usd`, so subscription runs can report non-zero costs.</violation>
</file>

<file name="rust/crates/ccusage/src/config.rs">

<violation number="1" location="rust/crates/ccusage/src/config.rs:279">
P2: `billing: "subscription"` does not reliably force zero-cost mode because `--mode` parsing can overwrite it after config is applied.</violation>
</file>

<file name="rust/crates/ccusage/src/adapter/opencode/loader.rs">

<violation number="1" location="rust/crates/ccusage/src/adapter/opencode/loader.rs:45">
P2: Subscription mode is not fully enforced for OpenCode: embedded positive `cost` values still pass through as non-zero.</violation>
</file>

<file name="rust/crates/ccusage/src/adapter/codebuff/loader.rs">

<violation number="1" location="rust/crates/ccusage/src/adapter/codebuff/loader.rs:47">
P2: Codebuff `Display` mode is not honored: token pricing is still calculated unless mode is exactly `Subscription`.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Fix all with cubic | Re-trigger cubic

pricing: Option<&PricingMap>,
) -> Option<String> {
if mode == CostMode::Display || cost_usd.is_some_and(|cost| cost > 0.0) {
if mode.skips_pricing() || cost_usd.is_some_and(|cost| cost > 0.0) {

@cubic-dev-ai cubic-dev-ai Bot Jun 11, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1: Subscription mode is recognized for pricing-skips but OpenCode cost calculation still returns stored positive cost_usd, so subscription runs can report non-zero costs.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At rust/crates/ccusage/src/adapter/opencode/parser.rs, line 127:

<comment>Subscription mode is recognized for pricing-skips but OpenCode cost calculation still returns stored positive `cost_usd`, so subscription runs can report non-zero costs.</comment>

<file context>
@@ -124,7 +124,7 @@ fn missing_open_code_pricing(
     pricing: Option<&PricingMap>,
 ) -> Option<String> {
-    if mode == CostMode::Display || cost_usd.is_some_and(|cost| cost > 0.0) {
+    if mode.skips_pricing() || cost_usd.is_some_and(|cost| cost > 0.0) {
         return None;
     }
</file context>
Fix with cubic

apply_shared_options(shared, SharedOptions::from_map(options));
}
// Billing is a stronger signal than mode: subscription always forces zero costs.
if shared.billing == BillingType::Subscription {

@cubic-dev-ai cubic-dev-ai Bot Jun 11, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: billing: "subscription" does not reliably force zero-cost mode because --mode parsing can overwrite it after config is applied.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At rust/crates/ccusage/src/config.rs, line 279:

<comment>`billing: "subscription"` does not reliably force zero-cost mode because `--mode` parsing can overwrite it after config is applied.</comment>

<file context>
@@ -261,9 +268,17 @@ fn is_report_command(command: &str) -> bool {
         apply_shared_options(shared, SharedOptions::from_map(options));
     }
+    // Billing is a stronger signal than mode: subscription always forces zero costs.
+    if shared.billing == BillingType::Subscription {
+        shared.mode = CostMode::Subscription;
+    }
</file context>
Fix with cubic

shared: &SharedArgs,
) -> Result<Vec<LoadedEntry>> {
let pricing = if shared.mode == CostMode::Display {
let pricing = if shared.mode.skips_pricing() {

@cubic-dev-ai cubic-dev-ai Bot Jun 11, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Subscription mode is not fully enforced for OpenCode: embedded positive cost values still pass through as non-zero.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At rust/crates/ccusage/src/adapter/opencode/loader.rs, line 45:

<comment>Subscription mode is not fully enforced for OpenCode: embedded positive `cost` values still pass through as non-zero.</comment>

<file context>
@@ -42,7 +42,7 @@ pub(crate) fn load_entries_from_directory(
     shared: &SharedArgs,
 ) -> Result<Vec<LoadedEntry>> {
-    let pricing = if shared.mode == CostMode::Display {
+    let pricing = if shared.mode.skips_pricing() {
         None
     } else {
</file context>
Fix with cubic

Comment on lines +47 to +51
let cost = if mode == CostMode::Subscription {
0.0
} else {
calculate_codebuff_cost(&entry, pricing)
};

@cubic-dev-ai cubic-dev-ai Bot Jun 11, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Codebuff Display mode is not honored: token pricing is still calculated unless mode is exactly Subscription.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At rust/crates/ccusage/src/adapter/codebuff/loader.rs, line 47:

<comment>Codebuff `Display` mode is not honored: token pricing is still calculated unless mode is exactly `Subscription`.</comment>

<file context>
@@ -40,10 +41,19 @@ fn load_entries_inner(shared: &SharedArgs, pricing: &PricingMap) -> Result<Vec<L
 ) -> LoadedEntry {
-    let cost = calculate_codebuff_cost(&entry, pricing);
-    let missing_pricing_model = missing_codebuff_pricing(&entry, pricing);
+    let cost = if mode == CostMode::Subscription {
+        0.0
+    } else {
</file context>
Suggested change
let cost = if mode == CostMode::Subscription {
0.0
} else {
calculate_codebuff_cost(&entry, pricing)
};
let cost = if mode.skips_pricing() {
0.0
} else {
calculate_codebuff_cost(&entry, pricing)
};
Fix with cubic

ryoppippi added a commit that referenced this pull request Jun 11, 2026
The Blacksmith migration (#1249) changed the PR Gate trigger from
`pull_request_target` to `pull_request`. For PRs opened by outside
contributors, `pull_request` workflows are gated as `action_required`
and do not run without a maintainer manually approving them, so the
auto-close gate silently stopped firing (e.g. #1281 stayed open).

Restore `pull_request_target` so the gate runs with the base repo's
write permissions and can close unapproved PRs automatically. This
workflow never checks out PR code — it only calls the GitHub API via
github-script — so the usual pull_request_target injection risk does
not apply. Added an inline comment documenting the requirement to
prevent the same regression in future workflow edits.
ryoppippi added a commit that referenced this pull request Jun 11, 2026
The PR Gate only fires on `pull_request_target` `opened`, so PRs that
were opened while the gate was misconfigured (e.g. #1281) cannot be
retroactively auto-closed. Add a `workflow_dispatch` workflow that
closes a given PR number with the same contribution-gate message,
attributed to github-actions[bot] like the gate itself.
@github-actions

Copy link
Copy Markdown
Contributor

This PR was auto-closed. Only contributors approved with lgtm can open PRs. Open an issue first.

Maintainers review auto-closed issues and reopen worthwhile ones. Issues that do not meet the quality bar in CONTRIBUTING.md may not be reopened or receive a reply.

If a maintainer replies lgtmi, your future issues will stay open. If a maintainer replies lgtm, your future issues and PRs will stay open.

See CONTRIBUTING.md.

@github-actions github-actions Bot closed this Jun 11, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes — The PR adds a billing top-level config option ("api" / "subscription") to ccusage.json. When set to "subscription", all cost output is forced to $0.00 while token counts remain intact, supporting Claude Team / Max / Pro flat-fee subscription users whose token-calculated costs are misleading.

  • CostMode::Subscription and BillingType enums — New Subscription variant on CostMode forces zero costs in all calculation paths; new BillingType enum (Api / Subscription) with config schema and runtime types.
  • CostMode::skips_pricing() helper — Refactors mode == CostMode::Display checks to a method that also covers Subscription, avoiding redundant pricing data loads in adapters.
  • Adapter updates — All adapters updated to handle Subscription via skips_pricing() or explicit match arms (Claude, Codebuff, Gemini, Kilo, Kimi, OpenCode, Qwen — 7 adapters).
  • Config integration — billing is read from the root of ccusage.json; "subscription" overrides shared.mode to CostMode::Subscription regardless of per-command or default mode settings. The override is applied after shared options, so mode always wins.
  • Schema and tests — JSON schema updated for IDE autocomplete; snapshot regenerated; 4 new unit tests covering subscription override, explicit-mode override, api-leaves-mode, and cost zeroing.

Pullfrog  | View workflow run | Using Big Pickle (free via Pullfrog for OSS) | 𝕏

@ryoppippi ryoppippi added the triage:needs-review Requires a fresh technical or product decision. label Aug 31, 2026
@ryoppippi

Copy link
Copy Markdown
Member

Historical audit: this pull request was auto-closed by the legacy contributor gate. That closure did not assess technical importance.

Audit result: needs review. The current state does not prove resolution, but a fresh technical or product check is required before deciding whether the underlying request is still relevant. This closed PR will not be revived as-is; create a new PR only after reviewing the related issue and current main.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

triage:needs-review Requires a fresh technical or product decision.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add billing: "subscription" config option to suppress inflated costs for flat-fee plans

2 participants