Layered the same way as the rest of my backend work - router, service, repository, model - typed end to end with Pydantic and SQLAlchemy 2 async. Stripe Checkout is called directly over httpx rather than through its SDK, and a background job expires unpaid orders and releases the inventory they were holding, so abandoned carts don't lock up stock indefinitely.
Highlights
Storefront + admin
Catalog, cart, Stripe checkout, wishlist, and reviews; an admin side with analytics and management UI.
Inventory expiry job
A background job expires unpaid orders and releases the stock they reserved.
Learning project
A solo build exploring full-stack e-commerce end to end, not a deployed store.
Stack