← Back to QI SI

Case study

Court booking 羽球場預約系統

Live since August 2026

Players check the courts themselves. The operator just confirms.

A booking system for an indoor badminton venue with three courts in New Taipei. Players see which slots are free on the web or in LINE without creating an account, request the ones they want and pay by bank transfer. The operator checks the transfer and confirms with one tap in LINE. We built the public site, the LINE integration and the admin, and kept shipping changes after launch.

We built
Public booking site, LINE Official Account and mini-pages, admin, backend
Used by
Players, no account needed, and the venue operator
Release
Live since August 2026, still shipping
Venue
Three indoor badminton courts, New Taipei
The operator’s schedule: courts A, B and C by hour, showing booked slots with the booker’s name and requests on hold.
The public booking grid on a phone: courts A, B and C by hour, marked available or booked, with two slots selected.
Real screens from the system (Chinese UI): the operator’s schedule and the public booking grid on a phone. Names and bookings are sample data; the venue name is replaced.

What changed for the venue

  1. Before

    “Is court B free on Saturday night?” came in by phone and LINE all day, and the operator searched old records to answer each one.

    Now

    A live grid of courts A, B and C, on the web and in LINE, open to anyone without signing in.

  2. Before

    Every booking was typed up again by hand.

    Now

    The player’s own request, with name, phone and the last five digits of the transfer, becomes the record. The operator checks the bank and confirms.

  3. Before

    Seasonal regulars were marked in week by week.

    Now

    A plan books the whole season in one go, skips clashes and reports them.

  4. Before

    Slots could sit reserved by people who never paid.

    Now

    Unpaid holds release themselves after 24 hours.

How it works

  1. Pick slots across days and courts

    A court-by-time grid shows what’s free. Players tick several slots across dates and courts and send one request; all three courts together count as a whole-venue booking at a fixed price. The public grid only ever says “booked”, never who.

    The public booking grid on a phone: courts A, B and C by hour, marked available or booked, with two slots selected.
    Real interface, sample data.
  2. Confirm from LINE

    Each request reaches the operator in LINE as a card with the court, time, contact and the last five digits of the transfer. Confirm, reject or ask for missing details without opening the admin. Players hear back in LINE when the request arrives and again when it’s confirmed.

    Illustration using the system’s own wording (Chinese UI).
  3. Seasonal plans that renew themselves

    The operator sets up plans by court, weekday and time. Applying one books the whole series and moves sessions that land on a public holiday to the end. Before a season ends, the same slots are held for the regular and they’re asked in LINE whether to renew; with no reply in 14 days, the hold is released.

  4. Change or cancel without a phone call

    Players reschedule or cancel their own bookings under the venue’s policy, and see the refund before they confirm. The operator gets a LINE card to mark the transfer back as done.

    Refund if cancelled

    • 3 days before 100%
    • 2 days before 50%
    • 1 day before or on the day 0%
  5. One place to run the venue

    Pending requests, a schedule that shows who booked and what’s still on hold, history, seasonal plans and admin accounts. A single switch pauses public requests, which made moving bookings over from the old calendar safe.

    The operator’s list of requests on hold, each with confirm and cancel buttons.
    Real interface, sample data.

Shaped by the people using it

After launch we kept shipping in small steps. Almost every change started with something the operator or a player ran into.

  • What came up

    Players typed their phone number into the chat to link their LINE, and many got it wrong.

    What we changed

    Linking moved to a short form inside LINE, with separate menus for linked and unlinked players.

  • What came up

    “My bookings” asked people to log in every single time.

    What we changed

    Rebuilt as a page inside LINE that already knows who you are. No login button.

  • What came up

    Regulars’ slots were taken while the operator waited to hear whether they’d renew.

    What we changed

    The next season is now held for them automatically.

  • What came up

    Players weren’t sure their request had gone through.

    What we changed

    Every kind of request now sends a “request received” message in LINE.

What we built

Vue 3 · TypeScript · Vite

Public booking site

Availability grid, multi-slot requests, prepaid hours, seasonal plans, FAQ and directions. Works without an account.

Messaging API · LINE Login · LIFF

LINE Official Account

A rich menu, chat commands to check a date, your balance or your bookings, five mini-pages inside LINE, and a message at every step.

Vue 3 · Bootstrap 5

Admin

Requests, schedule, history, plans and admin accounts, laid out for one person running a venue.

Laravel 13 · PHP · MySQL

Backend

Prices worked out on the server, holds that expire on schedule, and database locks so two people can never book the same slot.

Small venue, solid engineering

A booking system is only as good as the rules underneath it: no double bookings, the right price, holds that let go on time.

  • 788 automated tests in the backend
  • 96 API endpoints behind the site, the LINE pages and the admin
  • 5 mini-pages inside LINE: book, buy hours, my bookings, link account, applications
  • 4 scheduled jobs, including releasing unpaid holds every five minutes and renewal reminders

Counted in the project repository in October 2026.

Laravel, Vue and LINE were the right tools for a venue whose players already live in LINE. The next product gets its own answer.

Have something that needs to go live?

Tell us what you’re building, where it stands today, and what “done” looks like to you. We’ll take it from there.

support@handyla.co
Studio 1F., No. 39, Sec. 2, Kaifeng St., Wanhua Dist., Taipei City 108, Taiwan