How I Built a URL Shortener
That Now Pays My Rent
From a sleepless weekend project to a product making real money — this is the unfiltered story nobody tells you.
It was 11:43 PM on a Friday. My landlord had just sent another "friendly reminder" about rent. I had ₹4,000 in my account, a half-eaten packet of Parle-G biscuits on the desk, and a tab open to Stripe's pricing page — because somewhere in my head, I genuinely believed I could fix my bank account by building something over the weekend. Most people would call that delusion. I call it the Indie Hacker mindset. And honestly? It worked. Just not in the way I imagined it would.
Let me take you back to where this whole thing started — not with code, but with frustration. I was freelancing at the time, managing social media campaigns for three small clients. Every week, I'd manually create UTM-tagged URLs, paste them into Google's Campaign URL builder, then shorten them with Bitly. Bitly's free plan had a link limit. Their paid plan felt expensive for what I needed. I kept thinking: "Why is this so annoying? How hard can it be to build my own version?" That question is where every indie project begins.
The Weekend I Decided to Stop Complaining and Just Build It
I gave myself one rule: no planning documents, no Notion boards, no "market research." I opened VS Code, brewed strong chai, and started typing. The MVP was embarrassingly simple — a Node.js backend with Express, a Redis database to store the short-code-to-long-URL mapping, and a frontend that was essentially just two input boxes and a button. No user accounts. No analytics. No dashboard. Just: paste long URL, get short URL. Done.
That first version took about 14 hours across Saturday and Sunday. I deployed it on a ₹500/month VPS from DigitalOcean (the cheapest droplet), bought a short domain for $8, and posted about it on Twitter at midnight: "Built my own URL shortener this weekend. It's basic but it's mine. No tracking, no paywalls, no BS." That tweet got 11 likes — three of which were my college friends being polite. But one person replied: "I'd pay for this if it had analytics." That comment changed everything.
Adding the One Feature That Made People Pay
I spent the next two weeks adding click analytics. Nothing fancy — just a simple dashboard showing total clicks, top referrers, and a country breakdown. I used a free IP geolocation API and Chart.js for the graphs. I added user accounts (JWT auth, because sessions scared me at the time), set up a simple pro plan at $5/month using Stripe's test mode, and launched it on Product Hunt on a Tuesday morning — which I later learned is a terrible day to launch, but I didn't know that yet.
The Product Hunt launch got 47 upvotes. Not viral, not impressive. But three people signed up for the paid plan that same day. That's $15. Fifteen dollars I did not have before I pressed publish. I remember staring at the Stripe notification on my phone, reading "Payment received – $5.00" three times in a row. I felt something I can only describe as a very specific kind of joy — the joy of someone paying for something you made with your own hands, for a problem you yourself had.
The Slow, Unglamorous Growth Phase
I want to be completely honest with you here, because every "I made $10k/month" article on the internet skips this part: months 2 through 5 were soul-crushing. Growth was slow. Some months I'd gain 8 users, some months I'd lose 3. I had a day job at a digital agency during this time, and every lunch break I'd open my dashboard, refresh Stripe, check for churn, and wonder if I was just wasting my weekends.
What kept me going was a spreadsheet. Every week I logged my MRR, the number of new signups, and one thing I'd improved in the product. Seeing even small numbers go from $15 to $45 to $110 was enough to keep me in the game. I also started writing about the product on a small dev blog — nothing polished, just raw "here's what I built this week" posts. Those posts started bringing in organic traffic from Google. People searching "Bitly alternative open source" or "custom URL shortener with analytics" started finding me.
The Moment Everything Shifted
Six months in, I got an email from a marketing manager at a mid-size e-commerce company. She said her team had been using my tool for two months and wanted to know if I had a team plan. I didn't. I built one in four days. Charged $49/month for up to 10 users. She signed up immediately. That single customer took me from $1,200 MRR to $1,249 MRR — but more importantly, it showed me that businesses would pay significantly more than individuals.
I pivoted my entire focus. I added team workspaces, branded link domains (so companies could use their own domain instead of mine), bulk link creation via CSV upload, and API access for developers. Each of these features was directly requested by real customers in support emails. I wasn't guessing — I was listening. This is the biggest lesson I took from the whole experience: don't build what you think people want, build what they keep emailing you about.
const stack = {
backend: "Node.js + Express",
database: "PostgreSQL + Redis (cache)",
auth: "JWT + bcrypt",
payments: "Stripe Billing",
hosting: "DigitalOcean + Cloudflare",
frontend: "Vanilla JS → then React",
monthly_cost: "~$38/month at $10k MRR"
};
What $10,000/Month Actually Feels Like
People assume that once you hit a big revenue number, life feels different in some dramatic way. It doesn't — not immediately. What changes is the absence of certain fears. I no longer check my bank account before buying groceries. I quit my agency job in month 9, which felt terrifying for about 72 hours and then just felt normal. I sleep slightly better. I still eat Parle-G biscuits, but now it's a choice, not a budget constraint.
The real reward isn't the number on the Stripe dashboard. It's the fact that I built something that solves a problem for over 800 paying customers — real people and businesses who use it every single day. A marketing team in Germany uses it to track their entire influencer campaign performance. A SaaS startup in Bangalore uses it for their onboarding email links. A solo blogger in the Philippines uses it to keep his affiliate links clean. These people are trusting a product I built alone, in my apartment, on nights and weekends. That still feels surreal.
Honest Mistakes I Made (So You Don't Have To)
I underpriced for the first four months. I was charging $5/month out of fear — fear that people would leave if I charged more. When I raised the price to $9/month for new signups, churn did not increase. Revenue went up. Lesson: price anxiety is almost always unfounded.
I also spent too much time on features nobody asked for. I built a QR code generator (nobody used it), a Slack bot integration (three people used it), and a link "expiry date" feature (actually became a top-requested feature later — so sometimes you're just early). Focus on the core loop first: short links + analytics + team management. Everything else is noise until your MRR is healthy.
And finally — I waited too long to do SEO. I had a working product for five months before I wrote a single blog post. Organic traffic now accounts for 40% of my new signups. Start writing the day you launch, even if nobody reads it. Future-you will thank you.
Should You Build a URL Shortener? (Real Talk)
Probably not a URL shortener specifically — the space has more competition now. But the approach? Absolutely. Find a tool you use daily that either costs too much, does too little, or treats you like a number. Build a version for yourself. Show 10 people. Charge $5. Iterate. That's the whole playbook. There's no secret, no unfair advantage, no VC funding required. Just a problem you understand better than most, and the stubbornness to keep showing up.
I'm writing this from a coffee shop in Bangalore. My laptop is open, Stripe is showing $10,480 MRR for this month, and I'm about to work on a new feature a customer requested last week. The rent is paid. The biscuits are optional. And somewhere out there, another developer is looking at a frustrating tool they use every day, thinking — "How hard can it be to build my own version?" Go find out. That question is the best one you'll ever ask yourself.