Skip to content

Repository files navigation

TypeScriptBunHonoNext.jsPostgreSQLDrizzleRedisStripeTailwindFly.ioVercel

Stackr

Where Wholesale Meets Excellence.

Stackr is an AI-powered B2C & B2B multi-vendor wholesale marketplace. Retailers discover and buy curated inventory at scale. Wholesalers manage their catalog, payouts, and analytics in one place. Admins oversee the entire ecosystem.

🔗 Livestackr-nine.vercel.app

Stackr


What it does

  • Storefront — full-text + faceted search, product detail pages, B2C cart & checkout
  • B2B Wholesale — minimum order quantity enforcement, wholesale pricing, store-owner portal
  • Wholesaler Dashboard — product catalog management, order tracking, payout history, analytics
  • Admin Panel — user management, order oversight, commission control, platform analytics
  • AI Features — personalized recommendations, similar products, frequently-bought-together
  • Automated Payouts — daily Stripe Connect batch transfers to wholesalers
  • Shipping — EasyPost label generation and real-time tracking webhooks

Architecture

graph TD
FE["Next.js 15\nVercel"]
API["Hono API\nFly.io"]
WK["BullMQ Worker\nFly.io"]
DB["PostgreSQL\nNeon"]
RD["Redis\nUpstash"]
TS["Typesense\nFly.io"]
R2["Cloudflare R2"]
ST["Stripe Connect"]
EP["EasyPost"]
AI["Voyage AI\n+ pgvector"]
FE -- "HTTPS (proxied)" --> API
API --> DB
API --> RD
API --> TS
API --> R2
API --> ST
API --> EP
API --> AI
WK --> DB
WK --> RD
WK --> ST
RD -- "BullMQ" --> WK
Loading

Repo Structure

stackr/
├── apps/
│ ├── api/ # Hono + Bun REST API
│ ├── worker/ # BullMQ background jobs
│ └── web/ # Next.js 15 frontend
├── packages/
│ ├── db/ # Drizzle schema + Neon client
│ ├── auth/ # Better Auth config
│ ├── shared/ # Enums, types, queue constants
│ ├── email/ # Resend + React Email templates
│ └── config/ # Shared tooling configs
└── docs/ # Architecture & API reference

User Flows

flowchart LR
C[Customer] --> BC["Browse & Checkout"]
SO["Store Owner"] --> B2B["B2B Purchasing"]
WS[Wholesaler] --> CAT["Manage Catalog & Payouts"]
ADM[Admin] --> OPS["Platform Oversight"]
Loading

Data Flow — Checkout

sequenceDiagram
participant Browser
participant API
participant Stripe
participant DB
Browser->>API: POST /api/checkout
API->>DB: Reserve stock (atomic WHERE)
API->>Stripe: Create PaymentIntent
Stripe-->>Browser: client_secret
Browser->>Stripe: Confirm payment
Stripe->>API: Webhook (charge.succeeded)
API->>DB: Create order + orderItems
API->>DB: Release reservedStock
API->>DB: Insert commissions
Loading

Payout Pipeline

flowchart TD
CRON["Cron: 02:00 UTC"] --> QUERY["Query unpaid commissions"]
QUERY --> GROUP["Group by wholesaler"]
GROUP --> TRANSFER["Stripe Transfer"]
TRANSFER --> MARK["Mark payout = paid"]
MARK --> EMAIL["Notify wholesaler"]
Loading

Database Schema (overview)

erDiagram
user ||--o| wholesalerProfile : has
user ||--o| storeOwnerProfile : has
user ||--o| customerProfile : has
user ||--o{ address : has
product ||--o{ productVariant : has
product ||--o{ productImage : has
productVariant ||--o{ cartItem : in
productVariant ||--o{ orderItem : in
cart ||--o{ cartItem : contains
order ||--o{ orderItem : contains
order ||--o{ orderStatusHistory : tracks
orderItem ||--o| commission : generates
commission }o--|| payout : batched_into
order ||--o| shipment : has
shipment ||--o{ shipmentEvent : tracks
product ||--o| productEmbedding : has
user ||--o{ userInteractionEvent : logs
user ||--o{ recommendation : receives
Loading

Tech Stack

LayerStack
RuntimeBun
API FrameworkHono
DatabasePostgreSQL on Neon + Drizzle ORM
AuthBetter Auth (multi-role, cookie sessions)
Background JobsBullMQ + Upstash Redis
SearchTypesense (self-hosted on Fly.io)
AIVoyage AI embeddings + pgvector + Anthropic
PaymentsStripe Connect
EmailResend + React Email
File StorageCloudflare R2
ShippingEasyPost
FrontendNext.js 15, Tailwind v4, TanStack Query, Zustand
HostingFly.io (API + Worker), Vercel (Web), Neon (DB)

Local Development

# 1. Install dependencies
pnpm install
# 2. Add env files# apps/api/.env.local, apps/worker/.env.local, apps/web/.env.local# 3. Push DB schema (dev branch)
pnpm db:push
# 4. Start everything
pnpm dev
# API → http://localhost:3001# Web → http://localhost:3000

Stripe test card

4242 4242 4242 4242 (any future date, any CVC)

Deployment

# API
pnpm deploy:api # flyctl deploy apps/api/fly.toml# Worker
pnpm deploy:worker # flyctl deploy apps/worker/fly.toml# Frontend
pnpm deploy:web # vercel --cwd apps/web --prod

Docs

Releases

Packages

Contributors

Languages