Inspiration

Under EU Regulation 261/2004, a cancelled or badly delayed flight can mean a fixed payment of €250, €400 or €600. The European Commission's own impact assessment says "only between 5 and 10% of passengers entitled to compensation do actually claim it".

The people who do claim often hand a big share to an agency. AirHelp's fee is "35% of the total Flight Compensation, including applicable VAT". The European Court of Auditors found some agencies asking for up to 50%.

In the US, a cancelled flight means a refund if you don't take the alternative, and airlines have been fined for dragging their feet. The Department of Transportation fined Frontier $2.2 million for failing "to provide timely refunds to tens of thousands of consumers", and Air India $1.4 million over refunds that took more than 100 days.

The rules are public. What people are missing is a plain way to see whether they apply to their own flight.

What it does

1. Your flight. You type where you flew from and to, the airline, where it's licensed, the scheduled times and what happened: cancelled, arrived late, denied boarding, or a schedule change.

2. Three sets of rules, checked one by one.

  • EU Regulation 261/2004: €250, €400 or €600.
  • The UK's retained version: £220, £350 or £520.
  • The US DOT refund rule (14 CFR part 260): your ticket refunded when the airline cancels or significantly changes the flight and you don't accept an alternative.

Each one gets a clear answer: the rule applies, doesn't apply, or can't tell yet, in which case Owed names the one missing fact. It shows the amount the rule sets and quotes the article it relied on, with the source and the date the text was checked.

3. The airline's defence, shown honestly. "Extraordinary circumstances" belongs to the airline to prove, and Owed doesn't decide it. It shows the article, what the EU Court of Justice has said about technical faults and strikes by the airline's own staff, and one plain instruction: ask the airline for its evidence.

4. Your claim, sent by you. A boarding-pass card keeps each flight, with a log of when you sent the claim and what the airline said.

5. Owed Pro (one RevenueCat purchase): the claim letter as a PDF in your name, quoting the articles, plus deadline reminders.

Always free: the check, whether each rule applies, the amount, every quote, the deadline dates and the claim log.

How I built it

  • Flutter for Android and iOS, Dart 3.10. Your flights stay on the phone: no backend, no account, no analytics and no AI in any decision.
  • Rules as data. assets/rules/eu261.json, uk261.json and us260.json hold one row per rule, with the citation, source URL, verbatim quote, check date and any numbers the rule sets. All 49 quotes were checked against saved copies of their sources.
  • Distance. The compensation band depends on great-circle distance. Owed computes it from a bundled OurAirports table of 3,244 airports. London Heathrow to Edinburgh comes out at 534 km.
  • Pure engines for EU and UK compensation (scope, notice periods, the three-hour delay threshold, the distance band and the 50% reduction the airline may apply) and for US refunds (covered flights, significant changes, and the refund deadline in business or calendar days).
  • Tests: 287 unit and widget tests, with a golden test for every case in the spec. A test fails if the engine cites a rule id that isn't in the data, or if a rule row is never used. An integration test runs a full cancelled-flight claim on an emulator.
  • Design: white paper, ink and a single amber, with a boarding-pass card for each flight. Inter Tight for words, DM Mono for airport codes, times and amounts.

How Owed uses RevenueCat

Why one purchase, and not a commission or subscription. An agency's 35% of a €250 claim is €87.50. One purchase at a fraction of that keeps the whole payment with the passenger and covers later trips too. People are disrupted a few times a year at most, so a subscription would bill them in the months nothing goes wrong.

Implementation:

  • Product: owed_pro_lifetime, a non-consumable at $5.99, on the entitlement pro, in the default offering.
  • Paywall: a RevenueCat Paywall, shown with RevenueCatUI.presentPaywallIfNeeded('pro', displayCloseButton: true).
  • Unlocking: a CustomerInfo update listener unlocks Pro the moment a purchase lands.
  • Restore purchases is in Settings.
  • No key: the app runs normally and says purchases aren't set up. The check, the rules and the log still work, and nothing unlocks without a purchase.

Everything goes through a PurchasesGateway interface with a fake for tests.

Challenges I ran into

  • "Can't tell yet" is a real answer. Some flights touch places this version doesn't classify, like US territories, Gibraltar or the Channel Islands. Some long flights to Iceland, Norway or Switzerland can't be placed between €400 and €600 without facts Owed doesn't have. Guessing would be easy and wrong, so Owed names what's missing.
  • Law that isn't law yet. The European Parliament approved a revised EU261 in July 2026. It wasn't in force when I built this, so Owed shows it only as a dated note and the engine ignores it. The US "Refund III" proposal is handled the same way.
  • Business days for refunds. US card refunds are due in 7 business days, skipping federal holidays, while other payment methods get 20 calendar days. Both calendars are covered by tests.

Accomplishments that I'm proud of

  • Every "applies", "doesn't apply" and amount traces back to a quoted article, checked against its source.
  • A passenger can make the claim themselves and keep all of it.
  • It shipped. Owed went live on 4 August 2026 and has passed 1,800 downloads across the App Store and Google Play.

What I learned

  • Where the airline is licensed matters as much as where the plane flies, and most people have never thought about it.
  • Being clear about what the app can't decide makes its answers easier to trust.

What's next

  • EU and UK schedule changes, once the case law is carried properly.
  • Article 9 care (meals and hotels) and US denied-boarding rules.

Built With

Share this project:

Updates

Submission history