Case study

Production Systems

Expense Reconciliation System

A production pipeline that turns emailed receipts into coded, human-verified transactions and writes them back into Yardi through a browser extension.

Outcome

$2.78M reconciled across 6,539 receipts, with 86.8% auto-matched.

Constraint

Company-card reconciliation crossed email, spreadsheets, storage, accounting rules, and a legacy ERP with no suitable write API. The system had to automate the repetitive work without guessing when evidence was ambiguous. The safest automation boundary was explicit: extract and match what the evidence supports, send uncertain cases to a person, and record corrections for the next run.

463 / 464

Commits authored

200,500

Lines of TypeScript

102

Database migrations

75

Test files

01

Reconciliation pipeline

Cloudflare Email Workers · Gemini · MySQL · R2 · Signed Links · Chrome Extension

01

Ingest

Email worker

02

Extract

Content routing + vision

03

Classify

Property + GL rules

04

Verify

Signed human review

05

Write back

Yardi extension

06

Learn

Corrections + tests

Failure / 359 receipts

The matcher found a valid address—in the wrong place.

A property matcher routed 359 receipts to the head-office property code because that address appeared in every email signature. The office was also a rentable property, so the match looked valid to the original rule.

I removed signature fields from property evidence, encoded the accounting distinction between fleet and utility GL codes, added a regression test for the incident, and changed ambiguous matches to return no answer instead of selecting the most plausible one.

Admin Panel home screen

Admin Panel home screen

Google Reviews dashboard

Google Reviews dashboard

Mileage entry

Mileage entry

02

Extraction and review

PDF · HEIC · JPEG · PNG · Text Email · Human Verification

  • Accepts receipts via email forwarding or direct UI upload
  • Handles PDF, image (HEIC/JPEG/PNG), and text-only emails (Amazon order confirmations)
  • Gemini Flash extracts structured JSON: total, merchant, description, GL code, date, OCR text
  • Deterministic property and GL rules run after extraction; ambiguous classifications fail closed
  • A signed review link keeps a person in the loop before accounting write-back
  • Corrections feed merchant rules and regression coverage
03

SEO Engine

Gemini 3.1 Pro · Google Search Console · DataForSEO · Foursquare · Google Places

The existing SEO vendor was charging $400/month for generic content that didn't reflect individual property characteristics. Replaced it with an automated Gemini pipeline at ~$0.50 per property per run, generating data-driven, property-specific content across all 60+ sites.

Pipeline

1

Data Collection

Aggregates property data, nearby places, walk scores, competitor keyword positions, and performance history from 6+ APIs in parallel

2

Portfolio Deconfliction

Ensures 60+ properties in overlapping markets target different keywords, preventing the portfolio from cannibalizing its own rankings

3

Content Generation

Gemini generates property-specific meta descriptions, FAQs, page content, and schema markup, each citing real neighborhood data, never prices

4

Delivery & Tracking

Content pushed to WordPress plugin, keyword positions tracked biweekly. Stable content preserved, declining content auto-refreshed, saving ~30-40% on API costs

What It Generates

Page Titles & Meta

Tailored per property and page type with template placeholders for individual floor plans

FAQ Content

10 structured items per property with FAQPage schema: availability, neighborhood, and floor plan topics

SEO Paragraphs

Per-section content citing specific nearby places, walk scores, amenity counts, auto-refreshed on decline

Neighborhood Summaries

Lifestyle prose from Foursquare + Google Places: walkability, dining, transit, grocery data

Image Alt Templates

Per-category templates (bedroom, kitchen, exterior) with property context applied

GBP Content

Q&A pairs, biweekly post content with semantically matched property photos

Monitoring & Optimization

  • Biweekly keyword position tracking via Google Search Console. Trend analysis flags improving, stagnant, and declining keywords
  • Automated SERP screenshots with fuzzy matching to detect name, address, phone, or URL mismatches
  • Seasonality awareness: content strategy shifts 6 to 8 weeks before peak leasing season
  • Competitor keyword gap analysis identifies terms competitors rank for that the property doesn't yet target

$400/mo

Previous vendor

~$0.50

Per property, biweekly

99.7%

Cost reduction

See how this content is delivered →

The WordPress plugin and Next.js sites that render SEO engine output across 60+ properties

04

GBP & Listings Sync

Google Business Profile · Foursquare · Google Places · ILS Platforms

  • 20+ automated cron jobs sync property data, media, reviews, and listings across GBP, Foursquare, Google Places, and ILS platforms
  • Photo rotation with scored image selection on a weekly schedule
  • Neighborhood profile generation: walkability scores, nearby amenities, cuisine data, transit lines
  • HelloData integration for property comparables and market positioning
  • Runs 24/7 on nightly, hourly, and weekly schedules depending on data freshness requirements
05

Google Reviews

Google Business Profile · Gemini · Sentiment Analysis

  • Automated review retrieval from Google Business Profile across all 60+ properties
  • AI-generated response drafts using Gemini, tone-appropriate and brand-consistent
  • Employee name extraction and sentiment analysis for performance tracking
  • Review engagement metrics and export for reporting
06

Matterport 3D Tours

Matterport GraphQL API · Yardi · RentCafe

  • Bonavista-owned iPhones checked out by property managers for 3D tour capture via Matterport app
  • Matterport GraphQL API auto-categorizes scans to the correct Yardi/RentCafe property ID
  • Billing automation: reminders on day 10, approval on day 15, billing on day 1 via cron jobs
  • Global billing settings management with per-property override support
07

Mileage Tracking

Google Maps Distance API · CSV Export · Payroll Integration

  • Property origin and destination input with automatic distance calculation
  • End-of-month automated mileage report generated per employee
  • CSV export for payroll integration

$2.78M

Spend Reconciled

6,539

Receipts

86.8%

Auto-Matched by Count

95.3%

Auto-Matched by Value

319

Production API Routes

Built With

Next.jsTypeScriptGoogle GeminiCloudflare WorkersMySQLMatterport API