Skip to content

513 - Billing Stripe initial implementation - #5378

Draft
matijapetanjek wants to merge 77 commits into
masterfrom
513
Draft

513 - Billing Stripe initial implementation#5378
matijapetanjek wants to merge 77 commits into
masterfrom
513

Conversation

@matijapetanjek

@matijapetanjek matijapetanjek commented Jul 12, 2026

Copy link
Copy Markdown
Collaborator

Copilot AI 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.

Pull request overview

Introduces an initial Stripe-based billing implementation across server and client, including subscription lifecycle endpoints, webhook handling, usage metering, persistence (Liquibase), and UI scaffolding to manage plans.

Changes:

  • Added new platform billing modules (API/REST/service) with Stripe client integration, subscription facade/services, repositories, and Liquibase schema.
  • Implemented REST endpoints + webhook endpoint (OpenAPI-generated stubs) and wired security exemptions for Stripe webhooks.
  • Added client-side billing settings route/UI and generated TypeScript API client, plus AWS/Quartz-based usage reporting scheduling hooks.

Reviewed changes

Copilot reviewed 77 out of 89 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
settings.gradle.kts Registers new platform billing Gradle modules.
server/libs/platform/platform-billing/platform-billing-service/src/test/java/com/bytechef/platform/billing/service/BillingUsageServiceImplTest.java Adds unit tests for usage reporting logic.
server/libs/platform/platform-billing/platform-billing-service/src/test/java/com/bytechef/platform/billing/service/BillingSubscriptionServiceImplTest.java Adds unit tests for subscription lookup behavior.
server/libs/platform/platform-billing/platform-billing-service/src/test/java/com/bytechef/platform/billing/facade/BillingSubscriptionFacadeImplOperationsTest.java Adds tests covering subscription facade operations (upgrade/downgrade/cancel/reactivate).
server/libs/platform/platform-billing/platform-billing-service/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports Auto-imports billing JDBC repository configuration.
server/libs/platform/platform-billing/platform-billing-service/src/main/resources/config/liquibase/changelog/platform/billing/20260429000000_platform_billing_init.xml Creates billing subscription + webhook event tables and FK constraint.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/service/BillingWebhookEventServiceImpl.java Implements webhook event persistence service.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/service/BillingUsageServiceImpl.java Implements usage counting + Stripe metered event reporting across tenants.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/service/BillingSubscriptionServiceImpl.java Implements subscription persistence + retrieval methods.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/repository/BillingWebhookEventRepository.java Adds Spring Data JDBC repository for webhook event deduplication.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/repository/BillingSubscriptionRepository.java Adds Spring Data JDBC repository plus cross-module usage-count query.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/job/StripeUsageReportingJob.java Quartz job to trigger periodic Stripe usage reporting.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/facade/BillingSubscriptionFacadeImpl.java Core billing orchestration: checkout, plan updates, webhook handling, subscription DTO.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/config/PlatformBillingJdbcRepositoryConfiguration.java Enables JDBC repositories + binds billing properties in autoconfig.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/config/BillingSchedulingConfiguration.java Wires Quartz trigger/job for usage reporting when billing enabled.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/config/BillingProperties.java Defines billing configuration properties record (bytechef.billing.*).
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/client/StripeClientImpl.java Stripe SDK integration: subscription changes, checkout, webhook verification, metered events.
server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/client/StripeClient.java Defines Stripe client abstraction used by billing services/facade.
server/libs/platform/platform-billing/platform-billing-service/build.gradle.kts Adds Stripe SDK + Spring/JDBC/Quartz/security dependencies for billing service.
server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/security/config/BillingSecurityConfigurerContributor.java Disables CSRF for webhook endpoint.
server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/security/config/BillingAuthorizeHttpRequestContributor.java Permits unauthenticated webhook endpoint access.
server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/mapper/config/PlatformBillingMapperSpringConfig.java Adds MapStruct mapper config for billing REST models.
server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/mapper/BillingMapper.java Maps billing DTO to REST model.
server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/BillingWebhookApiController.java Implements Stripe webhook endpoint controller.
server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/BillingApiController.java Implements internal billing subscription/checkout endpoints.
server/libs/platform/platform-billing/platform-billing-rest/openapi.yaml Defines internal billing REST API contract.
server/libs/platform/platform-billing/platform-billing-rest/openapi-webhook.yaml Defines webhook REST API contract.
server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/model/CheckoutSessionRequestModel.java Generated OpenAPI model for checkout/plan change request.
server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/model/CheckoutSessionModel.java Generated OpenAPI model for checkout session response.
server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/model/BillingSubscriptionModel.java Generated OpenAPI model for subscription response.
server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/BillingWebhookApi.java Generated OpenAPI interface for webhook endpoint.
server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/BillingApi.java Generated OpenAPI interface for internal billing API.
server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/ApiUtil.java Generated OpenAPI utility for example responses.
server/libs/platform/platform-billing/platform-billing-rest/generated/README.md Generated OpenAPI stub README.
server/libs/platform/platform-billing/platform-billing-rest/generated/pom.xml Generated OpenAPI stub Maven build file.
server/libs/platform/platform-billing/platform-billing-rest/generated/.openapi-generator/VERSION Records OpenAPI generator version used.
server/libs/platform/platform-billing/platform-billing-rest/generated/.openapi-generator/FILES Records generated file inventory.
server/libs/platform/platform-billing/platform-billing-rest/generated/.openapi-generator-ignore Generated ignore rules.
server/libs/platform/platform-billing/platform-billing-rest/build.gradle.kts Adds OpenAPI generator tasks (Spring + TS fetch) and wires generated sources.
server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/service/BillingWebhookEventService.java Billing API service contract for webhook event deduplication.
server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/service/BillingUsageService.java Billing API service contract for metered usage counting/reporting.
server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/service/BillingSubscriptionService.java Billing API service contract for subscription persistence.
server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/facade/BillingSubscriptionFacade.java Billing API facade contract for REST/webhook orchestration.
server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/dto/BillingSubscriptionDTO.java DTO representing subscription + computed usage.
server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/domain/BillingSubscriptionWebhookEvent.java Domain model for webhook event persistence.
server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/domain/BillingSubscription.java Domain model for persisted subscription state.
server/libs/platform/platform-billing/platform-billing-api/build.gradle.kts Adds API module dependencies for billing types/contracts.
server/libs/config/liquibase-config/src/main/resources/config/liquibase/master.xml Includes billing Liquibase changelogs.
server/libs/config/app-config/src/main/java/com/bytechef/config/ApplicationProperties.java Adds billing configuration section to application properties.
server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/listener/StripeUsageReportListener.java Adds SQS listener that triggers usage reporting in EE AWS scheduler mode.
server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/constant/AwsBillingSchedulingConstants.java Adds constants for Stripe usage reporting scheduler/listener/queue.
server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/config/AwsSchedulerConfiguration.java Wires Stripe usage schedule + listener and shares SchedulerClient bean.
server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/AwsStripeUsageReportScheduler.java Creates EventBridge Scheduler schedule for periodic Stripe usage reporting.
server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/build.gradle.kts Adds dependency on billing API for the AWS scheduler module.
server/apps/server-app/src/main/resources/config/application.yml Exposes billing enabled flag under actuator info.
server/apps/server-app/src/main/resources/config/application-bytechef.yml Adds local defaults for billing Stripe properties.
server/apps/server-app/build.gradle.kts Adds billing REST + service modules to the server app.
client/src/shared/stores/useApplicationInfoStore.tsx Adds billing enabled flag to app info store.
client/src/shared/queries/platform/billing.queries.ts Adds React Query hook for current subscription.
client/src/shared/mutations/platform/billing.mutations.ts Adds mutations for cancel/reactivate/upgrade subscription.
client/src/shared/middleware/platform/billing/runtime.ts Generated TS fetch runtime for billing API.
client/src/shared/middleware/platform/billing/models/UpgradeSubscription.ts Generated TS model (currently unused by exports).
client/src/shared/middleware/platform/billing/models/index.ts Exports generated billing models.
client/src/shared/middleware/platform/billing/models/CheckoutSessionRequest.ts Generated TS model for checkout/plan change request.
client/src/shared/middleware/platform/billing/models/CheckoutSession.ts Generated TS model for checkout session response.
client/src/shared/middleware/platform/billing/models/BillingSubscription.ts Generated TS model for subscription response.
client/src/shared/middleware/platform/billing/index.ts Exports generated billing runtime/apis/models.
client/src/shared/middleware/platform/billing/docs/UpgradeSubscription.md Generated docs for UpgradeSubscription model.
client/src/shared/middleware/platform/billing/docs/CheckoutSessionRequest.md Generated docs for checkout session request model.
client/src/shared/middleware/platform/billing/docs/CheckoutSession.md Generated docs for checkout session model.
client/src/shared/middleware/platform/billing/docs/BillingSubscription.md Generated docs for billing subscription model.
client/src/shared/middleware/platform/billing/docs/BillingApi.md Generated docs for billing API.
client/src/shared/middleware/platform/billing/apis/index.ts Exports generated billing API client.
client/src/shared/middleware/platform/billing/apis/BillingApi.ts Generated TS client for billing API endpoints.
client/src/shared/middleware/platform/billing/.openapi-generator/VERSION Records OpenAPI generator version for TS client.
client/src/shared/middleware/platform/billing/.openapi-generator/FILES Records generated TS file inventory.
client/src/shared/middleware/platform/billing/.openapi-generator-ignore Generated ignore rules for TS output.
client/src/shared/layout/Settings.tsx Gates the Billing settings nav item behind server-provided billing flag.
client/src/routes.tsx Adds Billing route and sidebar nav entry for platform settings.
client/src/ee/pages/settings/platform/billing/components/UpgradeConfirmationDialog.tsx Adds upgrade confirmation dialog UI.
client/src/ee/pages/settings/platform/billing/components/SelectPlanDialog.tsx Adds plan selection dialog + checkout/upgrade/downgrade flows.
client/src/ee/pages/settings/platform/billing/components/ReactivatePlanDialog.tsx Adds reactivate confirmation dialog UI.
client/src/ee/pages/settings/platform/billing/components/PlanTierCard.tsx Adds plan tier card UI.
client/src/ee/pages/settings/platform/billing/components/PlanCard.tsx Adds subscription summary card UI (usage bar, renewal/cancel state).
client/src/ee/pages/settings/platform/billing/components/DowngradeConfirmationDialog.tsx Adds downgrade confirmation dialog UI.
client/src/ee/pages/settings/platform/billing/components/CancelPlanDialog.tsx Adds cancellation confirmation dialog UI.
client/src/ee/pages/settings/platform/billing/Billing.tsx Adds Billing settings page with polling/checkout UX and plan management.
client/package-lock.json Updates lockfile metadata (removes platform libc constraints for some optional deps).
Files not reviewed (1)
  • client/package-lock.json: Generated file

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread client/src/ee/pages/settings/platform/billing/Billing.tsx Outdated
@ivicac

ivicac commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

cc @matijapetanjek

@matijapetanjek

matijapetanjek commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator Author

@ivicac server check failure due to

FtpDownloadFileActionIntTest > testDownloadFileViaSftp() STANDARD_OUT
    2026-07-17T17:09:11.820Z  INFO  --- [    Test worker] ftpRemoteFileClient$OutputStreamDestFile : permissions = 644
    2026-07-17T17:09:11.824Z  INFO  --- [    Test worker] ftpRemoteFileClient$OutputStreamDestFile : atime = 1784308145
    2026-07-17T17:09:11.824Z  INFO  --- [    Test worker] ftpRemoteFileClient$OutputStreamDestFile : mtime = 1784308146

7 tests completed, 1 failed


|  Results: FAILURE (7 tests, 6 successes, 1 failures, 0 skipped)  |


> Task :server:libs:modules:components:ftp:testIntegration FAILED

@matijapetanjek
matijapetanjek marked this pull request as draft July 19, 2026 17:22
Comment thread server/apps/server-app/src/main/resources/config/application-bytechef.yml Outdated
Comment on lines +190 to +202
private boolean isUpgrade(String currentPlanName, String newPlanName) {
return planTier(newPlanName) > planTier(currentPlanName);
}

private int planTier(String planName) {
if ("STARTER".equalsIgnoreCase(planName)) {
return 1;
} else if ("GROWTH".equalsIgnoreCase(planName)) {
return 2;
}

return 0;
}

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.

@matijapetanjek da li mozemo izbjeci hardkodiranje imena planova? Da li informacija o tipu plana(0,1,2), moze doci iz Stripe-a(metapodaci) ili biti zapisana negdje?

Comment on lines +253 to +258
if (billingProperties.stripe().productStarterId()
.equals(productId)) {
newPlanName = "STARTER";
} else if (billingProperties.stripe().productGrowthId()
.equals(productId)) {
newPlanName = "GROWTH";

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.

hardkodirana imena planova, mozemo li izbjeci?

private String resolveFlatProductId(String planName) {
if ("STARTER".equalsIgnoreCase(planName)) {
return billingProperties.stripe().productStarterId();
} else if ("GROWTH".equalsIgnoreCase(planName)) {

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.

hardkodirana imena planova, mozemo li izbjeci?

@matijapetanjek
matijapetanjek force-pushed the 513 branch 3 times, most recently from 75ce63d to a494ac7 Compare July 30, 2026 14:09
matijapetanjek and others added 27 commits August 4, 2026 16:29
…Stripe, don't just assume customer doesn/t exist
…duplicated checkWebhookSignature call which was present as a workaround for @transactional annotation
…ecutionsSince

Companion fix to the Task 1 interface rename: TrialServiceImpl and
BillingSubscriptionFacadeImpl (plus their tests) live in the same Gradle
module as BillingUsageService, so renaming the interface method broke
compilation for the whole module, not just the file that declared it.
Call sites only — the tasksUsed variable/DTO field names are unchanged
here and are handled by Tasks 2 and 3.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@sonarqubecloud

sonarqubecloud Bot commented Aug 4, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed for 'client'

Failed conditions
18.7% Coverage on New Code (required ≥ 80%)
4.9% Duplication on New Code (required ≤ 3%)
B Security Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@sonarqubecloud

sonarqubecloud Bot commented Aug 4, 2026

Copy link
Copy Markdown

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants