Skip to content
ZZetuTech
Back to our work

Case Study

Engineering trust into a two-sided marketplace.

AssignNet lets clients post research and technical work, receive bids from vetted specialists, and pay only when the work checks out. We architected, built, and operate the whole platform. Here is how it works under the hood.

Role
Architecture, build & operations
Frontend
Next.js 16 · TypeScript · Vercel
Backend
FastAPI · Python 3.12 · Railway
Data
PostgreSQL (Supabase) · Prisma

The problem

A marketplace where strangers exchange money for work fails the moment either side stops trusting it. Clients need to know the specialist is who they claim to be and that the work is original. Specialists need to know they will be paid. The platform needs both sides to stay on-platform, across the United States and Kenya.

That turns a simple listing site into a set of hard problems: identity verification, automated quality gates, escrowed payments on two continents, and moderation that works without a large operations team.

Architecture at a glance

A modular monolith: one FastAPI service organized into 17 feature modules, with a typed Next.js frontend and a single PostgreSQL database. Simple to operate, with clear seams if a module ever needs to be split out.

  1. 01 /04

    Web app

    Next.js 16 on Vercel. Typed forms with Zod, hardened security headers, Playwright end-to-end tests.

  2. 02 /04

    API

    FastAPI on Railway, containerized, with health-checked deploys. Modules for tasks, bids, integrity, wallet, payouts, support, and admin.

  3. 03 /04

    Data

    PostgreSQL on Supabase with 31 Prisma models and 48 versioned migrations. File storage on Supabase Storage.

  4. 04 /04

    Integrations

    Stripe (escrow and Connect payouts), Paystack (KES payouts), Copyleaks (AI and plagiarism scans), Resend (email), ClamAV.

Key design decisions

  1. 01

    Quality gates as an explicit state machine

    Every delivery passes an integrity scan before the client can see it. Rather than a flag on the task, the scan is modeled as task states: scanning, passed, revision required, and failure paths. Files stay hidden until a scan passes. When the scanning provider's webhook is late, the task moves to a pending state for automatic recovery, and after four hours it escalates to a human auditor, so no task can get stuck silently.

  2. 02

    Our own ledger, not the payment provider, is the source of truth

    Every payment event writes a row to an internal ledger of credits and debits, each with a clear status: pending, completed, or reversed. Balances, escrow holds, and fees are computed from the ledger, not by calling Stripe. That makes wallets fast, auditable, and correct even when a provider is slow or down.

  3. 03

    Two payment rails for two markets

    Clients can pay through Stripe escrow, where funds release only on approval, or a pay-after-review track. Specialists are paid through Stripe Connect or, in Kenya, through Paystack to M-Pesa or a bank account. If the platform's local balance is short, payouts queue for retry instead of failing.

  4. 04

    Deterministic moderation, by design

    Messages are checked for shared contact details and attempts to take payment off-platform, and flagged for review without blocking the conversation. Abusive language is blocked or censored by tier, and repeat offenders are flagged automatically. All of it is rule-based rather than machine learning, so every decision is predictable and explainable.

  5. 05

    Defense in depth for accounts and files

    Uploads are checked twice: the file's actual bytes must match its declared type, then it is scanned for malware. Accounts support authenticator-app MFA, sessions are tracked, and security events are audit-logged. When payout details change, the owner gets a one-time link to freeze the account if it wasn't them.

How it's engineered

  • 90+ backend tests across unit, integration, and security suites
  • Browser end-to-end tests with Playwright
  • Typed end to end: Pydantic on the API, TypeScript and Zod on the web
  • Containerized API with health-checked, auto-restarting deploys
  • Versioned schema migrations and pre-commit hooks

What this means for your project

The problems AssignNet solves (verification, escrow and payouts, integrity checks, moderation, and reliable third-party integrations) show up in most marketplaces and platforms. We bring these patterns, and the lessons from running them in production, to client engagements.

Have a system that needs to scale?

Tell us where you are and where you need to be. You’ll get a straight answer on whether we can help — usually within one business day.