# iLeague.golf: I built Patreon meets 18Birdies for golf creators — and left Clerk on pk_test

Source: https://www.michaelchurley.com/blog/ileague-golf-patreon-meets-18birdies  
Published: 2026-08-08  
Author: Michael C. Hurley  
Tags: ileague, ileague-golf, golf, creator-economy, patreon, 18birdies, stripe, convex, clerk, nextjs, expo, itour, hurleyus

![iLeague.golf homepage mock. Patreon meets 18birdies, Top 54 qualify for iTour](/blog/ileague-golf-patreon-meets-18birdies/screenshots/home.png)

## Who

I build products in public for operators, not for pitch decks. Golf creators already duct-tape a scorecard app to a Patreon to a tip jar. Fans already bounce between three tabs to follow a round and pay for the good stuff.

iLeague.golf is for those creators and those fans, and for anyone shipping a Bun monorepo that has to hold a Next.js web app, an Expo companion, and a Convex backend without lying about what is finished.

If you care about creator-economy plumbing, Stripe tier math, or how a generic "influencer" scaffold gets rebranded into a sport vertical: this is the field notes.

## What

I shipped a golf creator platform under `HurleyUS/ileague.golf`.

The README line is blunt: **Patreon meets 18birdies**. The live lander says the same badge, then: **Where Golf Creators Build Empires**. Track rounds. Build a following. Get paid through subscriptions and tips. **Top 54** creators qualify for [iTour.golf](https://itour.golf). Winners aim at iConference.

Stack on the box: **Next.js 15.5.9**, React 18.3.1, **Convex**, **Clerk**, **Stripe**, PostHog, Sentry, Resend, Tailwind v4, Bun workspaces, Expo 52 mobile, Phosphor icons via react-icons, Vercel. Package version **1.0.0**. Repo is private. Site is public at [ileague.golf](https://ileague.golf).

![Creator profile mock. followers, subscribers, earnings, content grid](/blog/ileague-golf-patreon-meets-18birdies/screenshots/creator-profile.png)

Monetization is not a slide. It is `apps/web/src/lib/billing.ts`:

- Platform fee **15%**
- Tip presets **$5 / $10 / $20 / $50 / $100**
- Suggested creator tiers. Bronze $4.99, Silver $9.99, Gold $24.99 monthly (yearly suggested too)
- Real tiers live in Convex `subscriptionTiers` and check out through dynamic Stripe `price_data` (web API + Convex actions)

Content model covers video, shorts, images, links, text, and **round recaps** tied to scorecards. Visibility: public / followers / subscribers. Courses, course reviews, rounds (FIR/GIR/putts), standings, leagues, notifications. all in `convex/schema.ts`.

What is also true: the dashboard still says **influencers**. Explore still calls `getInfluencers`. The README still says **Top 36** while the live hero says **Top 54**. Production HTML still loads Clerk **`pk_test`** from a `*.clerk.accounts.dev` instance. The scorecard schema is ahead of the hole-entry UI. That is the product, part of the story.

![Billing mock. Bronze / Silver / Gold + tip presets](/blog/ileague-golf-patreon-meets-18birdies/screenshots/billing-tiers.png)

## Where

It runs on Vercel against Convex. Auth is Clerk. Money is Stripe. Mail is Resend. Errors go to Sentry. Product events go to PostHog. Mobile is Expo with EAS configs and placeholder Apple submit IDs.

Surfaces that matter:

- Public lander. emerald/slate hero, feature grid, creator/fan columns, ecosystem footer
- Auth + onboarding. Clerk sign-in/up, role/profile setup
- App shell. dashboard, explore, leagues, notifications
- Creator profile. `/creator/[id]` with hero, featured courses, content grid
- Payments. `/api/stripe/checkout`, portal, webhook; Convex `/stripe-webhook`

Audience sits with golf creators, golf fans, and builders watching a sport vertical on a creator-economy stack. Sibling properties: iTour.golf and iConference.golf under the HurleyUS lane.

![Scorecard / schema mock. hole-by-hole model vs missing UI](/blog/ileague-golf-patreon-meets-18birdies/screenshots/scorecard.png)

## When

**2026-01-09.** Initial monorepo. web + mobile. Convex stubs. React 19 downgraded to 18 for Clerk/Convex. Vercel monorepo config. First production deploy on a hustle-launch Vercel URL. CHANGELOG also remembers the earlier `michaelmonetized/ileague-app` GitHub link.

**January 31.** Chore sync.

**February 4.** Mobile leagues pushed toward Convex. EAS config. Roadmap honesty about hardcoded mobile screens.

**February 11.** HurleyUS repo created. Golf schema and plan. Golf-focused homepage, header, footer, Convex functions. This is the rebrand day: influencer scaffold becomes iLeague.golf.

**February 12–28.** Stripe API version bump. Search indexes. Metadata rewritten for golf. Golf category. lucide to react-icons. Root `/convex` consolidation. CI experiments. Mobile TypeScript cleanup. Vercel as the only CI/CD.

**March.** Security headers. Middleware runtime fights. **www vs apex redirect loop**. normalize middleware, dual aliases, then disable middleware so Vercel stops bouncing. robots.txt, sitemap, trending creators carousel. Stripe checkout patterns standardized. **Creator profile page** ships. Dashboard starts showing real follower/subscriber/earnings stats. Convex package versions aligned.

**May 14–15.** Blacksmith CI gate spam, then removed.

**May 21.** Production Convex crash fix. Missing creator queries for the lander and profile pages. Stripe/Resend factories so deploy analysis does not need live keys. CSP `worker-src`. CHANGELOG **1.0.4**.

**June 22.** Nightly commits.

**August 8, 6:55 AM ET.** HEAD `508df8e`. set `X-Robots-Tag` to `index, follow` on Vercel. Fifty-four commits on `main`.

**September 8 pack day.** Live site returns 200. Robots tag present. Clerk still on test keys. Draft only.

![Ecosystem mock. iLeague to iTour to iConference](/blog/ileague-golf-patreon-meets-18birdies/screenshots/ecosystem.png)

## When (clock)

Fifty-four commits. January 9 to August 8. HEAD `508df8e`. Private monorepo. Public emerald lander.

## Why

Creator tools fail in two directions: beautiful landers with no money path, or Stripe dashboards with no sport-specific object model. I wanted both. scorecards that can become content, tiers that can become iTour qualification, tips that are not a third-party link-in-bio.

I also refused to pretend the rebrand was complete. Influencer function names, Top 36 vs Top 54, and `pk_test` on a real domain are operator signals. They tell you where the product still is.

The ecosystem bet is explicit: iLeague feeds iTour feeds iConference. This pack is only the first node.

If you create golf content today, what would you rather ship next on iLeague: a real hole-by-hole entry flow, or flipping Clerk to live keys so the first paying subscriber is not on test mode?
