Refresh billing state after ending trial period (#23534)

Fixes #23530

After adding a credit card in the billing prompt, the credits section
and subscription details stayed stale until a full page refresh.

The `endSubscriptionTrialPeriod` mutation only returned `status` and
`hasPaymentMethod`, and the frontend hook only patched the subscription
status into the workspace state. The credits query was never refetched,
so granted credits kept showing trial values, and `currentPeriodEnd`
(renewal date) and `billingCustomer.hasPaymentMethod` stayed outdated.
The backend already syncs everything to the database synchronously
before the mutation returns, so fresh data was available, just never
fetched.

Changes:
- `BillingEndTrialPeriodDTO` now includes nullable
`currentBillingSubscription` and `billingSubscriptions`, returned by the
resolver on success, mirroring the other billing update mutations
(`switchSubscriptionInterval`, etc.)
- `useEndSubscriptionTrialPeriod` applies the full billing update via
`useApplyCurrentWorkspaceBillingUpdate` (falling back to the previous
status-only patch), marks the billing customer as having a payment
method, and refetches `GetResourceCreditUsage` so the credits section
updates for any active observer

This covers all entry points that end the trial: the billing page card
modal, the trial banner, the AI chat banner, and the return from the
Stripe portal.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01W1J7cW2MhaqXGfdjvHeFoX)_

<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/23534?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
This commit is contained in:
Félix Malfait
2026-07-30 09:53:26 +02:00
committed by GitHub
parent 8b707c5131
commit 0b335d15b3
8 changed files with 91 additions and 2 deletions
@@ -340,6 +340,14 @@ export class BillingResolver {
return {
hasPaymentMethod: result.hasPaymentMethod,
status: result.status,
currentBillingSubscription:
await this.billingSubscriptionService.getCurrentBillingSubscriptionOrThrow(
{ workspaceId: workspace.id },
),
billingSubscriptions:
await this.billingSubscriptionService.getBillingSubscriptions(
workspace.id,
),
};
}
@@ -2,6 +2,7 @@
import { Field, ObjectType } from '@nestjs/graphql';
import { BillingSubscriptionEntity } from 'src/engine/core-modules/billing/entities/billing-subscription.entity';
import { SubscriptionStatus } from 'src/engine/core-modules/billing/enums/billing-subscription-status.enum';
@ObjectType('BillingEndTrialPeriod')
@@ -23,4 +24,16 @@ export class BillingEndTrialPeriodDTO {
nullable: true,
})
billingPortalUrl?: string;
@Field(() => BillingSubscriptionEntity, {
description: 'Updated current billing subscription',
nullable: true,
})
currentBillingSubscription?: BillingSubscriptionEntity;
@Field(() => [BillingSubscriptionEntity], {
description: 'All billing subscriptions',
nullable: true,
})
billingSubscriptions?: BillingSubscriptionEntity[];
}