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. 👇
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!
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.
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.
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 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.
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.
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.
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.
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.
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!
Leave a Comment
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.
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.
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.
Good call. I may have dismissed these as a "revenue generator", but they very much are a "revenue stabilizer".
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.
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?
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.
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.
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.
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
Thanks Simon. Love the work you're doing with NativePHP!
Congrats this is awesome!
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?
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.
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
Yes, while hard to measure, all those replies created some "true fans".
Very good and congrats on 50k$ MRR on a developer tool is no a small feat
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?
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.