The situation#
The business sold online before this storefront existed - first an eBay store, then an osCommerce store for a few years. osCommerce worked until it didn’t: the catalog and the custom workflows the business depended on had outgrown what a stock PHP shop could express cleanly, and every modification made the next upgrade harder. Roughly fifteen years ago I replaced it with a custom Django storefront, and that application has been the revenue path ever since.
Everything around it changed. Products turned over. Payment providers came and went and changed their APIs. Shipping moved to dedicated systems. Marketplaces became the larger share of the business. The storefront stayed. It kept working, so there was never a reason to take it down.
Why it stayed#
When I wrote it, there were no real alternatives - osCommerce was the state of the art, and it was already failing us. That hasn’t been true for a long time. Today I could move to Shopify or a dozen hosted carts in a month. I’ve priced it out more than once.
The answer came out the same every time. A migration meant months of work and real risk to the main revenue channel, and the store was already taking orders without problems. So I kept adding products and feeds, and put my time into the pricing, accounting, and warehouse systems instead.
The design thinking#
The stack is old, and it has been updated many times over the years. What has aged best is the shape of the data. The catalog, the basket, the checkout flow, and the order record were all modeled around how this business actually works, not around the defaults of some template. When PayPal changed their integration, when Stripe came along, when shipping moved out to its own system - each of those was a new integration against a stable core. Nobody had to cut the core open.
The build#
What’s actually running today: a Django application of roughly twenty-two thousand lines across its Python modules and over a hundred and thirty templates. It covers the catalog and category pages, application-level search and product compatibility lookups, customer accounts, guest and authenticated checkout, PayPal and Stripe payment flows and callbacks, shipping rates and label/tracking utilities, product feeds and sitemap generation, and the admin workflows the business runs on.
It shares data with the purchasing, inventory, accounting, and fulfillment systems described elsewhere on this site.