/ build-guides / How to Build a E-commerce Store as a Solo Developer
build-guides 10 min read

How to Build a E-commerce Store as a Solo Developer

Step-by-step guide to building an e-commerce store by yourself. Tech stack, timeline, costs, and practical advice.

Hero image for How to Build a E-commerce Store as a Solo Developer

What You're Building

An e-commerce store is an online storefront where you sell physical or digital products directly to customers. This could be anything from custom t-shirts to digital templates to handmade jewelry. The beauty of building your own store instead of using Etsy or Amazon is that you own the customer relationship and keep way more of the revenue.

I helped a friend set up an e-commerce store for her candle business in 2024. She'd been selling on Etsy and losing about 15% to fees. Moving to her own store cut that to under 3% (just Stripe fees). That math alone makes it worth the effort.

Difficulty & Timeline

Aspect Detail
Difficulty Medium
Time to MVP 2-4 weeks
Ongoing Maintenance Medium
Monetization Direct product sales, subscriptions, digital downloads

For a solo developer, you don't want to build a payment system from scratch. That's insane. Use Shopify's Storefront API with a custom Next.js frontend, or go full headless with Medusa.js if you want total control. For simpler stores, even a static site with Stripe Checkout works surprisingly well.

Here's my honest recommendation for most people. If you're selling fewer than 50 products, use Next.js with Stripe. If you need inventory management, shipping calculations, and a full product catalog, use Medusa.js or Saleor as your backend. Skip WooCommerce unless you already know WordPress well.

Here is where each of these projects actually stands right now, checked on 2026-05-30. Next.js is at 16.2.6 on npm and pulls roughly 40 million downloads a week, with about 140k GitHub stars, so it is the safest bet for the frontend. Medusa.js sits at 2.15.5 on npm (about 34k stars) and is the headless backend I reach for when a store needs real inventory and order logic. Saleor is the other serious headless option at about 23k stars if you prefer a GraphQL-first, Python backend. For client state, Zustand is at 5.0.14 (about 58k stars, 36 million weekly downloads) and stays my pick over Redux for a cart. None of these numbers are static, so treat them as a snapshot and check current versions before you pin them.

Step-by-Step Plan

Phase 1: Foundation (Week 1-2)

Pick your approach based on what you're selling. Digital products? Next.js plus Stripe Checkout is all you need. Physical products with variants, shipping, and inventory? Set up Medusa.js.

Start with your product catalog. Get your data model right first. Products, variants (size, color), pricing, images. I've seen too many solo developers jump straight into the fancy UI and then realize their data structure can't handle basic things like "this shirt comes in 3 sizes and 4 colors." Model your data before you touch CSS.

Set up Stripe early. Create your account, add your products, and get a basic checkout flow working. You should be able to buy something from your store by the end of week one, even if the site looks terrible.

Phase 2: Core Features (Week 2-3)

Build the product listing page, individual product pages, and a cart. The cart is where most solo developers waste time. Here's a shortcut that I wish someone had told me earlier. Use Stripe Checkout Sessions instead of building a custom cart. You pass an array of line items, Stripe handles the checkout page, and you get a webhook when payment succeeds. No cart state management, no checkout form validation, no PCI compliance headaches. The event you listen for is checkout.session.completed, and per Stripe's own fulfillment docs you should trigger order fulfillment from that webhook, not from the success redirect, because the customer is not guaranteed to ever land on your success page.

If you absolutely need a custom cart experience, use Zustand for state management (currently 5.0.14 on npm). It's simpler than Redux and handles cart persistence out of the box with a localStorage middleware.

Add product images using Cloudflare R2 or even just Vercel Blob storage. Don't overthink image hosting early on.

Phase 3: Polish & Launch (Week 3-4)

Add order confirmation emails (Resend or SendGrid), a basic order tracking page, and your shipping configuration. Set up your domain and deploy. Resend's free tier covers 3,000 emails a month, capped at 100 per day, which is plenty for early order receipts; the first paid Pro tier is $20 a month for 50,000 emails (checked 2026-05-30, confirm current pricing before you commit).

For physical products, integrate a shipping calculator. EasyPost handles USPS, UPS, and FedEx rates and includes a genuinely usable free allowance (its Free Access plan advertises 3,000 free shipments a month at the time of writing, then $0.08 per label). For digital products, set up automatic delivery via email after purchase.

Write product descriptions that actually sell. This is where most developer-built stores fail. The tech is fine, but the copy reads like a database dump. Spend real time on this.

Monetization Strategy

You're selling products, so the monetization is built in. But think about expanding revenue per customer. Offer bundles at a slight discount. Add a subscription option for consumable products (coffee, supplements, supplies). Sell digital add-ons alongside physical products.

One thing I've noticed works incredibly well for solo e-commerce stores is email marketing. Capture emails with a 10% discount popup, then send a simple weekly email with new products or restocks. Heads up that Mailchimp is no longer the easy free default it used to be. As of January 2026 its free Marketing plan dropped to 250 contacts and 500 sends a month, and unsubscribed contacts still count against that cap. For a brand new store you may scrape by on it briefly, but plan to move to something like Buttondown or Loops sooner than you think.

Your margins matter more than your revenue. A store doing $5k/month with 60% margins is better than a store doing $15k/month with 10% margins. Focus on products where you control the pricing and the supply chain.

Common Mistakes to Avoid

Building a custom payment system. Just use Stripe. I cannot stress this enough. Every hour you spend on payment processing is an hour you're not spending on your actual product. Stripe Checkout handles taxes, multiple currencies, Apple Pay, Google Pay, and 3D Secure. Its US standard rate is 2.9% plus 30 cents per successful card charge, and Checkout itself is included at no extra cost on standard pricing, so there is no separate fee for using the hosted page. You literally cannot build something better as a solo developer.

Ignoring mobile. Over 60% of e-commerce traffic comes from mobile devices. If your store doesn't work on a phone, you're losing more than half your potential customers. Test on a real phone, not just Chrome DevTools.

Adding too many products at launch. Start with 5-10 products. Seriously. A store with 10 great products converts better than a store with 200 mediocre ones. You can always add more later.

Skipping analytics. Install Plausible or Umami from day one. You need to know which products people look at, where they drop off, and which traffic sources actually convert. Flying blind with an e-commerce store is a recipe for wasting ad money later.

Is This Worth Building?

Yes, if you have something to sell. The mistake most developers make is building the store before having a product. Don't do that. Find the product first, validate demand (even if it's just asking people on Reddit or Twitter), and then build the store.

The technical part of e-commerce is mostly solved. The hard part is finding products people want and getting traffic. If you already have an audience, a following, or a niche you understand well, building your own store is almost always better than selling on a marketplace. The margins are better, you own the customer data, and you can build exactly the experience you want.

If you don't have a product yet but want to practice, build a store for someone else. Charge them for it. You'll learn the tech, make some money, and have a portfolio piece. That's how I got started, and it was way more motivating than building a store for imaginary products.

Common Errors and Fixes

These are the snags that bite solo builders most often, with the fix grounded in the official docs rather than guesswork.

Orders never get fulfilled even though payment succeeded. This almost always means you wired fulfillment to the Checkout success redirect instead of the webhook. Stripe's fulfillment guide is explicit that a customer can pay and then lose their connection before your success page ever loads, so the redirect is not a reliable trigger. Fulfill from the checkout.session.completed webhook event, and use the success page only for the immediate "thank you" experience.

Your webhook handler accepts forged events. If you parse the raw request body and act on it without checking the signature, anyone who finds your endpoint can fake a paid order. Verify the Stripe-Signature header against your endpoint signing secret using the SDK's constructEvent (or Webhook.construct_event) helper, and return a 400 on a signature mismatch. Stripe documents this as a required step, not an optional one.

Webhook signature verification fails even though the secret is correct. This is usually because a body parser ran first and mutated the payload. Stripe needs the exact raw request body to recompute the signature, so disable JSON body parsing on the webhook route specifically and pass the raw buffer to constructEvent.

npx create-next-app pulls a version you did not expect. The CLI tracks the latest release, which is 16.2.6 as of 2026-05-30. If a tutorial assumes an older major, either pin the version (npx create-next-app@<version>) or read the current upgrade notes, since App Router defaults and config keys move between majors.

Medusa install or migrations break against the wrong Node or Postgres. Medusa 2.x (2.15.5 at time of writing) expects a recent Node LTS and a reachable Postgres instance before medusa db:migrate will run. If migrations hang or error, confirm your DATABASE_URL resolves and the database exists before debugging anything in application code.

Mailchimp signups silently stop sending. If your discount popup stopped triggering emails, you likely hit the new free cap. As of January 2026 the free plan is 250 contacts and 500 sends a month, and unsubscribed contacts still count. Check your contact total before assuming the integration broke.

Sources

Built by Kevin

Like this? You'll like what I'm building too.

Two ways to support and get more of this work.

Desktop App

HEARTH

A privacy-first Life OS for your desktop. Journal, tasks, and notes that stay on your machine. Coming soon, direct download from this site.

Read more
Digital Products

MY TOOLKITS

Receipts-first toolkits for shipping after hours, building Claude agents, publishing on Amazon, and more. The exact methods I used, not theory.

Browse on Whop

Need This Built?

Kevin builds products solo, from first version to live. If you want something like this made, work with him.