Skip to content

[Feature]: display provider-reported subscription / plan renewal dates in Providers #1060

Closed

Description

@agentHits

Area

Web Dashboard → Providers / account metadata

Problem

OpenCodex currently exposes operational account information such as quota/rate-limit state and reset timing, but users may also need to know when a paid subscription, token plan, or account entitlement actually expires or renews.

These are different concepts.

In particular, this issue must not treat OAuth/access-token expiration as subscription expiration.

OAuth credentials may expire and refresh while the user's underlying subscription remains active. Displaying that timestamp as "subscription expires" or "plan renews" would be misleading.

Goal

Where a provider exposes authoritative subscription or entitlement metadata, surface that information in the Providers dashboard.

Examples of useful provider-reported fields include:

Plan renews: Aug 25, 2026
Subscription expires: Sep 1, 2026
Billing period ends: Aug 31, 2026
Entitlement valid until: Aug 20, 2026

The exact terminology should follow what the provider's source actually represents.

Data-source requirement

A displayed subscription/plan date must come from a source that actually represents the provider's subscription, entitlement, billing period, or plan validity.

Acceptable sources may include:

  • an authenticated provider account/subscription API;
  • provider quota metadata that explicitly includes plan renewal or entitlement expiry;
  • account metadata returned by an official provider endpoint;
  • an equivalent provider-native source with documented semantics.

Do not infer a plan date from:

  • OAuth access-token expiry;
  • OAuth refresh-token expiry;
  • API-key expiration;
  • session expiration;
  • quota reset time;
  • rate-limit reset time;
  • arbitrary credential-file timestamps.

If a provider does not expose trustworthy plan metadata, OpenCodex should simply omit this field for that provider.

Provider capability

Support should be capability-driven rather than assuming that every provider exposes the same metadata.

A provider/account may expose zero or more concepts such as:

quotaResetAt
billingPeriodEndsAt
planRenewsAt
subscriptionExpiresAt
entitlementExpiresAt

The implementation does not need to manufacture a single universal timestamp when the upstream semantics differ.

Where possible, normalize provider-native metadata into a small typed OpenCodex account/subscription metadata contract while preserving the meaning of the source field.

Dashboard behavior

When authoritative metadata exists, show it alongside the corresponding provider/account in the Providers dashboard.

Examples:

Plan renews Aug 25, 2026
Subscription expires Sep 1, 2026
Billing period ends in 12 days

Requirements:

  • display the correct semantic label;
  • format dates using the active locale;
  • handle unavailable/unknown metadata without warnings or fake placeholders;
  • clearly distinguish plan/subscription timing from quota-reset timing;
  • do not expose credential secrets or raw provider payloads.

Multi-account providers

For providers with multiple accounts, the metadata belongs to the individual account unless the provider explicitly defines it at a shared subscription level.

Do not copy one account's subscription date onto unrelated accounts merely because they use the same provider.

Previous implementation attempt

PR #1081 attempted part of this issue but was closed unmerged.

It exposed an existing OAuth/Codex credential expiresAt value and rendered it as account expiration.

That is not sufficient for this feature.

The maintainer review identified two separate problems:

  1. the changed locale catalogs did not compile;
  2. more importantly, the displayed value represented renewable OAuth token expiry rather than actual subscription/plan expiry.

Any future implementation should reuse only infrastructure that is semantically appropriate. Credential expiration and subscription expiration must remain distinct fields.

Suggested implementation order

For each supported provider:

  1. identify an authoritative provider-native source for subscription/plan metadata;
  2. document what each upstream timestamp means;
  3. normalize that metadata into a safe management DTO;
  4. add focused parsing/contract tests;
  5. expose it in the Providers UI;
  6. add localized presentation and GUI regression coverage.

Provider support can be delivered incrementally. One trustworthy provider is better than pretending all providers expose a common subscription date.

Out of scope

This issue does not require:

  • calculating billing dates heuristically;
  • scraping provider websites;
  • treating rate-limit resets as subscription renewals;
  • treating OAuth token expiry as plan expiry;
  • implementing provider billing or payments;
  • displaying sensitive credential metadata.

Acceptance criteria

  • At least one provider has an authoritative subscription/plan metadata source.
  • The source semantics are documented and tested.
  • OAuth/access-token expiry remains distinct from subscription/plan expiry.
  • Quota/rate-limit reset timestamps remain distinct from subscription/plan timing.
  • Provider/account management DTOs expose only safe normalized metadata.
  • The Providers dashboard displays the correct semantic label and localized date.
  • Missing metadata is handled cleanly.
  • Multi-account providers associate metadata with the correct account.
  • No subscription date is fabricated when a provider does not expose one.
  • Additional providers can add support without changing the basic UI/data contract.
  • Accepted implementation is merged into dev.

Related work

Activity

  1. github-actions commented on Aug 5, 2026

    @github-actions
    Contributor

    Automated translation bookkeeping — detected language: English.

  2. lidge-jun commented on Aug 6, 2026

    @lidge-jun
    Owner

    Keeping this open — the idea is wanted. The draft PR attached to this campaign was closed with specific technical feedback (see the PR thread); the ideas stay tracked here. What gets a fast review: small, rebased, independently testable slices that wire the runtime/data path first and the UI second, one concern per PR.

  3. changed the title [-][Feature]: Display account subscription / plan expiration date in Providers dashboard (#providers)[/-] [+][Feature]: display provider-reported subscription / plan renewal dates in Providers[/+] on Aug 9, 2026
  4. lidge-jun commented on Aug 19, 2026

    @lidge-jun
    Owner

    리뷰 · 우선순위 42 / 80

    현재 dev의 Providers 표면은 운영 쿼터/레이트 리밋과 리셋 시각을 보여 줍니다. src/providers/quota.ts의 정규화 모델은 fiveHourPercent, weeklyPercent, 리셋 타임스탬프 같은 창입니다. planRenewsAt, subscriptionExpiresAt, billingPeriodEndsAt, entitlementExpiresAt는 소스에서 검색되지 않습니다. 구독/플랜 갱신일을 보여주는 계약은 아직 없습니다.

    이슈가 원하는 것은 프로바이더가 권위 있는 구독· entitlements·청구 기간을 줄 때만 그 날짜를 표시하는 것입니다. OAuth 액세스/리프레시 만료, API 키 만료, 세션 만료, 쿼터 리셋, 레이트 리밋 리셋을 “구독 만료”로 쓰면 안 됩니다. 자격 증명은 돌고 구독은 살아 있는 경우가 흔합니다.

    네이티브 신뢰성보다 위생이 점수입니다. 잘못된 날짜는 사용자에게 결제 사실을 속입니다. 프로바이더마다 의미가 다르므로 하나의 만능 타임스탬프를 만들면 안 됩니다. 업스트림이 없으면 필드를 생략하는 것이 맞습니다. 초안 PR이 닫힌 이유도 데이터 경로 없이 UI를 그린 점과 같습니다.

    Windows/서비스 이슈가 아니고, 프로바이더 호환은 능력 탐지형이어야 합니다. ChatGPT, Claude, Antigravity, Z.AI가 같은 필드를 준다고 가정하면 안 됩니다. 계정 메타데이터 계약에 소스 필드 의미를 보존해야 합니다.

    해결방안은 프로바이더별로 구독/청구 API가 있는지부터 확인하고, 있는 곳만 typed 메타데이터를 채운 뒤 Providers UI에 원문 의미를 붙여 그리는 것입니다. 쿼터 리셋 시각을 재사용하지 않습니다. 패치는 추측하지 않으며, 현재 트리에 구독 갱신 필드는 없습니다.

    이 댓글은 grok-bot이 작성했습니다

  5. lidge-jun commented on Aug 19, 2026

    @lidge-jun
    Owner

    리뷰 · 우선순위 42 / 80 · 유지

    Providers에 구독/플랜 갱신일을 보여 달라는 요청. OAuth 토큰 만료, 쿼타 리셋, API 키 만료를 구독일로 쓰면 안 됨. #1081이 credential expiresAt를 계정 만료로 그려서 머지 안 됨.

    유지함. 프로바이더가 진짜 플랜/빌링/엔타이틀먼트 날짜를 줄 때만 표시. 없으면 필드 자체를 숨김. 계정마다 따로. 추측해서 만들지 말 것.

    해결방안: 프로바이더별 공식 소스 → typed metadata → Providers UI. 토큰 expiry와 구독 expiry는 필드 분리.

    이 댓글은 grok-bot이 작성했습니다

  6. lidge-jun commented on Aug 26, 2026

    @lidge-jun
    Owner

    Landed via #2660 at 7181ebd

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestguiDashboard, tray, settings UIlanded-via-maintainerOriginal PR closed after landing via a maintainer merge train

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions