← Back to blog

2025-12-28

8 min read

Build notes: from zero to live (what we built and what broke)

A sealed-offer marketplace shipped on Next.js, Appwrite, and Stripe. Here’s what we built, what broke, and what we learned.

This started with one goal: selling should feel calm. No last-second theatre. No public scoreboard. Just real offers, a clear deadline, and a seller choosing the buyer that actually makes sense.

What we built

  • Sealed offers (“envelopes”) — buyers don’t see competing bids.
  • Deadline → seller sees all offers at once.
  • Seller chooses the buyer (price + profile + logistics).
  • Private outcomes — sold price visible only to buyer + seller.

The parts that broke first

Real builds don’t fail in the headline — they fail in the edges. The weird states. The “what if…” scenarios. The half-complete flows.

  • Deadlines and timezones (pick a source of truth and stick to it).
  • “Winner chosen” vs “payment taken” vs “dispatch” — each must be explicit.
  • Admin approval and partner onboarding (schemas + scopes + emails).

What we learned

Practical lessons

  • Make every action a state transition with one clear owner.
  • Never leave users stuck: always show a next step or a reason.
  • Make rules visible: deadlines, decision windows, and fees.

Try the model once

Browse a listing and submit one proper envelope. You’ll feel the difference fast.

FAQ

What stack powers Sealabid?

Next.js (App Router) on Vercel, Appwrite for auth + database, Stripe for payments, and a simple content layer for the blog.

What was the hardest part to get right?

Edge cases and state transitions: deadlines, decision windows, winner selection, payment timing, and making sure users never dead-end.

Why sealed offers instead of public bidding?

Because completion matters more than drama. Sealed offers reduce sniping, bidding wars, and regret-driven bids.

Related posts