# GetFarmin: I scaffolded a farm equipment marketplace with escrow math first

Source: https://www.michaelchurley.com/blog/getfarmin-farm-equipment-marketplace-scaffold  
Published: 2026-08-08  
Author: Michael C. Hurley  
Tags: getfarmin, farm-equipment, marketplace, nextjs, convex, clerk, stripe-connect, escrow, agriculture, martech, catppuccin

![GetFarmin home mock. Find. Buy. Farm.](/blog/getfarmin-farm-equipment-marketplace-scaffold/screenshots/home.png)

## Who

I got tired of watching six-figure iron move on hope and a Facebook comment thread.

Farm equipment is not a $49 SaaS seat. A 2022 John Deere 8R 370 placeholder in this repo lists at **$385,000**. A Case IH 9250 combine sits at **$425,000**. That is not "add to cart and pray." That is escrow, hours, condition enums, oversize permits, and a seller who might be a dealer with a storefront slug.

GetFarmin is for operators who want that marketplace shape on a real stack. Next, Convex, Clerk, Stripe Connect. before they pretend they have 10,000 live listings. Ag buyers and dealers who are done leasing trust from a local classifieds culture. Builders who would rather ship fee constants in a Convex mutation than wait for the perfect deploy key.

If you have ever tried to move a center pivot across state lines with a spreadsheet and a handshake, this is for you.

## What

I built **GetFarmin**. package name `getfarmin`, version **0.1.0**, private under **HurleyUS/getfarmin.com**. Metadata line: *Global Farm Equipment Marketplace*. Hero line: **Find. Buy. Farm.**

Stack facts from the lockfile and tree, not the stale sitrep: **Next.js 16.2.6**, **React 19.2.6**, **Tailwind 4.3**, Bun, **Convex** schema + queries/mutations, **Clerk** auth surfaces, **Stripe** webhook route + Connect escrow scaffolding, Catppuccin Mocha default with green primary, Resend/Sentry/PostHog wired in `.env.example`. Thirty-six commits. HEAD `4b5df30`.

![Browse mock with placeholder iron](/blog/getfarmin-farm-equipment-marketplace-scaffold/screenshots/browse.png)

Surfaces that exist in `app/`: `/` marketing, `/browse` with URL `searchParams` filters and placeholder cards from `lib/placeholder-data.ts`, `/about`, `/dashboard`, `/listing/new` multi-step form, `/dealers/[slug]`, Clerk sign-in/up catch-alls, `POST /api/shipping/estimate`, Stripe webhook route.

Convex tables: `listings`, `categories`, `users`, `dealerProfiles`, `messages`, `savedListings`, `payments`. Listing tiers: basic / enhanced / dealer. Conditions: new through salvage. Escrow math in `convex/payments.ts`: platform **2.9% + $0.30**, escrow **1.5%**, optional buyer protection **+2%**. Comments say PaymentIntent creation is deferred. schema-ready money path, not a finished Connect onboarding wizard.

Shipping estimator in `lib/shipping-estimate.ts`: base **$250**, **$2.10**/mile, **$38**/1000 lb, oversize and expedite flags, honest notes about permits and long-haul variance.

![Dashboard mock. inbox + escrow](/blog/getfarmin-farm-equipment-marketplace-scaffold/screenshots/dashboard.png)

## Where

Code lives at [github.com/HurleyUS/getfarmin.com](https://github.com/HurleyUS/getfarmin.com). **private**. GitHub homepage points at [getfarmin-com.vercel.app](https://getfarmin-com.vercel.app). At pack time that URL returned **HTTP 500** with `X-Robots-Tag: index, follow` (the Aug 8 header fix). This pack does not invent a healthy production story.

Audience sits next to MachineryTrader / TractorHouse energy, with a builder twist: Catppuccin dark-first UI, compound Convex indexes, issue-driven February feature closeout. Sibling operator furniture is present. `.hustlemc`, Blacksmith ship workflow, fallow REVIEW, Stripe sanity rule file.

![New listing multi-step mock](/blog/getfarmin-farm-equipment-marketplace-scaffold/screenshots/listing-new.png)

## When

**2026-01-08.** `8107c34` Initial commit: Next.js, Convex, Tailwind. Same morning `f717dcf` OPPORTUNITIES + homepage. Afternoon `381035b` PLAN improvement list. The market thesis lands day one: global farm equipment, used market, listing tiers, escrow, shipping.

**2026-01-31 / 2026-02-05.** Sync. Prod build ready.

**2026-02-06.** `6f764f9` upgrade to Next.js 16, React 19. Tailwind v4 globals `@import` fix follows.

**2026-02-13.** `0afe002` dark mode, Catppuccin theme system, browse/about pages, Convex schema.

**2026-02-21–22.** Standards debt burned down. error/loading/not-found, env validation, Zod validations, providers, schema foreign keys as `v.id("users")`, merged fix PRs.

**2026-02-23–24.** The marketplace week. Search and filtering. Clerk buyer/seller dashboard. Listing creation flow. In-app messaging. Stripe Connect + escrow scaffolding. Dealer storefronts + tiers. Convex bootstrap scripts. Heavy-equipment shipping estimate API. Issues **#1–#8** closed with matching PRs.

**2026-05-14–15.** Eleven commits of Blacksmith CI gates, Biome, preflight, deploy URL verification.

**2026-08-08, 06:54 ET.** `4b5df30` set X-Robots-Tag to index, follow on Vercel. HEAD. Thirty-six commits total.

**Pack day 2026-09-08.** Draft and assets only. Live preview still 500s. `sitrep.md` still claims purpose unclear and last commit February 5. treat it as drift, not truth.

![Shipping estimate mock](/blog/getfarmin-farm-equipment-marketplace-scaffold/screenshots/shipping-estimate.png)

## Why

I did not want another "agriculture somehow" landing page with emoji tractors.

I wanted fee constants next to listing status enums. I wanted a shipping function that admits a 22-foot load needs permits. I wanted dealer slugs and message threads on the same Convex deployment shape as the browse grid, even while the browse grid still reads placeholder data and the Vercel deployment throws 500s.

So the February issue board became the product: close search, auth, listing form, chat, escrow, dealers, shipping, bootstrap. May hardened the gates. August flipped robots headers on a site that still needs a living Convex URL.

Would you price a six-figure tractor listing as free basic inventory, or charge the $49 enhanced tier before the first escrow release clears?
