Adapted Industries Get in touch
All free guides
Free guide · For online coaches

Own your coaching software. So an update can never switch your business off.

On November 10, 2026, a platform update left a lot of online coaches with clients who couldn't log in. No programs, no check-ins, no meal plans, no messages. If that was you, this guide is for you. I'm a coach too, I've switched platforms three times, and I know exactly how that morning feels.

This guide gives you three ways forward. Pick the one that fits your time, budget and skills. All three end in the same place: you own your clients, your data and your platform.

Part 1

The first 24 hours. Protect the relationship first.

An outage doesn't lose you clients. Silence does. Your clients don't care whose software broke. They care whether their coach has it handled.

1. Message every client outside the app, now

Use whatever you still control: email, text, an Instagram broadcast channel, WhatsApp, Telegram. Keep it short, calm and specific. Here's a template you can copy:

Hey [name], quick heads-up: the app we use for coaching is having issues today and you might not be able to log in. Nothing is lost on your end and your plan hasn't changed. For today, keep training and eating to the plan you had this week. If you need anything, reply here and I'll answer directly. I'll update you as soon as it's sorted.

2. Export everything you can, today

Whether or not the platform comes back, assume this happens again. Pull out whatever the platform lets you: client names and emails, active programs, nutrition plans, check-in history, progress photos and payment status. If there's no export button, screenshots and copy-paste are better than nothing. Store it somewhere you own (a private drive, encrypted if it includes health information).

The real red flagIf you can't export your own client data, the outage isn't your biggest problem. Not being able to leave is.

3. Give clients a fallback for this week

The Google Sheet coaches had a normal day today for one reason: they owned their files. Borrow that. A shared doc or sheet per client with this week's training, nutrition targets and check-in questions keeps everyone moving until you're back up. It's a stopgap, not a business model, but it works today.

4. Don't make permanent decisions in a panic

Don't cancel, migrate or sign up for anything new today. Stabilize clients, secure your data, then make the decision with a clear head this week using the rest of this guide.

Part 2

The ownership audit. Ten minutes, five layers.

"Owning your software" doesn't have to mean writing code. It means no single company can switch off a layer of your business without you having a way around it. Score yourself honestly.

LayerYou own it if…You're renting it if…
1. Client listYou have every client's name, email and phone in a place you control, updated weekly.The only full list lives inside the coaching platform.
2. PaymentsBilling runs through a payment account in your business's name (for example Stripe) that you can connect to anything.Payments are locked to the platform and you couldn't move subscriptions without asking every client to re-enter cards.
3. ContentPrograms, lessons, recipes and templates exist as your own files.They only exist in the platform's editor.
4. Client dataYou can export check-ins, metrics, logs and photos on demand, in a standard format (CSV/JSON).No export, or "contact support" exports.
5. DeliveryYou control the app or site clients use: the domain, the code or a contract that guarantees access and exports.Someone else decides when it updates, what it costs and whether you stay.

How to read your score

  • 0 to 2 owned: Start with Part 3 this week. That alone removes most of the risk.
  • 3 to 4 owned: You're close. Decide between DIY, DWY and DFY for the app layer.
  • 5 owned: You're already ahead of most coaches. Use the DIY section to harden it.
Part 3 · The middle road

Own your data, even if you keep renting the app.

Not everyone needs their own app. Everyone needs to be able to leave. Do these this week and the next outage becomes an inconvenience, not a crisis.

  1. Move billing into your own name. A payment account your business owns, with subscriptions you can see and manage. If the platform handles payments today, plan a move at your next renewal cycle so clients only re-enter their card once.
  2. Build a client list you control. A simple CRM or even a private spreadsheet: name, email, phone, start date, package, renewal date, goal. Update it every week.
  3. Keep your content as files. Every program, lesson and template saved as a document or spreadsheet you own. Your platform becomes the delivery truck, not the warehouse.
  4. Schedule a weekly export. Same time every week: export or copy check-ins and key metrics for active clients. Put it in your calendar like a client call.
  5. Check the contract. Read your platform's terms for data ownership, export rights and notice of changes. If exports aren't guaranteed, ask in writing.
  6. Write a one-page outage plan. Who you message, how, and what clients do in the meantime. You already have the template from Part 1.
  7. Test your exit once. Pick one test client and try to move them, start to finish. You'll find the gaps before a real outage does.
Choosing a platformBefore you commit to any coaching platform, ask three questions: Can I export all client data myself, anytime? Can I bring my own payment account? How much notice do I get before major changes, and can I stay on the old version while my clients adjust? If the answers are vague, so is your ownership.
Part 4 · DIY

The technical blueprint. Build your own coaching app.

This is the honest version. Building and running your own coaching software is a serious project. This section shows you every moving part so you can decide with your eyes open, and so you know exactly what to ask for if you hire it out.

Reality checkA solid first version usually takes an experienced developer months, not weeks, and running it is an ongoing job: updates, security, backups, support. If that sounds like too much, skip to DWY or DFY. No shame in it. That's why those options exist.

4.1 The architecture at a glance

LayerWhat it doesCommon choices
Client appWhat clients use daily: workouts, logging, check-ins, messagesInstallable web app (PWA) first; native iOS/Android later via Capacitor, React Native or Swift
Coach dashboardWhere you build programs, review check-ins, manage clientsSame codebase as the web app, separate coach role
Backend + databaseStores everything, enforces who can see whatPostgres (Supabase, Neon, or managed Postgres on a cloud host); or serverless (Cloudflare Workers + D1)
File storageProgress photos, videos, PDFsS3-compatible object storage (Cloudflare R2, AWS S3, Supabase Storage)
AuthLogins, password resets, two-factorSupabase Auth, Auth.js, Clerk; always with two-factor available
PaymentsSubscriptions, failed payments, pausesStripe Billing + Customer Portal + webhooks
NotificationsCheck-in reminders, coach repliesWeb Push (works for home-screen web apps on iOS 16.4+), email (Resend, Postmark), native push for app-store apps
MonitoringKnowing it's broken before your clients tell youUptime checks, error tracking (Sentry or similar), a simple status page

4.2 The data model

Get this right and everything else is easier. A coaching app at minimum needs these tables. Every row that belongs to a client also carries the coach (or organization) it belongs to, so access rules stay simple.

TableKey fields
coaches / organizationsid, name, brand settings, plan
clientsid, coach_id, user_id, status, package, start_date, renewal_date, timezone
programs → weeks → workouts → workout_exercisesorder, sets, reps or time, load guidance, tempo, rest, notes, video link
exercisesname, muscle groups, equipment, demo video, substitutions
workout_logs → set_logsclient_id, date, exercise, weight, reps, RPE, notes
nutrition_plans → meals / macro_targetscalories, protein, carbs, fats, per day type (training, rest)
food_logsclient_id, date, item, amount, macros
check_in_templates → questionsquestion, type (scale, text, number, photo)
check_ins → answers, photos, metricsclient_id, week, bodyweight, measurements, photo keys, coach_feedback
messagesthread_id, sender, body, attachments, read_at
habits → habit_logssteps, water, sleep, custom habits
subscriptionsclient_id, stripe_customer_id, stripe_subscription_id, status, current_period_end
audit_logwho, what, when, before/after (for anything sensitive)

A starting point in Postgres, with row-level security so a client can only ever read their own data and a coach only their own clients:

create table clients (
  id uuid primary key default gen_random_uuid(),
  coach_id uuid not null references coaches(id),
  user_id uuid unique references auth.users(id),
  status text not null default 'active',
  package text,
  start_date date default current_date,
  renewal_date date,
  timezone text default 'America/New_York'
);

create table check_ins (
  id uuid primary key default gen_random_uuid(),
  client_id uuid not null references clients(id) on delete cascade,
  coach_id uuid not null references coaches(id),
  week_of date not null,
  bodyweight numeric(5,1),
  answers jsonb not null default '{}',
  photo_keys text[] default '{}',
  coach_feedback text,
  created_at timestamptz default now()
);

alter table check_ins enable row level security;

-- clients see only their own check-ins
create policy client_reads_own on check_ins for select
  using (client_id in (select id from clients where user_id = auth.uid()));

-- coaches see only check-ins from their own clients
create policy coach_reads_clients on check_ins for select
  using (coach_id in (select id from coaches where owner_id = auth.uid()));

4.3 Offline first: the feature clients notice

Gyms have bad signal. If logging a set needs a connection, clients lose work and blame you. Build it so the app saves locally first and syncs later:

  • A service worker caches the app shell, so it opens with no signal.
  • Every write (a set, a food entry, a check-in) goes into a local queue in IndexedDB with a unique id.
  • When the connection comes back, the queue syncs to the server. The unique id means a retry never creates a duplicate.
  • Conflicts (coach edited the plan while the client was offline) resolve by a clear rule, usually "latest change wins, keep both in the history".
// queue a set log locally, sync when online (simplified)
async function logSet(entry) {
  entry.id = crypto.randomUUID();          // idempotency key
  entry.queuedAt = Date.now();
  await db.put('outbox', entry);           // IndexedDB store
  if (navigator.onLine) flushOutbox();
}

async function flushOutbox() {
  for (const item of await db.getAll('outbox')) {
    const res = await fetch('/api/set-logs', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json', 'Idempotency-Key': item.id },
      body: JSON.stringify(item)
    });
    if (res.ok) await db.delete('outbox', item.id);   // keep it if the server said no
  }
}
window.addEventListener('online', flushOutbox);

4.4 Payments that don't break

Keep billing in your own Stripe account from day one. Then the app is just a view on top of it, and you can change apps without touching anyone's card.

  • Use Stripe Billing for subscriptions and the hosted Customer Portal so clients can update cards and cancel without emailing you.
  • Listen for webhooks and treat them as the source of truth: invoice.paid (grant access), invoice.payment_failed (start a grace period and a friendly reminder), customer.subscription.updated and customer.subscription.deleted.
  • Always verify the webhook signature and make the handler safe to run twice.
  • Never store card numbers yourself. Stripe holds them; you store ids.
// webhook skeleton (Node / Express)
app.post('/stripe/webhook', express.raw({ type: 'application/json' }), async (req, res) => {
  let event;
  try {
    event = stripe.webhooks.constructEvent(req.body, req.headers['stripe-signature'], WEBHOOK_SECRET);
  } catch { return res.status(400).end(); }

  if (await alreadyProcessed(event.id)) return res.json({ ok: true });

  switch (event.type) {
    case 'invoice.paid':            await grantAccess(event.data.object.customer); break;
    case 'invoice.payment_failed':  await startGracePeriod(event.data.object.customer); break;
    case 'customer.subscription.deleted': await endAccess(event.data.object.customer); break;
  }
  await markProcessed(event.id);
  res.json({ ok: true });
});

4.5 Security and privacy: non-negotiable

You're holding body weights, photos, sometimes health history. Treat it like it matters, because it does, and because your clients' trust is the business.

  • Two-factor login for coaches always, and offered to clients.
  • Encryption in transit (HTTPS everywhere) and at rest (your database and storage provider should do this by default; check).
  • Least access: row-level security as above, private storage buckets, signed URLs that expire for progress photos.
  • Secrets out of the code: API keys in environment variables or a secrets manager, never in the app bundle.
  • Audit log for sensitive changes, so you can always answer "who changed this, and when".
  • Consent and privacy policy that says what you collect, why, where it's stored and how a client can have it deleted. Health information is treated as sensitive under privacy laws in Canada, the US and elsewhere. Get express consent and talk to a privacy lawyer for your situation. This guide isn't legal advice.

4.6 Backups: the 3-2-1 rule

Three copies of your data, on two different kinds of storage, with one copy off-site. For a coaching app that looks like:

  • Your live database (copy 1) with your provider's automatic backups and point-in-time recovery turned on.
  • A nightly encrypted database dump to separate object storage (copy 2).
  • A weekly copy to a different provider or an offline drive you control (copy 3).
  • Test a restore every month. A backup you've never restored is a hope, not a backup.
# nightly encrypted backup (cron, 3 a.m.)
0 3 * * * pg_dump "$DATABASE_URL" --format=custom \
  | gpg --encrypt --recipient [email protected] \
  > /backups/coach-$(date +\%F).dump.gpg \
  && rclone copy /backups remote:coach-backups --max-age 25h

4.7 Release discipline: today's actual lesson

Most outages aren't hacks. They're updates. Owning your software means you decide how changes reach clients:

  • Staging first. Every change runs on a copy of the app with test data before real clients see it.
  • Feature flags. Turn new features on for yourself, then a few clients, then everyone.
  • Never on a Monday morning. Ship when you can watch it, and never right before check-in day.
  • One-click rollback. If something breaks, going back to yesterday's version should take minutes.
  • Tell clients before big changes. A short heads-up message beats a hundred confused DMs.

4.8 Getting into the App Store

A home-screen web app gets you most of the way, and you control every update. A store app adds native push, Apple Health and Google Health Connect access, and that "real app" feeling.

  • Apple Health (HealthKit) data is only available to native iOS apps. A web app can't read it.
  • Apple's developer program has an annual fee; Google Play has a one-time fee. Check both sites for current pricing.
  • Read Apple's App Review Guidelines on payments before you launch. Real-time one-to-one services (like personal training) have different payment rules from digital content sold inside the app, and the rules change. Check the current version.
  • Plan for review time and the occasional rejection. Keep your web app live so clients are never waiting on Apple.

4.9 Moving clients over without losing them

  1. Map the data. List every field in your old platform and where it lands in your new tables.
  2. Import a test batch. Two or three clients. Check every program, log and photo landed correctly.
  3. Run both side by side. New app live for a small group while everyone else stays put.
  4. Set a cutover date and tell clients two weeks ahead, with a short video showing the new app.
  5. Move billing last, and only once the new app has been stable for a full check-in cycle.
  6. Keep read-only access to the old platform for a month if you can, in case something's missing.

4.10 Realistic costs and time

ItemBallpark
Hosting, database, storage, email for a small coaching businessTens of dollars a month at the start, growing with clients and video
App store accountsApple annual fee + Google one-time fee
Payment processingYour processor's per-transaction fees (you pay these on any platform)
Build time, first solid versionHundreds of hours for an experienced developer
OngoingUpdates, security patches, backups, support: plan a few hours every week

Prices change. Check each provider's current pricing before you budget.

Part 5 · DWY

Build it with me. Payment: a follow.

Real talk: if you were stressed this week, I was too. I've been on the coach side of this three times. So if you want to build your own platform yourself, I'll help you do it. No invoice.

Here's the deal

  • Follow @anthoniefallone on Instagram and engage with my content. That's payment enough for me.
  • Send me your questions by DM. Stuck on the data model, payments, what to build first, which tools to pick? Ask. I'll answer as many as I can and point you in the right direction.
  • Share what you're building. I'll give you honest feedback on your plan and flag the mistakes I made so you don't repeat them.
  • I'll post the common answers as content, so everyone building alongside you benefits.
Free advice to startBuild the smallest version that replaces what your clients use every week: their program, logging, check-ins and messages. Everything else (habits, courses, AI features, community) comes after your clients are happily moved over. Most coaches who stall try to build everything at once.

I'll help where I can, around coaching my own clients. It's guidance, not a done-for-you service, and I can't promise a reply time.

Part 6 · DFY

We build it for you. You go back to coaching.

This is what we do at Adapted Industries. We build and run software for brands, including our own coaching app. If you'd rather never think about servers, backups or app store reviews, we'll build your branded coaching platform and look after it.

What's includedWhat it means for you
Your branded appYour logo, colors and name. Web app first, app store version when you're ready
Built around how you coachYour check-in questions, program style and packages, not a template you bend around
Payments in your nameConnected to your own payment account, so the money and the client relationship stay yours
Data you can always take with youFull exports, any time. That's the whole point
Help moving clients overWe plan the move with you and import what your current platform lets you export
Backups, security and updatesTested backups, two-factor logins, staged releases with rollback
Ongoing careChanges and improvements handled for you

Pricing

Every coaching business is different, so every build is custom-quoted. It's a serious investment, priced for coaches who see their platform as the core of their business. Book a free call, tell us how you coach, and we'll tell you what it takes.

Book a free call

Part 7

Your 30-day plan. Whichever path you pick.

WhenDo this
TodayMessage clients outside the app. Export everything you can. Give clients a fallback for this week.
This weekDo the ownership audit. Build your own client list. Save your programs and templates as your own files.
Week 2Start a weekly export routine. Read your platform's terms on data and changes. Write your one-page outage plan.
Week 3Decide your path: stay and own your data, DIY, DWY or DFY. If you're building, map your data model.
Week 4Move billing into your name if it isn't. Test your exit with one client.
Part 8

FAQ.

Should I leave my current platform right now?

Not today. Stabilize your clients, secure your data, then decide with a clear head. Plenty of coaches will stay where they are and simply own their data. That's a valid choice.

Can I really build my own app without a tech background?

You can learn it, but it's a big project and running it is ongoing work. Be honest about your time. The middle road in Part 3 removes most of the risk without writing code.

Will I lose clients if I switch?

Not if you plan it. Run both side by side, tell clients early, show them the new app, and move billing last.

Is a web app good enough, or do I need the App Store?

A good web app installed on the home screen covers most of what clients need, and you control every update. Add a store app when you want Apple Health, native push and that extra polish.

What about the Google Sheet coaches?

They had the right instinct: own your files. A sheet is a great backup. It's just not the experience most clients will pay premium prices for. The goal is both.

How much does the done-for-you build cost?

It's custom-quoted, because it depends on how you coach and what you need. Book a free call and we'll give you a straight answer.

Written by Anthonie (Coach Tony), founder of Adapted Industries. Coaching for 17+ years, and building our own coaching software after switching platforms three times.

This guide is general information for coaches, not legal, tax or security advice for your specific business. Tools, prices and app store rules change; check the current details with each provider. Last checked November 2026.