2023 - 2025

Entendre Finance

Double-entry crypto accounting with AI-assisted workflows

Joined pre-launch as an early engineer. Over two years, grew from implementing specs to owning entire systemsβ€”billing, background infrastructure, and reporting.

Role

Full-Stack Engineer

Stack

Next.js, Node.js, MongoDB, AWS

Focus

Billing, Background Jobs, Financial Reporting, Onboarding, Third-Party Integrations, CI/CD

TL;DR

  • Built visual rules engine with user-configurable cron jobs for automated transaction classification
  • Owned Stripe billing integration, background job infrastructure, and financial reporting
  • Shipped multi-timezone support, third-party GL sync (QuickBooks/Xero), and full accounting period management
  • Implemented pixel-perfect UI components from Figma, filtering system (shadcn), and API layer (TanStack Query, JWT auth)

The Problem

Crypto accounting is a nightmare. Transactions flow in from dozens of wallets and exchanges, each with different data formats. Accountants must classify thousands of transactions into proper journal entries - doing this manually is slow, error-prone, and doesn't scale. Teams needed a way to define classification rules once and have the system apply them automatically across their entire transaction history.

Core Features

Rules Engine UI

A visual condition-builder letting users create classification rules (e.g., "if source wallet is X and amount > Y, categorize as revenue") that auto-generate journal entries. Users could define complex conditions with AND/OR logic, preview matching transactions, and see journal entries before committing. Also built user-configurable cron jobs for scheduled classification.

Rules Builder Demo

If all of these conditions match:

AND

Then classify as:

Background Job Infrastructure

Reliable pipelines for backfills, asset snapshots, reconciliation, and long-running transaction processing with retry logic and failure recovery. Jobs could be triggered from anywhere in the UI - a sheet, a modal, a bulk action. Each showed inline progress, but if users navigated away, tracking moved to a global job tracker in the corner. Users could monitor all running jobs, pause or cancel them, and see real-time progress without losing context.

Background Job Flow

Idle
⏰Cron
πŸ“‹Task Manager
πŸ—„οΈDB
Waiting for cron trigger...

Background Job Tracker

Jobs follow you across the app

Click a button above to start a background job
Try: Start a job in the sheet, then close it - the job continues in the tracker

Stripe Billing Integration

Full subscription lifecycle: trials, plan enforcement, upgrades, and payment reliability. Handled edge cases like failed payments, mid-cycle plan changes, and usage-based billing.

Stripe Onboarding Flow

Ready
πŸ–₯️Frontend
βš™οΈBackend
πŸ’³Stripe
πŸ“ Fill details
πŸ“€ Send setup
β†’
waiting...
←
πŸ“Š Report card
πŸ’° Select plan
↗️ Redirect
β†’β†’
on Stripe...
←←
πŸ”„ Polling
←
βœ… Success!
🏠 Dashboard
↓
πŸ’Ύ Save config
πŸ”„ Classify
↓
πŸ“€ Send results
waiting...
↓
πŸ“¨ Webhook
πŸ—„οΈ Update DB
↓
βœ“ Return OK
↓
πŸ’³ Checkout
⏳ Process
πŸ“€ Webhook
←
Click to begin onboarding flow

S3 Presigned URL Uploads

Secure file attachments via presigned URLs. Files upload directly to S3, bypassing our servers. S3 events trigger Lambda to update database references.

S3 Presigned URL Upload

Ready
πŸ–₯️Frontend
βš™οΈBackend
☁️S3
πŸ“Ž Request URL
β†’
waiting...
←
πŸ”— Got URL
πŸ“€ Upload
β†’β†’
done
↓
πŸ” Generate
↓
↩️ Return URL
waiting...
↓
Ξ» Handle event
πŸ—„οΈ Update DB
βœ… Attached!
↓
πŸ’Ύ Stored
πŸ“£ Event
←
Click to simulate file upload flow
Accounting Features

Multi-Timezone Support

Different firms needed different end-of-day cutoffs based on location. Implemented organization-level timezone configuration affecting all timestamps, reports, and data filtering. Critically, accounting periods depend on timezone - a transaction at 11 PM UTC on March 31 falls in March for a London firm but April for a Tokyo firm. Changing timezone invalidates existing journal entries and requires re-classification, so users see a confirmation showing exactly which periods and entries will be affected before proceeding.

Timezone & Period Boundaries

See how timezone affects which period a transaction falls into

Organization Timezone:
Transaction: Mar 31, 11:30 PM UTC
UTC (London)UTC +0
March
April
midnight
11:30 PM
Falls in:March 2024
EST (New York)UTC -5
March
April
midnight
6:30 PM
Falls in:March 2024
PST (Los Angeles)UTC -8
March
April
midnight
3:30 PM
Falls in:March 2024
JST (Tokyo)UTC +9
March
April
midnight
8:30 AM
Falls in:April 2024
Click the dropdown to see the timezone change warning

Third-Party GL Sync

Streamlined QuickBooks and Xero integration into a unified service handling authentication, field mapping, and error recovery consistently across platforms.

Sync to External Ledgers

89 journal entries ready to sync

πŸ“—
QuickBooks Online

Last sync: 2 days ago

Connected
πŸ“˜
Xero

Last sync: 5 days ago

Connected
πŸ“™
NetSuite
Not connected
Each platform uses its native API client for reliable sync

Accounting Period Management

  • Journal entry rollups for period closes
  • On-demand ledger balance recalculation
  • Impairment workflows with audit trails

Accounting Periods

Period close workflow with timezone-aware cutoffs

Organization Timezone:
Period cutoff: 11:59 PM EST
January 2024Closed
February 2024Closed
March 2024
Open
April 2024
Open
Transactions at period boundaries are assigned based on organization timezone

Financial Reporting

All reports (balance sheet, trial balance, income statement) are powered by pre-computed account balances, not calculated on-the-fly. When a period closes, ending balances are computed from journal entries and carried forward as the next period's opening balance. This makes reports instant regardless of transaction volume.

  • Balance sheet, trial balance, income statement
  • Timezone-aware date filtering
  • CSV export for downstream analysis

Balance Pre-computation

Closing balances carry forward to next period

Januaryclosed
Opening$0
+ 89 entries
Closing$45,230
Februaryclosed
Opening$45,230
+ 67 entries
Closing$52,890
Marchopen
Opening$52,890
+ 74 entries
Closingβ€”
Balance carried forward
Computing
UI & Infrastructure

App-Wide Filtering

Unified filtering across all views: date ranges, wallets, accounts, categories, tags. Backend DRY filter helpers - composable and unit testable.

Persistent Tabs

Power users needed to save their workspace configurations. Built a tabs system persisted to database and exposed via API, allowing users to save UI state including default filters, column preferences, and view settings. Hybrid storage with localStorage for instant load and API sync for cross-device access. Each tab remembers exactly how the user left it.

Persistent Tabs

Workspace configurations saved to DB & localStorage

Tab Configuration
Default Filters
Visible Columns
Synced (DB + localStorage)
Local changes
Syncing
Click "Edit" to modify filters and columns, then save to sync across devices

Table Components

  • Backend-driven multi-column sorting (any asc/desc combination)
  • Infinite scroll, row selection, inline actions
  • Custom cell renderers for currencies, debits/credits, dates, status
  • Pixel-perfect implementation from Figma specs

Page Headers & API Layer

  • Responsive headers from Figma: title, breadcrumbs, action buttons
  • TanStack Query with centralized query keys
  • JWT + refresh token flow via Axios interceptor
Summary

Technical Approach

Prioritized composable, testable code. Filter helpers, API hooks, and UI components designed for reuse. Figma specs followed precisely. Rules engine useddeclarative JSON β€” simpler UI, auditable rules, predictable execution.

Outcome

Collaborated closely with the team to ship multiple projects under tight deadlines β€” billing, background infrastructure, reporting, and the rules engine among them. Together we delivered a full-featured accounting platform with reliable background jobs at scale, seamless billing lifecycle, accurate multi-timezone reporting, and consistent UI across complex data views. The rules engine significantly reduced manual classification work for end users.