A local marketplace where a listing becomes a reservation, a payment, and a QR-confirmed pickup. Live in Edmonton and Calgary.
Live
Marketplace home: browse by city, category, and condition.Product page: reserve for 30 minutes, choose how to pay, pick a window.Seller side: orders, earnings, and QR-confirmed handoffs.
Next.js
TypeScript
C# / .NET 10
PostgreSQL
Stripe Connect
AWS S3 / SES
Docker
Overview
CrowHub connects local buyers and sellers through listings, reservations, card payments, messaging, and QR-based pickup confirmation. Sellers get AI-written listings from photos, a store page, pickup windows, and subscription plans. Buyers reserve an item, pay online or at the door, and scan to confirm the handoff. I designed it, built it, shipped it, and run it.
My role
Founder, product, and engineering. I took CrowHub from solution design through implementation, testing, deployment, and ongoing operation. I used coding agents extensively for implementation and tests, and personally owned the architecture, the security review, production behaviour, and every release decision.
The problem
Local commerce needs more than a product catalogue. A reservation has to hold inventory for a limited window, payment has to reconcile with the provider, and pickup has to give both parties a clear, verifiable outcome. Most local marketplaces stop at the listing and leave the hard part to a text thread.
The solution
A Next.js storefront backed by a separate .NET 10 API with explicit order state transitions, PostgreSQL persistence, Stripe Connect payment orchestration for sellers, and QR-token pickup confirmation. Hosted background services handle reservation expiry, reminders, notifications, and AI listing analysis outside the request path.
System architectureCrowHub
Next.js storefront
.NET 10 Web API
PostgreSQL
Hosted services
AWS S3 / SES
Stripe Connect
Application architecture.NET 10 Web API
Engineering decisions
Give the domain its own API boundary
The Next.js storefront calls a separate .NET API. Marketplace transitions and payment rules live in the backend, and the interface can evolve independently. The cost is a second deployment boundary to operate, which I accepted for the clarity it buys.
Treat payment events as external facts
The webhook handler verifies Stripe signatures before processing anything. Event claiming and duplicate handling are explicit, and every payment event reconciles provider state with local order state rather than assuming they agree.
Release inventory carefully
The expiry sweeper cancels outstanding payment intents before releasing inventory, and skips orders whose payments already succeeded or cannot be safely resolved. Expiry and payment race each other, and the sweeper is written to lose that race safely.
Move recurring work out of requests
.NET hosted services handle reservation expiry, payment-method expiry, notifications, and listing analysis with cancellation-aware processing, so interactive requests stay fast and background failures are isolated.
Key capabilities
Seller onboarding and listings
Seller registration, image uploads, AI-assisted listing generation from photos, store pages, and tiered subscription plans.
Reservations and payments
Time-boxed inventory reservations, Stripe payment flows with connected seller accounts, pay-online or pay-at-pickup, and signed webhook handling.
QR pickup confirmation
A QR token ties the digital order to the physical handoff. The seller scans, the card is charged, and both sides see the outcome.
Messaging and operations
Buyer-seller conversations, notifications, admin endpoints, and cleanup services that keep inventory and orders consistent.
The hard parts
Payment and inventory are separate systems, and success at the payment provider can arrive before the API records it.
Abandoned reservations need cleanup without cancelling a completed payment or releasing inventory early.
Agent-generated code ships only after architectural review, behavioural tests, and watching it behave in production.
Outcomes and links
Live and operating in two cities, with real sellers, listings, and pickups.
One codebase covers the full listing-to-reservation-to-payment-to-pickup workflow, including the edge cases where those steps disagree.
A working demonstration of how I run AI-assisted delivery: agents implement, I review, test, and own the release.