Selected work

Product architecture made concrete.

These are sanitized architecture briefs: enough detail to show the product/system judgment, without exposing secrets, private data, or implementation internals that do not belong on a public professional site.

Case study / PaidToday Kit

Turning overdue invoice anxiety into a paid recovery workflow.

Solo product build Next.js / React Stripe / Supabase OpenAI with fallback generation

PaidToday Kit is a focused web app that turns one overdue invoice into a practical recovery pack: follow-up emails, SMS reminders, a phone script, final notice language, payment-page copy, and a next-step checklist.

The product problem is deliberately narrow: help freelancers, consultants, contractors, small agencies, and solo service businesses chase overdue invoices without sounding desperate, hostile, or unprofessional.

Product constraint

The MVP is intentionally accountless and payment-first. A buyer should move from landing page to structured intake, Stripe Checkout, paid result verification, and generated Markdown/copy output without requiring a user account, dashboard, accounting integration, or automated debtor contact.

That constraint forced the architecture to separate payment state, commercial entitlement, kit generation, and artifact delivery rather than hiding all of that under a generic user account model.

System shape

Landing page Structured intake Supabase draft records Stripe Checkout Server-side payment verification Generated recovery kit Copy controls / Markdown download

The architecture uses Next.js server actions and routes, Stripe Checkout for the commercial boundary, Supabase for durable records, and a generated artifact flow that remains useful even when optional providers are unavailable.

Architectural decisions

Payment is verified server-side

The client never gets to claim payment success. The result page verifies the Stripe Checkout Session before unlocking or generating the kit.

Entitlements are a ledger

Purchases, subscriptions, kit entitlements, entitlement uses, and generated kits are modeled as separate concepts so bundles and future subscriptions can evolve without corrupting the one-kit path.

AI is useful, not load-bearing

OpenAI generation improves output quality, but deterministic fallback generation protects paid fulfillment when API keys, quota, model behavior, or provider availability fail.

Scope protects launch speed

Accounts, dashboards, PDF generation, analytics, and accounting integrations are deferred until user behavior proves they are worth the operational and product complexity.

What this demonstrates

  • Product scoping around a painful, specific cash-flow problem.
  • Backend architecture that separates commercial rights from generated artifacts.
  • Payment-flow design that avoids trusting client-side success states.
  • Graceful degradation when AI, email, or webhook timing is imperfect.
  • Operational discipline around environment variables, server-only secrets, migrations, and smoke tests.

Contact

Want the architecture behind a product like this reviewed or built?

I am useful where product ambiguity, payment flows, data models, and backend reliability need to become one coherent system.