From Idea to €2,490/month: Building a Niche SaaS in 3 Weeks
How I built Gym Savages — a full-stack coaching SaaS for natural bodybuilders — from zero to paying clients in 17 days, using Next.js, Supabase, and Claude Vision API for AI meal tracking.
From Idea to €2,490/month: Building a Niche SaaS in 3 Weeks

The Problem I Identified
I noticed a critical pain point in the natural bodybuilding coaching space. Coaches couldn't scale beyond 20–30 clients because they were drowning in manual work:
- Programs sent via PDF — clients lose them
- Progress tracked in spreadsheets — messy and inconsistent
- Communication scattered across WhatsApp, email, and Instagram DMs
- Admin work consuming 20+ hours per week
- No accountability system for clients
- Stuck trading time for money — impossible to scale
The market gap: every existing solution (Trainerize, TrueCoach, Personal Trainer on Demand) was a generic fitness platform. None were built for natural bodybuilders with their unique nutritional needs, evidence-based training, and supplementation protocols.
The Team
Gym Savages is built by two co-founders with complementary roles. I'm the technical co-founder — responsible for architecture, product, and everything engineering. Voislav Sinadinovski (@vojce_sin) is the domain co-founder — the coach and the face of the brand, bringing over 10 years of deep expertise in natural bodybuilding.
Voislav holds a BSc in Biology & Nutrition and was a professional alpine skier who represented North Macedonia internationally, competing at the 2017 World Alpine Skiing Championship in St. Moritz. After transitioning to natural bodybuilding, he won 1st place at the NPC FitParade Eagle Classic in Budapest (October 2025) — drug-free. His coaching philosophy centres on evidence-based training, intelligent nutrition, and long-term consistency over hype.
His credibility with the natural bodybuilding community is our biggest moat. The platform isn't built by engineers who looked up fitness on Wikipedia — it's built from 10+ years of lived experience at the highest level of the sport.
The Solution
Gym Savages: All-in-One Coaching Platform
Coaches get:
- Client management dashboard
- Drag-and-drop program builder
- Automated check-ins & analytics
- Direct client communication
- Payment & scheduling automation
Athletes get:
- Structured workout delivery with logging
- AI-powered meal tracking (photo → macros via Claude Vision)
- Progress visualisation
- Direct coach access
- Accountability system
Key Technical Decisions
Why Next.js Monolith (Not Microservices)
My initial instinct was microservices. The reality check: I had 15 clients. I needed to ship fast.
Microservices would have cost 2+ months of setup, 3+ services to maintain, complex deployment, and higher hosting costs. A monolith gave me 50% faster development, easier debugging, a single deployment, and shared TypeScript types across the stack. It scales comfortably to 1,000+ users.
Lesson: Don't optimise for scale you don't have yet.
Database: Supabase + Row-Level Security
Supabase gave me PostgreSQL (powerful and familiar), built-in Row-Level Security for multi-tenant safety without application code, and an affordable free tier with no vendor lock-in.
-- Coach can only see their own clients' data
CREATE POLICY "Coaches see own clients"
ON client_profiles FOR SELECT
USING (auth.uid() = coach_id);
-- Clients see only their own profile
CREATE POLICY "Clients see own profile"
ON client_profiles FOR SELECT
USING (auth.uid() = user_id);
Security enforced at the database level — even if application code breaks, the database prevents unauthorised access.
AI Meal Tracking with Claude Vision
User flow:
1. Client takes photo of meal
2. App sends to Claude API
3. Claude returns: "Grilled chicken 200g, brown rice 150g..."
4. Returns macros: 525 cal, 69g protein, 48g carbs, 9g fat
5. Client confirms → saved to log
6. Daily totals auto-calculated
7. Coach can correct if needed
Cost at scale:
- Per meal analysis: ~€0.01
- 20 clients × 3 meals/day × 30 days = 1,800 analyses/month
- Monthly AI cost: €18 (0.7% of revenue)
- At 1,000 clients: ~€900/month (still only 0.18% of revenue)
Server Components for Performance
// Runs on the server — no loading spinners
export default async function DashboardPage() {
const client = await getClientProfile();
const progress = await getClientProgress();
const workouts = await getClientWorkouts();
return (
<>
<ProgressOverview data={progress} />
<WorkoutSchedule workouts={workouts} />
</>
);
}
Result: 2s page load → 0.8s. 60% less JavaScript shipped to the browser.
Optimistic Updates
const { mutate: logWorkout } = useMutation({
mutationFn: (data) => api.updateWorkout(data),
onMutate: (newData) => {
queryClient.setQueryData(['workout', id], newData);
return { previousData };
},
onError: (_, __, context) => {
queryClient.setQueryData(['workout', id], context.previousData);
toast.error('Failed to save');
},
onSuccess: () => queryClient.invalidateQueries(['workout', id]),
});
User clicks → UI updates instantly → data saves in background → automatic rollback on failure. Perceived latency: 0ms.
Development Process
I ran a tight loop for each feature:
- Design on paper — 30 min
- Prompt Claude Code — 5 min
- Review & iterate — 20 min
- Test with a real client — 15 min
- Deploy to Vercel — 5 min
Cycle time: ~75 minutes per major feature × 12 features = 12 development days to MVP.
Validation & Traction
No marketing spend. Just authenticity:
- Oct 2024: Started Gym Savages Instagram
- Feb 2025: 10K followers (organic)
- Mar 2025: 20K followers (transformation content)
- Mar 2025: Beta with 5 close clients → real feedback, critical UX fixes
- Apr 2025: Applied to 10 people who had shown interest → 8 accepted (80% conversion)
- Apr 2025: €2,490/month MRR in 30 days
Current Metrics
| Metric | Value | |--------|-------| | Active clients | 20 | | MRR | €2,490 | | NPS | 4.8/5 | | Workout completion | 85% | | Check-in submission | 88% | | Renewal rate | 50%+ |
Business Decisions
SaaS Platform vs Personal Coaching
Path A — scale personally: coach 50 clients, earn ~€25K/month, but capped by time.
Path B — build a platform: enable 100 coaches to serve 5,000 clients. Recurring revenue, scalable, fundable.
I chose Path B. The platform becomes a valuable asset, not just a job.
Why Natural Bodybuilding Specifically
Generic fitness coaching: €10B market, high competition, low price power
Natural bodybuilding: €200M niche, no dedicated platform, high price power
15% YoY growth — fastest-growing segment
I'm the only platform built by a natural bodybuilder, for natural bodybuilders. Deep domain expertise, community trust, and features no generic platform has.
Payments: Bank Transfer First
I resisted adding Stripe immediately. Setup takes a week, requires business registration, and at early stage the 1.5% fee isn't worth the complexity. Bank transfers: €0 fees, €0 setup, professional enough for coaching. Plan to add Stripe once MRR exceeds €10K.
Lesson: Don't add complexity until you've proven the core business.
Key Learnings
Ship > Perfect. First client paid on day 17. The product was rough — some UI inconsistencies, minimal documentation. But it worked, and real user feedback shaped everything after.
Build for your first 10 users. No query optimisation, no caching, no microservices. Simple SQL, one server, manual testing. Optimise when you have the actual problem.
Personal brand is a moat. 25K Instagram followers = zero paid acquisition. Competitors with better tech can't beat authentic community trust.
Niche > Broad. "Natural bodybuilding platform for coaches" beats "fitness platform for everyone" every time. Clear positioning, premium pricing, less competition, deeper trust.
What's Next
- Q2 2026: AI meal tracking live, payment automation, 40 active clients, €20K/month target
- Q3–Q4 2026: Native iOS & Android apps, advanced analytics, B2B coach expansion, €40K/month target
- 2027+: AI-powered program generation, marketplace, €100K+/month, potential investment or acquisition
Building in public on Instagram @gymsavages · gymsavages.fit
Co-founders: Viktor Spasevski (tech) & Voislav Sinadinovski (domain) · Instagram @vojce_sin · gymsavages.fit/en/about