BallBall football booking app: co-developed by VAON, live on both stores in under 4 months

iOS Android API Web App 2026
BallBall football booking app: co-developed by VAON, live on both stores in under 4 months

Project Context

Most amateur football games in Vietnam are still arranged over Zalo (Vietnam's main messaging app) and phone calls: ringing the venue to check a slot, rounding up players, chasing people for their share. BallBall moves that into one app. Players find and book fields, one-off or weekly, form teams, recruit extra players and chat. Field owners run their schedule, pricing and combined pitches in the same system. VAON co-developed BallBall with its founder, Hao Nguyen. He owns the business model and the relationships with field owners. VAON designed the product and built all of the technology: the Flutter app, the Laravel backend, the admin panel and the store releases. The first commit landed on November 25, 2025, and the app went live on the App Store and Google Play in July 2026.

Challenges

1

A 7-a-side pitch is often two 5-a-side pitches joined together, so booking one has to block the other

Many small venues rent the same turf two ways: as two separate 5-a-side pitches, or as one 7-a-side pitch. If the system treats those as three independent pitches, one team can book the 7-a-side at 7 pm while another already holds a 5-a-side at the same hour. The owner finds out when both teams show up.

2

Teams book the same weekly slot for months, then skip a week

Amateur teams often keep a fixed weekly slot for months. Storing every session as its own booking turns a 3-month schedule into about 13 records, and moving the time means editing all of them. Owners also want to approve skipped sessions, because a slot dropped at the last minute is lost revenue.

3

Invite links shared in Zalo and Messenger open a web page instead of the app

Players invite each other mostly through Zalo and Messenger. The in-app browsers in those apps often fail to hand Universal Links (iOS) and App Links (Android) over to the installed app, so a match or team invite opens in a webview. For a new product, every broken invite is a user lost at the first step.

4

Team chat has to arrive in full on patchy 4G at the pitch

Teams message most right before kickoff, while people are on the road or standing at a venue with weak signal. A few seconds offline is enough to drop messages, turn a second tap into a duplicate, or push a notification to someone who already has that conversation open.

5

Vietnamese phone OTP login and user-generated content are both common reasons for store rejection

New users sign in with a one-time code sent by SMS or Zalo to a Vietnamese phone number. An App Store reviewer abroad cannot receive that code, which is exactly the Guideline 2.1 case. Chat, field reviews and public profiles are user-generated content, so Guideline 1.2 requires blocking and reporting.

6

Vietnam moved from three administrative tiers to two while field data and the app still used districts

In 2025 Vietnam merged provinces and abolished the district level. Field addresses, players' home areas and the search filter all had to follow the new units. Meanwhile, app versions already installed on users' phones still called the API with the old structure, and nobody can force every user to update at once.

VAON's Solution

VAON built the full BallBall platform end to end — a combined-pitch booking engine that prevents double-booking, recurring weekly schedules with owner-approved skips, deep links that reliably open the app from Zalo and Messenger, real-time WebSocket chat that survives patchy connections, App Store/Google Play compliance work, and a migration to Vietnam's new administrative units that keeps older app versions working.

Booking & scheduling

Modeled combined pitches with a dedicated link table, where each combined pitch lists the pitches it is made of. A slot check covers the selected pitch and every linked pitch, across one-off bookings, weekly schedules and maintenance windows. New bookings wait for owner confirmation, and a job running every 10 minutes cancels expired ones so the slot opens up again.

Stored each weekly schedule as a single record (weekday, start date, 3-month term) with skipped dates in a separate table. VAON chose this over generating every session up front because changing or ending a schedule touches one row. The trade-off is that availability queries have to expand the dates in code. Players request a skipped week and the owner approves or declines it. The price is copied onto the booking when it is made, so an owner's later price change never rewrites existing bookings.

Pointed share links at a landing page on the BallBall domain rather than straight into the app. The page tries to open the app through the `ballball://` scheme. If the app has not opened after 2.5 seconds, it sends the user to the App Store or Google Play depending on the device. A broken link or deleted item still shows a general page, never a 404.

Reliability & store compliance

Tagged every message with a UUID on the phone before sending, so it appears instantly and is later matched to the server copy. Messages travel over WebSocket (Laravel Reverb). After a reconnect, the app asks the REST API for everything after the last message ID it saw. Before sending a push notification, the server checks whether the recipient is viewing that conversation and skips the push if so.

Set up dedicated reviewer accounts on the backend so Apple and Google reviewers can sign in without a Vietnamese SIM. Before submission, VAON shipped blocking, reporting across 4 content types, admin takedown and account bans, in-app account deletion, and the iOS privacy manifest.

Kept the old and new administrative tables side by side and served the new data under the old field names, so installed app versions kept working. For breaking changes later on, the backend gained a minimum app version check, live since July 22, 2026. It can require an update only when it is really needed.

Key Features

1

Combined-pitch booking that blocks every linked pitch to prevent double-booking

2

Recurring weekly schedules with owner-approved skip requests

3

Deep links that reliably open the app from Zalo and Messenger

4

Real-time team chat over WebSocket that survives patchy 4G

Value Delivered

Under 4 months from first commit to a live app on the App Store and Google Play

5 new builds in the first 3 weeks after the 1.0.0 release

One backend serving 3 roles through 125 API routes, with 38 automated test files

5,399 fields with full coordinates preloaded, so players can find a pitch from day one