Skip to content
Luan Phan
All work
  • Fintech
  • Cloud
  • Integrations

Accounting Data Sync Platform

A multi-tenant, event-driven service that connects lending products to their clients’ Xero and MYOB ledgers, keeping invoices, contacts and payments in sync and writing funding activity back to the books.

Role
Technical lead
Period
2025 — Present
Stack
TypeScript, AWS CDK, AWS Lambda, DynamoDB, SQS, SNS, API Gateway
Outcome
Zero app downtime from slow or hung accounting APIs · real-time sync to every product

The problem

A lender’s view of a business comes from its ledger: who owes it money, how old those invoices are, and what has been paid. Each lending product used to talk to Xero and MYOB on its own, so token handling, rate limits and data mapping were rebuilt in every app, and a dropped connection could silently leave funding decisions running on stale data.

The goal was one service that owns the connection to a client’s accounting software, so every product gets the same clean, current data.

My role

As technical lead, I led the design and build of the service, from the AWS architecture and infrastructure-as-code through the sync engine, provider integrations and deployment pipeline, and wrote most of the codebase.

Approach

  • One connection, many products: a company connects its ledger once, and every product reads from the same synced data.
  • Jobs instead of requests: a sync runs in the background as a job split into tasks, so a large ledger or a slow provider never blocks the apps.
  • Provider-agnostic core: Xero, MYOB and CSV upload sit behind one interface, so adding a provider doesn’t touch the sync logic.

Architecture

The whole stack is serverless and defined in AWS CDK.

  • Secure API: API Gateway with IAM auth, so only trusted services can call it.
  • Sync workers: Lambda workers fed by SQS queues with dead-letter queues. A worker stops before its time limit and hands off to the next run, so syncs of any size finish.
  • Token lifecycle: tokens refresh on a schedule with backoff. Temporary failures are retried, and a real disconnect is flagged to the product instead of retried forever.
  • Events out: DynamoDB streams publish changes to SNS, which sends each product only its own events on its own queue.
  • Write-back and reports: payments and bank transactions go back into the client’s ledger, and financial reports are pulled on demand.

Results

  • No downtime from external services: when Xero or MYOB slowed down, rate-limited or hung, the work stayed on queues and in background workers, so the lending apps kept running. The apps have had no downtime caused by an accounting provider since the move.
  • Real-time sync for many consumers: one connection per company now feeds every product at once. Each product gets ledger changes as events on its own queue, in real time, instead of polling or keeping its own integration.
Next case study Event Venue Marketplace