Updates
Highlights
- Gmail Import: Connect your Gmail account and import expenses directly from receipts and orders in your inbox.
- Improved Data Extraction: We've added support for Schema.org JSON-LD extraction, ensuring highly accurate vendor and amount detection.
- Proof-of-Expense Snapshots: Automatically capture visual previews of imported email receipts.
- Direct Linking: Link each expense back to the source email in Gmail for easy verification.
Read More
Highlights
- Google Drive backup is now available so your receipts and reports can sync to your own account.
Read More
When you attach a receipt, Expense Reports can automatically choose the best existing report for you.
This is powered by a threshold-based matching algorithm that balances two things:
- Distance: Is this expense near a report's location?
- Recency: Is that report still active enough to reuse?
How report auto-selection works
1) Infer likely cities near your current position
If location is enabled, we find nearby cities from your coordinates and rank them by distance.
2) Evaluate reusable reports with thresholds
For each candidate city, we search for reports that match either:
- Exact city/state/country, or
- Geographic proximity within a configured radius (currently
150 km)
Then we filter those candidates by activity recency (currently 3 days), using the report's latest expense/report timestamp.
3) Pick the best match
From valid candidates, we select the most recently active report.
If no report passes both thresholds, we default to creating a new report and prefill location when available.
Algorithm shape (simplified)
for each inferred city candidate:
reusable reports = locationMatch(report, city, withinKm=150)
active reports = reusable reports with latestActivity >= now - 3 days
if active reports exist:
return mostRecentlyActive(active reports)
return NEW_REPORT
Why this is valuable
- Fewer taps: Most expenses land in the right report automatically.
- Cleaner report grouping: Nearby expenses stay together, even when city names differ slightly.
- Better continuity: Recent in-flight reports are reused, older ones are not.
- Consistent behavior: The same recommendation logic applies across receipt capture flows.
This gives you automation that feels predictable: close in place, close in time, and therefore likely part of the same report.
We're excited to introduce a new way to add expenses to your reports: Gmail Integration. No more manual entry of vendor names and amounts, and no more downloading receipt PDFs just to upload them again.
Features
- Direct Gmail Integration: Connect your Gmail account securely using Google's official sign-in.
- Automated Data Extraction: We automatically parse your emails to find the vendor, total amount, and date.
- Smart Metadata Support: We use Schema.org JSON-LD metadata for precision extraction, and intelligent pattern matching for everything else.
- Automatic Receipt of Expense:
- Visual Snapshots: We capture a PNG image of your email for quick previewing.
- Original Receipts: We attach the original email (.eml) or PDF attachments as permanent records.
- Deep Linking: Each expense includes a direct link back to the original message in your Gmail for easy reference.
Why this matters
Manual expense entry is tedious and error-prone. By connecting directly to your inbox, you can process dozens of receipts in minutes with high accuracy.
Privacy and Security
Your privacy is our priority. Gmail Integration runs entirely in your browser. We only request read-only access to your messages, and your email data is never sent to our servers. Your receipts are stored exactly where you choose—locally or on your own Google Drive.
Why Location Matters for Expense Reports
When you capture a receipt, you're recording a moment and a place. Expense Reports automatically detects your location—with your permission—to pre-fill the city where your expense occurred. This saves you typing and ensures consistent, reliable reporting.
But getting it right matters. We use a well-established algorithm and a robust dataset to identify not just any city, but the three nearest cities to your actual location, ranked by distance.
The User's Choice: Opt-In Location
Location access is opt-in only. When you first open the app, we ask:
"Use my location for nearby cities"
If you say yes, the browser's native Geolocation API reads your approximate coordinates (accurate to ~100 meters in most cases). If you say no or don't answer, you can still type any city manually. Either way, your location never leaves your device—we don't store it.
This approach respects your privacy while unlocking real convenience.
Haversine Distance: The Algorithm
Once we have your coordinates, we use the haversine formula—a method from spherical trigonometry—to calculate the great-circle distance between your position and every known US city.
The haversine formula is ideal because it:
- Accounts for Earth's curvature (not euclidean distance)
- Is numerically stable at all distances
- Runs instantly on mobile hardware
- Is well-tested in navigation and GIS systems
The math:
a = sin²(Δφ/2) + cos(φ1) × cos(φ2) × sin²(Δλ/2)
c = 2 × atan2(√a, √(1−a))
distance = R × c
Where φ is latitude, λ is longitude, and R is Earth's radius (6,371 km).
For your location, we compute distance to all 15,000+ US cities and sort by nearest. The result: three cities appear as suggestions, ordered closest to farthest.
Census Data: Quality & Coverage
The city dataset comes from the US Census Bureau's 2025 Gazetteer:
- 15,000+ cities included
- Population filter: ≥ 5,000 residents (reduces noise, focuses on real towns)
- Coordinates: Precise to ~100 meters (Census-measured)
- Updated annually by the Census Bureau
- Includes all 50 states plus Puerto Rico
We download this data once and store it client-side. It never changes during your session, ensuring fast, predictable queries.
Browser Technologies at Work
Three web APIs power this feature:
1. Geolocation API
navigator.geolocation.getCurrentPosition(
position => {
const { latitude, longitude } = position.coords;
},
error => console.warn('Permission denied')
);
Built into all modern browsers; prompts the user for permission.
2. IndexedDB
The 15,000-city dataset is stored in IndexedDB, the browser's native database. This means:
- Cities load instantly (no server round-trip)
- Works offline
- Survives app restarts
- ~2 MB of storage (negligible)
3. Lazy Loading
The city dataset is only loaded when needed—either when you enable location or manually search for a city. This keeps the app's first load fast.
The User Experience
Here's what happens when you add a receipt:
- You grant location permission (first time only)
- Browser reads your coordinates silently in the background
- Within 300ms, the app computes distances to all 15,000 cities
- Three nearest cities appear as buttons below the form
- One click selects a city; a new report is created with that location
- If no recent report matches that city, the app auto-creates a new one for you
No typing. No menu hunting. One tap.
And if you're offline, or deny location, the manual search still works—start typing "San Fran" and the app finds it instantly from the cached dataset.
Performance & Efficiency
On a typical phone:
- Distance calculation: ~5ms for 15,000 cities
- Sorting: ~2ms
- Total latency: < 20ms
- No network calls (all client-side)
The haversine algorithm is so efficient that even calculating distance to all cities is faster than a typical network request.
Privacy, First
- Your location is read by your device only
- Never sent to our servers
- Deleted at end of session
- Opt-in and revocable at any time
- Reports to other services (cloud sync) use the city name, never coordinates
What's Next
As we expand to other countries, we'll integrate similar government datasets (Statistics Canada, UK ONS, etc.) and apply the same haversine logic. The algorithm scales globally.
For now, Expense Reports finds your three nearest US cities, every time, in under 20 milliseconds—powered by math, browser APIs, and respect for your privacy.
Have feedback on location matching? Send us a note.
We rolled out Google Drive backup so your local expense data can sync to your own Drive account.
Recent updates also improved sync reliability:
- Better handling when Google sessions expire
- Clearer progress feedback in Settings
- Direct links to manage synced files in Google Drive