Client work

The Problem
A parent club can have a dozen young players out on loan at any time, and they are the most valuable assets it owns. Once a player leaves, the club loses sight of him. Minutes played arrive through a WhatsApp message from an agent, or a scout who happened to be at the ground. Training load, injuries and how he actually looked are anyone's guess until he comes back.
The money makes it sharper. Loan agreements carry clauses: a number of starts before a date, a minimum of appearances over fifteen minutes, a games-played threshold that triggers a payment. Under the SFA Cooperation System there is a standard obligation of five appearances of fifteen minutes before 31 March. Miss one of those windows and a club can lose a fee it had already counted on, having had no visibility that it was slipping.

The Solution
Loanee puts the loan itself at the centre rather than the player record. Every agreement carries its clauses, each with a metric, a threshold, a window and a consequence, and the platform projects the pace needed to hit them. A clause is not simply met or missed: it is met, on track, at risk, missed or pending, recalculated nightly, so a loans manager sees a target slipping in November rather than discovering it in March.
The data arrives from the club that actually has the player. Loan clubs join free by invitation and submit appearances, attendance, GPS sessions, injuries and reports through a job that takes under a minute on a phone. That is the part no market data provider can replicate: commercial feeds do not meaningfully cover Scottish League One and Two, the Highland and Lowland leagues, or part-time football, which is exactly where these players go.

What the platform does
Clauses that project, not just record
Each loan carries its negotiated terms as structured data, evaluated against real appearances every night. The Cooperation System obligation is added automatically when a loan is set up as a cooperation arrangement.
- Metric, threshold, window and consequence per clause
- Met, on track, at risk, missed or pending
- Pace projection against games remaining
- Value at risk shown in money, not just counts
- Deduplicated alerts, so one problem is one notification

Two club types, one database
Parent clubs and loan clubs use the same platform with entirely different access. Permission is a role matrix crossed with the relationship: a loan club can only reach a player through an active loan linking the two organisations, and only in the modules it submits to.
- Shared-schema multi-tenancy with an active organisation on the token
- One person, several clubs, switched without signing out
- Submit-level modules for the hosting club
- Clauses, reports and baselines stay parent-only
Data from whoever has the player
The hosting club supplies what only it can see. GPS imports accept any vendor's CSV, with headers matched fuzzily rather than requiring a fixed template, because every sports science department exports something different.
- Appearances, minutes and starts
- Training attendance
- GPS sessions from any vendor export
- Injuries and return-to-play status
- Match reports from the coach who watched the game

Video without a storage bill
Clips are usually links, to YouTube, Vimeo, Veo, Hudl, Wyscout or InStat, embedded with a start and end where the provider allows it. Uploads go through a storage adapter, local for self-hosting or Cloudflare Stream for signed playback at a few pounds per thousand clips.
- Link or upload, per clip
- Signed, range-capable streaming
- Visibility per clip: parent, loan club or passport
A view of form that survives a change of staff
Match reports are scored against the same attributes every time, by whoever actually watched the game. A structured record beats a coach's recollection eighteen months later, when the staff who saw the player have moved on.
- The same attributes, every report
- Written by the person at the ground
- Trend across a season rather than one opinion

A report the sporting director reads
One export, assembled from what the platform already holds: minutes, clause status, attribute movement and the fixtures behind it. Board papers stop being a job somebody does by hand on a Sunday.
- Generated from the record, not re-typed
- Clause status and value at risk included
- Ready to circulate before a board meeting

And more
Everything else it needed
Player passport
A record that travels with the player rather than sitting in one club's system.
Nightly compliance run
One scheduled job re-evaluates every clause and raises only what changed.
Invitation only
No public registration. Accounts are created for named staff at named clubs.
Per-loanee billing
Parent clubs pay for the players they actually have out, through Stripe. Hosting clubs never pay.
Under the bonnet
How it was built
Front end
- Vue 3
- Vite
- Pinia
- Vue Router
- Chart.js
API
- PHP 8
- PDO
- JWT authentication
- Hand-rolled router and controllers
Data
- MySQL, shared-schema multi-tenancy
- Versioned SQL migrations
- Compliance and access services
Platform
- Stripe billing
- Cloudflare Stream
- Nightly scheduled checks
Your most valuable future assets play for somebody else on Saturday.
Services provided
- Product strategy
- UX and UI design
- Vue 3 application
- PHP 8 API and data model
- Compliance engine
- Stripe billing
Next project
Got something like this in mind?
We build products end to end: discovery, design, engineering and the AI that makes them worth using. Tell us what you are trying to solve.