Two years ago, I created a website for my business. By combining my terrible design skills with a decent-looking template, I created a site that looked okay. I told myself that if the business took off, I’d hire a real designer to make it look professional.
A year later, the business was generating $45k/month in revenue, but my website still looked like a college student’s hobby project. It was time for that professional redesign I’d promised myself.
There were only three pages I cared about, so I expected the redesign would be straightforward. Maybe a few months and $15k.
Here’s how the site looked after the redesign:
Except it didn’t take a few months and $15k. It took eight months, $46k, and a lot of headache.
Now that the project is over, I’m revisiting what mistakes I made that let this project spiral so far out of control.
I know what you’re thinking 🔗︎
If you hear that someone spent $46k to redesign three pages of a website, you probably think they’re a rube with no experience in software or hiring.
I made mistakes on this project, but hopefully they’re more interesting than the ones you expect.
The initial estimate: four weeks and $7k 🔗︎
I’m not trying to bash the agency here, so I’ll just call them WebAgency. They’re based in the US, and I found them through a Hacker News monthly freelancer thread.
WebAgency quoted the highest rate of anyone I interviewed, but their portfolio best matched the style I wanted. They had a wide range of talent in-house, including design, custom illustrations, and 3D imaging.
Isaac, WebAgency’s CEO, won my confidence during our initial call by suggesting I reduce the project’s scope. Even though it meant less money for him, Isaac proposed a rebranding rather than a full-blown redesign. WebAgency would work on the fundamentals like a new logo, color scheme, and fonts.
After rebranding, I could measure results to see if it was worth continuing the redesign. If nothing else, a rebrand would give me a solid foundation to create a marketing campaign with digital marketing agencies.
That sounded smart!
WebAgency estimated that the rebrand would require 30-40 billable hours over two to four weeks. Their hourly rate was $175, so we were looking at $5-7k for a new logo and branding. That was half my budget, so it was an easy call.
Isaac warned that I was smaller than their other clients. Most of their customers had WebAgency on expensive long-term retainer agreements. This project was so tightly-scoped that we could do it hourly, but there was a possibility that they’d have to pause my work occasionally if a retainer client needed more time.
I didn’t mind pausing the project for a week or two if things got busy. I was originally expecting the project to take two or three months, so a few extra weeks was nothing.
The honeymoon period 🔗︎
The first month of the project was fantastic.
WebAgency invited me to meetings every two weeks with their lead designer, a senior designer, a project manager, and Isaac. They’d show me samples of the new logos and branding, and I’d give feedback. The next round, we’d be a little closer.
Within six weeks, we narrowed in on a concept we all liked.
The first red flag: scope creep 🔗︎
In our first few meetings, WebAgency showed me mockups of my site with different color options.
As the project progressed, the mockups became more elaborate. WebAgency started showing me custom images and icons for the site.
We’d never discussed custom illustrations, but it seemed like a small amount of work, so I let it go.
A few weeks later, WebAgency called a meeting to share updates, but they hadn’t made any progress on the logo or branding. Instead, they spent the whole meeting showing me design ideas for the website.
“To be clear, the project is still a rebranding and not a redesign, right?” I asked.
“Oh, yes, yes!” the lead designer reassured me. “Some branding choices wouldn’t make sense on top of the old design, so these are just quick sketches of how they could look.”
Just finish the logo! 🔗︎
By December, we were three months into the project. WebAgency was 95% done with TinyPilot’s new logo. All I wanted was to change some rounding on the corners and eliminate the border. I expected it to be a couple of hours of work.
I was eager to finalize the logo because it would be the first completed asset WebAgency was giving me. Once it was ready, I could publish it on the website, integrate it into the product’s web interface, and print it on the device’s physical case.
All I needed was a couple more hours of work. But I didn’t get them.
Instead, WebAgency kept redesigning the website. Their lead designer didn’t have availability to work on the logo, but what did I think about this new design idea for the landing page?
The breaking point came when WebAgency started showing me new designs for my site’s blog. From the beginning, I had said that I only cared about three pages: the landing page, the product page, and the shopping cart page. All other pages were explicitly out of scope.
I pointed this out to WebAgency, and Isaac called me, embarrassed. He admitted that the designers went beyond mere sketching. They were so excited about the project and got carried away, but he was going to remove the hours they’d spent redesigning the blog.
The two-month holiday slowdown 🔗︎
Midway through December, I noticed WebAgency had stopped making progress on anything.
They stopped scheduling calls to review work with me, and the comments I left on their designs sat ignored for weeks.
I chalked it up to the holidays. Lots of people are on vacation in December, so I assumed things would pick back up in the new year.
The new year started, and not only did the pace stay slow, the quality of the work degraded. The easy, clear communication we had at the start of the project was gone. Now, a minor note about background color required three back-and-forths.
“I just don’t know when we’ll have the hours” 🔗︎
In early February, I emailed Isaac to ask what was going on. He called and apologized for how the project was going, admitting that internal issues at WebAgency were affecting my project. Their project manager quit in November, and Isaac was scrambling to fill the role himself while searching for replacements.
Isaac confirmed that I hadn’t imagined the drop in quality. WebAgency was overloaded with work from their larger clients. Their designers were squeezing me in when they had a spare moment, but they probably weren’t as focused as when we started.
I understood that TinyPilot was a small client to them. I was willing to wait a few weeks until their other work slowed down, but I wanted the remaining 10-20 hours to be high-quality October hours and not the harried, pop-in-whenever hours I saw in December and January.
“We’ll definitely finish your project,” Isaac said. “I just don’t know when we’ll have the hours.” I asked if they’d have time within the next two months. He wasn’t sure.
Isaac did, however, have an idea for expediting the project.
The solution is to pay more 🔗︎
The real issue, Isaac said, was that I was their only hourly client. I would always be at the mercy of long-term retainer clients pre-empting my project. So what if I signed a retainer agreement to guarantee WebAgency’s time? Their retainers started at 40 hours per month for $160/hr.
I felt duped and manipulated. WebAgency structured the work so that everything was 80% done, but nothing was usable. If I took the work to a new vendor, there’d be a massive amount of rework. And now they were holding the last 20% hostage until I signed an expensive retainer agreement?
As diplomatically as possible, I told Isaac that I felt like the situation was WebAgency’s fault. If a retainer agreement was better for everyone, why didn’t they propose it months ago? The project could have been done by now.
Isaac conceded that the situation was unfair to me. He promised to retroactively adjust my December and January bills as if I’d been on a retainer agreement and refund the difference. The offer was not even contingent on me signing the retainer.
But what would we do with 40 hours per month? There were only 20 hours left in the project.
I signed the retainer. My 60 high-quality retainer hours were scheduled to begin in March.
Development begins with… minor bugfixes? 🔗︎
The retainer agreement started off well. Within the first week, WebAgency wrapped up almost all of the outstanding design tasks. There were still some slight kinks to work out, but two of the three pages were ready to hand over to the developers.
And then, radio silence.
For two weeks, there was no activity from the dev team. I asked Isaac what was going on, and he explained that WebAgency’s schedule is fluid, so they don’t necessarily work on my project every week. He assured me that by the end of the month, they’d certainly use the remaining 48 hours I’d booked for the month.
When the month ended, WebAgency hadn’t moved the website any closer to the new design. Instead, they spent the last few days of the month fixing minor bugs from my issue tracker.
What inspired WebAgency to take on these insignificant bugs, you ask? Well, WebAgency had asked me to create Github tickets for each redesign task. WebAgency warned that they don’t refund or roll over unused hours, so they encouraged me to overbook the schedule with tasks beyond the redesign work.
What I didn’t expect was how WebAgency would split the tickets among their developers. I thought developer A would work on page X, and developer B would work on page Y. Instead, WebAgency assigned all the design-related tickets to developer A and left the rest to developer B. And that’s how a quarter of the March dev budget went to minor bugfixes.
The one-week task that took five weeks 🔗︎
In April, there was a new problem.
The TinyPilot website uses the Bootstrap CSS framework, and it still had the same Bootstrap theme from when I first launched the website.
WebAgency pointed out that layering a new design onto a totally different theme would be messy. They proposed replacing the theme and our ad-hoc CSS with a custom TinyPilot Bootstrap theme. Their dev estimated that he’d only need a few days to complete the switch, and it would accelerate the rest of the project.
Sure, that sounded fine.
Days stretched into weeks, and there were no updates about the new theme. Was the work taking longer than they expected? Or was this a repeat of March, and they’d squeeze everything into the last few days of the month?
The following month’s invoice gave me the answer. The “one-week” task of replacing the Bootstrap theme ultimately took five weeks and 38 billable hours for a total cost of $6.1k.
The final month 🔗︎
By May, we were seven months and $46k into what was supposed to be a four-week, $7k rebranding. Every month, it seemed like we were weeks away from the finish line, but something always popped up to prevent WebAgency from finishing anything I cared about.
It was time to call it. I gave WebAgency the required 28-days’ notice to terminate the contract.
WebAgency required each month’s payment upfront, so they already had all of my money for the final month. And now I’d fired them, so what incentive did they have to finish the work?
Surprisingly, the dev work was never smoother than after I terminated the contract. The project finally worked at the pace I expected from the beginning. WebAgency coded up each page within 7-10 days.
There were still issues, but I was prepared this time. WebAgency kept suggesting new flourishes to the design. I declined them all and told them to focus on the design I’d approved. I’m glad I did because they’d probably still be working on the website today.
On the last day of the month, the final page still wasn’t done. WebAgency hadn’t communicated with me about disengaging from the project.
On June 1st, the day after our contract officially ended, their dev told me that Isaac had authorized him to finish the outstanding work at no charge. He wrapped up the final page within two days.
And then it was finally done! This project had spiraled so far beyond what I initially wanted and transformed into an interminable drain on my time and finances. I was incredibly relieved to put it behind me.
Before and after 🔗︎
Here’s what the site looked like after the redesign:
The postmortem 🔗︎
After the project ended, I invited Isaac to a call to discuss what each of us could have done to improve the project’s outcome. I explained that I was writing a blog post about my takeaways from our work together.
Isaac was candid with me that the project hadn’t gone as smoothly as he’d hoped. He felt that the underlying problem was WebAgency’s difficulty scaling down their workflows to fit TinyPilot’s budget. Their typical client has a retainer in the range of $20-40k per month. TinyPilot was buying only 40-60 hours per month, which they typically reserve for maintenance rather than new development.
I told Isaac that I wished we’d structured the work to give me usable assets sooner. I would have preferred to have the logo first, then a new navbar design, then the landing page design, etc. He said that WebAgency’s clients are typically only interested in final results rather than intermediate pieces, but he understood why incremental work would have benefitted me.
I shared my surprise at how little WebAgency managed the project. I expected WebAgency’s project managers to provide regular status updates and maintain project timelines, but nobody was doing that. Isaac said this was a misstep on his part. WebAgency tries to keep project management to less than 5% of billable hours. At my scale, 5% would be too limited to provide any tangible benefit, so he eliminated project management entirely. He admitted that, in retrospect, he should have included me in that conversation to make sure it was what I wanted.
We talked about the opaqueness of WebAgency’s hours. Because they shared their hours so infrequently and worked an irregular schedule, I could never tell when a task was bloating beyond my expectations. I wished I’d raised this issue earlier because it turned out all I had to do was ask. WebAgency tracks billable time with toggl, and Isaac would have been happy to give me access to their dashboard.
What I’d do differently 🔗︎
If I were approaching this project again, here are the things I’d do differently, in descending order of importance.
Hire an individual freelancer instead of an agency 🔗︎
I don’t want to overgeneralize agencies based on this one experience, but I think an individual freelancer would have been a better fit for a business of my size.
Many of the problems were around management, resource allocation, and communication. I drastically underestimated how difficult those problems would be with a team rather than a single freelancer.
The agency was working with me for 40-60 hours per month, the same as each of TinyPilot’s other freelance developers. I thought the agency would require similar oversight to one freelancer, but having more people on a project requires more management, even if they’re collectively working only 40 hours per month.
Structure for serial, incremental results 🔗︎
At first, it seemed like a no-brainer to let the agency parallelize their work as much as possible. It lets them use their resources efficiently, so I’d get faster results for lower costs.
But think about it this way: if a project involves eight tasks that will take roughly one month each, which would you rather have?
- One task completed per month for eight months
- Nothing for seven months and then everything delivered at the end of month eight
The one-at-a-time is better value for your money. At the end of month one, you have one asset that provides value to your business for the next seven months. In month two, you have more, and so on.
Parallelizing everything also puts you in a weak negotiating position. If the agency has eight tasks that are all 80% complete, it’s expensive for you to scope down the project or switch vendors. If you limit the agency to only two or three tasks at once, those are the only tasks at risk if the project goes south.
Lastly, it’s more mentally taxing to oversee eight subprojects at once. Every unfinished task occupies real estate in your mind. It’s better to knock them out in small batches than to drag everything out for the entire project.
Narrow the project scope 🔗︎
At the design stage, I let the agency go too far in redesigning the website when they were supposed to focus exclusively on the logo, color scheme, and fonts.
During the implementation phase, I should have been more aggressive in preventing them from working on minor bugfixes until they finished publishing the new designs.
Agree on timelines 🔗︎
In my first meeting with WebAgency’s team, I asked how long they expected my project to take. “How long is a piece of string?” their lead designer asked.
It was up to me, he explained. I might love their first pitch, or I could reject everything for weeks. That was sensible, so I didn’t push for a more exact timeline.
I mistakenly let that lax attitude carry into the development work. I should have pressed the developers to share estimates of each task and asked them to revisit the scope if the work ballooned far beyond our expectations. That would have prevented situations like the five-week refactoring quest that was only supposed to take a few days.
Require a shared view of billable hours 🔗︎
Many of the issues with scope bloat resulted from the slow feedback loop in WebAgency’s reporting.
WebAgency’s process is to report hours twice per month. On the 15th, they share the total number of hours they’ve used with no details about which tasks contributed to the total. At the end of the month, they send a per-task breakdown.
In contrast, TinyPilot’s in-house developers report their hours at the end of each working session, so I have a better sense of their progress. If a 10-hour task starts looking more like a 25-hour task, we re-evaluate whether to eliminate or downscope the task.
If I work with a design agency in the future, I’ll insist on a tool that lets us share a view of billable hours as they happen, similar to what I use with TinyPilot’s regular devs.
Avoid hiring a vendor as their smallest client 🔗︎
When we started the project, WebAgency told me that most of their clients were larger than I was, but they wanted to help me grow. It sounded like a great deal — I’d enjoy service normally reserved for large companies despite my limited budget.
In reality, I didn’t get the same service as their larger clients. When I was an hourly client, WebAgency kept deprioritizing me in favor of their retainer clients. When I upgraded to a retainer plan, they struggled to work effectively within my budget.
Why didn’t you just…? 🔗︎
I’ve shared pieces of this story in my monthly retrospectives, and I’ve gotten questions about why I didn’t solve the problem in some easy, obvious way. I think this feedback is well-intentioned, but I suspect it comes from armchair experts and people who have only worked with agencies as large, powerful clients.
Below, I’ve addressed why the obvious suggestions I’ve received wouldn’t have worked.
Why didn’t you just refuse to pay them until the work was done? 🔗︎
WebAgency required payment up-front. For the hourly contract, I had to buy time in 30-hour blocks. For the monthly retainer, I had to pay each month’s bill by the 1st of each month. There was no financial leverage to force them to complete the project.
If I had insisted on milestone-based payments from the beginning, WebAgency likely would have declined the project. They saw me as a small client who could grow, but nobody wants to work with a tiny client who’s as demanding as a huge corporation.
Why didn’t you just find a cheap developer to do it for $4/hr? 🔗︎
In my experience, cheap developers are worthwhile if:
- You need throwaway code that has to work exactly once
- You value your time at zero, so you don’t mind giving two hours of feedback for every hour of work you receive from the freelancer
I plan to keep the TinyPilot website around for a while, so I need code I’m comfortable maintaining. For that, I need a competent developer who can write clear code.
Why didn’t you just fire them and hire someone better? 🔗︎
Firing WebAgency and searching for a replacement would have burned 30-60 hours of management time. And there was no guarantee that I’d find someone better.
For most of the project, I was sitting on a bunch of partially-complete tasks. The cost of reassigning half-done work and spinning up a new vendor would be almost as expensive as starting over from scratch.
Why didn’t you just use a Shopify template? 🔗︎
If I could go back to when I first created the website, I would have made it a simple Shopify store with a custom theme.
When I launched the site, I didn’t want to marry myself to Shopify and learn their templating system when all I needed was a simple “buy” button. I hand-coded the site using a frontend framework I knew well.
Over time, TinyPilot’s purchase experience became more complex. I ended up expensively reimplementing functionality that would have been free had I used a Shopify template. But at this point, migrating all the site’s content to Shopify would be its own major project, so I stuck with redesigning what I had.
I genuinely believe that WebAgency tried their best on this project. I don’t feel like they meant to deceive me or squeeze money out of me. We just didn’t match. I was used to working with individual freelancers, and WebAgency was accustomed to larger clients.
If I had to do it over again, I wouldn’t. But despite all the missteps and stress, the results might justify all the pain. I expected the new website to increase sales by 10-20%, but it’s been closer to 40%. In July, the TinyPilot website hit an all-time high of $72.5k in sales, 66% higher than before the redesign.
It’s too early to tell, but I’m optimistic about earning a positive return on the $46k I paid WebAgency.
I recently hired an agency to improve the TinyPilot website.— Michael Lynch (@deliberatecoder) July 21, 2022
It was supposed to be a four-week, $7k rebrand, but it exploded into an intensive eight-month, $46k full-blown redesign.
In today's blog post, I try to figure out how things got out of control. https://t.co/oyWv8GjgOG
Doghouse illustration by Loraine Yow.
Thanks to the members of the Blogging for Devs Community for providing early feedback on this post.
Be the first to know when I post cool stuff
Subscribe to get my latest posts by email.
Thanks for signing up! Check your email to confirm your subscription.
Whoops, we weren't able to process your signup.