Soccer24: live scores from 1,100+ competitions, right on the lock screen
We designed, built and run Soccer24, a live football app for iOS and Android with widgets, Live Activities and goal alerts in 18 languages. It has 75,685 Google Play installs and a public 4.5★ rating.

Instant results, on a daily request limit
A live scores app lives on the second a goal goes in. The data comes from API-Football, which has a daily request limit, and at first every phone asked for the score on its own, spending part of that limit.
People also want to follow the match without opening the app: on the widget, the lock screen and the iPhone Dynamic Island, and get the goal alert in their own language, without four alerts for the same goal.
Technical decisions, and why
One live snapshot for everyone
A cloud function polls the matches every minute and publishes one snapshot in Firestore that every phone reads. It is only rewritten when something changes: in one sample, 761 of 1,172 polls brought nothing new.
Fewer requests when there is no football
With no live matches, polling slows from every minute to every 2 and then 3 minutes. That stopped the daily API limit from running out.
Flutter, and native where the OS requires it
The app is in Flutter with flutter_bloc. The iPhone widgets and Live Activities are in Swift (WidgetKit and ActivityKit), and the Android widget is in Kotlin.
Alerts without floods
Alerts go out as FCM data messages per match, league and team, combined into one condition so the same goal is never repeated. By default only the top 8 leagues send alerts.
How it runs day to day
- Staged rollouts
- fastlane ships to both stores. On Google Play each release first goes to a share of users: version 2.3.1 to 20%.
- Tests before every upload
- A store-listing check runs before each upload. The project has 61 test files across the app and the functions.
- In each person's language
- Notifications and the rating prompt arrive in the phone's language, in 18 languages.
- A cache that never freezes the score
- Responses are cached, but live data never is: the snapshot expires after 3 minutes and the app asks again.
What it’s built with
- Flutter
- Dart
- flutter_bloc
- Firebase Auth
- Cloud Firestore
- Cloud Functions
- FCM
- Crashlytics
- API-Football
- Swift · WidgetKit · ActivityKit
- Kotlin
- fastlane
What does success look like for your product?
The first call and the proposal are free. The person who will lead your project replies in person.