# MerchWinner: I shipped a POD course marketplace before the catalog had courses

Source: https://www.michaelchurley.com/blog/merchwinner-pod-course-marketplace  
Published: 2026-08-08  
Author: Michael C. Hurley  
Tags: merchwinner, print-on-demand, course-marketplace, nextjs, convex, clerk, stripe, resend, catppuccin, martech, pod

![MerchWinner live home. Start Learning / Become an Instructor](/blog/merchwinner-pod-course-marketplace/screenshots/home.png)

## Who

I kept meeting people who wanted Amazon Merch, Etsy POD, and Shopify print-on-demand to pay rent, and who were buying theory courses from people who had not shipped a design in years.

MerchWinner is for aspiring merch sellers who want practitioners. It is for active sellers who will teach if the split and the platform are not a second job. It is for operators who want to see a full Clerk + Convex + Stripe course-marketplace shape on Next.js 16 without pretending the catalog is full.

If you have ever built the checkout before the first SKU, this is for you.

## What

I shipped **MerchWinner.com**: a user-contributed course marketplace for learning how to sell merch online. Public surfaces: home, `/courses` with search/category/sort, course detail + lesson player, `/instructors`, `/about`. Instructor workspace for create/edit/publish, lesson reorder, earnings, analytics, profile. Student enrollment dashboard. Money path on Stripe: one-time course and bundle checkout, Pro/Unlimited memberships, webhook to Convex purchases/subscriptions, Resend mail for enrollment, invoice, renewal, review reminders.

Stack from the lockfile, not the stale README line: **Next.js ^16.2.6**, **React ^19.2.6**, **Convex ^1.38.0**, **Clerk**, **Stripe ^22.1.1**, **Resend**, PostHog, Sentry, Tailwind v4, Radix, Catppuccin Mocha default. Package **0.1.0**, private under HurleyUS. **86** commits. HEAD `65c4413`.

![Live courses page: search UI with empty catalog](/blog/merchwinner-pod-course-marketplace/screenshots/courses-live.png)

Billing facts in `lib/billing.ts`: `PLATFORM_FEE_PERCENT = 20` (creator net 80%). Plans: Pro **$29/mo** / **$278/yr** (3 courses/month) and Unlimited **$49/mo** / **$470/yr**. Homepage marketing still says "Earn 70% of every course sale." I would rather name the mismatch than paper it over.

Convex schema covers users (student/instructor/admin), instructorProfiles, courses, lessons, enrollments with progress, subscriptions, coursePurchases, bundlePurchases, payoutRequests, reviews. Eighteen App Router pages. Fourteen API routes. Bun + Biome + ship script.

![About page: practitioner POD curriculum](/blog/merchwinner-pod-course-marketplace/screenshots/about.png)

## Where

Code lives at [github.com/HurleyUS/merchwinner.com](https://github.com/HurleyUS/merchwinner.com) (private). Live site: [www.merchwinner.com](https://www.merchwinner.com). Vercel project URL on the repo homepage field: [merchwinner-com.vercel.app](https://merchwinner-com.vercel.app). Apex redirects to www.

Audience sits next to every POD Discord still arguing Redbubble vs Merch while nobody ships curriculum. Contact in README: michael@hustlelaunch.com. Same operator family as the other HurleyUS Next/Convex products.

![Instructors page: shell loaded, no profiles yet](/blog/merchwinner-pod-course-marketplace/screenshots/instructors-live.png)

## When

**2026-01-08.** `91c1e8e` Initial commit: Next.js, Convex, Tailwind. Same day: opportunities doc and homepage pass.

**February.** Next 16 + React 19. Catppuccin dark mode, layout variants, stub `/courses` and `/about`. Feb 21 standards mega-fix closes a pile of issues. middleware, providers, schema, icons, fonts, email docs.

**March 20–22.** Stripe checkout patterns, instructor profile and earnings, webhook typing. Money enters the building.

**March 25.** Fourteen commits. Resend templates. Phase 2 webhook to email. Phase 3a–3c: instructor course creation, lesson manage UI, student enrollment and lesson player.

**March 26.** Nineteen commits. Phase 4 search/filters/SEO/schema markup. Phase 5 reviews UI + reminders. Phase 6a/6b earnings and analytics merges. Production-ready checklist docs.

**March 27.** Catppuccin unify across the site. Instructor and enrollment CTAs.

**May 13–15.** shipprep standards and a Blacksmith CI/deploy verification flurry.

**2026-08-08, 06:55 ET.** `65c4413` set X-Robots-Tag to index, follow on Vercel. HEAD. Eighty-six commits total.

On September 8, 2026 the live `/courses` page still reads **"No courses available yet."** The marketplace shipped. The catalog did not.

![Illustrative instructor earnings mock. 20% platform fee math](/blog/merchwinner-pod-course-marketplace/screenshots/instructor-earnings-mock.png)

## Why

I did not want another "courses coming soon" landing page with a Mailchimp box. I wanted the boring spine: auth roles, course/lesson tables, Stripe sessions, webhooks that enroll, email that confirms, instructor earnings that know the fee, student progress that is not a Google Sheet.

So I compressed the spine across six phases and left the honesty visible: empty catalog, empty instructors grid, README still claiming Next 15.5.6 and Payments N/A while Stripe and Next 16 are in the lockfile. Version 0.1.0. Private on purpose until the first real courses earn the public launch.

What would you publish first on MerchWinner: Amazon Merch niche research, Etsy POD ops, or TikTok ads that actually sell shirts?
