Every used handset is one of a kind
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. Instead of renting a store on someone else's platform, we built them one: a custom storefront, a search engine written for their catalogue, cash-on-delivery checkout, and an order console. No subscription, no cut of every sale.
15 pieces of the build, every one a real screen from the live site.

Every page is assembled in a Cloudflare Worker at the edge and sent as finished HTML. There is no client framework to download and parse before a customer sees a phone, which matters on the mobile connections most of this traffic arrives on.
Server rendered at the edge, no client framework

Pre-owned handsets are what the shop actually moves, so they get a row on the front page with price, colour options and a direct buy action. A customer can go from landing to a product page in 1 tap, without opening a menu.
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 condition-appropriate pricing. Second-hand stock is the hardest thing to sell online because every unit is different, so each one gets a full product page rather than a line in a list.
25 handsets, each individually listed

This is a real query. The customer typed "ifone" and the overlay returned every iPhone in stock. The relevance engine was written for this catalogue: edit-distance typo tolerance, a synonym table covering the words Bangladeshi buyers actually use, and tokenization that handles Bengali script alongside English.
Typo tolerant, synonym aware, built for this shop

A query lands on the same catalogue surface as a category, so the customer keeps the filter chips and the sort control instead of being dropped into a stripped-down results list. Weighted scoring puts exact matches first and prefix matches next.
Search and browse share one interface

Price, key specifications, colour choice, quantity, and 2 clear actions. Buy Now goes straight to checkout for a customer who has already decided; Add to cart is there for the one who has not. Structured data on every product page means the listing can surface correctly in search results.
Product schema on every listing

Selecting a finish changes what goes into the cart, and the same handset in 2 colours becomes 2 separate lines. The shop packs exactly what was ordered instead of calling the customer back to ask, which is where cash-on-delivery orders usually go wrong.
Colour carried through cart, order and email

The drawer slides in over the product page and the customer keeps browsing. Rapid taps are queued and applied in order, so a customer on a slow connection who taps twice does not end up with a cart that disagrees with itself.
Requests serialized to survive slow connections

The cart lives in a signed cookie that lasts 14 days, with no account and no database write. Every key and quantity is revalidated against the real catalogue on each read, so a stale or tampered cookie can never produce an order the shop cannot fulfil.
14 day cart, revalidated on every read

Navigation is stripped out so there is one path forward. The phone field accepts Bengali numerals and the +880 and 880 prefixes, folding them all to the format the shop can actually dial. Choosing a delivery zone updates the total in place, with amounts grouped the Bangladeshi way.
Bengali numeral input, +880 normalization

Nobody registers, nobody sets a password, and nobody forgets one. A customer enters the number they ordered with and sees their orders, statuses and totals, timestamped in Dhaka time. It removes the single most common reason a customer calls 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 it, the session cookie is scoped to the admin path alone, and every order screen is excluded from search engines. This is the public side of that door.
Constant-time token check, admin-scoped session

Buying a used phone from an unfamiliar website is an act of faith. Authenticity, delivery speed, paying on arrival and a human to call are stated plainly on the homepage, because for this category those 4 answers decide the sale long before the specifications do.
4 guarantees, stated on the front page

Delivery time, cash on delivery, authenticity, how to order and how to track it. Keeping them on the homepage rather than a policy page means a hesitant buyer resolves the doubt without leaving. The same content is marked up so search engines can read it as questions.
FAQ structured data, no extra page to visit
Selling handsets online in Bangladesh breaks most of the assumptions built into an off-the-shelf store.
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 a line of code, and the order matters as much as the list.
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.
Why we built it this way, and what each choice was a trade against.
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: we 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.
The systems a customer never sees, and the reason the ones they do see behave.
4 systems the owner works with, and exactly what each one covers.
What the same shop looks like on a subscription platform against the one we built.
These describe the scope of what was delivered. They are counts from the build, not traffic or revenue figures.
These describe how the build changes the way the business runs. They are 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 we would recommend for most product businesses selling locally:
If platform fees and transaction cuts are eating the margin on every sale, a platform you own pays for itself and then keeps paying.