Case study · Business operating system

Skilled Coaching: one private operating system for every client business

Skilled Coaching gives owner-led businesses the commercial team they cannot afford to hire: an AI sales agent and senior operators who work inside the business. Its Commercial OS puts sales, marketing, cash and operations on one live screen, and a monthly board meeting decides what to do about what the numbers show. I designed the backend system behind it, together with the Skilled Coaching team. Every client business gets a private space where its owner sees live numbers, takes part in board decisions and pays for its plan, while the Skilled Coaching team looks after all of them from one place.

The Commercial OS page on Skilled Coaching's website, with a live dashboard card showing revenue, cost per booked call, pipeline by stage, return on ad spend, show rate and cash runway

Skilled Coaching's public page for the Commercial OS, October 2026, with the sample numbers it shows there. The platform I built is private, so none of its screens are shown.

Visit skilledcoaching.com
What we built
A private operating system for client businesses
Who uses it
Skilled Coaching's team and its clients' owners and founders
My role
Backend and system design
Team
Built with the Skilled Coaching team
Core stack
React, NestJS, PostgreSQL on Supabase

For everyone

The short version

Skilled Coaching fills the commercial seats that an owner-led business needs but cannot justify hiring full time. Its line is 'real people installing digital people': AI agents and senior operators who work inside the client's business instead of advising from outside. Its clients are owners of businesses turning over roughly one to ten million dollars, in fields such as construction, solar, HVAC and professional services.

A client can start with one of three things. Emma is an AI sales agent that answers enquiries, qualifies leads, follows up and books calls. The Commercial OS is one live screen for sales, marketing, cash and operations, with two operators inside the business to run it and a monthly board meeting to act on it. Fractional senior leadership is offered by invitation.

A live screen needs software behind it. Each client business needs its own private place to see its own numbers, hold its board meeting, keep the decisions that came out of it, pay for the plan it is on and answer its onboarding questions. The Skilled Coaching team needs to set all of that up for many clients and look after them without mixing anyone's data.

I designed it as the backend operating system the whole service runs on. Numbers arrive from the tools a client already uses, such as the payment, CRM and accounting systems, and Emma, the AI sales agent, is connected on the backend so its results can be brought into the same space. The Boardroom keeps ideas, the board agenda and decisions, each with an owner and a deadline. Plans and payments run through it, and the database decides who sees what.

The platform is private to Skilled Coaching and its clients, so there are no screens of it on this page. The page shows how it is shaped and leaves out names, keys, limits and settings.

  1. Each client gets a private space

    Skilled Coaching sets up the space and invites the owner and the team, each with the access they need.

  2. Live numbers in one place

    Sales, marketing and money come in from the systems the client already uses.

  3. A monthly board meeting

    Ideas go on the agenda, the board decides, and every decision gets an owner and a deadline.

For founders and CEOs

The business case

What the business needed, why the platform is built this way, and what it gives Skilled Coaching and its clients.

The problem

Numbers live in too many places

Sales sit in a CRM, money in the accounting system, payments with the card processor and lead results with the AI agent. An owner who wants one view of the business has to open four tools, or wait for a spreadsheet at the end of the month.

Every client needs a window of their own

A founder must see their own business and nothing else, while Skilled Coaching's team has to see every client. Revenue and board decisions are private to one company, so a mistake in who sees what is the worst mistake the system could make.

Decisions get made and then forgotten

A monthly board meeting only works if each decision is written down, owned by a person and checked the next month. Skilled Coaching puts it in one line on its own site: 'Logged this month. Checked next month.'

Why we built it this way

A dashboard that only looks good does not help a founder decide anything. Skilled Coaching's promise is that decisions follow the numbers, so the numbers have to be live, they have to come from the source, and a client has to be sure they are looking at their own.

So every client business is a separate space with its own sections, pages and people, and the rules about who sees what sit in the database, where a mistake on a screen cannot undo them. The Skilled Coaching team builds each client's pages from a small set of blocks. That is quicker than a custom dashboard for every client and keeps every client's screens consistent.

The board meeting got its own place because it is the point of the service. An idea is raised and goes on the agenda, the board decides, and the decision is recorded against the idea with an owner and a deadline, in one step, so the log and the idea cannot disagree. The picture shows the decision log as Skilled Coaching presents it on its own site, with sample entries.

The monthly board meeting section of Skilled Coaching's Commercial OS page, with a board decision log of three sample decisions, each with an owner and a result, under the line 'Logged this month. Checked next month.'

What a client gets

A client business is one space in the platform. Inside it sit the sections the Skilled Coaching team has set up, such as Finance, a weekly pulse or the Boardroom, and each section holds pages.

The team builds those pages from blocks, so a founder's screen shows what matters for that business. Which pages each person sees is set by role, and can be narrowed to one person and one page.

What a client's space can hold
  • Live numbers from the payment, CRM and accounting systems the client already uses
  • A link to the client's own Emma workspace, for summary results on leads, bookings and campaigns
  • Weekly, fortnightly and monthly tracking tables, with formulas, next to the charts
  • A Boardroom for ideas, the board agenda and the decision log
  • The plans the client pays for, and the history of every payment
  • Onboarding forms, with the answers shown back on a page

What it gives Skilled Coaching and its clients

Skilled Coaching can now run its clients from one system. One client's monthly tracker, a spreadsheet, was moved into the platform with import scripts, tab by tab, and the board meeting is logged in the same place as the numbers it is based on. Payments are taken and renewed there as well.

Clients sign in, change their temporary password and see only their own space. Skilled Coaching's team can add people, change what each can see, block or reactivate an account, reset a password and reset a second sign-in step when someone loses their phone.

What the platform does today
  • Gives every client business a private space, with roles and page-level access
  • Shows live numbers from Stripe, HubSpot and Xero on a client's pages
  • Links each client space to its own Emma workspace for summary results
  • Holds the board's ideas and decisions, each decision with an owner and a deadline
  • Takes plan payments and charges each renewal when it falls due
  • Offers a second sign-in step by authenticator app or email code

My role

I designed the backend system and built it together with the Skilled Coaching team. I decided how clients are kept apart, how the numbers get in, how payments run and how board decisions are recorded, and I built the backend those screens depend on.

What I owned
  • The design of the backend system
  • How each client's data is kept apart, and who can see what
  • The connections that bring live numbers in
  • Plans, payments and renewals
  • The Boardroom and its decision log

For engineers and technical leads

How it's built

A React front end, a NestJS API and a PostgreSQL database on Supabase. The database decides who can see what, the API handles everything that needs a secret, and every client is a separate space. The system is private to Skilled Coaching, so this page shows its shape and leaves out table names, keys, limits and settings.

One platform, a private space for every clientSkilled Coaching teamsets up every clientA client's ownertheir own space onlyA client's teamthe pages they are givenWeb app (React)one app for everyonereads pages withtheir own sessionSupabase · PostgreSQLclient spacesroles · sectionspages · blocksthe Boardroomplans · paymentsrow-level securityon every tablethe database decides who sees whatanything thatneeds a secretNestJS APImemberssign-in codesconnectionspaymentsnightly renewalsthe service key stayson this side onlyafter the checksOutside systemsStripepayments, revenueHubSpotcontacts, dealsXeroinvoices, cashEmmaAI sales agentPayment providerplans and renewalsOne platform.A private space for every client.
One platform, a private space for every client
  1. The Skilled Coaching team creates a space for a client and builds its sections and pages from blocks: text, tables with formulas, charts, documents, files, video, payments, onboarding answers and live numbers from outside systems.

  2. The API adds the client's people, each with a temporary password they must change at first sign-in. A person gets one or more roles, and access can be narrowed to a single page, to view or to edit.

  3. The browser reads page content straight from the database, using the person's own session. Row-level security answers every question, so a request for another client's page returns nothing.

  4. Anything that needs a secret goes through the NestJS API: creating members, connecting a client's payment, CRM or accounting account, talking to Emma, taking payments and sending sign-in codes. The API checks that the person is signed in and belongs to that client before it does anything.

  5. Connected accounts are stored encrypted, and only the API can read them. It fetches summary numbers from Stripe, HubSpot and Xero and keeps them with the connection. A page reads the saved numbers and asks for a refresh on the schedule its block sets. Emma's summaries are read when they are asked for.

  6. In the Boardroom an idea moves from captured to the board agenda to a decision. Recording the decision writes it and updates the idea in one database call, so the two cannot disagree.

  7. For payments, a client picks plans, the API bundles them into one payment and the provider confirms by a signed message. The platform marks the plans active, and a nightly job charges each renewal that is due.

The stack

Front end

  • React 19 and TypeScript, built with Vite
  • AG Grid for large tables, Recharts for charts
  • A page builder with drag-and-drop arrangement

API and jobs

  • NestJS 11 in TypeScript
  • Scheduled jobs for renewals and clean-up
  • Rate limits, size limits and security headers

Data and access

  • PostgreSQL on Supabase
  • Row-level security, forced on every table
  • Roles, member grants and page grants

Connections

  • Stripe, HubSpot and Xero, on each client's own accounts
  • Emma, the AI sales agent, summary numbers only
  • A card payment provider, with signed messages

Sign-in and secrets

  • Temporary passwords, changed at first sign-in
  • Authenticator app or email code as a second step
  • Connected accounts encrypted before they are stored

Quality and delivery

  • Numbered database scripts with read-only checks
  • Front end hosted on Vercel
  • Unit tests on the Emma connection

The three hardest problems, drawn

Every client in a space of their own

One platform serves every client, so a single slip in who can see what would show one company's revenue or board decisions to someone else. Skilled Coaching's own team has to see everything, and a founder has to see only their business.

Access is layered. A client is a space, a space holds sections, and sections hold pages. A role opens sections, and one person can be given view or edit on one page. These rules sit in the database as row-level security, forced on every table, so a request built by hand to skip the screens gets nothing back. Once a person has a second sign-in step, the same rules also hide client data from any session that has not completed it.

Four requests, one set of rules1 Signed in,second step done2 Active memberof this client3 A role or page grantcovers this pageOwner openstheir own Finance pagetheir page,view or editSecond step turned on,but not completedsecond step not donezero rows,no hintOwner asks foranother client's pagenot a member herezero rows,no hintMember whose role hasno Boardroom opens itno grant for this pagezero rows,no hintRules live next to the data, so every request meets them.A request built by hand meets them too.
Four requests, one set of rules

Many systems, one set of numbers

A founder's numbers live in different tools: payments in one, deals in another, invoices and cash in a third, and lead results with the AI agent. Each speaks its own language and counts its own way.

The platform connects to each client's own accounts and reads summary numbers, then keeps them as named metrics with a date range, such as revenue this month or deals won this quarter. A page block picks one metric, one range and how often to refresh. Charts, stat tiles and table formulas then read the same numbers, so a figure on the board page matches the one on the finance page. Emma's summaries come through the same API for the client's linked workspace.

From the outside systems to one pageStripepayments, revenue, refundsHubSpotcontacts, deals, campaignsXeroinvoices, bills, cashEmmaleads, bookings, outcomesread when asked, summaries only:personal details of leads and callsare left out on purposeNestJS API1 connect to their accounts2 keep the key encrypted3 read summary numbers4 save them as named metricsonly the API can readthe saved keyDatabase73 named metricseach with a date rangeand a refresh scheduleStripe, HubSpot andXero numbers are keptwith the connectionA client's pagestat tileschartstable formulasa block picks ametric, a date rangeand how oftento refreshMany systems, one way to count.Charts and formulas read the same numbers.
From the outside systems to one page

Taking money once, and again every month

Skilled Coaching sells plans, and clients pay for them inside the platform. The first payment has to be right, and every renewal has to happen on its own, because nobody wants to chase each client for an invoice every month.

The platform keeps a catalogue of plans, switches each plan on or off per client, and lets a page show a plan as available or locked. The first payment saves the client's consent with the provider. A nightly job uses that consent to charge each renewal that is due, writes every attempt to a ledger and marks a failure as past due.

First payment, then every renewalFirst paymentClient's ownerpicks plansAPI bundles themone payment,one currencyPayment providerthe client pays heresigned messageAPI checks the signaturebefore it believes itPlans go activeledger writtenEvery renewalEvery nightlooks for renewalsthat are dueAPI jobcharges the consent savedat the first paymentPayment providertakes the chargepaid: next period startsfailed or no consent: past dueLedgerevery attempt
First payment, then every renewal

Other problems along the way

Secrets stay out of the browser

A client's connected accounts are encrypted before they are saved, in a table no browser session can read, and only the API holds the key and the service credentials. Tokens for the accounting system are renewed by the API when they run out. Emma's agency-level key lives only on the server, and each client space can be linked to exactly one Emma client, so two companies can never read the same numbers.

Emma's results, without anyone's personal details

Emma talks to a client's customers, so its raw records carry names, calls and conversations. The platform serves summaries only: an overview, a time series, outcomes, a funnel, results per agent, campaigns and pipelines. Leads, calls, conversations and calendars are left out on purpose, and the Emma client a request reads is looked up from the server-side link, never taken from the request. Spoken briefings and generated reports from Emma are built behind switches that Skilled Coaching turns on when it is ready.

A board meeting that cannot disagree with itself

An idea has a status that runs from captured, through under review and on the board agenda, to approved, in progress, deferred, declined or completed. Recording a decision creates it, with its owner and deadline, and updates the idea in one database function, so the idea and the log never drift apart. Every new space gets a Boardroom section that nobody can see until a role is given access to it.

A second sign-in step the database respects

Clients can turn on an authenticator app or a code sent by email. The app option uses the platform's built-in support, so we store no secret. Email codes are stored only as hashes, expire quickly, allow a few tries and are limited in how often they can be sent. Once a person has a second step, the database hides client data from any session that has not completed it. If someone loses their phone, an admin can reset it.

Pages without code for every client

Pages are built from twelve kinds of block: headings, text, documents, tables, stat tiles, lists, charts, video, files, payments, onboarding answers and live numbers. Tables work like a spreadsheet, with cell references, ranges, SUM, AVG, IF and references to other pages, and can track a week, a fortnight or a month at a time.

Moving a spreadsheet into pages

Before the platform, a client's numbers lived in a monthly metrics spreadsheet. Import scripts moved its tabs, from the monthly scorecard to marketing and sales, financials and sprint, and vision, operations and cash, into pages with the same layout, so the client could carry on with the rhythm it already had.

Setting up a new client

From an empty space to a first sign-in12345Create the spaceand its sectionsRoles and peopletemporary passwordsConnect accountspayment, CRM,accounting, EmmaBuild the pagesfrom blocksClient signs insees only their spaceThe same five steps for every client.Only the pages change.
From an empty space to a client's first sign-in
  1. The Skilled Coaching team creates the client's space and its sections, such as Finance, a weekly pulse and the Boardroom.

  2. They create roles, give each role the sections it may see, and add people. The backend creates each account with a temporary password.

  3. They connect the client's payment, CRM and accounting accounts and link the client's Emma workspace.

  4. They build the pages from blocks. Onboarding forms collect what the client has to tell them first.

  5. The client signs in, changes the password, can turn on a second step, and sees only their own space.

Keep reading

Next case study

Internal product · Agency operations

Aslam HQ: the system that runs my own agency

One login for LinkedIn outreach, email from your own domain, scheduled posts, clients and staff. Clients and employees get a portal that shows only their own part.

workspaces, one login
5
kinds of login
4
  • Next.js
  • Supabase
  • Claude
Read the case study