Bismillah Agro — bilingual agriculture ecommerce for Bangladesh
A bilingual (Bangla + English) agriculture ecommerce store for Bangladesh, built as a demo through my agency NextWebz — Next.js + MongoDB + Redis, SSLCommerz checkout, and a conditional COD rule that unlocks cash-on-delivery only after a clean delivery history.
- Role
- Lead — design, full-stack Next.js, payments, infra, deployment
- Year
- 2026
- Live
- Visit site ↗
Problem
Most small agro-businesses in Bangladesh sell through Facebook pages and WhatsApp. Orders come in as screenshots, payments are bKash transaction IDs, inventory is a mental model, and disputes come down to whoever remembers the conversation first. The single biggest cost in this model isn't the tooling — it's refused cash-on-delivery parcels. COD is the default expectation in Bangladesh's ecommerce market, but a meaningful slice of first-time buyers reject the parcel at the door once it shows up, and the seller eats the round-trip courier fee. That's the hole Bismillah Agro was built around: the shop is ready — organic rice, dairy, honey, spices, mustard oil, ghee — but the sales mechanics had to be tighter than a generic Shopify dupe before it could scale.
Approach
Built through NextWebz, my own agency, as the reference demo for the kind of Bangladesh-market ecommerce we take on for clients. It's a real storefront on a real domain with real payments — not a prototype. A bilingual (Bangla + English) catalog sits on top of a Next.js App Router app, with customer, admin, and order-tracking surfaces all on the same codebase.
Everything went single-stack: MongoDB for the canonical store, Redis for session / cart / rate-limit state, NextAuth for identity, SSLCommerz (Bangladesh's dominant aggregator — covers bKash, Nagad, cards, Rocket in one integration) for checkout, next-intl for the language split, Cloudflare R2 for product media. Ships as a Docker image to a single DigitalOcean droplet fronted by Cloudflare. One deploy, one set of credentials, one codebase.
The shape of the build is deliberately boring everywhere except the one place where Bangladesh ecommerce breaks: the COD policy at checkout.
Technical deep-dive
- Conditional COD. Cash-on-delivery is not a universal option on the payment step. On a first-time order the customer must prepay in full, or prepay only the delivery charge and settle the rest at the door. Once they've accepted a delivery or two without refusing, their account unlocks full COD on subsequent orders. It's a behavioral credit score baked directly into checkout — the rule runs server-side against the customer's order history on every cart evaluation, and the payment step re-renders with the right options for that specific account. It maps onto how this corner of the market actually works: trust is earned per-buyer, not assumed wholesale, and shopkeepers already operate this way off-platform.
- Bilingual from the database up. next-intl drives UI copy, but product content is bilingual at the data layer — each product document carries
name.bn/name.en,description.bn/description.en, and catalog queries resolve the field matching the active locale server-side, so the client never ships both strings. Categories and CMS blocks follow the same shape. Same URLs serve both languages; the toggle in the nav just swaps the cookie and revalidates. - Redis as the cart substrate. Carts don't hit Mongo until checkout commits. Guest carts live in Redis keyed by an anonymous cookie, authed carts move to a user-keyed entry, TTLs purge abandoned carts automatically. OTP attempts, login attempts, and checkout rate limits share the same Redis — one fast in-memory tier carries everything that doesn't need to be durable.
- Admin panel with customer history. The admin surface exposes every order with its delivery outcome (accepted / refused / returned), and the same per-customer history feed is what the conditional-COD rule reads. Ops can see why a specific buyer is still locked to prepay-only, and decide whether to manually unlock them or send a discount to nudge the next order — the anti-fraud logic and the CRM view are the same table.
- R2 + signed uploads. Product imagery uploaded through the admin goes to Cloudflare R2 via signed PUT URLs. Next.js image optimization sits in front, and because R2 has no egress fees and Cloudflare caches public reads at the edge, the DigitalOcean droplet almost never serves a JPEG — which matters on an image-heavy catalog browsed over Bangladesh's mobile networks.
Outcome
Live at bismillah-agro.nextwebz.com as a complete end-to-end build — real SSLCommerz payments, real admin panel, real bilingual catalog, real conditional-COD enforcement. It's the build NextWebz points future agro and food-retail clients at when they ask what a production Bangladesh-market storefront looks like, and the reference architecture every subsequent shop we ship starts from.
Stack & handoff
Next.js 16, MongoDB, Redis, NextAuth, next-intl, SSLCommerz, Cloudflare R2. Deployed as a Docker image on a single DigitalOcean droplet, Cloudflare in front. Customer storefront and admin panel share the same Next.js app — one codebase, one deploy, one set of secrets for NextWebz to hand off to a client when they want to take ownership.
Stack
Related work
- Web & ecommerce2026
Events BD — event ticketing platform for Bangladesh
A full-stack event ticketing platform for Bangladesh — OTP auth, organiser dashboards, and PDF + QR tickets emailed on checkout. Conferences, meetups, cultural events.
Next.js 16ReactTypeScriptRedux Toolkit+10Read case study - Web & ecommerce2024
Bogura Theke — bilingual yogurt storefront for Dhaka same-day delivery
A bilingual (Bangla + English) ecommerce storefront for a Bogura yogurt shop selling clay-pot doi into Dhaka. OTP phone login, six BD payment rails, conditional cash-on-delivery, and a Dhaka-metro-only delivery zone keyed off a pre-loaded postal graph.
Next.js 14ReactJavaScriptRedux Toolkit+10Read case study