Case Study · The Inner-Circle Build

30 days. One engineer.
Production platform.

89 commits. 24 API endpoints. 54 tests passing. Stripe billing, member portal, admin command center, custom design language — all built solo from scratch. This is what one month of working with me actually looks like.

Engagement: Solo, full-time-equivalent · Start: April 26, 2026 · Production: May 25, 2026
30
Days
Apr 26 → May 25
89
Commits
All on main, no force-pushes
24
API Endpoints
Live at /api/docs
54
Tests Passing
Vitest, ~200ms run
22
HTML Pages
Static, CDN-served
6
Lib Modules
store · ledger · validate · rateLimit · logger · apiDocs
3
Pricing Tiers
$149 / $499 / $999/mo Stripe-live
$0
Boilerplate Spent
No SaaS templates, no agency markup
The Brief

What the business actually needed.

Real client. Real constraints. The honest version — not the after-the-fact press release.

The Business

Adventure Family Getaways LLC

A Los Angeles-area operator with three messy verticals: short-term vacation rentals, long-term furnished stays, and a tech-services side business. Owner is the operator, the salesperson, and the technician. Needed one digital storefront that didn’t make him look like three different businesses.

The Real Problem

Recurring revenue that didn’t exist yet

The tech-services side was paid one-job-at-a-time. No retention, no LTV, no predictability. The brief evolved from “build me a marketing site” to “invent a membership product that turns my best customers into a recurring book of business, and ship the entire system — pitch page, Stripe billing, member portal, admin tools — in one month.”

Week by Week

The honest timeline.

Not every week was a clean ship. Two of them included rewrites. The point of showing the messy iteration is so you can see what your money actually buys.

Week 1
Apr 26 – May 3

Foundation + the wrong product

First-week sprint: get something live, even if the product positioning is wrong. Better to ship and pivot than to plan and never ship.

  • Vercel serverless deployment configured + first production push
  • Initial Express backend with Stripe subscription creation
  • Cinematic builder + checkout flows (later rewritten twice)
  • Investor ROI calculator + gig-worker vertical landing page
  • Formspree wired for lead capture
11 commits 8 pages live Vercel · Stripe · Express
Honest note: Built a product positioning around “second phone library” that didn’t resonate. Decided early week 2 it needed to die. Week 1's work wasn’t wasted — the infrastructure carried forward — but the marketing copy and product cards got thrown out.
Week 2
May 4 – May 11

Product pivot + cart architecture

Rewrote positioning around “tech concierge for the family” instead of “phone library.” Built a cart-style builder so customers could stack services. Quiet Luxury design language as a holding pattern before the Tesla overhaul in Week 3.

  • Inner-Circle cart architecture — stack multiple subscriptions in one Stripe checkout
  • Calendly integration for AI coaching session bookings
  • Mobile menu fixes, checkout bug fixes
  • Quiet Luxury aesthetic across all marketing pages
  • Premium typography stack: Cormorant Garamond + Outfit + Inter
14 commits 1 product pivot Stripe Elements · Calendly · CSS grid
Week 3
May 12 – May 18

Tesla-style rewrite + AFG ecosystem

Biggest visual + architectural change of the project. Rewrote the entire design system in the Tesla.com minimal language. Restructured the brand so AFG became the parent and Inner-Circle became one product. 17 pages updated in one pass.

  • Tesla-style design system: dark/light scroll-snap sections, Inter sans, red accent
  • Bulk rewrite of 15 pages to match the new design language
  • AFG ecosystem restructure: Short-Term + Long-Term + Events + Inner-Circle
  • Subdomain routing (innercircle.* → membership landing)
  • Cinematic intro animation: glowing orb, ring rotations, text stagger
  • Vercel CDN-first deployment (HTML/assets static, only /api → Lambda)
  • Stripe ensurePrices() made idempotent for restart-safety
26 commits 17 pages rewritten Tesla design · Subdomain routing · Vercel
Honest note: Hit a 4-hour Vercel routing bug when the subdomain rewrite intercepted /api routes. The fix was three lines (move the host-matched route below filesystem handler). The debug took longer than the fix — logged it publicly in the commit history as a lesson.
Week 4
May 19 – May 22

The membership model + member portal

The week the membership product became real. Prototyped pricing, tested a stored-value approach, then landed on the clean three-package model that shipped — Essential / Plus / Concierge. Iterating on the business model is part of the build, not separate from it.

  • Three-package model: Essential ($49) · Plus ($149, 3 hrs/mo) · Concierge ($499+)
  • Stripe billing + per-tier webhook automation
  • Member portal (/dashboard) with email + card-last4 verification
  • Member self-service status page
  • Quick-book service tiles wired to the booking API
  • Community Wins feed on dashboard, rotating Monthly Negotiation prompt
18 commits 3 new member-facing pages Stripe metadata · Webhooks · Resend email
Week 5
May 23 – May 25

Backend hardening + developer-ready

The week the codebase became something I could hand to another engineer. Extracted lib/ modules, added a real test suite, JSDoc types, structured logging, self-served API docs, and a comprehensive README/CONTRIBUTING. Plus an admin command center and the cinematic golden halo brand layer.

  • lib/ modules: store (KV abstraction), ledger, validate, rateLimit, logger, apiDocs
  • Wins / Bookings / Negotiations REST APIs (full CRUD, member + admin)
  • Vitest test suite: 54 tests, ~200ms run, contract + unit coverage
  • Structured request logging with req.id tracing + consistent error envelope
  • Self-served /api/docs HTML reference + /api/docs.json catalog
  • Admin command center: tabs for Members, Bookings, Negotiations, Wins, Wallet
  • Golden AFG halo overlay across all member pages (CSS + parallax + chime + confetti)
  • README, CONTRIBUTING, .env.example with degradation notes
  • /hire page + this case-study page
20 commits 54 tests added Vitest · JSDoc · Upstash-ready
Architecture

How the pieces fit.

Stripe is the source of truth for billing. A swappable KV store handles everything Stripe doesn't model. No magic.

┌─────────────────────────────────────────────────────────────────────┐
                                                                     
   STATIC FRONTEND · 22 HTML pages, no build, Vercel CDN-served      
   index · inner-circle · dashboard · wallet · admin · hire ·         
   services · portfolio · short-term · long-term · events · …         
                                                                     
                    fetch via window.ic (api-client.js)                 
   ┌─────────────────────────────────────────────────────────────┐   
      EXPRESS BACKEND · server.js (~1500 LOC)                       
      24 endpoints · structured logging · error envelopes           
      request id tracing · rate-limited public routes               
      Vercel serverless via api/index.js (re-exports app)           
   └─────────────────────────────────────────────────────────────┘   
                                                                      
                                                                      
   ┌───────────────────┐   ┌──────────────────────────────┐      
      STRIPE                STORE (lib/store.js)            
                                                             
      Subscriptions         Upstash Redis (prod)             
      Customers                ↓ fallback                    
      Webhooks              In-memory Map                    
      Customer meta:                                         
        wallet bal         wins · bookings ·                
     tier                negotiations · ledger            
        ledger mirror                                        
   └───────────────────┘   └──────────────────────────────┘      
                                                                     
          ┌──────────────────────────────┐                          
             RESEND (optional)                                    
             wallet · booking · neg                               
             confirmation emails                                  
          └──────────────────────────────┘                          
                                                                     
└─────────────────────────────────────────────────────────────────────┘
Decision

No SPA framework. Static HTML + tiny API client.

22 pages, zero build step. Each page is self-contained, loads in ~50ms, and the shared window.ic wrapper handles every API call uniformly. SEO is excellent, hosting cost is $0, and onboarding any new engineer takes 3 minutes.

Decision

Stripe metadata as the canonical billing store.

Package, tier, and subscription state live on the Stripe customer record — the single source of truth for billing. No separate database to drift out of sync.

Decision

Swappable KV with auto-detected backend.

Set UPSTASH_REDIS_REST_URL & _TOKEN and the store persists in Upstash Redis. Skip them and it falls back to in-memory. Same API surface either way. Pay for persistence only when you need it.

Decision

Self-served API docs from a single registry.

One file (lib/apiDocs.js) drives both /api/docs (HTML) and /api/docs.json (machine-readable). When you add an endpoint, you register it there. The docs page can never go stale — the same file is the source of truth.

Feature Inventory

What shipped.

Every line item below is live in production. Click into any page on the site to verify.

💳

Stripe Recurring Billing

Subscription creation, cart-style multi-line, customer portal, webhooks. 3 plan tiers ($149/$499/$999/mo) with auto-detected price IDs.

production
⏱️

Three-Package Billing

Essential / Plus / Concierge on Stripe subscriptions, with a live founding-overage-rate engine that steps up as members join. Per-tier webhook automation.

iterated + shipped
🔐

Member Self-Service

Email + card-last4 verification (no passwords). Wallet lookup, transaction history, quick-book service tiles.

live
⚙️

Admin Command Center

Tabs for Members, Bookings, Negotiations, Wins, Wallet Tools. Live MRR, CSV ledger export, one-click status updates.

live
📡

Bookings + Negotiations API

Members POST service bookings + bill-negotiation requests. Admin patches status + autoLogWin publishes to public feed.

REST · authed
📊

Community Wins Feed

Public “saved $X this month” aggregator. Member dashboard pulls live feed, daily-rotating featured win.

live

Golden Halo Brand System

Cinematic AFG monogram overlay on all member pages. Tier-aware colors, parallax, scroll-intensity, welcome chime.

brand layer
🧪

Test + Quality Stack

Vitest with 54 tests (~200ms). Smoke-test script for prod. ESLint-style syntax checks. JSDoc with ambient typedefs.

CI-ready
📚

Self-Served Docs

/api/docs HTML reference + /api/docs.json catalog. README with architecture diagram. CONTRIBUTING with 7-step recipe.

developer-ready
If You Hired Me to Build This

What you’d actually pay.

Same scope, same deliverables, same calendar. Here’s how it would map to my pricing tiers.

30-day breakdown

  • Week 1 · Foundation + discovery $750 (Sprint)
  • Weeks 2–5 · Half-Time embedded (~80 hrs/wk × 4) $4,500/mo
  • Architecture review (included monthly) included
  • Weekly Friday demos × 4 (Loom recorded) included
  • Stripe + webhook integration (would normally be $3.5K project) included
  • Custom design system (would normally be $4.5K project) included
  • Member portal + auth (would normally be $7K project) included
  • Admin command center + ops tooling included
  • Test suite + CI-ready quality included
Total Engagement Cost
$5,250
$750 Sprint + $4,500 Half-Time month
vs. agency equivalent:
$30,000 – $60,000 for the same scope

The math works because there’s no agency markup, no project manager layer, no junior engineer learning on your dime. You hire the person who’s actually shipping the code. Once we’ve built trust, my rates move to standard market — but the second engagement is your call, not mine.

Ready to Start Yours?

30 days from now, this could be
your platform.

Tell me what you want built. By the end of the day, you'll have either a Sprint plan ready to go, or a clean “not the right fit” with a referral to someone better.