I’ve seen a lot of confusion about mileage documentation requirements, so let me break down what the IRS actually expects - and how Beancount can help you stay audit-proof.
2026 Standard Mileage Rate
The IRS rate for 2026 is 72.5 cents per mile for business use (up from 70 cents in 2025). This is the highest rate ever.
- Medical/moving: 20.5 cents/mile
- Charitable: 14 cents/mile (unchanged since forever)
What the IRS Requires for Mileage Deductions
Per IRS Publication 463, your mileage log must include:
- Date of each trip
- Destination (or business purpose)
- Business purpose of the trip
- Miles driven
- Total miles for the year (business + personal)
- Odometer readings at start and end of year
The last two are what people often forget. You need to prove your business mileage ratio is reasonable.
How Beancount Helps With Compliance
Here’s my recommended structure:
; Annual odometer tracking
2026-01-01 custom "vehicle" "odometer-start" "45,230"
2026-12-31 custom "vehicle" "odometer-end" "57,450"
2026-12-31 custom "vehicle" "total-miles" "12,220"
2026-12-31 custom "vehicle" "business-miles" "8,540"
2026-12-31 custom "vehicle" "business-pct" "69.9%"
; Mileage as commodity for easy summing
2026-01-01 commodity MILE
name: "Business Miles"
2026-01-01 open Expenses:Business:Mileage MILE
The “Contemporaneous Record” Requirement
The IRS loves this word: contemporaneous. It means you record trips when they happen, not months later from memory.
Mileage apps like TripLog and Everlance satisfy this automatically. But if you’re doing manual entry, do it at least weekly.
Good: Importing weekly from your mileage app
Bad: Reconstructing 6 months of trips in March
What Triggers an Audit?
High mileage deductions relative to income raise flags:
- Claiming $15,000 mileage on $30,000 income? Expect questions.
- 95%+ business use on a personal vehicle? Unlikely to hold up.
My Beancount Query for Tax Time
SELECT
year,
SUM(UNITS(position)) as total_miles,
SUM(UNITS(position)) * 0.725 as deduction_value
WHERE account = 'Expenses:Business:Mileage'
GROUP BY year
Questions about specific scenarios? Happy to help!
Great breakdown, Alice! Here are some real examples from my clients:
Client A: Passed an audit
- 18,000 business miles claimed on $45,000 Uber income
- Had TripLog with GPS-verified trips
- Odometer photos monthly (I require this from all gig clients)
- IRS auditor verified a random sample of 20 trips against the app
- No adjustment needed
Client B: Didn’t fare so well
- 22,000 miles claimed, reconstructed from Google Maps “typical route”
- No contemporaneous records
- Claimed 90% business use on family minivan (wife works from home, 2 kids)
- IRS reduced to 50% business use = $7,975 in additional tax + penalties
The lesson: The tracking app is your best friend. It’s not just about convenience - it’s insurance against the IRS.
Pro tip: I have clients take a dashboard photo on the 1st of each month. Store it in Google Photos with automatic date tagging. If audited, you have 12 odometer readings per year, timestamped by Google.
The metadata approach in Beancount is really powerful for this. Here’s how I store trip details:
2026-01-15 * "Business Mileage" "Client meeting downtown"
Expenses:Business:Mileage 28.5 MILE
Equity:MileageTracking -28.5 MILE
purpose: "Quarterly review meeting"
origin: "Home office"
destination: "Client HQ - 123 Main St"
odometer-start: "45230"
odometer-end: "45258.5"
triplog-id: "TL-2026-0115-001"
Then I can query for compliance:
; Verify all trips have required metadata
SELECT
date, narration, number,
META('purpose') as purpose,
META('origin') as origin,
META('destination') as dest
WHERE account = 'Expenses:Business:Mileage'
AND META('purpose') IS NULL
If any trips show up without purpose/origin/destination, I know I need to fix them before filing.
Bonus: The triplog-id field links back to the original app record. If the IRS ever asks about a specific trip, I can pull up the GPS track.
Question about mixed personal/business trips:
I sometimes run a personal errand during a DoorDash shift. Like I’ll do 3 deliveries, stop at the grocery store for myself, then do 2 more deliveries.
How do I handle this?
Do I:
A) Track the whole thing as business since I’m “on the clock”?
B) Stop tracking when I go to the grocery store, restart after?
C) Somehow split the trip?
The tracking app can’t really tell the difference - it just sees me driving. I feel like option A is cheating but option B is really tedious.
Also - what about the drive TO my first delivery and FROM my last delivery? I leave from home and return to home. Is that business or personal?