vadimkravcenko

What I learned building a $1K MRR SaaS in 6 weeks

09 July 2024 ·Updated 04 April 2026

I spent the last six weeks sneaking away from Netflix evenings and Saturday hikes to tinker on SEOJuice, and—somehow—last Tuesday the stripe dashboard crossed $1 K in monthly run-rate. The original target was “let’s see if anyone pays $9,” so the graph feels a little surreal. Success? Too early to call it. Fun? Absolutely.

As usual I kept a worklog—mostly half-baked notes to future-me (“don’t optimize PDFs at 2 AM again”). This post is the cleaned-up version. If you’re hacking on a micro-SaaS alone—code, support, marketing, everything—maybe the bumps I hit help you dodge a few. I’ll do a similar write-up at $10 K and $100 K if we ever get there (I’m not betting the mortgage on it).

Graph showing the growth of monthly recurring revenue (MRR) from alt=
SEOJuice finances in ChartMogul

Quick roadmap of what follows (don’t treat the bullets as equal weight—I linger where the lessons hurt most):

  1. The first few days — seed idea, tech stack, embarrassing shortcuts.
  2. The first few weeks — launch noise, paid ads, and the inbox firehose.
  3. The first few months — refactor season and keeping churn below panic level.
  4. My building philosophy — three “sustainable” rules I repeat to myself when shiny objects appear.

Important nuance: that $1 K is revenue, not profit. Infra, APIs, and tiny ad experiments eat roughly 25 %. If I killed all experiments tomorrow the margin jumps, but then the learning stops.

The first few days

The itch was simple: internal linking across my own blog posts is boring, and I forget. Good UX dies, SEO juice (hence the name) leaks, visitors bounce. Automate it and move on—that was the theory.

I first tried a WordPress plugin. Two evenings later I had a spaghetti mess of custom tables and admin screens. I parked the repo and swore at wp-insert-whatever. A month passed, the linking chore resurfaced, and I decided to build the thing as a standalone SaaS because a) easier tech, b) new side-quest for 2024, c) I clearly hadn’t suffered enough.

Version 0.1: plain Django templates and vanilla HTML. No JS frameworks, just full-page reloads. For a single user (me) it was fine. For real users it turned into debt—by week four people kept asking why the dashboard didn’t live-update. I’ll migrate to React or Next soonish (I’m honestly flip-a-coin on which; the marketing pitches blur together).

Screenshot of the SaaS dashboard displaying K MRR milestone, highlighting user engagement metrics and growth trends.
My git commit history

Scraping SPA sites was my first “not tonight” moment. Running Playwright in Docker ate half a Sunday and still failed on ARM. Rather than sink another weekend I paid ~$50/month for a render-JS API. Totally worth it. (I’m midway through replacing it now that the crawling code is stable—paying forever for what I can self-host feels silly.)

From day one I piped every front-end event into my database. Clicks, drop-offs, trial conversions—the whole funnel. It felt premature, but I remembered a thread about analytics converging with messaging and figured the data would pay off later. Spoiler: it did—most trial-to-paid lifts came from emails triggered by those events.

Early adopters rolled in—some genuinely helpful, some bargain hunters who cost more in questions than they’ll ever pay. (I learned the hard way: cheap or free tiers invite “can you add this one-off feature?” loops. Filtering for people willing to swipe a card day one keeps sanity intact.)

Support volume caught me off guard. The chat bubble pinged every hour with “What does SEO even stand for?”-level questions. Moving the widget from bottom-right into a top-nav link dropped casual pokes a significant amount—pretty close to the numbers another startup shared about the same tweak, so I’m calling that a win.

The first few weeks

Polished the rough edges, then opened the wallet. Google Ads, a couple of AI newsletters, listing fees on niche directories—I burned through more money than I want to admit. But sign-ups spiked, and the CAC looks okay when you stretch it over expected LTV (I could be wrong; time will tell).

Cheap channel that surprised me: posting a short demo in the SaaS Growth Hacks Facebook group. Zero dollars, a few hundred eyeballs, half-a-dozen paid trials the same day. There’s gold in those old-school communities if you phrase the post as “here’s what I built, roast me” instead of spam.

✅ Net cash position is around –$1 K after ads. I expect to earn that back within two months—provided churn behaves.

Product Hunt launch came next: #3 of the Day, #3 of the Week in Marketing. Traffic yes, paying customers not so much, but the comments were a free UX audit. Multilingual content, multi-site support, and team invites all came from that thread. More complexity, sure, but also more willingness to pay annual plans—roughly a third of current revenue is yearly pre-pays.

Product Hunt launch graphic for a SaaS reaching K MRR, with a simple layout and a prominent '1K MRR' reference.
#3 Product of the Day on Product Hunt

I keep a public changelog. Sounds trivial, but on burnout days scrolling that list of tiny wins (“fixed Norwegian character encoding,” “moved metrics chart above the fold”) reminds me progress exists.

Pricing remains a tug-of-war. I started low ($9 starter) because I wanted frictionless trials. There’s a solid argument that discount pricing undercuts perceived reliability—nobody wants budget-grade SEO tooling. I’ll probably test a 2-3× bump once the onboarding flow is airtight. Worst case I roll it back.

Screenshot of the SaaS dashboard showing growth metrics and analytics for a K MRR project built in 6 weeks.
A small snapshot of the drip campaign, there's 20 more If statements below, different branches, different emails, conversions tracked per email.

The event-based email drip I hacked together in Customer.io converted more trials than any ad channel. Bite-size SEO tips, progress screenshots, gentle “upgrade to keep the data flowing” nudges—it works. If I’d waited to instrument analytics, that whole growth lever wouldn’t exist.

Support tone also shifted: now it’s “I’m an agency on a yearly plan—help me squeeze more ROI.” Those calls are longer but higher value, so I gladly jump on them (well, after coffee).

Where we are now

My build mantra stays: make it dumb → prove value → then polish. I’m knee-deep in the polish part. Moving infra from DigitalOcean to Hetzner shaved hosting by a third. Re-working the crawler so Playwright runs locally instead of via API should drop costs further, though I might curse that decision in three months.

Churn stings. Three cancellations so far isn’t tragic, but every “we’re out” email feels personal. I shipped a win-back flow—discount links, one-click pause, the usual. No data yet on efficacy (ask me at the $10 K post).

Line chart of churn rate over time with months on the x-axis and churn percentage on the y-axis, showing a downward trend.
Churn rate really does hurt, but it's normal part of the business

Day-to-day focus is value per existing user: faster reports, clearer UI, less jargon. I’m investing an unreasonable amount of time into the help center because every answered question there saves ten minutes of chat support later.

Screenshot of the SaaS dashboard illustrating monthly recurring revenue (MRR) reaching K, showcasing user engagement metrics.
There's churn, and then there's also paying customers who love your software.

My building philosophy

Saying “no” has been the healthiest habit. No to discounts that scream “I won’t stick around,” no to turning the app into an unrelated backlink checker, no to 1-on-1 SEO coaching. Bootstrapped means I don’t have to chase every dollar, and I’d like to keep enjoying weekends.

Three principles taped above the monitor:

  1. Sustainable development — code should be interesting, not frantic. Longer cycles, fewer all-nighters.
  2. Sustainable growth — attract users who already feel the pain; avoid spammy outreach or vanity metrics.
  3. Sustainable profits — pay myself first, reinvest carefully, keep optionality to walk away if it stops being fun.

I’m transparent in support: if it’s 11 PM I’ll say “pushing this to tomorrow.” If a request derails the roadmap I refund and part as friends. Win-win or nothing.

Feels good to steer at my own pace. The perfect customers set up the script, buy a yearly plan, and never open a ticket. Rare, but worth the hunt.

Sticking to those three principles and seeing where the road leads.

Journey > destination.

Take a peek at the tool if internal linking also ruins your evenings.

Worried your codebase might be full of AI slop?

I've been reviewing code for 15 years. Let me take a look at yours and tell you honestly what's built to last and what isn't.

Learn about the AI Audit →

No-Bullshit CTO Guide

268 pages of practical advice for CTOs and tech leads. Everything I know about building teams, scaling technology, and being a good technical founder — compiled into a printable PDF.

Get the guide →
Cancel