A coastal-India seafood brand wanted to take fresh fish from the boat to the customer's door in under 90 minutes — without owning the entire supply chain. We built a marketplace app with cold-chain SLAs, vendor onboarding, and rider-network integration that hit 9,000 monthly orders by month seven.
Selling fresh fish online is two engineering problems: a marketplace (matching customer to vendor), and a cold-chain (getting it there before it spoils). Most aggregators don't bother — fresh-fish is a tiny fraction of grocery orders. The client wanted to own this category in coastal India where fish is a daily-purchase staple.
Hub-and-spoke model: vendors deliver fresh catch to a refrigerated hub, hub-staff grade + pack + dispatch via rider network. The app coordinates the whole flow with sub-minute updates.
Catch-of-the-day feed (refreshed twice daily), vendor + rating filter, cart, scheduled delivery slots, 90-min express, order tracking, freshness-guarantee return flow, ratings.
Daily catch upload (photo + weight + price), hub-arrival check-in, payout dashboard, return-handling, rating breakdown.
Hub-pickup-list, multi-drop route (up to 5 orders), cooler-bag scan-in / scan-out, OTP delivery, daily earnings.
Hub-arrival queue, grading workflow, packing assignment, dispatch board, dispute desk, inventory + pricing override, daily reports, vendor onboarding.
NestJS API on Postgres, Firebase RTDB for live order state and rider-location streams, Redis for hub-staff handoffs, Twilio + FCM for notifications, Razorpay for payments.
We picked the stack for fit, performance under realistic load, and operational simplicity. Here is the breakdown:
Postgres for transactional + Firebase for live state: the split keeps cost manageable (Firebase only for the hot stuff) and makes reporting easy (everything settles to Postgres). The hot data is small; the cold data is huge.
Flutter across all three apps: one design system, one team, three apps in two stores. Build cost was ~40% of doing this in native.
Hub-ops web on React, not Flutter: staff at the hub use desktops with multiple browser tabs. A web app suits that workflow far better than a phone app.
Daily inventory orchestration.
A fish marketplace is not like a grocery marketplace where SKUs are stable. Every day, vendors arrive with different catches in different quantities at different prices. The customer-facing menu has to refresh twice a day with what is actually available — without breaking carts that are mid-checkout.
We modeled inventory as time-bucketed (morning catch / evening catch). Vendor uploads create a bucket; customer cart-locks-in a bucket-version; if the bucket changes mid-checkout, the customer sees a substitution-or-refund prompt within 8 seconds.
Cancellation rate from inventory mismatch dropped to 1.1% — well below the 5% industry default. Daily merchandising (which catch to highlight, which vendor to feature) became data-driven.
Single town launch — Mangaluru — with 12 hand-picked vendors and 200 hand-recruited customers. Six weeks of intensive ops involvement. Then expanded along the coast: Udupi, Karwar, Goa.
Vendor onboarding was the constraint, not engineering. We built a self-serve KYC + photo-verify flow that cut onboarding from 4 days to 90 minutes.
“Fish-online is a category most aggregators write off. The platform plus the hub model makes the unit economics work where everyone said they couldn't.”
Founder
Coastal Seafood Marketplace · Karnataka
Start with cooler-bag tracking from day one. We treated cold-chain as a process problem first, a tech problem second; turns out the bag-scan flow eliminated 80% of disputes. Should have been week-one, not month-three.
Hyperlocal categories that aggregators ignore are the best opportunities — if you have the operational discipline. Talk to a team that has shipped marketplace + cold-chain platforms before.
Get a Free Consultation