ClientFlow Metrics

Health TechIntermediateFeb 16, 2026

ClientFlow Metrics

Custom client progress tracking for health & wellness practitioners.

The Problem

Solo and small team health & wellness practitioners, such as nutritionists, physical therapists, and life coaches, struggle with inefficient and inconsistent client progress tracking. They often rely on manual methods like spreadsheets, paper notes, or generic CRM systems that lack the flexibility for specialized metrics. This leads to 3-5 hours wasted per week consolidating data, inconsistent record-keeping, and an inability to easily visualize client improvement. The lack of clear progress visualization hinders client engagement and makes it difficult to demonstrate the value of their services, potentially leading to higher client churn and lost revenue of hundreds to thousands of dollars annually. Existing solutions are either too expensive, overly complex for micro-businesses, or too rigid to accommodate diverse tracking needs.

The Solution

ClientFlow Metrics provides a focused, customizable platform for health & wellness practitioners to define, track, and visualize client progress. Practitioners can create bespoke metric templates (e.g., 'mood score', 'pain level', 'hydration intake') for each client or service, specify units and input types, and invite clients to log their own data via a secure, simplified portal. The core feature is dynamic charting, allowing practitioners to instantly generate visual reports of any metric over time, making it easy to spot trends, demonstrate progress, and personalize care plans. Unlike generic CRMs, ClientFlow Metrics is purpose-built for quantitative progress tracking, offering unparalleled flexibility and clear visual insights without the bloat, enabling practitioners to save hours weekly and significantly boost client retention.

Tech Stack

Frontend
Next.js 14ReactTailwind CSSshadcn/uiRecharts
Backend
Next.js API RoutesTypeScript
Database
PostgreSQL (Supabase)
APIs
Stripe (for subscriptions)Resend (for email notifications)

System Architecture

Database Schema

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    email TEXT UNIQUE NOT NULL,
    password_hash TEXT NOT NULL,
    role TEXT NOT NULL DEFAULT 'practitioner', -- 'practitioner' or 'client'
    full_name TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE TABLE organizations (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name TEXT NOT NULL,
    owner_user_id UUID REFERENCES users(id) ON DELETE CASCADE NOT NULL, -- The practitioner who owns the org
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE TABLE clients (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    practitioner_id UUID REFERENCES users(id) ON DELETE CASCADE NOT NULL, -- The practitioner managing this client
    client_user_id UUID REFERENCES users(id) ON DELETE SET NULL, -- Optional: If client has their own user account
    organization_id UUID REFERENCES organizations(id) ON DELETE SET NULL, -- Optional: If client belongs to an organization
    name TEXT NOT NULL,
    email TEXT UNIQUE, -- Optional, if client_user_id is not set
    status TEXT DEFAULT 'active',
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

CREATE TABLE metric_templates (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    practitioner_id UUID REFERENCES users(id) ON DELETE CASCADE NOT NULL,
    name TEXT NOT NULL,
    unit TEXT, -- e.g., 'kg', 'score', '%' 
    type TEXT NOT NULL, -- 'number', 'text', 'slider'
    min_value NUMERIC, -- For 'slider' type
    max_value NUMERIC, -- For 'slider' type
    description TEXT,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    UNIQUE (practitioner_id, name) -- Ensure unique metric names per practitioner
);

CREATE TABLE client_metrics (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    client_id UUID REFERENCES clients(id) ON DELETE CASCADE NOT NULL,
    metric_template_id UUID REFERENCES metric_templates(id) ON DELETE CASCADE NOT NULL,
    value TEXT NOT NULL, -- Store as text to accommodate numbers, text, or slider values
    recorded_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);

-- Indexes for performance
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_clients_practitioner_id ON clients(practitioner_id);
CREATE INDEX idx_metric_templates_practitioner_id ON metric_templates(practitioner_id);
CREATE INDEX idx_client_metrics_client_id ON client_metrics(client_id);
CREATE INDEX idx_client_metrics_metric_template_id ON client_metrics(metric_template_id);
CREATE INDEX idx_client_metrics_recorded_at ON client_metrics(recorded_at);

API Endpoints

POST/api/auth/registerRegisters a new practitioner account.
POST/api/auth/loginLogs in a user and returns a session token.
GET/api/user/meRetrieves the currently authenticated user's details.
GET/api/clientsLists all clients associated with the authenticated practitioner.
POST/api/clientsAdds a new client for the authenticated practitioner.
GET/api/clients/:idRetrieves details for a specific client.
PUT/api/clients/:idUpdates details for a specific client.
GET/api/metric-templatesLists all custom metric templates created by the practitioner.
POST/api/metric-templatesCreates a new custom metric template.
GET/api/clients/:clientId/metricsRetrieves all logged metric data for a specific client, optionally filtered by metric template.
POST/api/clients/:clientId/metricsLogs a new metric value for a specific client. Can be submitted by practitioner or client.
GET/api/subscriptionRetrieves current subscription status for the practitioner.
POST/api/subscription/create-checkout-sessionInitiates a Stripe checkout session for a new subscription.
POST/api/webhook/stripeStripe webhook endpoint for handling subscription events (e.g., successful payment, cancellation).
🤖

Start Building with AI

Copy this prompt for Cursor, v0, Bolt, or any AI coding assistant

👷

...

builders copied today

Found this useful? Share it with your builder friends!

BD

BuilderDaily Team

Verified

Indie hackers and full-stack engineers creating validated Micro-SaaS blueprints with production-ready tech stacks.

Health Tech
Code TestedSchema ValidatedProduction Ready
Coming Soon in Beta

Gap Alert

Today's gap expires in ~14 hours

Get tomorrow's blueprint delivered to your inbox so you never miss a profitable idea.

(Email delivery launching soon — sign up to be first!)

No spam, everUnsubscribe anytime