Available from 9 March
    Healthcare

    Odycy

    Odycy is a UK-based private healthcare marketplace that simplifies the patient journey through integrated search, booking, and payment. The platform connects patients with providers at optimal times, locations, and prices — replacing a No-Code prototype (Bubble + Airtable) with a production-grade, enterprise-ready platform. We worked as a lean team of three fullstack engineers and a product manager, designing and delivering the complete platform — a NestJS API powering React/Next.js frontends — transforming a validated concept into an enterprise-grade booking engine on an aggressive timeline. The result far exceeded the client's original expectations.

    View Live Site
    Odycy

    Key Outcome

    Production-grade healthcare marketplace with multi-party booking, relay negotiation, and integrated payments

    Technologies Used

    Frontend

    Next.js 15React 19TypeScriptTailwind CSSshadcn/uiLeaflet Maps (patients)Google Maps (providers)

    Backend

    NestJSPrisma ORMNode.jsTypeScript

    Database

    PostgreSQLPostGIS (geospatial)Redis

    Payments

    Stripe PaymentIntentsStripe Pre-authorizationStripe Checkout Sessions

    Communication

    SendGrid (transactional emails)Server-Sent Events (SSE)

    AI & Document Processing

    Google Gemini AIGoogle Document AI (OCR)Automatic image processing (EXIF, HEIC→JPEG)

    Testing & QA

    Jest (unit & integration)Playwright (E2E)NestJS Testing Modules

    Deployment & Infrastructure

    GCP Cloud RunGCP Cloud BuildGCP Cloud SQLGCP Secret ManagerTerraform (IaC)GitHub Actions (CI/CD)Nx Monorepo (affected builds)Docker

    Architecture Patterns

    Domain-Driven DesignSpecification PatternEvent SourcingAsyncLocalStorage Context TrackingModular Monolith

    The Challenge

    Odycy had proven strong demand for their private healthcare marketplace using Bubble and Airtable, but the No-Code stack was buckling under the weight of real-world booking complexity. The platform needed to handle three fundamentally different booking types, multi-party negotiation between patients and providers, integrated payments with pre-authorization, geospatial provider search, and a full referral management pipeline — all with proper security, scalability, and maintainability.

    Our Solution

    We architected a NestJS modular monolith from the ground up, establishing a clean domain-driven structure with shared TypeScript types across all five frontend applications. The backend uses a composable Specification Pattern for complex search queries, event sourcing for CRM-ready domain events, and a three-tier booking settings inheritance model that dramatically reduced provider onboarding friction. On the frontend, we built full CRUD admin interfaces, booking flows, and patient-facing search with map integration — all using Next.js 15 with React 19.

    Key Features

    Geospatial provider search — location-based search with PostGIS proximity queries, distance calculations, and sorting by nearest, cheapest, or highest rated
    Three distinct booking types — Integrated (real-time PMS sync), Preferred Time (async relay negotiation), and Redirect (external booking links)
    Relay System — asynchronous booking negotiation channel between patients and providers with in-app messaging, state machine transitions, and full email lifecycle notifications
    Magic-link authentication — passwordless access for patients and providers via one-use, time-limited magic links with terminal-state invalidation
    Stripe payment integration — PaymentIntents, pre-authorization with capture-on-confirmation, Checkout Sessions, and saved payment methods
    Dynamic multi-step booking wizard — conditionally renders steps for patient data, GP details, referral letter upload, payment, and confirmation
    Three-tier booking settings inheritance — Service Definition → Provider Defaults → Service Offering cascade, reducing admin data entry by ~80%
    Provider management portal — full CRUD for provider organizations, service definitions, networks, originators, referrers, and referral episodes
    Comprehensive email notifications — every booking state transition triggers contextual emails via SendGrid
    AI-powered referral intake — Gmail + Gemini AI + Document AI OCR pipeline that automatically processes emailed referral letters with confidence scoring
    Role-based API sanitization — global interceptor that automatically strips sensitive data based on the caller's role
    Smart Event Emission System — AsyncLocalStorage-based automatic tracking of all database mutations with actor identification, streamed via SSE
    Care coordinator support — Odycy team members can manage relays on behalf of providers
    CSV bulk import — service definitions can be imported/updated via CSV with comprehensive row-by-row validation
    Dual map integration — Leaflet for patients (open-source), Google Maps for provider portal
    Referral letter management — upload with automatic image resizing, EXIF stripping, and HEIC→JPEG conversion
    API key authentication — secure lifecycle for partner and widget integrations
    Embeddable search widget — Shadow DOM-isolated, script-embed pattern for third-party site integration

    Benefits

    Patients find care faster — geospatial search with price comparison and real-time availability
    Transparent pricing — see costs upfront, compare providers, and pay securely online
    No portal required — magic links and email notifications keep all parties engaged without requiring accounts
    80% less admin work — three-tier settings inheritance means providers set defaults once
    Security by design — role-based sanitization, magic link invalidation, and hashed API keys protect every layer
    Analytics-ready — event sourcing captures every interaction for CRM and business intelligence
    Flexible booking — three booking types handle the full range of private healthcare scheduling complexity

    💛 What We Love About This Project

    The Relay System — a genuinely novel approach to async booking negotiation that solved a real-world problem no off-the-shelf solution could handle.

    How the three-tier settings inheritance eliminated 80% of provider onboarding friction — a simple concept with massive real-world impact.

    The Smart Event Emission System using AsyncLocalStorage — automatic context-aware domain events without any manual wiring, ready for CRM and analytics consumers.

    Magic link authentication that truly respects the user — no passwords, no apps to install, and links that self-invalidate the moment they're no longer relevant.

    The specification pattern for search — every new filter or sorting strategy is a self-contained, composable, testable object.

    How the entire email lifecycle keeps everyone informed — patients, providers, and coordinators always know what's happening without checking a portal.

    The AI-powered referral intake pipeline — watching Gemini AI extract structured data from emailed referral letters with confidence scoring felt like real magic.

    🤝 What We Appreciate About Our Client

    Their deep understanding of the UK private healthcare market — they knew exactly which pain points mattered most and prioritized ruthlessly.

    The trust they placed in us to architect a complex, multi-party platform from scratch — they let us make the right technical decisions without micromanaging.

    Always available for rapid feedback — decisions came fast, which meant we could iterate at startup speed without blockers.

    Their willingness to evolve scope as the platform took shape — new booking types, relay messaging, and care coordinator workflows were added collaboratively, not as last-minute demands.

    Their commitment to security and data protection from day one — in healthcare, this isn't optional, and they never treated it as an afterthought.

    The genuine excitement when features exceeded their original expectations — their enthusiasm was contagious and pushed us to deliver even more.

    Challenges We Faced

    1

    Three fundamentally different booking types

    The platform needed to support integrated bookings (real-time PMS sync), preferred time bookings (async relay negotiation), and redirect bookings (external links) — each with different payment flows, state machines, and user experiences. We designed a dynamic multi-step wizard that conditionally renders the right steps based on service configuration, with shared validation and Stripe integration across all paths.

    2

    Asynchronous multi-party negotiation (Relay System)

    Building a reliable async communication channel between patients, providers, and care coordinators required careful state machine design. Each relay transitions through well-defined states, triggers contextual email notifications, manages magic link lifecycle, and handles edge cases like simultaneous modifications from multiple parties.

    3

    Geospatial search at scale

    Provider search needed PostGIS-powered proximity queries with ST_DWithin and ST_Distance, combined with service type, price range, CQC rating, and insurance network filters — all composable and sortable. The Specification Pattern gave us a clean, extensible architecture where each filter is an independent, testable specification object.

    4

    Security without friction

    Healthcare data demands strong security, but patients and providers shouldn't need accounts or passwords. Magic links with one-use tokens, time-limited expiry, and terminal-state invalidation gave us strong security with zero-friction access. A global role-based sanitization interceptor strips sensitive fields automatically based on who's calling the API.

    5

    Provider onboarding complexity

    Private healthcare providers offer hundreds of services with different pricing, booking rules, and restrictions. The three-tier settings inheritance model (Service Definition → Provider Defaults → Service Offering) allows providers to set sensible defaults at each level, with lower levels only overriding what's different — reducing data entry by roughly 80%.

    6

    Replacing a No-Code prototype without losing momentum

    The existing Bubble + Airtable prototype was live and in use. We needed to build the production platform fast enough that the No-Code version didn't have time to accumulate more technical debt. The Nx monorepo with affected builds, shared TypeScript types, and incremental CI/CD kept the team shipping daily.

    7

    Event sourcing for a CRM-ready architecture

    Every database mutation needed to be captured as a domain event with actor context. Using AsyncLocalStorage, we built automatic context propagation that tracks the current user through every database operation, emitting events via SSE in development and ready for production Pub/Sub consumers.

    8

    AI-powered email referral intake

    Processing emailed referral letters required chaining Gmail API, Gemini AI for intelligent data extraction, and Document AI for OCR — with confidence scoring to flag uncertain fields. The pipeline needed to be reliable, auditable, and gracefully handle the wide variety of formats that NHS referral letters come in.

    9

    Multi-app monorepo coordination

    Five Next.js frontends and a NestJS backend sharing types, utilities, and Prisma schemas required careful workspace architecture. Nx's affected build system reduced CI costs by 50-70%, and shared TypeScript types caught integration issues at compile time rather than in production.

    Photo Gallery

    Patients Main View

    Patients Main View

    Provider View

    Provider View

    Provider View Services

    Provider View Services

    Provider View Availability

    Provider View Availability

    Appointment Request

    Appointment Request

    Appointment Request Info

    Appointment Request Info

    Appointment Request Payment

    Appointment Request Payment

    Appointment Request Sent

    Appointment Request Sent

    Relay Page Patient

    Relay Page Patient

    Relay Page Provider Login

    Relay Page Provider Login

    Relay Page Provider Administrator

    Relay Page Provider Administrator

    Relay Page Provider Propose Time

    Relay Page Provider Propose Time

    Relay Page Provider View Events

    Relay Page Provider View Events

    Relay Page Patient View Events

    Relay Page Patient View Events

    Relay Page Booking Closed

    Relay Page Booking Closed

    Events Console Expanded Event

    Events Console Expanded Event

    Events Console Events

    Events Console Events

    Relay Management

    Relay Management

    Dashboard Admin

    Dashboard Admin

    Payments Admin

    Payments Admin

    Originator Admin

    Originator Admin

    Edit Originator

    Edit Originator

    Providers Admin

    Providers Admin

    Provider Edit

    Provider Edit

    Provider Integrated Booking

    Provider Integrated Booking

    Provider Booking Settings

    Provider Booking Settings

    Provider Services Admin

    Provider Services Admin

    Provider Edit Service

    Provider Edit Service

    Patient Booking Request Email

    Patient Booking Request Email

    Provider and Patient Confirmation

    Provider and Patient Confirmation

    Provider Service Inheritance

    Provider Service Inheritance

    Want something similar?

    Let's discuss how we can build a solution tailored to your business needs.

    Book a Call

    Other Projects