Inspiration

In December 2022 Hertz settled claims from 364 people for about $168 million. They said the company had reported their rental cars stolen, and that police detained or arrested them for it. Most rentals never get anywhere near that. What does happen a lot is quieter: a damage bill turns up weeks later with charges the renter has no way to check.

Some of those charges are simply not allowed:

  • New York: loss of use "shall not be recovered from any authorized driver" (Gen. Bus. Law § 396-z(6)(d)).
  • California: "An administrative charge shall not be imposed" when parts and labor come to $100 or less (Civ. Code § 1939.05(d)).

If the company has already charged your card, federal law gives you 60 days from the first statement showing the charge to send a written billing error notice (12 CFR 1026.13(b)(1)). Most people find that out after the 60 days are gone.

What it does

1. At the counter: photos, part by part. You tap a part of a top-down car (front, wheels, left side and so on) and take a photo at pickup, then another at return. Each photo gets a SHA-256 fingerprint when it's saved, so you can later show it hasn't been changed.

2. When the bill arrives: every line, checked. You type in each charge. Walkaround reads it against the law of the state where you picked the car up and gives each line a plain status:

  • Conflicts with the statute
  • Over the cap, by how much
  • Proof needed
  • Within the rules checked
  • Not covered by this app's rules

The exact statute text sits under each line, with a link to the page it came from. The demo bill has three charges for $415.00, and $325.00 of it is in question.

3. If it's on your card: the dispute clock. Walkaround counts down the 60 days for your written notice, then tracks the card issuer's own deadlines: an acknowledgment within 30 days, and a resolution within two billing cycles and never more than 90 days.

4. The paperwork (one RevenueCat purchase):

  • a letter to the rental company that quotes the rules each charge conflicts with;
  • a billing error notice for your card issuer;
  • a photo evidence packet with every photo and its fingerprint;
  • reminders before your deadlines.

Always free: the check against the law, every quote and the card dispute clock.

Coverage: California, New York and Minnesota rental car law, plus the federal credit card billing error rules, which apply in every state. For any other state the app says it has no rules for it, and it doesn't guess.

How I built it

  • Flutter for Android and iOS, Dart 3.10. Storage is on the device with atomic writes. There's no backend, no account and no analytics.
  • Rules as data. assets/rules/rules.json holds 38 rule rows, each with its citation, the exact quote, the source URL and the date it was checked. The engine is pure Dart. Every status it gives carries the rule rows it relied on, so the screen can quote them. No AI makes any decision.
  • Tests: 116 unit and widget tests. A test fails if the code and the rule file drift apart. An integration test drives the whole flow on an emulator, from pickup photos to the unlocked documents.
  • Design: an instrument-panel look with a dark band, cool grey paper and one magenta, in Barlow Semi Condensed with tabular figures so amounts line up.

How Walkaround uses RevenueCat

Why one purchase. People rent a car a few times a year and fight a damage bill maybe once. A subscription would charge them for all the months nothing goes wrong. So the documents are a single non-consumable purchase, offered at the moment a bill needs answering.

Implementation:

  • Product: walkaround_pass, a non-consumable at $6.99, attached to the entitlement documents and sold through the default offering.
  • Paywall: a RevenueCat Paywall, shown with RevenueCatUI.presentPaywallIfNeeded('documents', displayCloseButton: true).
  • Unlocking: Purchases.addCustomerInfoUpdateListener unlocks the documents the moment the entitlement arrives.
  • Restore purchases sits on the Documents screen.
  • Build without a key: the app runs, the check and the clock still work, and the Documents screen says purchases aren't set up. Nothing unlocks by accident.

Screens only talk to a small PurchasesGateway interface, with a fake used in tests. The demo shows a real purchase through RevenueCat's Test Store.

Challenges I ran into

  • The paywall kept falling back to RevenueCat's default template. The server was sending my published paywall, so I decoded it with the Android SDK's own classes on my laptop. That turned up the error: url cannot be null when destination is terms. The Terms and Privacy buttons had no link, and the SDK drops the whole paywall when a button has no URL. I removed those buttons, republished, and checked the result the same way.
  • States disagree about the same charge. New York bans loss of use outright. Minnesota allows it for up to 14 days. California leaves it off the list of things a renter can be charged. The same line on a bill gets a different status depending on where the car was picked up.
  • "Proof needed" is not "wrong". Some charges can be lawful if the company can back them up. Walkaround says what to ask for rather than calling the charge illegal.
  • Overflows that only showed in tests. The countdown label and the rule buttons overflowed in the test font. Wrapping them in Flexible and Expanded fixed it for every text size.

Accomplishments that I'm proud of

  • Every status on a bill line can be traced to a quoted sentence of law, with the source and the date it was checked.
  • The free part is enough to protect someone. The purchase saves them writing the letters.
  • It shipped. Walkaround went live on 28 August 2026 and has passed 500 downloads across the App Store and Google Play.

What I learned

  • The same charge name means different things in different states, so the app has to key its rules to where the car was picked up and not to the charge's name.
  • An honest "not covered" is more useful than a confident guess.

What's next

  • More states, once their statute text is checked at the source.
  • A return-photo guide that shows the pickup photo as a faint overlay, so the angles match.

Built With

  • flutter-local-notifications
  • ios
  • purchases-ui-flutter
  • revenuecat
  • sha-256
Share this project:

Updates

Submission history