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 varsPOST /api/billing/extend-trial— the one-time extension, gated ontrialExtendedboolean to prevent double-use- Webhooks on
checkout.session.completed(activate barn) andcustomer.subscription.deleted(suspend barn) - A suspension gate in the manager layout that redirects to the subscription page on every request — with
x-pathnameheader 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.com → equinepilot.com, stablesync.com → equinepilot.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.