Play · Improve · Connect

Get on court.
Get better.
Get CourtUp.

Sydney's badminton community. Find casual play, get coached, meet players who love the sport — all in one place.

Group coaching for:
🏸
Adult beginners
18+ · $45 · Weekends
🎯
Adult intermediate
Available now · Weekends
Adult advanced
Coming soon · Notify me →
1 Sydney venue
Sessions available
Players joined
V
🏸 Sessions
📍 Venues
All
Beginner
Saturday
Sunday
Roketto Badminton
Saturday · 7:00 AM · Court 1
$45
Beginner
P
J
+2
2 spots left
Roketto Badminton
Saturday · 9:00 AM · Court 2
$45
Beginner
A
S
T
+1
1 spot left
Roketto Badminton
Sunday · 8:00 AM · Court 2
$45
Beginner
R
+3
3 spots left
Spot booked!
Players this week
127 🏸

Three steps to
your next game

No phone calls. No group chats. No guessing who's at what level.

01
🔍
Browse sessions

Filter by suburb, skill level, age range, and time. Every session shows real availability — no surprises.

02
👥
See who's playing

Know exactly how many players have already booked and how many spots are left before you commit.

03
Book & pay instantly

Secure your spot with a single tap. Payment handled securely. Confirmation sent straight to your phone.

Find your session

Our home court

Currently running adult beginner coaching sessions at Roketto Badminton, 22 Carter St Lidcombe NSW 2141. More venues coming soon.

🏸
Roketto Badminton
Sessions available
Players joined
Per person
View sessions →
📍
Your venue here?
Partner with GetCourtUp to fill your courts with motivated players.
Get in touch →

Learn from coaches who live the sport

Vishal Singh Lather
Head Coach

National-level badminton player and coach with years of experience at Roketto and the National Badminton Centre. Passionate about helping adults discover badminton in a fun, supportive environment.

🏆
National titles
India
🏸
NSW state players
Developed
📍
Roketto & NBC
Experience
Book a session with Vishal Singh Lather →
Watch Vishal Singh Lather in action

Ready to find your community?

Join hundreds of Sydney players already booking through GetCourtUp.

Find a session now →
✓ Spot booked! See you on the court 🏸
else { btn.style.background = 'white'; btn.style.color = 'var(--text-mid)'; btn.style.borderColor = 'var(--border)'; } } }); // Update prices const session = platform.platformSessions.find(s => s.id === platform.bookingSessionId); if (!session) return; const basePrice = session.price; const totalBase = basePrice * qty; let discount = 0; if (qty === 5) discount = 0.05; if (qty === 10) discount = 0.10; const finalPrice = Math.round(totalBase * (1 - discount)); document.getElementById('bookModalPrice').textContent = '$' + finalPrice; if (qty > 1) { document.getElementById('bulkQtyLabel').textContent = '(' + qty + ' sessions)'; document.getElementById('bulkOriginalPrice').textContent = '$' + totalBase; document.getElementById('bulkOriginalPrice').style.display = 'block'; // Show date range for bulk bookings const dateInfo = document.getElementById('bulkDateInfo'); const dateRange = document.getElementById('bulkDateRange'); if (dateInfo && dateRange) { // Parse the date properly let sessionDate; if (session.startsAt) { sessionDate = new Date(session.startsAt); } else if (session.date) { sessionDate = new Date(session.date); } else { // Fallback to today if no date sessionDate = new Date(); } const dayOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][sessionDate.getDay()]; const startDateStr = sessionDate.toLocaleDateString('en-AU', { day: 'numeric', month: 'short' }); // Calculate end date (qty weeks from start) const endDate = new Date(sessionDate); endDate.setDate(endDate.getDate() + ((qty - 1) * 7)); const endDateStr = endDate.toLocaleDateString('en-AU', { day: 'numeric', month: 'short', year: 'numeric' }); dateRange.textContent = `Next ${qty} ${dayOfWeek}s from ${startDateStr} to ${endDateStr}`; dateInfo.style.display = 'block'; } } else { document.getElementById('bulkQtyLabel').textContent = ''; document.getElementById('bulkOriginalPrice').style.display = 'none'; // Hide date info for single session const dateInfo = document.getElementById('bulkDateInfo'); if (dateInfo) dateInfo.style.display = 'none'; } } catch (e) { console.error('Error opening player profile:', e); showAppToast('Error opening profile'); } } = await sb.from('users').update({ name, phone, gender: gender || null, dob: dob || null, emergency_contact_name: emergencyName || null, emergency_contact_phone: emergencyPhone || null, medical_notes: medicalNotes || null }).eq('id', platform.currentUser.id); if (error) throw error; // Update local state platform.currentUser.name = name; platform.currentUser.phone = phone; platform.currentUser.gender = gender; platform.currentUser.dob = dob; platform.currentUser.emergencyName = emergencyName; platform.currentUser.emergencyPhone = emergencyPhone; platform.currentUser.medicalNotes = medicalNotes; // Update display document.getElementById('appUserName').textContent = name.split(' ')[0]; document.getElementById('profileSuccess').style.display = 'block'; showAppToast('✓ Profile updated!'); setTimeout(() => { document.getElementById('profileSuccess').style.display = 'none'; }, 2000); } catch (e) { console.error('Profile update error:', e); showAppToast('Failed to update profile'); } } let currentRatingSessionId = null; let currentRatingValue = 0; function openRatingModal(sessionId) { const session = platform.platformSessions.find(s => s.id === sessionId); if (!session) return; currentRatingSessionId = sessionId; currentRatingValue = 0; document.getElementById('ratingSessionInfo').textContent = `${session.venue} · ${formatSessionDate(session.startsAt, session.date)} · ${session.time}`; document.getElementById('ratingComment').value = ''; document.getElementById('ratingSuccess').style.display = 'none'; document.getElementById('ratingBtn').style.display = 'block'; // Reset stars document.querySelectorAll('#starRating .star').forEach(s => { s.textContent = '☆'; s.style.color = '#888'; }); document.getElementById('ratingModal').classList.add('open'); } function closeRatingModal() { document.getElementById('ratingModal').classList.remove('open'); } function setRating(stars) { currentRatingValue = stars; const starElements = document.querySelectorAll('#starRating .star'); starElements.forEach((star, i) => { if (i < stars) { star.textContent = '★'; star.style.color = '#FFB800'; } else { star.textContent = '☆'; star.style.color = '#888'; } }); } async function submitRating() { if (currentRatingValue === 0) { showAppToast('Please select a star rating'); return; } const comment = document.getElementById('ratingComment').value.trim(); // Save rating to Supabase try { await sb.from('ratings').insert({ session_id: currentRatingSessionId, user_id: platform.currentUser.id, rating: currentRatingValue, comment: comment || null }); document.getElementById('ratingSuccess').style.display = 'block'; document.getElementById('ratingBtn').style.display = 'none'; setTimeout(() => { closeRatingModal(); }, 1500); showAppToast('✓ Rating submitted!'); } catch (e) { console.error('Rating error:', e); showAppToast('Failed to submit rating'); } } async function renderUsersTab() { const { data: users, error } = await sb.from('users').select('*').order('created_at', { ascending: false }); if (error || !users) { document.getElementById('usersTable').innerHTML = '

Failed to load users

'; return; } document.getElementById('usersTable').innerHTML = `
${users.map(u => ` `).join('')}
Name Email Phone Role Joined Status Actions
${u.name || 'Unknown'} ${u.email} ${u.phone || '-'} ${u.role || 'player'} ${new Date(u.created_at).toLocaleDateString('en-AU')} ${u.blocked ? 'Blocked' : 'Active'} ${u.role !== 'manager' ? ` ${!u.blocked ? `` : ''} ` : 'Manager'}
`; } async function blockUser(userId) { if (!confirm('Block this user? They will not be able to log in.')) return; const { error } = await sb.from('users').update({ blocked: true }).eq('id', userId); if (error) { showAppToast('Failed to block user'); return; } showAppToast('✓ User blocked'); renderUsersTab(); } async function unblockUser(userId) { const { error } = await sb.from('users').update({ blocked: false }).eq('id', userId); if (error) { showAppToast('Failed to unblock user'); return; } showAppToast('✓ User unblocked'); renderUsersTab(); } async function deleteUser(userId) { if (!confirm('Permanently delete this user and all their bookings? This cannot be undone.')) return; // Delete user's bookings first await sb.from('bookings').delete().eq('user_id', userId); // Delete user const { error } = await sb.from('users').delete().eq('id', userId); if (error) { showAppToast('Failed to delete user'); return; } showAppToast('✓ User deleted'); renderUsersTab(); } function copyPayIdRef() { const ref = document.getElementById('payIdRef').textContent; navigator.clipboard.writeText(ref).then(() => { showAppToast('✓ Reference copied!'); }).catch(err => { console.error('Copy failed:', err); showAppToast('Copy failed - please select and copy manually'); }); }

Who are you?

Hi there 👋

Find your next session at Roketto Badminton, Lidcombe.

Manager dashboard

Manage sessions, view bookings, track growth.

Coach profile preview
Vishal Singh Lather
Loading...

All sessions

All bookings

Registered players

Confirm booking

💰 BULK BOOKING DISCOUNTS
Book multiple sessions and save!
Total
$45

Add session

Create a new coaching session.

For social sessions, this is the optional host. Leave as-is or change.

Edit coach videos

Paste YouTube links (regular or Shorts). These appear on your public profile page.

💡 Works with any YouTube link format:
youtube.com/watch?v=abc or youtube.com/shorts/abc or youtu.be/abc

Edit coach profile

This appears on the public landing page under "Your coach".

JPG, PNG or WebP. Square photos work best.
🎯

Intermediate coaching

We're building this programme now. Drop your email and you'll be the first to know — and first to book.

Spot reserved!

Action needed
Pay via PayID to confirm
PayID
Account name
Amount
Reference
Please include the reference in the payment description so Vishal Singh Lather can match your payment.
Session details
Court:
Address: 22 Carter St, Lidcombe NSW 2141
Bring: Racket, water bottle, non-marking shoes

Cancel booking?

You'll be refunded
$0
0% refund
Cancellation policy
• 48+ hours before → Full refund
• 24–48 hours before → 50% refund
• Less than 24 hours → No refund
💬

Need help?

Send Vishal Singh Lather a message and he'll get back to you soon.

Or email directly: getcourtupbookings@gmail.com

Your profile

Update your personal information

Email cannot be changed

Rate this session