HomeAboutWorkServicesPluginsMonitorBlogContactstart_a_build
Web Development· 8 min read

The Charter Business That (Mostly) Runs Itself

DirtyBoat Charters runs on two codebases I built from the dock: a 300-page marketing site and a custom CRM that books trips, answers texts, chases balances, and now sends customers the story of their own trip. Here's the whole feature set.

KM

Kit Mobley

Islamorada, FL

The Charter Business That (Mostly) Runs Itself

This week I shipped a small feature that made me stop and count everything else. A customer named Dan took his son offshore for a graduation trip, limited out on mahi, and three days later got an email that linked to the written story of his own trip — photos, the fish, the whole thing. Nobody clicked a button to make that happen. The system matched his booking date to the trip report on the website and dropped the link in automatically.

That’s one feature. Then I counted the rest, and honestly, I think it’s worth writing down what a modern charter operation can run on when you build it yourself instead of renting it.

DirtyBoat Charters runs on two codebases. Astro and Tailwind on Netlify, Supabase for data, Stripe for money. No WordPress, no FareHarbor, no monthly SaaS stack eating the margins.

The marketing site: dirtyboat.com

About 300 statically-built pages. Landing pages for every town a customer might search from — Islamorada, Key Largo, Marathon — and every kind of customer: beginners, families, people who just want the sandbar. Planning content that answers real questions: when to catch mahi, when to catch swordfish, how not to get seasick, where to stay.

The engine under it is the fishing reports system. 180+ markdown reports in a content collection, split into four categories: trip reports (a customer’s actual day, written up with photos), captain’s logs (daily conditions), tournaments, and updates. Species archives, year archives, a live conditions page. Everything ships JSON-LD structured data, so Google and the AI search engines can actually read it.

There’s also a gear shop with honest affiliate reviews, email preference management, and the boring-but-necessary compliance pages.

The CRM: where the actual business lives

The marketing site gets people in the door. The CRM does everything after:

Booking. Public booking flow with unguessable confirmation codes, a slot materializer that generates the bookable calendar, blackout dates, split-charter broadcasting (open seats get offered to interested customers automatically), gift cards, promos, a manifest view, and a conflict detector for when two things try to occupy the same boat. We migrated fully off FareHarbor onto this.

Money. Stripe pay links, deposits, automated balance reminders, tax and passthrough fees, card-on-file, crew pay reconciliation — and a Zelle inbox, because half the Keys still pays by Zelle, with a sweeper that releases stuck holds.

Messaging. One inbox for SMS, email, web chat, and Facebook and Instagram DMs. On top of that sits an AI booking agent that answers texts — with guardrails I keep sharpening. It checks the actual season list before telling anyone a species is open, and it stopped pitching summer sailfish after I caught it doing exactly that.

The lifecycle. This is my favorite part, because it’s where software quietly does the work of a full-time office manager:

  • Booking confirmation, and recovery texts for abandoned bookings
  • Pre-trip reminder with a real fishing forecast pulled from FishIntel
  • Day+1: a short review-request text
  • Day+3: a warmer follow-up email
  • And now: if a trip report exists on the website for your trip date, both follow-ups link you straight to it

That last one closes a loop I’ve wanted for a while. The marketing site publishes a /reports.json index; the CRM matches your booking date against it — and only against actual trip reports, never a generic conditions log, because sending a customer a wind report and calling it “your trip” would be worse than sending nothing.

Back office. Daily operator digest, Google Calendar sync, GA4 funnel monitoring, a media library, and fuel tracking that ingests marina invoices straight out of Gmail and reconciles them against trips. Plus a nightly QA system that checks invariants across the whole database and emails a digest when something drifts.

Security. Passkeys for operator login, rate limiting, audit logs, secret rotation runbooks, gitleaks in CI. A booking system holds names, phones, and payment history — it deserves the same care as anything bigger.

Why this matters if you run a charter — or any local service business

Every feature above replaced either a monthly subscription, a manual chore, or a dropped ball. The follow-up email Dan got isn’t marketing automation in the corporate sense. It’s the digital version of the captain remembering your name and mailing you the photos. Software just makes sure it happens every single time, for every customer, without anyone having to remember.

The whole stack costs almost nothing to run because it’s static-first: Astro pages on Netlify, background functions that wake up on a schedule, a Postgres database. The expensive part was the thinking, and that’s a one-time cost.

If you’re running a Keys business on a pile of subscriptions and a legal pad, this is what the alternative looks like. It’s not out of reach. It’s just built one feature at a time — from the dock.