04 / The Circular Net
Circular Ticket
An events and ticketing product: attendees discover events and buy tickets; organisers create events, scan tickets at the door and get paid in NGN or USD.
- Company
- The Circular Net
- Role
- Sole frontend engineer, web
- Period
- Mar 2026 – PresentLive
- Links
- Visit site
- Stack
- Next.jsReact 19TypeScriptTailwind CSSnpm workspacesTanStack QueryTanStack TableRedux ToolkitZodStripe
Circular Ticket
Website + web app for events and ticketing
Screenshots coming soon
What I built
- 01Public event pages with SEO metadata, a sitemap and OG images
- 02A multi-step event wizard with schedules, ticket types, speakers and hybrid venues
- 03Browser ticket scanning, a scanner hub and staff scanner access
- 04NGN/USD wallets, transactions, payout accounts and payout requests
- 05A five-step KYC flow and organiser verification settings
- 06Orders, registration stats and spreadsheet export for organisers
The system
Two apps, one shared package
Key decisions
- 01
Share logic, not screens
The shared package holds services, hooks, schemas and rules. The interface stays native to each platform, so neither app feels like a port of the other.
- 02
One rule, one place
Payout eligibility, order status mapping and currency formatting each exist once. Web and mobile can't disagree about money.
- 03
Design every state
Loading, error, filtered-empty and truly-empty are separate states on every data screen. It made dense organiser dashboards much easier to read.
01
The problem
Organisers needed one place to publish events, sell tickets, check people in, verify their identity and get paid. The web and mobile apps were duplicating API calls and business rules, and slowly drifting apart.
02
The process
I built the web app first, then moved it into an npm-workspaces monorepo with a new Expo app. Services, query hooks, validation schemas and rules like currency formatting and payout eligibility moved into one shared package; screens stayed platform-specific. Each area (events, orders, wallets, payouts, KYC and scanning) was wired to the live API, including Stripe onboarding and bank payouts.
03
The outcome
The web app is live at circularticket.com. Both apps import the same services and rules, so a change such as when a payout can be requested happens once.
04
What I learned
Sharing code is a dependency problem before it's a code problem. Aligned versions and careful hoisting across web and native mattered more than the shared code itself.