← All work · 05 / 06
Match-fee payments for the Belgrade FA
FSB Doprinosi
I referee in the Belgrade Football Association. After every match referees pay a fee to the association, and the office used to check the bank statements by hand. I built an app where a referee sees how much to pay and where, and the office sees who has paid.
- 270
- referees imported from the official PDF directory
- 42
- leagues pulled automatically from the FA website
- 212
- matches in the first tracked round
- 264,930
- RSD in fees tracked that round
Video and screens







The problem
The lead referee pays for the whole crew, one payment per match. The amount depends on the league and on how many officials worked. The deadline is the next working day plus two more. The office had no overview of who had paid, so it read bank statements line by line.
What I built
- For referees, on the phone: a list of matches to pay, the exact amount from the fee table, the account number and payment reference with copy buttons, and a receipt upload.
- For the office, on a desktop: the round grouped by league, a queue to check, a list of whom to call after the deadline, and an Excel export.
- Automatic delegations. There was no API key for the national system, so I found that the FA website publishes every match report with the full referee crew. A scraper reads the last round of all 42 leagues, one league per request so it fits Vercel limits.
- Postgres with row-level security. Receipts sit in a private storage bucket. Personal data never goes to git.
Decisions
The first scraper pulled “every new match”. It imported 14 old matches whose deadlines had already expired, and I rejected it. It now pulls only the last played round. Postponed matches are added by hand.
I called the first design “low budget AI UI” and it was rebuilt: light, one typeface, colours from the association’s crest, phone-first for referees and desktop for the office.
Next
An AI check that reads each uploaded receipt (the column is already in the database) and an IPS QR code so referees can pay by scanning.
What I decided
- Every business rule: who pays, deadlines, fee table, which round to import.
- Website, not app: referees open it once a week.
- No national API needed. Use the public match reports.
What the AI did
- Built the Flask app, the Postgres migration and the scraper.
- Imported 270 referees from a PDF.
- Set up Supabase, Vercel and automatic deploys.
Where I corrected it
- Assumed each referee pays their own share. I corrected it: the lead pays for everyone.
- Imported every new match. I limited it to the last round.
- A generic first design. I asked for a full redesign.
Next case study
Lead Finder + dental sites