I owned the architecture for FITREPS, a fitness creator platform, including infrastructure, CI, and the test platform. I built billing end to end while my co-founder Alan focused primarily on the frontend and content creation.

Choosing a database that supported iteration
FITREPS started on DynamoDB while we were still discovering how the application needed to query its data. Workout programs connected to workouts, exercises, and reusable exercise templates. Comments, likes, and bookmarks added relationships between users and content.
As those requirements evolved, the data layer became increasingly difficult to reason about. I moved the relational data to Aurora PostgreSQL so we could adapt queries more easily and iterate faster. I made the transition before launch, migrating the existing development users and their data.
Building billing around failure and recovery
I built the Stripe integration, creator onboarding through Stripe Connect, subscriptions, and the surrounding refund and payout flows. The hardest part was handling failed payments, delayed events, and repeated webhook deliveries correctly.
Subscription processing protects against duplicate events and supports retries. Successful checkout also updates subscription state directly, so access does not depend solely on a webhook arriving. Refund and payout handling includes explicit ledger adjustments and state transitions.
I tested billing end to end using Stripe test mode, with additional webhook and data-layer tests covering repeated events, refunds, and payout failures.
Making releases repeatable and recoverable
I built delivery checks alongside the application. Pull requests run lint, type checks, unit tests, application builds, infrastructure synthesis, and local platform integration tests. The local API runs the same Lambda handlers as AWS.
Development deployments update the backend before building the frontends, then run smoke tests followed by regression tests. Parallel test runs use separate users and server ports to avoid interfering with one another.
Production releases require a deliberate trigger and take a database snapshot before migrations. After deployment, read-only smoke checks verify the live system without creating test users or payment activity.









