OOOlorede.
Back to Projects
FrontendFeaturedFebruary 2024

Seamless Point

Turns three separate apps (delivery, bill payments, and finding a technician) into one habit, so users never have a reason to leave for a competitor.

Next.jsReactTypeScriptTailwind CSSZustandTanStack QueryPaystackRadix UIReact Hook FormZod
Seamless Point
Overview

Every one of Seamless Point's services, package delivery, utility and data bill payments, on-demand technicians, already has standalone competitors. The business case for building one platform instead of three is retention: a user who only came to pay a light bill can schedule a delivery in the same session, without downloading another app or trusting another brand. That only works if the experience feels effortless end to end. The platform pre-computes exact delivery and payment fees, including the notoriously fiddly local and international transaction math, before the user commits. No 'wait, how much will this actually cost' hesitation left to kill the conversion.

Architecture

The application leverages the Next.js App Router for optimal routing and rendering. Next.js Server Actions securely communicate with the external backend API, handling authentication, data fetching, and business logic encapsulation. Global UI state is managed by Zustand, while TanStack Query handles server state, caching, and optimistic updates for dashboard metrics. Payment processing is integrated via Paystack, with a custom mathematics module that accurately pre-computes complex local and international fee structures (kobo math) on the edge. Authentication flows use a mix of local JWTs and Google OAuth.

Technical Decisions
01

Architecture

Chose

Decoupled Next.js frontend communicating with an external backend API

Why

Allowed the frontend to focus purely on UI/UX, caching, and client state management, while the backend independently scales to handle heavy transaction loads and third-party webhooks for logistics and utility payments.

Trade-off

Requires strict synchronisation between frontend TypeScript interfaces and backend API contracts, increasing overhead for type sharing.

02

State Management

Chose

TanStack Query alongside Zustand

Why

Zustand provides a lightweight, boilerplate-free solution for localised UI states (multi-step forms, modals), while TanStack Query exclusively manages asynchronous server state, ensuring efficient caching and reducing redundant network requests.

Trade-off

Introduces two separate state management paradigms, requiring clear architectural boundaries on what state lives where.

03

Payment Integration

Chose

Custom Paystack fee computation logic on the client

Why

Ensures the UI accurately displays gross and net charges to users in real-time (handling local caps, waivers, and international flat rates) before initiating the transaction with the payment gateway.

Trade-off

Adds computation complexity to the frontend that must be kept precisely in sync with Paystack's official pricing structures to prevent discrepancies.

Future Improvements

Implement real-time tracking for logistics and delivery requests using WebSockets

Transition to a strictly typed monorepo (e.g., Turborepo) to natively share TypeScript interfaces between frontend and backend

Expand automated test coverage using Playwright for end-to-end critical user flows