Ship the useful path
A small shop had a Rails storefront unfinished for about three years. I put it live in under a week by shipping the catalog that already worked, and keeping checkout as the email link from the old site.
Situation
The client is a small custom-print shop in Melbourne.
The shop was already selling on WordPress: static product pages, and a mailto: link for orders. Changing a product meant the owner edited the page by hand.
A Rails and React storefront was supposed to replace that site. It had been in progress for about three years, and it was not live.
Constraint
The owner needed the new site up soon. Stripe and a full cart were planned, and they could wait until after launch. What had to ship was a catalog the owner could update without editing WordPress pages.
The app already had that. Adding products and creating promos worked. Launch was waiting on payments and on features that were not finished.
What I did
I was the only one writing code, and the owner set the scope.
I made the working admin live, and hid the unfinished features behind feature flags.
For checkout, I matched the WordPress order path. The buy button was a plain mailto: link. Orders still landed in the owner’s inbox. The Rails app went live in under a week.
Craft choices
I kept the mailto: link so launch did not depend on Stripe. Shoppers ordered by email, the same way they did on WordPress.
I left the finished React in place. Where it was slowing the work down, I replaced it with plain Rails views.
Result
The owner added products and promos in the new app instead of editing WordPress pages. Shoppers browsed that catalog, and the buy button opened an email to the shop. Stripe came about three weeks later.
Still stand by
Matching the old order path was the right bar. Holding the release for Stripe would have kept a working catalog offline for at least three more weeks, after three years of waiting.
Ship the useful path. Perfect can wait.