Bookings
Calendar view of all bookings for your club.
Loading...
Loading club data...
Payments
Payment history for your club.
Loading...
No past due payments.
| Date | Court | Player | Type | Action |
|---|---|---|---|---|
| {{ formatDate(p.bookingDate) }} | {{ p.courtName }} | {{ p.playerFirstName + ' ' + p.playerLastName }} {{ p.bookingComments ? p.bookingComments.replace(' - playtomic', '') : 'Blocking' }} | Playtomic Match Blocking Event Training Other | Saving... — |
Loading...
No upcoming payments.
| Date | Court | Player | Type | Action |
|---|---|---|---|---|
| {{ formatDate(p.bookingDate) }} | {{ p.courtName }} | {{ p.playerFirstName + ' ' + p.playerLastName }} {{ p.bookingComments ? p.bookingComments.replace(' - playtomic', '') : 'Blocking' }} | Playtomic Match Blocking Event Training Other | Saving... — |
| Day | Cash | Card | Viva | Playtomic | Total | VIPs |
|---|---|---|---|---|---|---|
| {{ row.label }} | {{ row.cash.toFixed(2) }} | {{ row.card.toFixed(2) }} | {{ row.viva.toFixed(2) }} | {{ row.playtomic.toFixed(2) }} | {{ row.total.toFixed(2) }} {{ historyCurrency }} | {{ row.vips }} |
Loading...
No payments found.
| Booking date | Court | Booking | Player | Amount | Type | Marked by | Paid at | Action |
|---|---|---|---|---|---|---|---|---|
| {{ formatDate(p.bookingDate) }} | {{ p.courtName }} | Match Blocking Event Training — | {{ p.playerFirstName + ' ' + p.playerLastName }} {{ p.playerFirstName ? p.playerFirstName + ' ' + p.playerLastName : (p.bookingComments ? p.bookingComments.replace(' - playtomic', '') : '—') }} | {{ p.paymentMethod === 'vip' ? '0.00 ' + (p.currency || 'RON').toUpperCase() : (p.amount ? (p.amount / 100).toFixed(2) + ' ' + (p.currency || '').toUpperCase() : '—') }} | Refund Playtomic Paid 📱 Manual 💵 Manual 💳 VIP 👑 Manual | {{ p.markedBy || '—' }} | {{ formatDate(p.paidAt) }} | Refunding... |
Classes
Trainings per coach for the selected month.
Loading...
No trainings this month.
{{ group.coachName }} — {{ group.count }} training{{ group.count === 1 ? '' : 's' }}
| Date | Court | Students | Comment |
|---|---|---|---|
| {{ formatDate(t.date) }} | {{ t.court?.name || '—' }} | {{ classStudents(t) }} | {{ t.comments || '—' }} |
Players
Players who have bookings at your club.
Edit Player {{ selectedPlayer.lastDevice }} · last seen {{ formatDateShort(selectedPlayer.lastSeenAt) }}
Loading...
{{ playersSearch ? 'No players match your search.' : 'No players found.' }}
| Player {{ sortArrow('name') }} | User ID | Phone | Level | Points {{ sortArrow('points') }} | Type | Matches {{ sortArrow('matchCount') }} | Matches (30d) {{ sortArrow('matchCount30d') }} | Last Active {{ sortArrow('lastPlayed') }} | Device |
|---|---|---|---|---|---|---|---|---|---|
|
{{ (p.firstName?.[0] || '') + (p.lastName?.[0] || '') }}
{{ p.firstName }} {{ p.lastName }}
Male
Female
Unknown
|
{{ p.userId || '—' }} | {{ p.phone || '—' }} | {{ playerLevel(p.points) }} | {{ p.points }} | {{ playerTypeName(p.type) }} | {{ p.matchCount }} | {{ p.matchCount30d }} | {{ formatDateShort(p.lastPlayed) }} | {{ p.lastDevice || '—' }} |
Club Details
Edit your club information and manage courts.
Loading...
Club Images
Courts
Club Prices
Manage court pricing rules.
{{ editingTierKey ? 'Edit Price Tier' : 'Add Price Tier' }}
Loading...
No prices configured yet.
| Courts | Days | Hours | Price / 30 min | Price / hour |
|---|---|---|---|---|
| {{ g.courtIds.map(id => courtName(id)).join(', ') }} | {{ g.days.map(d => dayName(d)).join(', ') }} | {{ formatHour(g.startHour) }} - {{ formatHour(g.endHour) }} | {{ (g.price / 100).toFixed(2) }} {{ clubCurrency }} | {{ (g.price * 2 / 100).toFixed(2) }} {{ clubCurrency }} |
Calendar Colors
Define keyword-based colors for bookings in the calendar. When a booking's comments contain a keyword, it will be displayed in the matching color.
Loading...
{{ colorForm.id ? 'Edit Color' : 'Add Color' }}
| Color | Keyword | Coach | Booking Type | Actions |
|---|---|---|---|---|
|
{{ color.hex }}
|
{{ color.keyword || '—' }} | {{ coachName(color.coachId) }} | {{ matchTypeName(color.matchType) }} |
Send Push Notification
Send a push notification to players at this club.
Filter Recipients
Notification Content
Club Admins
Manage who can access this club's backoffice and mobile-app admin features. Admins must already have a Courtio app account (phone-based).
Add Admin
Loading...
No admins for this club.
| Name | Phone | Role | |
|---|---|---|---|
| {{ ((a.firstName || '') + ' ' + (a.lastName || '')).trim() || '—' }} | {{ a.phone }} |
|
Playtomic Sync
Configure two-way sync with Playtomic for this club.
Loading...
Viva.com Payment Credentials
Leave blank if the club is not yet onboarded at viva.com.
Loading...
Shop
Products, stock and sales for this club. Prices in {{ clubCurrency }}.
Loading...
Add product
| Category | Product | Size | Stock | Sell | Buy | Margin | Image | Action |
|---|---|---|---|---|---|---|---|---|
| {{ p.category }} | {{ (p.sellRON - p.purchaseRON).toFixed(0) }} ({{ p.purchaseRON > 0 ? Math.round(((p.sellRON - p.purchaseRON) / p.purchaseRON) * 100) : 0 }}%) — |
|
No products yet.
Loading...
| Date | Product | Size | Qty | Unit | Margin | Method | Sold by |
|---|---|---|---|---|---|---|---|
| {{ formatDate(s.soldAt) }} | {{ s.productName }} | {{ s.size || '—' }} | {{ s.quantity }} | {{ (s.unitPrice/100).toFixed(2) }} | {{ s.margin != null ? (s.margin/100).toFixed(2) : '—' }} | {{ s.paymentMethod || '—' }} | {{ s.soldBy || '—' }} |
No sales in this period.
Loading...
| Date | Product | Requested by | Phone | Note | Status | Action |
|---|---|---|---|---|---|---|
| {{ formatDate(r.createdAt) }} | {{ r.productName }}{{ r.size ? ' (' + r.size + ')' : '' }} | {{ r.firstName ? r.firstName + ' ' + r.lastName : '—' }} | {{ r.phone || '—' }} | {{ r.note || '—' }} | {{ r.status }} |
No requests.
Logs
Who did what: bookings created/deleted, players joined/left/added/removed, scores.
Loading...
| Time | Who | Action | Target | Booking | Detail |
|---|---|---|---|---|---|
| {{ formatDate(l.createdAt) }} | {{ l.actor || 'System' }} | {{ l.action }} | {{ l.target || '—' }} | #{{ l.bookingId }} · {{ l.court }} · {{ formatDate(l.bookingDate) }} — | {{ l.detail || '' }} |
No logs.
Coaches
Photo and bio for each coach of this club. Coaches are managed in Club Admins; here you set what players see.
Loading...
No coaches for this club. Add coach roles in Club Admins first.
Reports
Occupancy and revenue, aggregated — no per-player data. Prime time = weekdays 18:00–22:00 · Mornings = opening–12:00 · Weekends = Sat+Sun full day. Only elapsed days count, so the current period stays honest.
Loading...
Could not load reports.
{{ reportError }}
| Period | Booked | Avg h/day | Avg h/day/court | Occupancy | Revenue (RON) |
|---|---|---|---|---|---|
| {{ b.label }} | {{ b.bookedHours }}h | {{ b.avgHoursPerDay }}h | {{ b.avgHoursPerCourtPerDay }}h | {{ b.occupancyPct }}% | {{ reportMoney(b.revenueBani) }} |
VIP Memberships
Players with a VIP membership pay nothing for matches in this club. Default = every match free. Morning first = one free match per day, any day of the week (weekends included), starting at or before 15:00 and ending by 16:30.
Add {{ vipTypeTab === 'morning_first' ? 'morning_first' : 'default' }} VIP
{{ vipTypeTab === 'morning_first' ? 'Morning-first' : 'Default' }} members
Loading…
No members in this category.
| Player | Phone | Expires | |
|---|---|---|---|
| {{ m.firstName }} {{ m.lastName }} | {{ m.phone || '—' }} | {{ m.expiresAt || 'never' }} |
Test Login
Logging in with phone +40777999000 and code 123456 will sign in as the player below.
Leave unset to fall back to the default test user.
Loading...