BILL · Software Engineer II
AR Platform Modernization
Jun 2024 to Present
Led modernization of BILL's Accounts Receivable platform. Transformed a legacy monolithic frontend into a scalable microfrontend system serving hundreds of thousands of SMBs.
100K+
SMBs impacted
Customers using the AR platform whose invoicing and payment workflows were improved or expanded
5+
Major features shipped
End-to-end customer-facing capabilities delivered: Bulk Mark as Paid, Recurring Invoices, Scheduling, Payment Links, Invoice Customization
↑
Engineering velocity
Measurably faster feature delivery cadence as microfrontend patterns and standardized tooling compounded across the team
BILL is a financial operations platform built for small and medium businesses. Its Accounts Receivable product handles invoicing, payment collection, and cash flow management for a customer base of hundreds of thousands of SMBs, representing billions in annual payment volume. When I joined, the AR frontend was showing its age: a monolithic codebase that was slow to change, hard to test, and increasingly unable to keep pace with the product roadmap.
A platform that couldn't keep up with its own growth
The AR frontend was built for a product at an earlier scale. As BILL grew aggressively, the codebase became a bottleneck. Each feature shipped more slowly than the last, and test coverage gaps meant that changes to core workflows carried real regression risk for customers.
- Monolithic Angular frontend made isolating and deploying individual features difficult, slowing down release cycles
- Legacy LaunchDarkly feature flags had accumulated over years. Stale flags scattered across the codebase added cognitive overhead and made the system harder to reason about
- Frontend-backend coupling through REST APIs led to over-fetching and redundant network calls, degrading performance at scale
- Test automation was inconsistent. Each team had its own patterns, making coverage spotty and QA maintenance expensive
- Bundle sizes had grown without systematic management, impacting load time for time-sensitive AR workflows
Modernize at the seams, not all at once
Rather than a risky big-bang rewrite, the strategy was to modernize incrementally. We migrated high-value workflows into microfrontend experiences while maintaining continuity for existing customers. Each new feature was an opportunity to establish the right patterns.
Microfrontend boundary design
Defined clear ownership boundaries across AR workflows. Invoicing, payments, and customer management each became independently deployable surfaces. This let teams ship without coordinating across the full monolith.
GraphQL for data efficiency
Replaced over-fetching REST calls with GraphQL-driven data fetching within a federated architecture. This reduced redundant API traffic, improved response times for data-heavy AR views, and gave the frontend precise control over what data it requested.
Feature flag rationalization
Audited and cleaned up LaunchDarkly flag sprawl across the AR surface. Removed stale flags, documented active ones, and established standards for flag lifecycle management, which reduced the cognitive overhead of working in the codebase.
Standardized Playwright automation
Established shared Playwright patterns and helper utilities adopted across the AR team. Standardizing automation removed the inconsistency between team testing approaches and made it faster to write high-quality tests for new features.
Key capabilities shipped
- ✓Bulk Mark as Paid: lets AR teams reconcile multiple invoices simultaneously, eliminating a major workflow bottleneck for high-volume customers
- ✓Recurring Invoices: automated invoicing on configurable schedules, reducing manual overhead for subscription-based billing
- ✓Scheduling Invoices: deferred send workflows so customers could prepare invoices in advance and dispatch them at the right time
- ✓Payment Links: shareable payment URLs that let customers collect payments outside the platform, expanding AR reach
- ✓Invoice Customization: branding and layout controls that let businesses present professional, on-brand invoices to their clients
Faster shipping, fewer regressions, more capable product
The modernization effort compounded over time. Each workflow migrated and each pattern standardized made the next feature easier to build. Engineering velocity improved measurably, and the AR platform shipped more meaningful customer-facing capability in this period than in comparable timeframes before.
The biggest leverage point in this project wasn't any single feature. It was establishing the right patterns early. Every standardized test helper, every rationalized feature flag, and every GraphQL schema decision made the next sprint faster. Incremental modernization works when each change is an investment in the system, not just a delivery against a ticket.
Hiring for work like this?
Share this case study with your team, or get in touch directly.