---
title: "Remove Billing, Plans and Entitlements"
description: "Learn what to delete to remove Stripe or Lemon Squeezy billing, subscriptions, plans, trials and entitlements."
canonical_url: "https://www.vuesion.dev/docs/removal/billing"
---

> Index of every page on this site: [llms.txt](https://www.vuesion.dev/llms.txt)

# Remove Billing, Plans and Entitlements

Vuesion monetizes workspaces in layers: Stripe or Lemon Squeezy billing, subscriptions and plan prices on top of plans, features, overrides and trials, which resolve into entitlements such as the member limit. Removing only the payments leaves a plan system without a purpose, so this guide removes the whole stack: workspaces then have no plans, no limits and no admin Plans area. It follows the [shared removal loop](https://www.vuesion.dev/docs/removal/shared-removal-loop); the simulated billing provider belongs to the [demo mode guide](https://www.vuesion.dev/docs/removal/demo-mode), which you can follow in either order.

## Entry points

- Domains: `src/server/domain/subscription/`, `src/server/domain/workspace-trial/`, `src/server/domain/workspace-plan/`, `src/server/domain/entitlement/`, `src/server/domain/feature/`, `src/server/domain/plan/`, `src/server/domain/plan-price/`, `src/server/domain/plan-feature/`, `src/server/domain/workspace-feature-override/`.
- Admin API: `src/server/api/admin/plans/`, `src/server/api/admin/features/`, `src/server/api/admin/subscriptions/`, `src/server/api/admin/workspaces/[id]/entitlements.get.ts`, `src/server/api/admin/workspaces/[id]/entitlements.get.spec.ts`, `src/server/api/admin/workspaces/[id]/plan.get.ts`, `src/server/api/admin/workspaces/[id]/plan.patch.ts`, `src/server/api/admin/workspaces/[id]/feature-overrides/`, `src/server/api/admin/workspaces/[id]/trial/`. The specs of the plan routes sit next to them and go with them.
- Workspace API: `src/server/api/workspaces/[id]/billing/`, `src/server/api/workspaces/[id]/billing.get.ts`, `src/server/api/workspaces/[id]/entitlements.get.ts`, `src/server/api/workspaces/[id]/member-slots.get.ts`, each with its spec, and `src/server/api/webhooks/`, which only holds the Stripe and Lemon Squeezy webhooks (`stripe.post.ts`, `lemonsqueezy.post.ts`).
- Provider and tasks: `src/server/services/lemon-squeezy-webhook.ts`, `src/server/services/stripe-webhook.ts`, `src/server/services/use-billing-provider-service.ts`, `src/server/services/use-lemon-squeezy-billing-provider-service.ts`, `src/server/services/use-stripe-billing-provider-service.ts`, each with its spec, and `src/server/tasks/subscription-reconciliation.ts`, `src/server/tasks/workspace-trial-expiry.ts`.
- Emails: `src/server/emails/subscription-active/`, `src/server/emails/subscription-ended/`, `src/server/emails/trial-expired/`, `src/server/emails/trial-reminder/`, and the generated files with the same names in `src/public/email-templates/` (`subscription-*` and `trial-*`, both locales).
- Test helpers: `src/server/test/factories/subscription.factory.ts`, `src/server/test/factories/workspace-trial.factory.ts`, `src/server/test/mocks/billing-provider-service.mock.ts`.
- Shared domain: `src/shared/domain/feature/`, `src/shared/domain/plan-price/`, `src/shared/domain/subscription/`.
- Shared types: `src/shared/types/domain/Entitlement.ts`, `src/shared/types/domain/Feature.ts`, `src/shared/types/domain/Plan.ts`, `src/shared/types/domain/PlanFeature.ts`, `src/shared/types/domain/PlanPrice.ts`, `src/shared/types/domain/PlanPriceListQuery.ts`, `src/shared/types/domain/Subscription.ts`, `src/shared/types/domain/WorkspaceBilling.ts`, `src/shared/types/domain/WorkspaceFeatureOverride.ts`, `src/shared/types/domain/WorkspaceFeatureOverrideListQuery.ts`, `src/shared/types/domain/WorkspacePlan.ts`, `src/shared/types/domain/WorkspaceTrial.ts`.
- Form models: `src/shared/types/ui/forms/FeatureValueFormModel.ts`, `src/shared/types/ui/forms/PlanFeatureFormModel.ts`, `src/shared/types/ui/forms/PlanFormModel.ts`, `src/shared/types/ui/forms/PlanPriceFormModel.ts`, `src/shared/types/ui/forms/WorkspaceFeatureOverrideFormModel.ts`, `src/shared/types/ui/forms/WorkspacePlanFormModel.ts`.
- App components and pages: `src/app/components/domain/feature/`, `src/app/components/domain/plan/`, `src/app/components/domain/plan-price/`, `src/app/components/domain/workspace-feature-override/`, `src/app/components/domain/workspace-plan/`, `src/app/components/domain/workspace-trial/`, `src/app/components/domain/workspace/WorkspaceBilling/`, `src/app/components/domain/workspace-member/WorkspaceMemberSlots/`, `src/app/pages/admin/plans/`.
- App composables: `src/app/composables/features/use-checkout-return.ts`, `src/app/composables/actions/use-feature-actions.ts`, `src/app/composables/actions/use-plan-actions.ts`, `src/app/composables/actions/use-plan-price-actions.ts`, `src/app/composables/actions/use-workspace-feature-override-actions.ts`.
- App stores: `src/app/store/feature.ts`, `src/app/store/plan.ts`, `src/app/store/plan-price.ts`, `src/app/store/workspace-feature-override.ts`. Specs and stories sit next to the app files and go with them.
- Prisma: `prisma/schema/plan.prisma` (Plan, PlanFeature), `prisma/schema/plan-price.prisma` (PlanPrice, enum BillingInterval), `prisma/schema/subscription.prisma` (Subscription, enum SubscriptionStatus), `prisma/schema/workspace-plan.prisma`, `prisma/schema/workspace-trial.prisma` (WorkspaceTrial, enum TrialStatus), `prisma/schema/feature.prisma` (Feature, enum FeatureType), `prisma/schema/workspace-feature-override.prisma`. The seed `prisma/seed.ts` only syncs the feature catalog and bootstraps the default plan.
- Docs and knowledge: `content/docs/02.core-concepts/06.plans-and-entitlements.md`, `content/docs/02.core-concepts/07.billing-and-subscriptions.md`, and the ADRs `.agents/knowledge/adr/0002-entitlements-not-plan-names.md`, `.agents/knowledge/adr/0003-plans-are-versioned.md`, `.agents/knowledge/adr/0004-over-limit-policy.md`, `.agents/knowledge/adr/0005-effective-plan-resolution.md`, `.agents/knowledge/adr/0007-billing-provider-owns-billing-emails.md`. ADR 0006 (incidents) stays.
- The env variables `NUXT_BILLING_PROVIDER`, `NUXT_STRIPE_SECRET_KEY`, `NUXT_STRIPE_WEBHOOK_SECRET`, `NUXT_LEMON_SQUEEZY_API_KEY`, `NUXT_LEMON_SQUEEZY_STORE_ID`, `NUXT_LEMON_SQUEEZY_WEBHOOK_SECRET` and `NUXT_BILLING_REFERENCE_SECRET` in `.env-example`.
- The runtime config keys `billingProvider`, `stripeSecretKey`, `stripeWebhookSecret`, `lemonSqueezyApiKey`, `lemonSqueezyStoreId`, `lemonSqueezyWebhookSecret` and `billingReferenceSecret` in `nuxt.config.ts`.
- The Prisma enums `BillingInterval`, `SubscriptionStatus`, `TrialStatus` and `FeatureType`.
- The i18n namespaces `BillingInterval`, `SubscriptionStatus`, `Feature`, `SupportLevel`, `FeatureValueForm`, `PlanForm`, `PlanTable`, `PlanPriceForm`, `PlanPriceTable`, `WorkspaceBilling`, `WorkspaceFeatureOverrideForm`, `WorkspaceMemberSlots`, `WorkspacePlanForm`, `WorkspaceTrialForm`, `common.Plans`, `pages.admin.plans.*` and `WorkspaceSettings.Billing.*`, and the server namespaces `email.SubscriptionActive`, `email.SubscriptionEnded`, `email.TrialExpired` and `email.TrialReminder`.

## Not found by the compiler

- Config: in `nuxt.config.ts`, remove the scheduled-task entry `'0 * * * *'` with `subscription-reconciliation` and `workspace-trial-expiry`, the seven runtime config keys and the route rules of both webhooks. Delete the `scheduledTasks` block if it becomes empty. Remove the seven variables from `.env-example`.
- Workspace creation and rules: in `src/server/domain/workspace/use-workspace-service.ts`, remove the two `workspacePlan` assignments of the default plan (personal and regular workspace creation), the `subscriptions` guards on workspace deletion and ownership transfer (`CurrentSubscriptionWhere`), `getWorkspaceMemberSlots`, and the `trials` select and `activeTrial` of the admin views. Remove `activeTrial` from `src/server/api/admin/workspaces/[id]/index.get.ts`.
- Member limit: remove the three limit checks and the slot counting in `src/server/domain/workspace-invitation/use-workspace-invitation-service.ts`, `canAddWorkspaceMember` and `canManageWorkspaceBilling` in `src/server/domain/workspace/workspace.policy.ts`, and `WorkspaceMemberLimitError` in `src/server/utils/errors.ts`. In `src/app/pages/workspace-invitations/[id]/index.vue`, remove the `WORKSPACE_MEMBER_LIMIT` branch and the `WorkspaceInvitation.accept.workspaceFull.*` keys. After this, workspaces have no member limit.
- Users: delete the guard against deleting a user who owns a workspace with a current subscription in `src/server/domain/user/use-user-service.ts`.
- Errors and helpers: delete `TrialNotAllowedError`, `TrialNotActiveError` and `ProviderError` with `getProviderErrorCategory` in `src/server/utils/errors.ts`, after checking that nothing else uses them. Delete `assignTestPlan` in `src/server/test/factories/workspace.factory.ts` and `resetBillingProviderServiceMocks` in `src/server/test/setup.ts`.
- Test databases: `src/server/test/global-setup.ts` creates `testdb_reconciliation`, `testdb_trial_expiry` and `testdb_trial_reminders` (env variables `RECONCILIATION_TEST_DATABASE_URL`, `TRIAL_EXPIRY_TEST_DATABASE_URL`, `TRIAL_REMINDER_TEST_DATABASE_URL`) from the template `testdb_demo`. Delete the three databases and variables. `testdb_demo` stays while the demo exists.
- Seed: remove the feature catalog sync and the default plan bootstrap from `prisma/seed.ts`.
- Shared types: remove `workspacePlan`, `trials`, `activeTrial` and `WorkspaceMemberSlotUsage` from `src/shared/types/domain/Workspace.ts`. In `src/shared/enums/translation-maps.ts`, remove `getBillingIntervalTranslations`, `getSubscriptionStatusTranslations`, `getFeatureTranslations` and `getFeatureEnumValueTranslations` (`SupportLevel.*`).
- Emails: remove the four send methods, their params interfaces and `getBillingUrl` from `src/server/services/use-email-service.ts`. Remove the server i18n keys `email.SubscriptionActive`, `email.SubscriptionEnded`, `email.TrialExpired` and `email.TrialReminder` from the `-server` locale files.
- Workspace settings and stores: in `src/app/pages/workspaces/[workspaceId]/settings.vue`, remove the "Plan & Billing" section (`WorkspaceBilling`, checkout return handling, billing actions) and the `WorkspaceMemberSlots` block. In `src/app/store/workspace.ts` and `src/app/composables/actions/use-workspace-actions.ts`, remove entitlements, member slots, billing, checkout, subscription and trial state and actions. In `src/app/store/admin-workspace.ts` and `src/app/composables/actions/use-admin-workspace-actions.ts`, remove plan and trial state and actions. Remove their specs.
- Admin area: in `src/app/layouts/app.vue`, remove the "Plans" sidebar link. In `src/app/pages/admin/workspaces/[workspaceId]/index.vue`, remove the plan, trial and feature-override sections. In `src/app/components/domain/workspace/WorkspaceTable/WorkspaceTable.vue`, remove the plan and trial display.
- Incidents: remove only the subscription parts, the incident system stays. Remove the `end-subscription` action from `src/app/components/domain/incident/IncidentDetails/IncidentDetails.vue`, `src/app/components/domain/incident/IncidentTable/IncidentTable.vue`, `src/app/pages/admin/incidents/index.vue`, `src/app/store/incident.ts` (`endMissingSubscription`) and `src/app/composables/actions/use-incident-actions.ts`. Incident stories and API specs that use billing sample data may stay.
- Prisma: delete the seven schema files, `Workspace.workspacePlan`, `featureOverrides`, `subscriptions` and `trials` in `prisma/schema/workspace.prisma`, and `User.startedTrials` in `prisma/schema/user.prisma`. Then create a new migration with `npm run db:migrate` and never edit the existing `init` migration. The migration drops data: existing subscription, plan and trial rows are lost, so back up first and confirm the migration. The generated client and `src/public/swagger/openapi.json` are regenerated by the scripts.
- Text: delete or replace `FaqSection.payments.*`, `ConversionSection.included.billing`, `FoundationSection.platform.subscriptions`, `FoundationSection.collaboration.featureLimits`, `HeroComposition.plan.title` and the whole `MonetizationSection` (only if you keep marketing; see the marketing guide). The privacy policy `src/app/pages/privacy-policy/index.vue` names Lemon Squeezy as a processor in "purchases" and in the processor list. These are legal texts: replace them with your own.
- i18n: the extractor never removes keys. Delete unused keys by hand from `en-US.json`, `de-DE.json` and the `-server` files in `i18n/locales`.
- Docs: delete links to the two deleted pages everywhere (`/docs/core-concepts/plans-and-entitlements`, `/docs/core-concepts/billing-and-subscriptions`). Remove the "Plans" section of `content/docs/02.core-concepts/04.workspaces.md`, the entitlement mentions in `content/docs/02.core-concepts/05.authorization.md`, and the "Billing incidents" section and billing examples in `content/docs/02.core-concepts/10.incidents.md`, and the sentence "unrelated to plans and entitlements" in `content/docs/02.core-concepts/03.authentication.md`. In `content/docs/03.development/04.configuration.md`, remove the Stripe, Lemon Squeezy and billing sections (environment variables, "Billing test and live mode", "Lemon Squeezy products and plan prices", "Stripe products and plan prices", "Stripe webhook and portal setup", "Billing webhook"), the billing mention in "Scheduled tasks" (`subscription-reconciliation`), the trial and subscription rows and the billing-provider paragraph in "Emails", and the plans, plan features and plan prices in "Customize the seed". In `content/docs/03.development/05.database.md`, remove the default-plan lines.
- Agent skills: replace references to deleted code with surviving code in `.agents/skills/vuesion-testing/SKILL.md` (`PlanPriceTable.spec.ts` and its stories as reference), `.agents/skills/vuesion-workspace-feature/SKILL.md` (`fetchWorkspaceEntitlements` in `src/app/store/workspace.ts`) and `.agents/skills/vuesion-backend/SKILL.md` (billing provider, seeded plans and catalog features, subscription factories).
- Agent knowledge: in `.agents/knowledge/domain.md`, delete the stack line "Stripe or Lemon Squeezy billing (one per installation, `NUXT_BILLING_PROVIDER`) plus a simulated billing provider for demo mode" and the whole scheduled-task line (it only names `subscription-reconciliation` and `workspace-trial-expiry`). Delete the product rules for ADR 0002 to 0005 and 0007 and the glossary terms Plan, Entitlement/feature, Per-workspace feature override, Effective plan, Trial and Subscription.
- Agent knowledge, continued: adjust the Workspace glossary entry ("owns members, a plan and its data"). In `.agents/knowledge/backlog.md`, remove the link to the deleted billing page from the incident hint item.
- Incident wording: ADR 0006 and `content/docs/02.core-concepts/10.incidents.md` mention the billing provider dashboard; adjust that wording.
- Demo: if the demo still exists, its seed `src/server/demo/seed-demo-data.ts` and `src/server/demo/complete-demo-checkout.ts` use plans and subscriptions. Follow the demo guide, which removes both.

## Remove one provider

To keep only one of Stripe and Lemon Squeezy, delete the other provider's:

- service (`use-stripe-billing-provider-service.ts` or `use-lemon-squeezy-billing-provider-service.ts`), webhook parser (`stripe-webhook.ts` or `lemon-squeezy-webhook.ts`) and webhook route (`src/server/api/webhooks/stripe.post.ts` or `lemonsqueezy.post.ts`), each with its spec,
- runtime config keys in `nuxt.config.ts` (`stripeSecretKey`, `stripeWebhookSecret` or `lemonSqueezy*`), env variables in `.env-example` (`NUXT_STRIPE_*` or `NUXT_LEMON_SQUEEZY_*`) and the route rule of its webhook.

Then:

- Remove the `billingProvider` key and `NUXT_BILLING_PROVIDER`.
- Make `useBillingProviderService` return the remaining provider; keep the demo branch if demo mode stays.
- Delete the paragraphs of the removed provider in the docs and adjust the `provider` values in [Incidents](https://www.vuesion.dev/docs/core-concepts/incidents).
- Delete the removed provider from the landing wording ("Stripe or Lemon Squeezy" in `ConversionSection.included.billing`, `FaqSection.payments.*`, `MonetizationSection.description` and `MonetizationSection.subscriptions.description`).

## Coding-agent prompt

> Read this guide and the shared removal loop. Delete every entry point of this guide, handle every item under "Not found by the compiler", and run the loop until lint, test and build pass.

## Sitemap

See the full [sitemap](https://www.vuesion.dev/sitemap.md) for all pages.
