Loading...
Loading...
Event vendor marketplaces have a unique trust problem: the transaction happens once, the stakes are high, and the vendor often has no digital reputation. Here's how we designed for that.
Field Note — Jos Eventia
---
Event planning in Jos, Nigeria, runs on relationships and referrals. You need a caterer, you ask your cousin. You need a photographer, you DM someone on Instagram. The problem is scale and trust: when you're planning a wedding for 500 guests, "my cousin knows them" is not a risk management strategy.
Jos Eventia was built to solve this: a vendor marketplace where event organizers can find verified vendors, book them with escrow protection, and pay securely through Paystack. The technical challenge was not building a marketplace — that's well understood. The challenge was building trust in a market where digital reputation barely exists.
---
In mature marketplaces (Airbnb, Upwork), trust is built through reviews, completion rates, and platform-mediated disputes. In Jos, most vendors have never used a digital platform. Their reputation is word-of-mouth, not star ratings. The platform had to create a trust layer from scratch.
Our approach was three-pronged:
1. Verification, not just registration. Vendors don't just sign up; they submit business registration documents, sample work, and references. We verify these manually before the vendor appears in search results.
2. Escrow for every booking. The organizer pays into escrow, not directly to the vendor. The vendor knows the money is secured. The organizer knows the vendor has skin in the game.
3. Milestone-based releases. For large events, escrow is released in milestones: 30% on contract signing, 40% on delivery of key materials, 30% on event completion. This aligns incentives without requiring the organizer to pay everything upfront.
---
Vendor profiles are the core of the marketplace. An organizer searching for caterers needs to see photos, pricing, availability, and reviews — fast.
We chose Incremental Static Regeneration (ISR) over full static generation or server-side rendering. ISR gives us:
The tradeoff is complexity. ISR requires thinking about revalidation strategies, fallback behaviors, and cache invalidation. A vendor who updates their pricing expects it to be live immediately; explaining a 60-second delay requires careful UX design.
The backend follows the same pattern as our other projects: Django REST Framework, PostgreSQL, structured service layers. The domain models are straightforward — Vendor, Organizer, Booking, Escrow, Review — but the state machines are where the complexity lives.
A booking goes through multiple states:
INQUIRY → QUOTED → ACCEPTED → ESCROW_FUNDED → CONFIRMED → IN_PROGRESS → COMPLETED → REVIEWED
↓ ↓ ↓
DECLINED EXPIRED CANCELLEDEach transition has guards: you can't fund escrow until the quote is accepted. You can't cancel after the vendor has started work (without penalty). You can't review before completion. These guards are enforced in the service layer, not just the frontend.
The escrow system for Jos Eventia is simpler than Naija Co-op Hub's — it's single-tenant (one booking, one vendor, one organizer) — but the milestone logic adds complexity:
class Milestone(models.Model):
booking = models.ForeignKey(Booking, on_delete=models.CASCADE)
name = models.CharField(max_length=255) # e.g., "Contract Signed"
amount = models.DecimalField(max_digits=12, decimal_places=2)
status = models.CharField(choices=MilestoneStatus.choices, default=MilestoneStatus.PENDING)
release_trigger = models.CharField(choices=ReleaseTrigger.choices)
# ORGANIZER_APPROVAL, VENDOR_COMPLETION, AUTO_AFTER_DAYSEach milestone has a release trigger. "Contract Signed" might release on organizer approval. "Event Completion" might release automatically 48 hours after the event date unless the organizer disputes. This flexibility lets us handle different vendor types: caterers (delivery-based), photographers (completion-based), venues (time-based).
Paystack supports split payments — a single charge that is automatically divided between multiple recipients. We use this for platform fees: when an organizer pays ₦500,000, Paystack sends ₦475,000 to the vendor's account and ₦25,000 to the platform's account, automatically. This simplifies reconciliation — the platform never holds the full amount — but requires careful configuration of subaccounts and split codes.
Webhook handling follows the same pattern as Proova: signature verification, idempotency, dead-letter queuing. Payment webhooks are the most critical external dependency; a missed webhook means a booking stays in ESCROW_FUNDED when it should be CONFIRMED.
---
The chicken-and-egg problem: organizers won't use the platform without vendors, vendors won't join without organizers. Our solution was to seed the platform with verified vendors before launch. We manually onboarded 50 vendors — photographers, caterers, decorators, DJs — and verified each one. When organizers arrived, they found a marketplace that already had inventory.
This was labor-intensive but necessary. A marketplace with no vendors is just an empty search page. Trust starts with curation.
Disputes are inevitable in event planning — a vendor delivers late, the quality doesn't match the sample, the organizer cancels last-minute. We built a dispute resolution workflow:
1. Either party raises a dispute with evidence (photos, messages, contracts).
2. The platform's dispute team reviews the evidence.
3. A decision is made: full release to vendor, partial refund to organizer, or full refund.
4. The decision is recorded and the escrow is adjusted.
We chose manual resolution over automated rules at launch. Automated rules work for commodity transactions (e-commerce refunds) but fail for subjective services ("the food was cold"). Human judgment is slower but more accurate for the first 500 disputes. Once we have enough data, we can train a classifier — but not before.
---
Marketplaces need to solve the chicken-and-egg problem creatively. Technical excellence doesn't matter if there's no one to transact with. We spent more time on vendor onboarding in the first three months than on any technical feature.
Escrow complexity increases with the number of edge cases. A simple "hold and release" escrow is easy. Milestones, partial releases, disputes, cancellations, and vendor no-shows make it a state machine with dozens of transitions. We drew the full state diagram on a whiteboard before writing any code. That diagram saved us weeks of rework.
Local payment methods significantly improve conversion rates. Paystack supports cards, bank transfers, USSD, and mobile money. In Jos, bank transfer and USSD are more popular than cards. Supporting these payment methods from day one — not as a later addition — doubled our conversion rate compared to card-only.
---
Jos Eventia is live at [joseventia.com](https://joseventia.com)