Expert MarketplaceWeb Applications

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.

Assemble (BeGreat) web dashboard
Ruby on Rails 7PostgreSQLAWS S3StripeGoogle CalendarZoomTwilioKlaviyoMixpanel

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

HotwireTurboStimulusesbuildcssbundling-rails

Backend

Ruby on Rails 7PostgreSQLSidekiqAWS S3Mailgun

Database

PostgreSQLRedis

APIs & Integrations

Stripe & Stripe Connect ExpressGoogle OAuth 2.0 & Calendar APICloudflare StreamAWS S3MailgunZoom APIFCM Push NotificationsZoomTwilioKlaviyoMixpanel

Dev Tools

CarrierWaveFogPretenderChartkickGroupdateBugsnagSentry