goGerami
Lead Full-Stack DeveloperNov 2025 – PresentMulti-vendor gift marketplace connecting the Ethiopian diaspora to local vendors — browse gifts, events and services, check out in USD or ETB, and track delivery.
- Java 21
- Spring Boot
- React
- TypeScript
- PostgreSQL
- Stripe
- Chapa
- Prometheus
Overview
goGerami (formerly Zembil) is a marketplace for the Ethiopian diaspora to send meaningful gifts, book event tickets and support local vendors back home. I lead development across the stack — a Spring Boot 3 / Java 21 API, a React + TypeScript client and a Liquibase-managed PostgreSQL schema — covering product discovery, multi-currency checkout, vendor onboarding and payouts, event ticketing, custom orders, delivery and an admin back office.
Results
Challenge
Diaspora customers needed a reliable way to send gifts, book events and pay local vendors across currencies and payment rails, while vendors needed tools to manage products, events and payouts.
Solution
A Spring Boot API and React/TypeScript client covering catalog, cart, multi-currency checkout, vendor onboarding and payouts, event ticketing, custom orders, delivery assignment and an admin dashboard for platform operations.
Key technical decision
Checkout is split into two phases: an idempotent order API first creates a fully priced order, then a separate step initializes payment with Stripe (USD) or Chapa (ETB) and a confirmation flow built for provider webhooks completes it. A retried request or dropped connection can't create duplicate orders, and adding a payment rail doesn't touch order logic.
Highlights
- Two-phase checkout: idempotent order APIs, then Stripe (USD) or Chapa / Telebirr (ETB) payment
- Multi-currency pricing that creates and validates USD and ETB prices for every product and SKU
- Liquibase-managed PostgreSQL schema (80+ tables) with rollback-tested migrations across local, Neon and Render
- React + Vite client with Zustand, React Query and Radix UI for customers, vendors, admins and delivery staff
- Prometheus and Alertmanager monitoring with 10 alert rules routed to Slack