Turning a developer tool into a $50k MRR lifestyle business

Jason McCreary, founder of Shift

Jason McCreary built a tool that automates the process of upgrading Laravel applications between major versions. Ten years later, Shift is at $50k MRR — and it only takes him a few hours per day.

Here's Jason on how he did it. 👇

Ten years in

I've been programming since I was 15. I studied Computer Science in college. I've always had side projects. Some have done well — particularly a "March Madness" iOS app back in the early App Store days. I still work on side projects, especially now with AI. But Shift is by far the most successful and remains my primary focus.

Shift automates the process of upgrading Laravel applications between major versions. You sign in, connect your repo, and in less than a minute, get a pull request with all the changes in nice, atomic commits. It costs less than lunch.

I built and run Shift solo. In its ten years, Shift has performed over 175,000 upgrades. While a bit seasonal around the release cycle, it consistently generates over $50k MRR. Growth has slowed a bit with the adoption of AI and fewer Laravel changes. But customer retention is very high. Those who Shift, keep Shifting!

Building at a conference

I gave a talk at a PHP Conference about upgrading Laravel in November of 2015. Taylor Otwell, the creator of Laravel, attended. After the talk, I asked him if any scripts automated the upgrade process. He said, "No. But I'd use it."

I started building Shift that night at the conference hackathon. When I had a working prototype, Taylor mentioned it on Twitter to help me find testers. I continued working on it when I got home. A few weeks later, I launched laravelshift.com on December 23, 2015.

Over the Christmas holiday, I made $80 — about 20 runs. Pricing was stupid back then. Having built iOS apps, I charged only a few dollars. But with people buying it over the holidays, I clearly had something.

I didn't consider it a business at the time. I was happy at my day job. I liked the problem. I knew I'd use it myself. Turned out, about 40,000 other Laravel developers would too.

A scrappy MVP

The initial product was scrappy. A mashup of PHP and shell scripts. It was a true MVP. Although I didn't have a deadline, Taylor mentioned he was working on the next release, so I wanted to be ready. Ideally, I wanted to offer Shifts to cover three major releases (5.0, 5.1, 5.2).

I built a single-page site. No sign-in. Users connected with GitHub, Bitbucket, or GitLab. They chose their Shift. They paid via Stripe Checkout. The initial version immediately redirected users to their pull requests. It took about 60 hours over nights and weekends to make it launchable.

The initial version was incomplete. Jeffrey Way, who created Laracasts, ran it early and told me it was "buggy." He wasn't wrong. I cut corners to ship. I was also new to Laravel. So I didn't know all the ways it was used.. But it was worth it for two reasons.

First, launching quickly to meet the next release and meeting Taylor afterward was perfect timing. I was new to the Laravel community. Having its creator interested in the product was a huge boost. Second, those feedback emails were critical for iterating on the MVP. It would have been easy to think it failed, but it ended up being key to Shift's success.

As far as funding it, the initial overhead was minimal. Probably less than $50 for a domain and servers. It helped that I'm a developer. I built everything myself. While time is money, I had it to give. Those 60 hours came from nights and weekends. Before I had kids.

A familiar stack

These days, I run a straightforward, familiar stack:

  • PHP + Laravel

  • Tailwind CSS

  • Stripe Checkout

  • Additional services: Pusher, AWS SES

I host everything with Cloudflare and Digital Ocean for dynamic workers on demand.

The underlying Shift "engine" is still a mashup of PHP and shell scripts, with a much better pipeline architecture. I expanded the website with a user dashboard and redesigned it a few times. But nothing fundamental has changed from the MVP, just a lot more Shifts.

Shift homepage

Increasing revenue via pricing, expansion, and adjacent products

Shift started with a single revenue stream: pay-as-you-go runs. I charged $3 to $7, depending on the number of versions upgraded. Embarrassingly low in hindsight. I introduced subscriptions later, once developers trusted the service. Today, revenue splits evenly between the two.

Expanding the catalog has been an obvious driver of revenue growth. Every new Laravel release creates a new Shift. But I also built adjacent products: a test generator, code modernizer, and one-off refactors. These help normalize seasonal revenue.

Pricing has been the biggest lever. I find pricing extremely personal. I started with what I would pay. Then I dialed it in. It took a few increases to get where it is now. It's easy for someone to say, "Charge more." But for me, charging less in the early days may have helped Shift grow. You have to start with what works for you. Then, be willing to increase. Over the years, I moved to tiered pricing, aligning costs with the age of the Laravel version. Older versions cost more. This approach works two ways: it incentivizes customers to stay current and increases revenue.

In the last year, I moved to localized pricing using Stripe's new features. I intended to help customers avoid currency conversion fees. But it slightly increased revenue, given my customer base in the EU and UK. Ultimately, this helped offset the slight decline from AI.

Absurd margins

The margins are absurd. $100 a month in overhead against $50k+ MRR.

Over the years, I've brought in a few contractors. Mostly, when I needed extra capacity or just wanted some company instead of running the business solo. But no employees. No investors.

Now with AI, I'm back to doing it all myself. Total overhead is still around $100 a month. I do a few hours of support in the morning. A true lifestyle business.

With essentially no overhead, I've had a lot of flexibility to experiment, make mistakes, and figure it out as I go.

Building authority and trust via communities

The biggest growth lever has always been community. From day one, Taylor Otwell backed Shift with a tweet. That one retweet reached exactly the right audience. That definitely gave Shift the initial boost most projects never get.

Taylor's tweets were gold. But I didn't always have them. I needed to build my own audience. I got involved. Spoke at Laracon. Got on community podcasts. Wrote blog posts. Built courses where I saw knowledge gaps. None of it explicitly marketed Shift. I'm not salesy. But I was never afraid to mention Shift when it added value to the conversation.

I did that in community chats, forums, Twitter, and Reddit. I'm old school. Given my developer audience, I still mostly do Twitter. I also send a weekly newsletter to Shift users and try to livestream every Wednesday.

I run a monthly ad on Laravel News, too. I don't think it moves the needle. But it's a good deal and keeps Shift in front of eyeballs. You never know what content reaches people. So, I stay consistent. A shotgun approach.

I enjoy being part of the Laravel community. It's not a marketing tactic. It's who I am. I think that shines through and ultimately builds authority and trust. All the same things you want good marketing to do.

Relying on luck and feedback

Two things have been particularly helpful: luck and feedback.

The luck part was meeting Taylor at that conference. It was exactly the right time, with exactly the right idea. His early backing gave Shift that intial boost.. I'm never afraid to acknowledge that luck is a big factor.

The feedback was those early email follow-ups. From day one, I sent an email follow-up every single user 48 hours after they ran a Shift. Two simple questions: What manual changes did you still have to make? How did you find out about Shift? The answers weren't always what I wanted to hear. But I replied to every one. I still do.

That feedback loop turned a lucky MVP into a service Laravel developers trust. If there's one thing I'd tell any indie hacker, it's that: Talk to your users. As many as you can. You don't always have to act on their feedback, but listening helps.

Freedom is the goal

Other than that, here's my advice: Ship it!

Shift was buggy at launch. I knew it. I shipped anyway. I could have easily spent a year building the full catalog and getting the automation perfect. But I might have missed my window.

And it's okay to stay small. Freedom is the goal. Not the exit. Find a real problem in a community you're already part of. Your idea doesn't have to be the next trillion-dollar company. It can be something you and the people around you pay for. That's it.

What's next?

The path I'm on has been Ikigai. The intersection of what I'm good at, what I enjoy, what the world needs, and what I can be paid for. Ten years in and it's still fun.

Life has changed over the last 10 years. Married, two kids, getting older. My goal is to keep Shift going as long as I can. It has an end, likely from the rise of AI or the fall of Laravel. Both of those are probably far enough off that I can retire from Shift.

So, I'll adapt Shift to AI. And I'll keep saving for retirement.

You can follow along on X and my personal website. And check out Shift!

Indie Hackers Newsletter: Subscribe to get the latest stories, trends, and insights for indie hackers in your inbox 3x/week.

About the Author

Photo of James Fleischmann James Fleischmann

I've been writing with Indie Hackers for the better part of a decade. In that time, I've interviewed hundreds of startup founders about their wins, losses, and lessons. I'm also the cofounder of dbrief (automated expert interviews) and LoomFlows (customer feedback via Loom). I'm the creator of a newsletter called Ancient Beat (archaeo/anthro news). And I built and sold SaaS Watch.

Support This Post

26

Leave a Comment

  1. 1

    Very Inspiring

  2. 1

    I learned something similar while building my own product. My first instinct whenever people didn't use it was "I need another feature." But after shipping more, I realized distribution was usually the bottleneck, not the product itself.

    It's surprisingly easy to spend weeks improving something that almost nobody is seeing. Changing where you find users often teaches you more than changing another screen in the app.

  3. 1

    I really liked your point about launching before the product was perfect and using early feedback to shape it. I’m also building a small Windows utility, and I’ve found that real user feedback is far more valuable than trying to predict every feature in advance. Your approach of following up with every user after 48 hours was especially insightful.

  4. 1

    This was a great read. What impressed me most wasn't the technical side—it was how quickly you shipped an MVP and let real users shape the product. Too many founders spend months polishing before getting any feedback.

    I also liked your point about pricing. Starting with a price that felt comfortable and increasing it over time seems much more sustainable than trying to maximize revenue from day one.

    I'm building LaunchLoopIO, an AI platform that helps founders discover and validate business ideas, and one pattern I keep seeing is that the most successful products usually solve one very specific pain exceptionally well. Shift is a perfect example of that.

    Congratulations on building something that's been valuable to the Laravel community for a decade. Reaching that level of longevity is probably harder than building the product itself.

  5. 1

    Love the honesty about luck and AI adoption. A lot of people think AI will instantly kill dev tools like this, but 10 years of building trust within the Laravel community is a massive moat. Users know Shift won't break their production code, and that's something a raw LLM prompt can't guarantee yet.

    1. 1

      "Users know Shift won't break their production code" - that's my biggest "moat" with AI currently. Shift is still far more deterministic and thorough with its changes. AI will get there. Like you said, just not "yet".

  6. 1

    This is one of the best examples of solving a specific problem for a specific audience instead of chasing the next big trend. What stood out to me wasn't just the $50k MRR—it was the consistency over 10 years, the tiny operating costs, and the relentless feedback loop with customers.

    The biggest takeaway for me is that community and trust can become a much stronger moat than complex technology. Shipping an imperfect MVP, listening to users, gradually increasing prices, and staying deeply involved in the Laravel ecosystem created a business that's difficult to replicate.

    Also appreciated Jason's honesty about luck. Meeting the right person at the right time mattered, but he still had to build, iterate, and deliver value for a decade to turn that opportunity into a sustainable business.

    A great reminder that freedom and longevity can be better goals than chasing hypergrowth.

    1. 1

      I find it nuts when founders dismiss "luck". Maybe "luck" is not always the right term, but there is definitely an element of luck/fate/serendipity in their story.

  7. 1

    The $100/month overhead line is the detail that should stop every bootstrapper who reads this. Most solo founders don't track overhead carefully enough to even know what theirs is. Jason does, and it's not an accident — it's the structural advantage of owning the entire stack and never taking investment that would pressure him to spend.

    The part I keep thinking about is the AI risk he mentions almost casually at the end. Shift's core job — parsing changelogs, applying upgrade rules, generating PRs — is the exact kind of structured transformation that LLMs handle well now. But here's what any AI wrapper competitor would be missing: 175,000 upgrades worth of edge case data from those 48-hour follow-up emails. That feedback corpus IS the product at this point, not the scripts.

    Running 10+ apps myself, I can confirm that the "adjacent products to smooth seasonality" strategy is underrated. We do the same thing — different tools that share a user base but peak at different moments. It's boring compared to chasing new markets, but the LTV math is significantly better when you're cross-selling to people who already trust you.

    The Ikigai framing is honest in a way most founders won't admit to. "I'll adapt Shift to AI and keep saving for retirement" isn't a moonshot story. It's a sustainable one. And ten years of evidence suggests it works.

    1. 1

      AI is a real risk. But I'm taking it in stride. There's also no competing with it. The way forward for Shift is more collaborative. Ideally using Shift to do what it's done well for the last 10 years, and use AI for the "last mile" of automation. Best of both worlds.

  8. 1

    Congrats on 10 years, this is the kind of longevity most of us can only aspire to. The detail I keep coming back to is the tiered pricing where older Laravel versions cost more. Most SaaS pricing punishes loyal customers with increases over time. Yours does the opposite. It charges for procrastination. The customer who stays current pays less, upgrades more often, and generates more recurring revenue anyway. That’s pricing as product design, not just monetization. It nudges users toward the exact behavior that makes them successful with the tool. I suspect that alignment is a quiet reason behind the crazy retention you mentioned.

    1. 1

      Maybe. It just made sense in my head. Having the latest version be the lowest cost is both a "carrot" and a "thanks" at the same time.

  9. 1

    Really enjoyed reading this. The part that stood out most was how much of Shift's success came from consistent iteration rather than chasing perfection. Shipping a buggy MVP, replying to every customer email, gradually improving pricing, and staying active in the community for a decade is a much more realistic blueprint than the overnight success stories we usually hear. Congrats on 10 years, and thanks for sharing the numbers and lessons so openly.

  10. 1

    Freedom is the goal that frames everything. Most founders measure success by revenue or users, but those are just proxies; the actual goal is time and autonomy. 10 years solo at $50k MRR with a few hours per day is a better outcome than a VC-backed team doing 10x the revenue with zero freedom.

    The community authority point in section 7 is something I'm learning right now at month 7 of building dailyaitools.io, showing up consistently in the right places, compounds in ways that paid acquisition never does. slow, but it actually sticks.

    1. 1

      Exactly, I have no clue which "channel" has the most customer acquisition. I just do my silly "shotgun approach" and Shift keeps growing. I share for me, not necessarily for Shift. Somehow it all factors in. But, in the end, I really have no idea.

  11. 1

    Congrates DEAR

  12. 1

    The part about luck and timing really resonates. I'm in the early days of building FamiStream — a parental control layer for IPTV. Found the problem the hard way when my kid found something he really shouldn't have on our IPTV setup.

    Your point about shipping scrappy hit home too. I've been overthinking perfection when I should just be getting users.

    One question: how did you handle the period between 'I have something working' and 'people actually trust it enough to pay'? That's exactly where I am now.

    1. 1

      I just kept grinding - made improvements based on the feedback emails, extended the catalog, and did lots of community engagement (SO, reddit, forums, etc). It probably took about 18 months before Shift reached that "ok, people are using this" phase. But I still do the same "grind" today.

  13. 1

    The seasonality problem is the quiet engineering in this story. Shift's demand spikes around each Laravel release and then flattens. The adjacent products — test generator, code modernizer, one-off refactors — aren't just extra revenue, they're the answer to that valley between releases. Most solo founders fight seasonality with discounts or more ad spend. Building adjacent SKUs for the same audience with different timing is a much cleaner fix.

    The localized pricing detail is also underrated. Usually framed as 'doing right by international customers,' but Jason's honest that it slightly increased revenue from EU/UK — because currency friction was suppressing conversions that were already there.

    The deeper lesson for me: when your product is tied to someone else's release cycle, your job isn't to fight the seasonality, it's to fill the gaps with adjacent problems the same customer has.

    1. 1

      Good call. I may have dismissed these as a "revenue generator", but they very much are a "revenue stabilizer".

  14. 1

    The "charge less early, raise later" path is the opposite of the advice this site usually gives, and it's right for the situation: with a skeptical dev audience, a few-dollar price de-risked the trial, and retention did the rest once the value was obvious. The deeper moat isn't the tool (scripts AI can now approximate), it's that Jason owns the exact moment in the Laravel lifecycle where the pain spikes, backed by ten years of trust in one community. That's the part nobody clones with a weekend and a wrapper.

  15. 1

    The 48-hour follow-up email is the detail I keep coming back to. Two questions, every user, every run, for ten years. Most founders automate that loop away or skip it entirely. Were the "what manual changes did you still have to make" answers the main driver for which Shifts you built next, or did they mostly confirm things you already suspected? And did the format of those two questions ever change, or have you been asking exactly that since 2015?

    1. 2

      No, I wanted a straightforward email. So those two questions have never really changed. I figured it had a better chance at replies. I'd say 1 in 10 do. Sometimes just to say, "worked perfectly, no changes".

      Yes, the "what manual changes did you still have to make" helps improve the automation. Shift will never be able to automate 100% of the changes for 100% of the project. But as you said, tweaking it just a bit based on this feedback for 10 years gets it pretty close.

  16. 1

    The "charge less early, raise later" path is the opposite of the advice this site usually gives, and it's right for the situation: with a skeptical dev audience, a few-dollar price de-risked the trial, and retention did the rest once the value was obvious. The deeper moat isn't the tool (scripts AI can now approximate), it's that Jason owns the exact moment in the Laravel lifecycle where the pain spikes, backed by ten years of trust in one community. That's the part nobody clones with a weekend and a wrapper.

    1. 1

      Yes, I really don't think I could have charged $39 from day one. Is that what Shift is "worth"? Sure, maybe even more. But that wasn't my view in the beginning. Especially coming off selling iOS apps for a $1.

      My view on pricing has changed a lot over the years. I think it's all about "perceived value". That's just as much your view, as it is the customers. It took me years to be comfortable raising prices. I didn't want to "raise prices once I got popular". But if Shift was going to be a "real business", it was almost required. In fairness, tiered pricing is more approachable than the weird "waterfall pricing" I had.

  17. 1

    I haven't told you this in person because... well I don't know why... anyway, your work with Shift and its success for you as a solopreneur has been an aspirational example for me for a long time

    Thanks for being so dang awesome dude

    1. 1

      Thanks Simon. Love the work you're doing with NativePHP!

  18. 1

    Congrats this is awesome!

  19. 1

    Congrats — $50k MRR on a developer tool is no small feat, devs are famously hard to charge. What actually got them to pay? Was there a clear "this saves me hours" moment, or did it spread inside teams first and convert on usage?

    1. 1

      Those initial tweets from Taylor likely convinced the first few customers. I also think the ridiculously low pricing "derisked" the service. After trying it, the value was obvious - as measured by Shift's crazy high retention rate.

  20. 1

    Incredible journey, Jason! The line 'Freedom is the goal. Not the exit.' really resonates. In a world so obsessed with unicorn valuations and venture capital, it's incredibly refreshing to see a 10-year masterclass in building a highly profitable, sustainable lifestyle business. Your dedication to the unsalable stuff—like replying to every single feedback email for a decade—clearly paid massive dividends in building community trust. Congrats on the success

    1. 1

      Yes, while hard to measure, all those replies created some "true fans".

  21. 1

    Very good and congrats on 50k$ MRR on a developer tool is no a small feat

  22. 1

    Congrats — $50k MRR on a developer tool is no small feat, devs are famously hard to charge. What actually got them to pay? Was there a clear "this saves me hours" moment, or did it spread inside teams first and convert on usage?

    1. 1

      Thanks! Yes, as a dev, I'll admit, I don't pay for much. I think that ridiculously low initial pricing helped mitigate devs skepticism. A sort of, "it's only a few bucks" kind of thing. Once they realized it indeed saved them hours of work, they gladly paid more.

      Shift is definitely B2C than it is B2B. That is, the pay-as-you-go Shifts generate more revenue than subscriptions.

  23. 0

    PolicyKit is live on Product Hunt today

    Launching on PH — free Privacy Policy generator I built after Stripe asked for a live policy URL.

    Privacy = free. Terms + Cookie = $9 once.