Skip to main content

Stripe Billing Gap Matrix

Purpose

This document turns the current Stripe billing surface into a concrete gap matrix for invoices, subscriptions, customer billing identity, and collection flows.

Use it to answer:

  • what the app already covers well
  • what is only partially covered
  • what still requires Stripe Dashboard or hosted Stripe flows
  • what should stay Stripe-side on purpose

This is scoped to the agency-operated Stripe Connect billing layer, not starter SaaS billing.

Related docs:

Status Key

  • Complete: supported in-app for normal operations
  • Partial: supported in-app for common cases, but important Stripe behavior is still missing
  • Missing: not meaningfully supported in-app yet
  • Stripe-side: intentionally reasonable to leave in Stripe unless we choose to own that admin surface

Current Source Of Truth

Primary implementation files today:

  • packages/backend/convex/lib/stripeNode.ts
  • packages/backend/convex/org/clientBillingNodeActions.ts
  • packages/backend/convex/org/clientBillingWebhooks.ts
  • packages/backend/convex/portal/workspace.ts
  • apps/app/src/app/[locale]/org/(dashboard)/subscriptions/[subscriptionRecordId]/page.tsx
  • apps/app/src/app/[locale]/portal/(dashboard)/billing/subscriptions/[subscriptionId]/billing-subscription-detail.client.tsx
  • apps/app/src/app/[locale]/org/(dashboard)/invoices/**
  • apps/app/src/app/[locale]/portal/(dashboard)/billing/**

Gap Matrix

AreaStatusCurrent in-app supportMissing or limited vs StripeMain repo surfacesPriority
Subscription create/update/cancel/reactivateCompleteCreate subscription, update plan/amount/interval/quantity, cancel now, cancel at period end, reactivate, preview invoice before changeStill modeled around a single primary subscription itemstripeNode.ts, clientBillingNodeActions.ts, org/portal subscription detail pagesDone
Subscription discounts / promo codesCompleteApply, clear, previewNo broader campaign-management UI for coupons/promotion codes themselvessame as aboveDone
Trial managementCompleteSet trial end, end now, preview billing impactNo higher-order trial policy managementsame as aboveDone
Pause / resume subscription lifecyclePartialPause collection, true pause, resume paused subscription, preview resumeStripe has no equivalent invoice preview for every pause-collection toggle; those remain direct actionssame as aboveMedium
Subscription schedulesPartialInspect schedule, set next phase, release schedule, preview scheduled changeNot a full phase composer: no multi-phase builder, future-start wizard, backdating flow, or broader schedule editing modelstripeNode.ts, clientBillingNodeActions.ts, portal/workspace.ts, subscription detail pagesHigh
Multi-item / multi-product subscriptionsMissingNone beyond a single primary item patternStripe supports multiple subscription items, add-ons, mixed recurring lines, bundled pricingsubscription code currently assumes items.data[0] in stripeNode.ts and UI drafts only model one recurring lineHigh
Charge automatically subscriptionsCompleteSubscription create/update supports send_invoice and charge_automatically, including saved default payment methods and incomplete-payment stateRevenue-recovery policy remains Stripe-sidesubscription actions, create dialogs, payment-method managerDone
Payment methods fully in-appCompleteSetupIntent-based add, remove, and default-payment-method management is available in-appCard entry remains Stripe-hosted/Elements by design; recovery policy remains Stripe-sidecustomer snapshot and setup-intent flows, org client billing surfacesDone
Usage-based / metered billingMissingNone as an app-native operational surfaceNo meters, no usage event recording UX, no metered subscription item flows, no billing-credit workflow for usage productsno app surfaces or backend action family for Stripe meters/usageHighest if pricing model needs usage
Invoice draft workflowCompleteCreate draft invoice, update draft, line items, finalize, sendNormal standalone invoice drafting is presentinvoice actions in clientBillingNodeActions.ts, org invoice pagesDone
Invoice state handlingCompleteDraft/open/paid/void/uncollectible visibility and sync via webhooksNormal state coverage existsinvoice record sync, invoice pages, portal billing invoice list/detailDone
Invoice revision / advanced editingPartialDraft invoices are editable; standard lifecycle actions existNo in-app support for revising finalized standalone open/uncollectible invoices; subscription-invoice revision is constrained by Stripe itselfinvoice backend/actions and org invoice UIMedium
Partial paymentsCompleteOpen invoices can collect an explicit partial amount from a saved payment method and attach it to the invoiceComplex installment schedules remain unsupportedinvoice actions and invoice detail payment surfacesDone
Invoice payment plansMissingNoneNo installment plan creation/update for invoicesno payment-plan backend/UI surfaceHigh for enterprise invoicing
Credit notes / refundsCompleteCredit note and refund operations existNo broader finance workflow layer around theminvoice actions in backend, invoice detail surfacesDone
Customer credit balance / invoice balance adjustmentsCompleteCustomer balance transactions are visible and authorized users can create debit/credit adjustmentsBroader approval workflows remain out of scopetransaction actions and client billing surfacesDone
Tax IDsPartialCustomer tax IDs are stored in the client business profile and synchronized through Stripe's tax-ID API on create/updateStripe remains the source of validation status; account-level registrations and liability configuration still require Stripeclient account billing fields, stripeNode.ts customer tax syncHigh
Automatic tax / tax behaviorPartialQuotes support automatic tax/default tax rates; catalog products and prices support tax codes/tax behaviorNo workspace-wide tax-liability setup or complete invoice/subscription automatic-tax policycatalog, quote, invoice, and subscription flowsHigh
Invoice rendering templates / invoice presentation controlsPartialTemplates are listed and some billing defaults exist in modelNo full admin UI for assigning, editing strategy, grouping rules, branding/memo/footer policy managementtemplate listing exists in backend; no full settings UIMedium
Hosted invoice page / hosted payment pageCompleteOpen hosted invoice URLs and PDFs from appStripe-hosted payment remains underlying payment surface by designportal billing pages, invoice detail pagesDone
Public billing artifact sharingCompleteCopy Stripe-hosted invoice, quote, and receipt links for a payer without granting portal accessBilling portal sessions, saved payment methods, collections, drafts, and subscription controls intentionally remain authenticatedorg invoice/quote/transaction actions and portal billingDone
QuotesCompleteCreate/update/finalize/cancel/accept/get/PDF flows exist in backendQuote UI depth may still be thinner than subscription/invoice UI, but core API support is presentstripeNode.ts, clientBillingNodeActions.ts, org quote surfacesMedium
Dunning / retries / reminder policyMissingApp reflects billing outcomesNo in-app policy editor for Smart Retries, retry schedule, reminder cadence, collection automationcurrently Stripe-config side, not app-managedMedium
Billing portal deep linksCompleteHosted Stripe entry points exist where usefulStill hosted by Stripe, but this is acceptable for payment collection and customer self-service edgesportal session helpers and billing pagesDone

What Still Forces People Back To Stripe

If the goal is "agents and clients should almost never need Stripe," these are the biggest remaining reasons someone would still need it:

  1. multi-item subscriptions
  2. invoice payment plans
  3. tax liability and automatic-tax policy
  4. usage-based billing, if the product will need it
  5. advanced dunning and reminder policy

Wave 1: Remove the biggest operational escapes to Stripe

  • In-app payment method management
  • charge_automatically subscription support
  • Partial payments on invoices
  • Customer credit balance adjustments
  • Customer tax-ID synchronization and billing identity

Wave 2: Close structural billing-model gaps

  • Multi-item subscriptions
  • Automatic tax, price tax behavior, and tax-code support
  • Invoice payment plans
  • Fuller subscription schedule composer

Wave 3: Expand to advanced billing models

  • Usage-based billing
  • Billing credits for usage products
  • Richer invoice revision workflows
  • Invoice rendering template administration

Wave 4: Optional Stripe-admin replacement work

  • Dunning / retry policy editor
  • Reminder automation editor
  • Revenue recovery control surface

Do not mark a row complete just because the backend API exists.

Mark a row Complete only when all of the following are true:

  • org users can perform the normal workflow in-app
  • portal/client users can perform their allowed workflow in-app or through an app-launched hosted Stripe payment surface where that is the intended model
  • public payers can use a resource-scoped hosted invoice link without receiving access to the customer's broader portal or billing account
  • webhook sync keeps the mirrored records trustworthy
  • important billing-impacting actions have preview or review steps where Stripe supports them
  • there is no routine operational reason to open the Stripe Dashboard for that workflow

What Is Reasonable To Leave Stripe-Side

These are valid candidates to leave in Stripe unless we intentionally want to own finance-admin tooling:

AreaRecommendationWhy
Smart Retries strategyStripe-sideFinance-policy configuration, not core day-to-day product workflow
Reminder cadenceStripe-sideSimilar to retries; useful but not essential to product-native billing ops
Invoice branding/template editingStripe-side or PartialNeeded by some teams, but not required to eliminate most Stripe Dashboard usage
Obscure subscription schedule edge casesStripe-side until neededLow-frequency, high-complexity
Private-preview Stripe billing featuresStripe-sideProduct should not depend on unstable/private-preview admin features unless explicitly chosen

Stripe References