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
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

Google Reviews dashboard

Mileage entry
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
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
Data Collection
Aggregates property data, nearby places, walk scores, competitor keyword positions, and performance history from 6+ APIs in parallel
Portfolio Deconfliction
Ensures 60+ properties in overlapping markets target different keywords, preventing the portfolio from cannibalizing its own rankings
Content Generation
Gemini generates property-specific meta descriptions, FAQs, page content, and schema markup, each citing real neighborhood data, never prices
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
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
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
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
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