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; the simulated billing provider belongs to the demo mode guide, which you can follow in either order.
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/.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.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).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.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).src/server/test/factories/subscription.factory.ts, src/server/test/factories/workspace-trial.factory.ts, src/server/test/mocks/billing-provider-service.mock.ts.src/shared/domain/feature/, src/shared/domain/plan-price/, src/shared/domain/subscription/.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.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.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/.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.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/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.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.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.billingProvider, stripeSecretKey, stripeWebhookSecret, lemonSqueezyApiKey, lemonSqueezyStoreId, lemonSqueezyWebhookSecret and billingReferenceSecret in nuxt.config.ts.BillingInterval, SubscriptionStatus, TrialStatus and FeatureType.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.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.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.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.src/server/domain/user/use-user-service.ts.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.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.prisma/seed.ts.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.*).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.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.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.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.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.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.en-US.json, de-DE.json and the -server files in i18n/locales./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..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)..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..agents/knowledge/backlog.md, remove the link to the deleted billing page from the incident hint item.content/docs/02.core-concepts/10.incidents.md mention the billing provider dashboard; adjust that wording.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.To keep only one of Stripe and Lemon Squeezy, delete the other provider's:
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,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:
billingProvider key and NUXT_BILLING_PROVIDER.useBillingProviderService return the remaining provider; keep the demo branch if demo mode stays.provider values in Incidents.ConversionSection.included.billing, FaqSection.payments.*, MonetizationSection.description and MonetizationSection.subscriptions.description).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.