STStephen TioluwaniAll work

Pama product · 2026

Campus marketplace · Mobile + web

Founder & product engineer

Pamastore

Making campus commerce trustworthy after the happy path ends.

Pamastore grew from a campus marketplace into a cross-platform commerce system where payments, inventory, seller payouts, chat, delivery handoff and app-store policy all had to agree on the same truth.

The thesis

“The interesting part of a marketplace is not the product card. It is everything that can go wrong after somebody pays.”

2 stores

Shipped mobile

Pamastore is distributed on Google Play and the Apple App Store.

Atomic

Paid fulfillment

Stock validation, seller-order creation and cart updates share one server transaction.

Idempotent

Money movement

Callbacks, webhooks, seller transfers and refund paths are designed around retries and uncertain external responses.

01 · The problem

The UI was the easy part. Trust was the product.

A campus marketplace can look deceptively simple: show products, add a cart, accept payment. That model stops being useful the moment one payment contains products from multiple sellers, stock can change while the buyer is paying, and each seller eventually needs a payout.

I treated the financial lifecycle as a state machine rather than a collection of payment buttons. The server recomputes what should be paid, verifies the Paystack reference, currency and amount, then validates aggregate demand against the current physical stock pools before any seller order is created.

  • Repeated items that target the same product, variant or shared stock pool are aggregated before availability is checked.
  • An insufficient-stock failure rolls the whole fulfillment transaction back instead of clamping inventory to zero.
  • A duplicate callback for an already fulfilled payment is safe: it does not decrement inventory twice.

02 · Engineering for uncertainty

A timeout is not the same thing as a failed payout.

External payment APIs produce awkward states. A transfer request can time out after the provider has already accepted it. Retrying blindly is how a marketplace pays a seller twice.

Pamastore reserves deterministic transfer references before calling Paystack and treats ambiguous network outcomes as processing until they can be reconciled. Refunds, disputes and payout eligibility share the same principle: if the system does not know, it does not invent certainty.

  • Signed webhooks are validated before dispatch.
  • Transfer transitions are monotonic across success, failure, processing, OTP and reversal states.
  • Unresolved refunds or buyer issues block payout reservation rather than racing the transfer path.

03 · Shipping a real mobile product

App-store readiness reached all the way into the backend.

Preparing Pamastore for release exposed work that had nothing to do with screenshots: release credential hygiene, fail-closed production configuration, buyer and seller account deletion, report/block controls in chat, and explicit retention rules for financial evidence.

That changed how I think about release readiness. A mobile product is not ready because the binary compiles. It is ready when the operating system, store policy, backend lifecycle and user-facing recovery paths agree.

04 · The current product

Discovery is campus-aware, while conversations stay unified.

The mobile home experience moved to Explore-first discovery with campus-aware products and native category navigation. Buying and selling conversations were brought into one inbox instead of making seller accounts mentally switch products.

The same release also kept campus choice server-canonical for authenticated users and introduced durable seller-onboarding email claims so reminders can be retried without becoming spam.

What stayed with me

Pamastore taught me to treat trust boundaries, not screens, as the architecture of commerce.

Next.jsExpo / React NativeConvexPaystackTurborepopnpmEAS

Next case study

PamaOS

Turning a growing business suite into modules that own their data.

↗