Inspiration
Organizing a casual football match with friends sounds simple. In practice, it's a dozen messages to figure out who's actually coming, a reserved pitch going half-used because four people dropped out last minute, and never really knowing the skill level of the group until kickoff. I wanted an app built specifically for that problem — not a group chat repurposed for something it was never designed to do.
What it does
Pitcha lets players create and join public or private football matches (5v5 to 11v11) in about two minutes. Beyond casual play, it includes a full Ranked mode: players form 5-player clubs and compete across 12 real divisions, from District level up to Ligue 1, based on actual match results — wins, losses, and goals scored. Every player has a progression card showing level, XP, division, and Performance League (PL) points. After each match, players vote for MVP and rate each other's reliability, building a fair-play reputation system into the core loop.
Monetization is dual: a consumable "coins" currency (used to organize matches) sold via StoreKit 2, and a Premium subscription (monthly/annual) managed through RevenueCat, unlocking unlimited match creation and faster progression.
How I built it
- iOS app: Swift / SwiftUI, MVVM architecture
- Backend: Firebase (Firestore, Auth, Storage, Cloud Messaging) + Cloud Functions (Node.js) for every operation that touches another user's account — match results, XP/PL distribution, club membership, friend requests — so none of that logic is trusted to the client
- Payments: StoreKit 2 for consumable coins (server-verified via Apple's App Store Server Library, dual Sandbox/Production verification), RevenueCat for the Premium subscription
- Push notifications: Firebase Cloud Messaging, deep-linked to the relevant screen on tap
Challenges I ran into
The hardest part wasn't a single feature — it was the plumbing that makes an economy trustworthy. Early on, critical actions (match results, PL changes, club rosters) were writable directly from the client, which meant a modified app could cheat its way to a higher rank or free currency. I rebuilt that entire layer around Cloud Functions with Firestore transactions, so the client only ever requests an action and the server decides the outcome. Getting Apple's own review sandbox to pass required building a verifier that accepts both Sandbox and Production transactions automatically, since Apple's reviewers always test purchases in Sandbox — even for a production submission.
What I learned
Building a real economy (currency + subscriptions + a competitive ranking system) taught me far more about backend security and transaction integrity than any tutorial — mostly by hitting the exact failure modes tutorials don't cover, then fixing them one at a time.
What's next
Growing the first real community of players, gathering feedback on the Ranked mode's balance, and expanding match formats based on what people actually ask for.
For the HAMM Award
Pitcha runs two complementary revenue streams: a low-friction consumable (coins, from €0.99) that lets any player start organizing matches immediately, and a Premium subscription (monthly/annual via RevenueCat) for players who want unlimited match creation and faster progression. The paywall never blocks playing — only organizing — so free users stay engaged with the core social loop while Premium targets the players most invested in the Ranked mode.
For the RevenueCat Design Award
The player progression card (level, division badge, PL bar) was designed to feel like a collectible trading card rather than a settings screen — look for the division ladder animation and the club roster screens, which reuse the app's own position tags (DEF/MIL/ATT) as a structural design element throughout the UI.
For the Next Gen Award
I am a third-year Computer Science undergraduate at Paris-Saclay University in France, and I am developing Pitcha solo alongside my studies.
Built With
- cloud-functions
- firebase
- firestore
- google-cloud
- node.js
- revenuecat
- storekit2
- swift
- swiftui
- xcode

Log in or sign up for Devpost to join the conversation.