Skip to main content
YK logo
← Back to projects

Ascent — Point-of-Sale Lending Platform

Ascent dealer dashboard

Overview

Ascent is a point-of-sale lending platform built by Luna Protocol to digitise the loan origination process for marine and powersports dealers. It connects dealers, customers, OEM partners, and financial institutions in a single integrated workflow — from pre-qualification through to signed contract and funded deal.

The platform supports multiple OEM brands (Brunswick, KTM, E-Z-GO, and custom white-labels), multiple loan origination channels, and is configurable per brand via templated flows.


The Problem

Dealers in the marine and powersports market historically relied on paper-based or fragmented digital processes for financing. Customers would fill out paper credit applications, dealers would fax them to lenders, and deals could take days to close. There was no unified experience tying together credit decisioning, deal structuring, identity verification, income verification, document signing, and ACH payment setup.

The goal was to eliminate this fragmentation entirely — bringing the full loan origination workflow into a single, real-time digital experience that works on the showroom floor.


Architecture

Frontend — Three React Applications

The frontend is a TypeScript/React monorepo with three Vite-powered applications sharing a common component library (@luna-protocol/core):

App Audience Purpose
web.consumer End customers Loan application, identity & income verification, review & sign
web.dealer Dealer staff Deal building, pre-qual management, product & accessory configuration
web.admin Internal ops Platform administration, template management (Monaco editor)

All three apps share internationalisation via formatjs, are linted with ESLint, formatted with Prettier, and covered by Vitest (unit) and Cypress (E2E).

State management for server data was handled via React Query, which was central to keeping the three applications in sync with the async nature of the loan lifecycle — credit decisions, e-signature webhooks, and Plaid callbacks all arrive out-of-band and need to trigger UI updates without polling.

Backend — Go Monorepo

The backend is a Go monorepo using GoFiber v2, GORM with PostgreSQL, Redis for session state, and RabbitMQ/Azure Service Bus for async messaging. As a frontend engineer on the project, I worked closely with this layer to define API contracts, debug integration issues, and ensure the frontend state machine aligned with the backend's loan status model.

Infrastructure

Deployed on Microsoft Azure via Azure Bicep (IaC). TLS via Let's Encrypt, DNS in AWS Route 53, CI/CD through GitHub Actions with per-environment build targets.


Key Integrations

The platform coordinates seven third-party services in a single coherent workflow:

Integration Purpose
Apollo Pricing Engine Loan pricing, rate programs, and offer generation
DocuSign E-signature for loan contracts (JWT auth, token refresh)
Plaid Bank account linking for proof of income and ACH payment setup
Adobe Programmatic document generation (contracts, disclosures)
T-Value Loan amortization and payment schedule calculations
Product Info service VIN/serial number lookup for unit verification
Datadog Custom metrics, APM, and distributed tracing

From the frontend, each of these integrations required careful UX handling — DocuSign and Plaid both use embedded iframes with postMessage handoffs, while the credit decision from Apollo is async and required an intermediate polling/webhook state in the UI.


User Flows

Customer Journey (11 Steps)

The consumer app guides customers through the full application lifecycle:

  1. Application Form — Personal info, income, employment, address; co-applicant support
  2. Phone Verification — OTP via SMS with separate flows for initial, disclosure, and final steps
  3. Credit Processing — Async credit pull with real-time status update on decision
  4. Approval & Offer Selection — Customer selects a loan program from approved offers
  5. Identity Verification — Third-party IDV step
  6. Proof of Income — Plaid bank link or document upload
  7. Stipulation Resolution — Customer resolves any outstanding conditions
  8. Confirm Details — Final review of personal and loan details
  9. Payment Setup — ACH bank account setup via Plaid
  10. Document Review & E-Signature — DocuSign contract signing
  11. Funded — Deal complete

Intermediate states handle edge cases throughout: frozen credit, under review, denied, waiting for co-applicant, pricing errors. Each state is a discrete route with its own UI and copy, driven by the loan application's status machine.

Dealer Journey

The dealer app handles the other side of the workflow — starting leads, building deals with products and accessories, tracking customer progress, and managing per-dealer white-label configuration (logo, colours, disclaimers).


Engineering Practices

i18n from day one — All user-facing strings are extracted via formatjs into compiled message catalogs, keeping the platform ready for localisation across OEM markets.

Component library isolation — The shared @luna-protocol/core library enforced strict separation between business logic and UI. This made it possible to white-label all three apps against a single component tree with only theme tokens changing.

Session persistence — With a multi-step, async journey that customers might pause and resume, session state needed to survive page refreshes. useSessionStorage hooks from usehooks-ts were used to persist application state through the context layer without rearchitecting the data model.

Type-safe API layer — All API calls were typed end-to-end against the backend's response shapes. React Query's queryKey factory pattern kept cache invalidation predictable across the complex status transitions of the loan lifecycle.


Impact

Within the first week of launch, the platform saw 40,000 new users, demonstrating immediate market demand. Dealership partners reported significantly faster deal turnaround — what had previously taken days of back-and-forth was reduced to a single showroom session. Sales targets were hit well ahead of projections.

Beyond the numbers, the platform represents a genuine digitisation of a compliance-heavy, multi-party financial process that had remained largely paper-based for decades in the marine and powersports sector.

Ascent application form

Ascent finance approval screen