Assemble (BeGreat)
Assemble is an expert sessions and Q&A marketplace where clients book live video calls or submit async questions to industry professionals. I inherited a Rails 5 legacy codebase and led a two-phase modernization to Rails 6 and Rails 7, migrating the frontend to Hotwire (Turbo/Stimulus), rebuilding the booking and payment engines, and integrating Google Calendar, Stripe Connect, and Cloudflare Stream, all while keeping production live.

The challenge
The platform ran on an outdated Rails 5 stack with fragile booking, payment, and calendar flows. Experts and clients needed reliable scheduling across timezones, payment-on-approval, and async video Q&A, but the legacy architecture couldn't support modern integrations without risk to live revenue.
Key features
- 7-day rolling availability with 15/30-minute slot generation and per-expert timezone handling
- Google Calendar conflict detection and auto-created events on session approval
- Charge-on-approval Stripe flow with promo codes, free sessions, and failed-payment rollback
- Stripe Connect Express for expert bank onboarding and earnings withdrawals
- Async video/audio Q&A with Cloudflare Stream resumable TUS uploads
- Four-tier access control (client, expert, admin, superadmin) with expert onboarding and payout approval
- Draft booking state preserved in cookies for unauthenticated users
- Retention analytics with signup cohorts and CRR via Chartkick/Groupdate
- CMS for landing pages and FAQs; Sidekiq Web UI for superadmins
Architecture
A Ruby on Rails 7 monolith backed by PostgreSQL and Redis, with Sidekiq handling async jobs. Business logic lives in dedicated service objects (SessionPayment, TimeSlots, RequestApprovalService, GoogleCalendar services, PromoCodeService). The frontend uses Hotwire (Turbo for navigation and Stimulus for interactivity), bundled with esbuild and cssbundling-rails. Media uploads flow through Cloudflare Stream; files and assets are stored on AWS S3 via CarrierWave/Fog; transactional email goes through Mailgun.
My role
Lead engineer who owned the Rails 5→6→7 modernization, session booking engine, payment-on-approval flow, Google Calendar integration, async Q&A pipeline, and multi-role admin platform on a live production app.
Challenge
Migrating a revenue-generating marketplace from Rails 5 through Rails 6 to Rails 7, replacing Webpacker/Sprockets with esbuild, adopting Turbo and Stimulus, and upgrading Ruby from 2.3 to 3.1.2, while adding new features and integrations like Zoom, Twilio, Klaviyo, Mixpanel, Stripe, Calendar, and booking flows.
Solution
Executed a phased upgrade: first stabilized on Rails 6 with Zeitwerk autoloading and gem compatibility, then six months later completed the Rails 7 migration with incremental frontend adoption. Isolated critical paths into service objects and validated each integration (Stripe, Calendar, Stream) independently before cutover.
Technology stack
Frontend
Backend
Database
APIs & Integrations
Dev Tools