I've shipped a bunch of half-finished projects over the years. Most never saw the light of day.
But I've also built two SaaS products that people actually pay for. The difference? I stopped making these mistakes.
No success porn. No inflated numbers. Just the dumb stuff I did wrong and how I fixed it.
1. Building Features Nobody Asked For
I spent three weeks building a dashboard.
It had charts. Real-time updates. Smooth animations. The works.
You know what my users wanted? A CSV export button.
That's it. They wanted their data in Excel so they could do their own analysis. My beautiful dashboard? Nobody used it.
Here's the thing: developers love building features. We see a problem and immediately think "I could build something cool to solve this." But what we think is cool and what users actually need are rarely the same thing.
The fix: Before you write a single line of code, talk to your users. Ask them what they're trying to do. Watch them use your product. You'll be amazed at how wrong your assumptions are.
I learned this the hard way. Now, whenever I get the itch to build something new, I send out a quick email first: "Hey, I'm thinking about building X. Would this help you?"
Half the time, the answer is no. The other half, they tell me what they actually need instead.
2. Choosing Tech Based on Hacker News
My first product used:
- Kubernetes (for 10 users)
- GraphQL (for 3 API endpoints)
- Microservices (for what was basically a CRUD app)
- Redis (for sessions that could've lived in cookies)
Why? Because that's what everyone on HN was talking about.
I spent more time configuring my "scalable" infrastructure than actually building features. Docker containers. Service meshes. API gateways. All for an app that peaked at 20 requests per minute.
Meanwhile, my competitor built their entire product in boring old Rails and ate my lunch.
The fix: Use boring technology. Seriously. Pick the most boring, stable, well-documented stack you can tolerate. You want to spend time solving your users' problems, not debugging why your service mesh isn't routing requests properly at 2 AM.
My current stack?
- One TypeScript monolith
- Postgres
- Caddy
That's it. It handles thousands of users just fine. When I need to scale (and that's a good problem to have), I'll worry about it then.
3. Hiding From User Feedback
"I'll add the feedback widget once the product is more polished."
"Let me just fix these bugs first."
"The UI isn't ready for real users yet."
I told myself these lies for months. The truth? I was scared. Scared that users would hate what I built. Scared of criticism. Scared of finding out I wasted my time.
So I hid. I kept building in my bubble, convinced I knew what users wanted.
Spoiler: I didn't.
When I finally launched, the feedback was brutal. Not mean brutal — just honest brutal. Features I spent weeks on were ignored. Basic stuff I overlooked was driving users crazy. The whole product was solving the wrong problem.
The fix: Set up feedback collection from day one. Not day 100. Day one.
I built UserJot for this exact purpose. After experiencing this pain myself, I wanted something dead simple where users could leave feedback right in the app, others could upvote, and patterns would emerge naturally. But honestly, even a Google Form is better than nothing.
Here's what early feedback taught me:
- My onboarding was confusing (fixed in a day)
- The main feature was buried in a submenu (moved to homepage)
- Users wanted Slack integration more than anything else (built it, usage doubled)
The earlier you get feedback, the less code you'll throw away.
4. Being Too Cheap to Charge Money
"Let's make it free during beta."
"We'll figure out pricing later."
"I don't want to charge until it's perfect."
Classic mistake. I had hundreds of "users" who loved the product. They sent nice emails. They requested features. They told their friends.
Then I added a paywall.
Crickets.
Turns out, free users will use anything. They'll tell you it's great because it costs them nothing. The moment you ask for even $5, they vanish.
The fix: Charge something from day one. Even $1. Even if you feel the product isn't worth it yet.
Why? Because paying users are different. They actually care about the problem you're solving. They give better feedback. They stick around.
Plus, there's nothing like someone pulling out their credit card to validate that you're building something worthwhile.
Don't overthink the price. Start low if you're nervous. You can always raise it later. Just don't be free.
5. Trying to Build the Next Big Thing
I've built:
- A revolutionary task manager (there are 500 already)
- A game-changing note-taking app (nobody switched from Notion)
- An innovative project management tool (it was just Trello with extra steps)
You know what actually worked? Boring stuff. Specific solutions to specific problems for specific people.
The world doesn't need another todo app. It doesn't need your revolutionary take on email. It definitely doesn't need an "AI-powered" version of something that already exists.
The fix: Find a boring problem in a boring industry and solve it better than anyone else.
Look for markets where:
- People already pay for solutions
- The existing tools are clunky or overpriced
- You can talk to actual users (not just other developers)
My successful products? They're not sexy. They solve mundane problems for businesses that happily pay to make those problems go away.
Innovation is overrated. Execution on boring ideas prints money.
6. Living in Your Code Editor
My daily routine on failed projects:
- 6 hours coding
- 1 hour "thinking about marketing"
- 0 hours actually talking to users
I convinced myself that if I just built a better product, users would come. If I added one more feature, fixed one more bug, refactored one more component — then I'd be ready to focus on growth.
This is the developer's curse. We're comfortable in our editors. Marketing feels slimy. Sales feels awkward. So we retreat to what we know: writing code.
The fix: Flip your time allocation:
- 2 hours coding
- 2 hours talking to users
- 2 hours on marketing/content
- 2 hours on literally anything except more code
Your product doesn't need to be perfect. It needs to be discovered.
I started forcing myself to write one blog post for every feature I shipped. To send 10 cold emails for every bug I fixed. To have one user call for every refactor I did.
Guess what? The shitty MVP with good distribution beats the perfect product nobody knows about. Every. Single. Time.
7. Overengineering Everything
Real things I built for my first SaaS:
- Custom authentication system (instead of using Django's built-in)
- My own job queue (instead of Celery)
- Custom analytics tracking (instead of Plausible)
- Homemade deployment scripts (instead of a simple rsync)
Why? Because I thought I was special. My app had "unique requirements." I needed "full control." The existing solutions were "too bloated."
What a load of crap.
I wasted months rebuilding things that already existed. Months I could've spent getting users, fixing actual problems, or — novel idea — making money.
The fix: Use everything off the shelf until you absolutely can't.
Your database? Postgres or SQLite.
Your auth? Whatever your framework provides.
Your payments? Stripe.
Your email? Postmark or SES.
Your hosting? Whatever you already know.
You're not Google. You don't have Google problems. You have I-need-to-find-10-paying-customers problems.
Save the clever engineering for when you're profitable.
Look, building a SaaS is hard enough without making it harder on yourself.
Stop overcomplicating everything. Stop building in secret. Stop pretending you know what users want.
Just build something simple, charge for it, and actually listen to the people using it.
That's it. That's the whole playbook.
Now stop reading blog posts and go talk to a potential customer.
PS: If you're starting a SaaS and want a simple way to collect user feedback without the enterprise complexity, check out UserJot. I built it because I was tired of expensive, bloated feedback tools. I'd love to hear your thoughts.
Top comments (16)
But what if my app suddenly scales to hundreds of endpoints and 500 developers?!??!?!
ah shit, you're right.
A very insightful post thanks, really thanks you
Sure thing
There's some good advice here. Thanks.
This hit way too close to home...in the best way
This is sow insightful 🙌
Oof, this hit home 😅
This ia a great post man, keep going! I finally can give the unicorn emote to someone
Haha thank you :)
This is extremely impressive, honestly. I feel like you summed up every pain point I hit when I started out
Thank you! I'm glad to hear.
This is so real - setting up feedback loops early changed everything for me, too. Curious, what was the hardest piece of negative feedback you had to act on?
Really interesting — I noticed that userJot offers a generous free tier, which is great for onboarding.
That said, your point #4 emphasizes the importance of focusing on paying users early.
I'm curious how you balance both?
Some comments may only be visible to logged-in visitors. Sign in to view all comments.