CodingStack
← Index
React 19Node.js / ExpressMongoDBSocket.IOStripeJWT + Google OAuth

AllCareMatch

AllCareMatch connects families needing in-home and specialized care ("careseekers") with independent caregivers and agencies ("caregivers") in one tracked workflow. Patients post care jobs and search vetted providers by specialization, rate, availability, and language; caregivers — gated behind a Stripe subscription — apply, chat in real time, and get hired into contracts that close with a star-rated review. CodingStack built the system end to end: an Express/MongoDB API, two role-scoped React apps plus a landing page served behind a single nginx domain, Socket.IO chat with read receipts, Stripe subscription billing backed by a webhook-synced mirror, S3-backed document uploads, and a Dockerized deploy with auto-renewed TLS and pre-release database snapshots.

Role Full-stack & infrastructure — domain modeling, REST API, real-time chat, Stripe billing, both React client apps, and Docker/nginx deployment

Problem

Families needing in-home or specialized care have no reliable way to find, vet, and hire qualified caregivers, while independent caregivers and agencies lack a steady channel to win work and get paid. Hiring happens over scattered calls and referrals with no shared record of credentials, schedules, rates, or who actually completed the job. AllCareMatch puts both sides on one platform — discovery, messaging, hiring, and reviews — so every engagement is tracked from posting to payment to rating.

Architecture

  1. H01

    Two apps, one origin, role-scoped sessions

    The caregiver and careseeker experiences are separate React 19 SPAs (plus a landing page) served behind a single nginx host at /caregiver and /careseeker. Each app namespaces its JWT under a role-specific localStorage key (doctor-access-token / patient-access-token) and sends an active-profile header (doctor-id / patient-id) that the API's auth middleware reads to scope every query and subscription check — so the two products share one domain without session collisions.

  2. H02

    Subscription-gated marketplace with a Stripe mirror

    Caregivers subscribe through Stripe Checkout (separate individual vs. agency price IDs, trial support, promo codes, billing-address collection). A webhook handler mirrors Stripe products, prices, subscriptions, and customers into MongoDB and flips the subscribed flag on both the user and caregiver records with computed expiry. A checkSubscriptionLimit middleware then enforces active, non-expired subscriptions before a caregiver can apply to jobs or accept invitations.

  3. H03

    Real-time chat with presence-derived read state

    Socket.IO connections authenticate via JWT in the handshake; rooms use deterministic IDs built from the sorted pair of user IDs. Messages persist to Mongo and are marked read based on whether the recipient's socket is already in the room, with a fan-out to per-user notification rooms for offline delivery, typing events, and unread counts. Conversation lists are assembled in a single aggregation that groups by room, counts unread, and joins the counterpart's caregiver or patient profile.

  4. H04

    Aggregation-driven profiles and analytics

    Caregiver listings run one $lookup-heavy aggregation that computes average rating, lifetime earnings, completed-job count, success percentage, and the three most recent populated jobs across the reviews, applications, jobs, and patients collections — then $facet-paginates. Contracts and applications use the same pattern, keeping multi-collection joins and pagination on the database rather than in app code.

  5. H05

    Three hiring paths over one Application model

    A contract can form three ways — a caregiver applies to a posted job, a patient invites a specific caregiver (a 7-day invitation that converts to an application), or an instant book-from-chat that creates a system-type job with a pre-approved application. All three funnel into a single Application lifecycle (applied → approved/hired → completed → review, or withdrawn/rejected/terminated), so downstream queries, analytics, and reviews stay uniform.

  6. H06

    Dockerized multi-service deploy on shared infra

    docker-compose orchestrates four app images plus MongoDB and an nginx reverse proxy that terminates Let's Encrypt TLS, auto-renewed by a certbot sidecar; the API runs under PM2. A deploy script pulls every repo, takes a mongodump snapshot before each release, and supports all-services or single-service redeploys. Uploaded documents/images live in S3 with a CloudFront asset path, and the same nginx co-hosts a separate inventory product on a shared external proxy network.

Key features

Stack

Frontend

React 19Vite (React SWC)Redux ToolkitReact Router 7Formik + YupReact-Bootstrap / SASSreact-selectSocket.IO clientFramer MotionChart.jsreact-toastify

Backend

Node.js + ExpressPassport (JWT + Google OAuth)Socket.IOStripe (subscriptions + webhooks)Joi validationNodemailer (SMTP)PM2WinstonHelmet / xss-clean / mongo-sanitize / rate-limitJest + Supertest

Data

MongoDB 6Mongoose 5Aggregation pipelines ($lookup / $facet)Custom toJSON + paginate pluginsStripe mirror collections (Product / Price / Subscription / Customer)

Infra

Docker + docker-composeNginx reverse proxyLet's Encrypt / CertbotAWS S3 + CloudFrontMulti-repo deploy script with mongodump backups

Status

Live

An idea, an existing app, or something in between?

Tell us what you're trying to ship. We reply within one business day with a written take on scope and timeline, not a sales pitch.