Skip to content
MarketplaceBangladesh

A services marketplace, then the same codebase sold twice

A multi-vendor marketplace with three role tiers, real-time chat that converts into orders, and payment capture with webhook reconciliation — later white-labelled and deployed for a second client.

Visit the live siteClient work — repository is private
Market
Bangladesh
Type
Marketplace
Delivered
2026
Duration
20 weeks
The TeamAdvertiser homepage on desktop and mobile, with the headline 'Achieve Your Goals.' beside portraits of three team members

What it looks like

The TeamAdvertiser and Perform Scale homepages side by side, showing the same navigation, the same sign-in and sign-up controls and the same pair of call-to-action buttons under two different brands
The same codebase, deployed twice. The navigation, the account controls and the button pair are identical; the brand, the colour and the copy are not. Both domains are live, so the comparison can be checked rather than taken on trust.
The TeamAdvertiser projects listing, a grid of client work cards each with a category and a title
The marketplace listing. Each project has its own page and its own URL.

Measured results

Each figure records where it came from. Nothing here is an estimate or a round number chosen because it reads well.

2
production deployments from one codebase
teamadvertiser.com plus a white-labelled instance for a second client
3
role tiers with separated permissions
Client, admin, superadmin
0
production dependency advisories after remediation
Recorded in the project production-readiness audit

The brief

Team Advertiser is a digital marketing agency that needed to sell services the way a marketplace does: a catalogue with tiered pricing, a negotiation step, an order pipeline, payment, delivery and a dispute process when it goes wrong.

The most interesting outcome was not planned. Once the platform was running, the same codebase was rebranded and deployed for a second client on entirely different infrastructure — turning a bespoke build into a repeatable product without a rewrite.

What was wrong

Three parties with genuinely different permissions. Clients, agency staff and a superadmin who arbitrates disputes and cannot be modified by ordinary admins. Getting this wrong means either staff seeing customer data they should not, or an admin being able to quietly rewrite a disputed order.

Payments that must reconcile. A payment webhook can arrive twice. If the handler is not idempotent, the second delivery credits the account again — and this only surfaces as a discrepancy weeks later.

Real-time chat, including for visitors who have not signed up. An unauthenticated socket connection is an open door unless the handshake itself is verifiable.

Serverless was not an option. WebSocket connections need a persistent process, which ruled out the deployment target the client initially assumed.

What I did

Three role tiers with a protected superadmin. Dispute resolution, coupons, role changes and audit logs sit above the admin tier, so an admin cannot alter the record of a dispute they are party to.

Idempotent payment capture. Order status and payment recording happen as a single all-or-nothing database operation, and a repeated webhook delivery is recognised and ignored rather than replayed.

Signed guest chat. Visitors who have not registered can open a support conversation, with the handshake authenticated by an HMAC signature — so the socket is open to the site, not to the internet.

Deliberate infrastructure choice, written down. A persistent Node process behind Nginx with a pinned runtime, on a multi-tenant VPS where restarting the wrong process would take down another client's site. The operations runbook exists specifically so that does not happen.

Defence in depth on inputs. Schema validation, sanitisation against XSS and NoSQL injection, shared rate limiting, TOTP two-factor authentication for staff, and pagination capped so a crafted request cannot exhaust memory.

Built with

React · Node.js · Express · MongoDB · Socket.IO · PayPal Server SDK · Redis · Nginx · PM2

More work

The Roofing Services Perth homepage on desktop and mobile, showing a roofer sealing chimney flashing above the headline 'Reliable Roof Leak Fixing'
Business siteAustralia

Cutting a roofing company’s page weight by two thirds

A Perth roofing business with a heavy single-page app that search engines could barely read. Rebuilt the delivery layer around prerendered HTML and cut the main JavaScript bundle by 68%.

−68% main JavaScript bundle

React · Vite · Node.js
The Al Marouf Curtains homepage on desktop and mobile, with the headline 'Custom Sofas, Curtains and Wallpaper in Dubai' over a dark furnished interior, and an English and Arabic language switch in the header
CRM / ERPUnited Arab Emirates

A storefront and an ERP in one bilingual system

A Dubai and Sharjah furnishing business running on WhatsApp threads and spreadsheets. Built one bilingual Next.js system that serves customers at the front and runs leads, quotations, orders and invoicing at the back.

1 REST endpoints in the entire application

Next.js 16 · TypeScript · PostgreSQL

Have something like this in mind?

A short call to work out what it would actually take. Free, and you get a written scope and price before anything is committed.