Every used handset is different
Pre-owned stock has no clean model catalogue behind it. Condition, storage and colour vary unit by unit, and a generic product template flattens exactly the detail a buyer needs.
NextGen Mobile sells handsets in Rajshahi. I built them a custom storefront, a typo-tolerant search engine, cash-on-delivery checkout and an order console, running on 1 Cloudflare Worker with 0 runtime dependencies. No monthly platform fee and no commission on any sale.
15 screens from the live site, and what each one does.

Every page is rendered as finished HTML in a Cloudflare Worker at the edge. No JavaScript framework loads before the first product appears, which matters on the mobile connections most of this traffic uses.
0 runtime dependencies, 0 client framework

Pre-owned handsets are the shop's main line, so they occupy a row on the homepage with price, colour options and a direct buy action. Landing to product page is 1 tap, with no menu required.
Price, colours and a buy action on every card

One catalogue page handles category filters, text queries and sorting by price or discount. Each combination is a real URL, so a filtered view can be shared in a message or linked from a Facebook post and still land correctly.
Every filter state is a shareable URL

25 pre-owned handsets, each with its own colour options and pricing. Every second-hand unit differs in condition and storage, so each gets a full product page rather than a row in a list.
Own product page per unit, colours included

A live query: the customer typed "ifone" and the overlay returned every iPhone in stock. The relevance engine was written for this catalogue, with edit-distance typo tolerance, a 31 entry synonym table of the terms buyers here use, and tokenization covering Bengali and English.
Typo tolerance, 31 synonyms, Bengali and English

A search result loads the same catalogue view as a category, keeping the filter chips and sort control rather than a reduced results list. Weighted scoring ranks exact matches first, then prefix matches.
Search and browse share one interface

Price, key specifications, colour choice, quantity and 2 actions. Buy Now goes straight to checkout, Add to cart keeps the customer browsing. Product structured data on every page lets the listing appear correctly in search results.
Product schema on every listing

Selecting a finish changes the cart line, so the same handset in 2 colours becomes 2 lines. The shop packs exactly what was ordered instead of phoning to confirm, which removes a common cause of failed cash-on-delivery deliveries.
Colour carried through cart, order and email

The drawer opens over the product page so browsing continues. Rapid taps are queued and applied in order, so a double tap on a slow connection cannot produce an incorrect cart total.
Requests serialized to survive slow connections

The cart is a signed cookie lasting 14 days, with no account and no database write. Every item and quantity is revalidated against the live catalogue on each read, so a stale or edited cookie cannot produce an unfulfillable order.
14 day cart, revalidated on every read

Navigation is removed so there is 1 path forward. The phone field accepts Bengali numerals and the +880 and 880 prefixes, normalising them to a dialable number. Selecting a delivery zone updates the total in place, with Bangladeshi digit grouping.
Bengali numeral input, +880 normalization

No registration and no password. A customer enters the number they ordered with and sees their orders, statuses and totals in Dhaka time. This removes the most common reason customers phone the shop.
No accounts, no passwords, no signup step

The console sits behind a token gate. Tokens are compared in constant time so the check cannot be probed by timing, the session cookie is scoped to the admin path only, and every order screen is excluded from search engines. Shown here is the public sign-in screen.
Constant-time token check, admin-scoped session

Authenticity, delivery speed, payment on arrival and a phone number to call are stated on the homepage. For second-hand handsets these 4 answers decide the sale before the specifications are read.
Authenticity, delivery speed, COD and phone support

Delivery time, cash on delivery, authenticity, how to order and how to track. Keeping these on the homepage rather than a policy page lets a hesitant buyer resolve the doubt without navigating away. The content carries FAQ structured data.
FAQ structured data, no separate policy page
6 conditions in this market that an off-the-shelf store handles badly.
Pre-owned stock has no clean model catalogue behind it. Condition, storage and colour vary unit by unit, and a generic product template flattens exactly the detail a buyer needs.
Nothing is paid until a courier is at the door. A wrong number or a vague address is not a support ticket, it is a handset that travelled across the country and came back.
Handset pricing shifts week to week. Anything that makes a price change slow or awkward means the site is quietly wrong for days at a time.
Customers come from a Facebook page and word of mouth. They land expecting to see stock immediately, not to be introduced to a brand they already know.
Phone retail runs on thin margins. A monthly subscription and a cut of every sale take a meaningful share of the profit on each handset sold.
Customers search in a mix of English and Bangla, shorten names, and misspell them. A search box that only matches exact strings returns nothing and loses the sale.
Agreed before development started, in the order they were solved.
A visitor arriving from Facebook should see real handsets and real prices in the first screen, with no brand introduction in the way.
Authenticity, delivery and payment on arrival are the decision. State them on the homepage rather than burying them in a policy page.
From landing to a placed order in as few steps as possible, with no account, no password and no page that exists only to collect an email.
Handle misspellings, shortened names and mixed Bangla and English, because the alternative is an empty results page.
Capture a dialable phone number and a real address at the point of order, so the shop can confirm before anything is dispatched.
Every order in one console, with a status that moves forward and tells the customer automatically when it does.
No subscription, no cut of each sale, and no third party holding the customer list. The shop owns what it paid for.
6 build decisions and what each one traded off.
The product list is compiled into the Worker itself, so browsing never queries anything. Only checkout, tracking and the admin touch storage. It removes the slowest part of a typical store and the most common thing to fall over under load.
Nothing from the package ecosystem runs in production. That is a deliberate trade: I wrote more ourselves, and in exchange the shop has no plugin to update, no supply chain to audit, and nothing that breaks because a maintainer pushed a release.
Requiring registration to hold a cart loses buyers who were 1 tap from ordering. A signed cookie holds it for 14 days with no database write, and every read is revalidated against the live catalogue so it can never be trusted blindly.
In a cash-on-delivery market the phone number is already the identity: it is how the shop confirms, how the courier calls, and what the customer remembers. Building accounts on top of that would add a password to forget and nothing else.
Off-the-shelf search assumes customers type catalogue English. This one handles edit-distance typos, a synonym table of the words buyers here actually use, and Bengali script in the same query. It is more work, and it is the difference between results and an empty page.
On a rented platform the storefront stops the month the billing does, and the customer list belongs to someone else. Building it as owned software means the code, the orders and the data stay with the business.
8 systems behind the storefront.
4 systems the owner works with, and what each covers.
10 differences between this build and a subscription platform.
Counts from the delivered build. Not traffic or revenue figures.
How the build changes the way the shop operates. Not separately measured outcomes.
No monthly platform fee and no percentage of each sale, which on thin hardware margins is the difference between a channel that pays and one that does not.
Every status change emails the customer without anyone remembering to. The shop moves a dropdown and the communication has already happened.
Customers check their own order with the number they ordered on, which removes the most common reason the shop phone rings.
A misspelled model name still returns the right handset, so demand that arrives with imperfect spelling still reaches something buyable.
No advertising pixels and no third-party analytics, so the site carries no tracking baggage and needs no consent banner in front of the stock.
The code, the orders and the customer list are the shop's property. Nothing switches off because an invoice went unpaid.
A complete commerce platform, not a theme on top of an existing one:
They are good products. They are a poor fit for this particular shop:
Nothing is charged online. The site's job is to capture an order the shop can safely dispatch against:
Through a private console, in a single screen:
Yes, and this is the model I would recommend for most product businesses selling locally:
If platform fees and transaction cuts are reducing your margin on every sale, an owned platform removes both.