← All entries

Friday, May 1, 2026

Day 29 — the platform earns money now

Three independent surfaces shipped today: subscription billing wired all the way through Stripe, the company website launched at equinepilot.com, and the project picked up its real name.

2 min read

Daily entry

Day 29of building EquinePilot

Currently Day 77 · founder build log

Milestones reached

  • Platform subscriptions
  • Marketing site live
  • Brand: EquinePilot
  • Idempotent migrations

A satisfying day — three things landed that, taken together, mean EquinePilot exists as a business, not just a codebase.

Subscription billing went live end-to-end. The schema was already there, but today the loop closed: a barn signs up on a 30-day free trial; if the trial expires they hit a suspension gate and have to subscribe (or use a one-time 14-day extension). The pieces:

  • POST /api/billing/create-checkout-session — creates a Stripe Checkout session, mapping tier and billing cycle to price IDs from env vars
  • POST /api/billing/extend-trial — the one-time extension, gated on trialExtended boolean to prevent double-use
  • Webhooks on checkout.session.completed (activate barn) and customer.subscription.deleted (suspend barn)
  • A suspension gate in the manager layout that redirects to the subscription page on every request — with x-pathname header from middleware to skip the check on the subscription page itself (otherwise: infinite redirect)
  • Daily cron firing 7-day and 1-day trial reminder emails, plus the "you're suspended" email with the extension CTA

The first time I tested the full flow — sign up, trial expires, get redirected, click subscribe, complete Stripe Checkout, get unlocked — felt like the moment the product transitioned from a thing I'm building to a thing that could pay for itself.

The company website shipped at equinepilot.com. A separate Next.js app in apps/web, Freshworks/Atera-inspired, dark Paddock Green nav + footer, linen body. Sections: hero (with a sunnyside.equinepilot.app dashboard mockup), pain points, features, suite preview, pricing, contact. Resend-powered contact form. The Suite section flags StableSync as Live and InGate / ReinLogic / RideIQ / FeedManager as Coming Soon. Pricing: Core $39, Suite $79 (popular), Pro $129. (Monthly and annual cards.)

Small win: suppressHydrationWarning on <body> to silence the Grammarly extension that was triggering hydration mismatches in dev.

The brand rename. EquiPilot → EquinePilot across 208 files. Package imports (@equipilot/@equinepilot/), brand text everywhere, equipilot.comequinepilot.com, stablesync.comequinepilot.app, mobile bundle ID, GitHub repo. All 303 tests passed afterward. Both new domains purchased.

Migration cleanup. Two old migrations (0011_barn_signup and 0012_chunky_joshua_kane) were failing in CI because the barns columns had been added to production before migration tracking was in place. Added IF NOT EXISTS to all the ALTER TABLEs. Also fixed 0012, which had been incorrectly generated to include all of 0011's columns — trimmed to just trial_extended. CI green.

A real day. Real progress.