01
All projects
2026SaaS ProductAI Agent
// project.athlo

Athlo

Founder · Full-Stack

A SaaS that automates a gym's entire customer-service desk — email, Instagram and WhatsApp answered in one reviewed inbox, in the gym's own voice.

athlo.se
app.athlo.se/inbox
AAthlo
Inkorg 4SkickadeSkippadeBibliotekInställningar
Kö · 4 öppna
Anna LindqvistE-POST
Pausa medlemskap i sommar?
utkast klart
Erik SandströmINSTAGRAM
Öppettider röda dagar?
genererar…
Maria KarlssonWHATSAPP
Hur säger jag upp mitt avtal?
utkast klart
Johan BergE-POST
Vad kostar PT-paket?
utkast klart
Anna Lindqvistför 2 min sedan

Hej! Jag åker bort hela juli och vill pausa mitt medlemskap. Hur gör jag det, och kostar det något?

AI-UTKASTgrundat på kunskapsbasen
Hej Anna!
Vad kul att du hör av dig. Du kan pausa (frysa) ditt medlemskap upp till 3 månader per år — det kostar 49 kr/månad under pausen. Säg bara till vilka datum det gäller så fixar vi det åt dig.

Vänliga hälsningar,
Teamet
Skicka SRedigera EAvvisa ASkippa K

fig. 01 — the owner's inbox: every channel in one queue, an AI draft ready, one keystroke to send. UI recreated; data illustrative.

02

The Problem

Try getting a straight answer out of a big-box gym chain. The phone queue runs an hour or more, the support email has quietly been switched off, and a simple question — can I freeze my membership over the summer? — turns into a week of being bounced around. It's not that the staff don't care; it's that front-desk teams are buried under the same dozen questions, arriving across email, Instagram DMs and WhatsApp, with no system to triage them. I lived this as a member, and saw the same backlog from the gyms' side: a customer-service channel that has effectively collapsed.

The Solution

Athlo is a SaaS product I sell to gyms that automates their customer-service desk end to end. It pulls every channel — email, Instagram and WhatsApp — into one inbox, and for each incoming message an AI drafts a reply in the gym's own voice, grounded in that gym's facts. The owner skims the draft and sends it with a single keystroke, or edits it first. It's deliberately draft-and-approve, not fully autonomous: the gym keeps its hand on the wheel while the hour of repetitive typing disappears.

How the AI Works

There is no queue broker and no polling — Postgres is the spine. When a message lands, a webhook writes it to the database, and an INSERT trigger fires a NOTIFY. A long-lived worker is LISTEN-ing, picks it up in under a second, builds the prompt, calls the model, and writes back a ready draft. The whole path from member email to reviewable answer takes a few seconds.

[01]
Message in
email · IG · WhatsApp webhook
[02]
Postgres + NOTIFY
insert fires new_message
[03]
Draft worker
LISTEN → Claude Sonnet
[04]
Draft ready
surfaces in the inbox
[05]
Owner sends
one keystroke, human-checked
fig. 02 — LISTEN/NOTIFY draft pipeline, member message to reviewable reply in seconds

Sounding Like the Gym

A generic chatbot answer is worse than no answer — members can smell it. So the prompt isn't one monolith; it's composed from small, ordered skill modules. Three are mandatory and can never be switched off: role (who the assistant is), company-info (the gym's knowledge base, which grounds every fact), and safety (injection fencing, no invented prices, no legal or medical advice). Around them sit optional modules a gym can tune — tone, banned words, sign-off — and the highest-leverage piece: a handful of real voice examplesthe model imitates. Inbound text is fenced as data, never instructions, so a member can't talk the assistant out of its rules.

composeSkills( ) · fixed order → one system prompt
rolewho the assistant is, per gymMANDATORY
toneformality + voice examples (few-shot)optional
no-jargonallowlist + per-gym banned wordsoptional
sign-offthe gym's closing lineoptional
company-infothe gym's knowledge base — grounds every factMANDATORY
safetyinjection fencing · no fabrication · refusalsMANDATORY
fig. 03 — the prompt is composed, not hand-written; identity, facts and safety are structurally un-droppable

It Learns from a Skip

When the AI doesn't know something, the owner doesn't just fix the one reply — they teach the system. Hitting Skippaon a draft and flagging a knowledge gap opens an inline box to add the missing fact to the gym's knowledge base. The draft then regenerates on the spot, now grounded in the new answer — no page reload, no leaving the inbox. Every gap closed this way makes the next hundred answers better.

Skip draftflag KB gapadd factregenerate
↩ the new draft appears in the same panel, grounded in the new fact
fig. 04 — the knowledge-gap loop: correcting once teaches the system for good

The Stack

The whole product is a small, boring-on-purpose set of processes with Postgres at the centre. The web app is Next.js 16 / React 19 (Server Components, TypeScript strict), which renders the three-pane inbox and hosts every webhook and route handler. Supabase Postgres in the EU is the spine: multi-tenant isolation is enforced in the database with row-level security keyed on gym_id, OAuth tokens live encrypted in Vault, and an append-only audit log records every send. A single Bun worker does the drafting against Claude Sonnet; Stripe handles subscriptions; a daily cron keeps the mailbox connections alive. No Kubernetes, no Redis, no queue — and everything stays in EU regions by design.

Gmail (Pub/Sub)InstagramWhatsAppStripe
↓ webhooks
Next.js 16 · React 19three-pane inbox UI · route handlers · webhooks · auth
Supabase Postgres (EU) — the spineRLS per gym_id · Vault (tokens) · LISTEN/NOTIFY · append-only audit
Bun draft worker
LISTEN → Claude Sonnet
Daily cron
Gmail watch renewal
Evals (promptfoo)
tone · injection gate
fig. 05 — five small processes, Postgres at the centre; deployed entirely in EU regions

Where It Stands

Athlo is live at athlo.se and running with pilot gyms. The bet behind it is simple: members deserve a real answer in minutes, not a week, and gyms shouldn't have to choose between hiring more front-desk staff and letting their inbox rot. An owner-approved AI draft for every message — across every channel, in the gym's own voice — turns a collapsed support channel back into a working one. Built solo, end to end: product, AI, full stack, and the EU-compliant plumbing underneath.

// reach.out

Working on something similar?

Tell me where the time goes in your process, and I'll tell you what an agent could take off your plate.

Let's talk
[MODE: READING ]// project.athlo
agents: online0 %--:--