All work
B2B marketplace · iOS, Android & web

A verified B2B textile marketplace, built across three platforms

MadeInPK connects Pakistani textile mills with international buyers who have no reliable way to tell a real supplier from a fraudulent one. Apps, web, escrow and admin tooling — designed and built end-to-end.

Year
2024
Platforms
iOS, Android, Web
My role
Product design · iOS & Android · Web app · Backend & APIs
Stack
React Native, Next.js, Node.js, PostgreSQL, Stripe
MadeInPK — overview
The situation

Context

Pakistan's textile industry is one of the largest in the world, and almost none of it is reachable online in a way an overseas buyer can act on. Mills advertise on WhatsApp and directory sites with no verification layer. Buyers arrive wanting to place real orders and find no way to distinguish a thirty-year-old family mill from an account created last week.

The problem

Cross-border trade runs on trust that does not exist between strangers. A buyer has no way to confirm the mill they are about to wire money to is a registered business; a genuine mill has no way to prove it is. The result is that deals die at exactly the moment money is supposed to move — which means the marketplace does not have a discovery problem, it has a settlement problem. Build the beautiful catalogue and it still fails at the last step.

What made it hard

The constraints

  • Neither side of the transaction trusts the other, and the platform starts with no reputation of its own to lend them
  • Buyers are often in different time zones and currencies from sellers
  • Sellers are frequently mobile-only; buyers are frequently desk-based — so neither web-first nor app-first was sufficient
  • Fraud has to be designed out structurally, not moderated away after the fact
Key decisions

Every choice has a cost

The tradeoff is stated next to each decision, because a case study that only lists wins isn't telling you anything useful.

01

Verify identity against government records, not documents uploaded by the seller

A verified badge that only means 'uploaded a PDF' is worse than no badge, because it transfers false confidence. Checking against CNIC and business registration makes the badge mean one specific, defensible thing.

TradeoffOnboarding is slower and some legitimate sellers drop out during verification. We accepted a smaller, real supply side over a large, unreliable one.

02

Hold funds in escrow rather than connecting the two parties and stepping back

The settlement step is where deals were already failing. Removing that risk is the product; everything else is a catalogue.

TradeoffSignificant compliance and operational burden, and a much harder v1. It also makes the platform responsible for dispute outcomes, which is a commitment, not a feature.

03

Keep negotiation inside the app instead of letting it move to WhatsApp

If the conversation leaves, the deal record leaves with it, and the escrow has no context when something is disputed.

TradeoffFighting a strong existing habit. It required the in-app chat to be genuinely good rather than merely present.

04

One shared API across iOS, Android and web from day one

The escrow state machine is the most delicate part of the system. Implementing it once and consuming it three times was the only way to keep it consistent.

TradeoffSlower start than shipping a single platform first, in exchange for not paying to reconcile three divergent implementations later.

How it works

Architecture

A Node and PostgreSQL core owns the two things that must never disagree: seller verification state and escrow state. Both are modelled as explicit state machines rather than boolean flags, so every transition is auditable and a payment can never be released from a state that should not permit it. React Native handles iOS and Android, Next.js serves the web marketplace and the public listing pages, and all three consume the same API. Admin tooling for verification review is a first-class part of the system rather than a spreadsheet, because a human decision sits in the middle of the flow.

React NativeNext.jsNode.jsPostgreSQLStripe

Cutting v1 down to what actually unblocks a deal

The initial brief was a full trading platform — logistics, analytics, ratings, financing. Reduced to first principles, only two things stop a deal from happening: the buyer cannot confirm who the seller is, and neither party will move money first. Everything else is optimisation on top of a transaction that is not occurring yet. v1 shipped those two, and the deferred features became a roadmap rather than a delay.

Why the verified badge had to be expensive to earn

Trust markers only work if they are costly to obtain. A badge granted for uploading a document is granted to anyone willing to upload a document, including the people it is meant to filter out. Tying it to CNIC and business registration is slower and loses some sellers at the gate — which is precisely the mechanism that makes it worth something to a buyer.

What three platforms actually cost

This is the project that best demonstrates the argument the rest of this site makes. An agency would have staffed a mobile team and a web team, and the escrow flow — the part where correctness matters most — would have been specified in a document, interpreted twice, and reconciled in QA. Here it was designed once and consumed three times. The savings were not in typing; they were in not having to make the same decision three times and then make the three answers agree.

How it ran

Build timeline

  1. Weeks 1–2

    Scope and the state machines

    Reduced the brief to verification and escrow. Modelled both as explicit state machines before writing interface code, because these are the two places where a bug is a financial event rather than a visual one.

  2. Weeks 3–6

    Core API and admin

    Built the shared API, the verification review tooling, and the escrow transitions with an audit trail. Admin came early rather than last, since a human review step sits inside the critical path.

  3. Weeks 7–12

    Three clients on one API

    React Native for iOS and Android, Next.js for the marketplace and public listings. In-app deal chat wired to transaction records.

  4. Launch

    Stores, onboarding and the first real deals

    App Store and Play Store submission, seller onboarding, and monitoring the first live escrow transactions — the only test that counts for a payments flow.

Screens from MadeInPK

In hindsight

What I'd do differently

The escrow state machine should have been built with dispute resolution modelled from the start rather than added once real disputes appeared. Retrofitting states into a system that is already moving money is far more delicate than designing them in while it is still theoretical. If I built this again, the unhappy paths would get the same up-front attention the happy path did.

Other case studies

GlazeMe
Social app with payments · iOS

GlazeMe

A social iOS app where the AI writes the compliment and the sender attaches real money to it. Combining generative text with a working wallet is where nearly all the engineering went.

FaceMeQuiz
Game · iOS

FaceMeQuiz

A face-and-memory quiz game with daily challenges and head-to-head battles, built around the retention cliff that ends most casual games within days of install.

WeCinema
Two-sided marketplace · Web

WeCinema

WeCinema lets independent filmmakers buy, sell and share work. Every meaningful decision in the build came from one problem: a two-sided marketplace is worthless to both sides until it already has both sides.

Want something built like this?

Tell me what you're making and who it's for. I'll tell you the smallest version worth shipping — and what it costs.

Chat with us