Toluwalope AkinkunmiLoading…

Sketching things…

000
Skip to content
← All work

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
Stack
Next.jsReact 19TypeScriptTailwind CSSnpm workspacesTanStack QueryTanStack TableRedux ToolkitZodStripe
04

Circular Ticket

Website + web app for events and ticketing

Next.jsReact 19TypeScriptTailwind CSS

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

Two apps, one shared packageAttendees & organisers → Web app; Attendees & organisers → Mobile app; Web app → Shared package; Mobile app → Shared package; Shared package → Platform API; Platform API ↔ PayoutsAttendees & organisersWeb appNext.jsMobile appExpoShared packagenpm workspacesPlatform APIRESTPayoutsStripeimportsimportstyped requests

Key decisions

  1. 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.

  2. 02

    One rule, one place

    Payout eligibility, order status mapping and currency formatting each exist once. Web and mobile can't disagree about money.

  3. 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.

Next projectCircular Ticket MobileThe events app for iOS and Android