Solo Founder SaaS

Indie SaaS

The dashboard preloads another customer record, exposes billing config in JavaScript, lets the browser self-upgrade a paid plan, and uses weak form validation throughout.

Expected Findings

  • Anonymous users can read any account by changing the user ID.
  • Static config and .env files disclose Stripe and session material.
  • Paid subscription upgrade trusts client-supplied payment state.
  • Admin surface is reachable without authentication.
  • Signup validation is almost entirely client-side and trivially bypassed.

Signals

Validation
if (email.includes("@")) allowInvite(email)
Paid Gate
if (form.paid === "true" || form.plan !== "starter") grantPlan(form.plan)
Billing Config
window.__BILLING__ = { stripePublicKey: "pk_test_founder_mode" }