Help Center

Everything about using and running PlayCircuit — booking, onboarding a venue, hosting events, and platform configuration.

Getting started

Every account has a role, chosen at sign-up, which decides what you can do beyond the shared player features:

  • Customer — book venues, join/host games, find players, join squads, book trainers, register for events.
  • Venue owner — everything a customer can do, plus listing and managing venues (see Onboarding a venue).
  • Trainer — everything a customer can do, plus offering coaching sessions (see Becoming a trainer).

Create an account or log in — note that login uses your email address, not a username.

Booking a venue

  1. Browse or search Venues by name, city, or sport.
  2. Open a venue and pick a court, then choose a date to see that day's available time slots.
  3. Select one or more slots and submit — this creates a pending booking and temporarily locks those slots so nobody else can grab them while you pay.
  4. Complete payment on the booking's pay page. If the platform has real Razorpay keys configured you'll see the normal checkout; otherwise (the default in a fresh dev setup) you'll see a "demo mode" button that simulates a successful payment.
  5. Once paid, the booking is confirmed and the slots move from locked to booked. You can cancel a pending or confirmed booking any time before it happens from My Bookings — cancelling releases the slots back to available.

Onboarding a venue (venue owners)

Register or log in with the Venue owner role — you'll see a + Add Venue button in the top nav. Fill in the venue's name, sports, amenities, address, and opening hours, and you're automatically set as the owner.

Verification gate: a new venue only shows up in the public venue list once an admin marks it is_verified = True from the Django admin — this moderation step is still admin-only.

Once your venue exists, open My Venues → Manage to:

  • Add each bookable court (name, sport, surface type, capacity, base hourly price) and activate/deactivate them.
  • Click Schedule on a court to customize its daily timing instead of using the venue's full opening hours — add one or more time blocks (day, start time, end time, slot length). Gaps between blocks become breaks: e.g. blocks 06:00–12:00, 13:00–16:00, 17:00–23:00 skip a 12–1 lunch and a 4–5 break. Off-grid schedules work the same way: a 9:30–10:30 block plus an 11:00–12:00 block gives exactly those two slots with a 30-minute gap between them. A court with no blocks falls back to the venue's opening/closing hours in flat 60-minute steps.
  • Generate bookable time slots right from the page — pick "days ahead" and click Generate for all active courts, or generate 14 days for a single court with its quick button. It's safe to run repeatedly; existing slots are left untouched.
  • Edit the venue's details at any time.
  • Click Bookings & payments to track every booking made at your venue — customer, court, date/time, status, amount, and the latest payment's status and provider — with filters by status and date range, plus a revenue total for confirmed/completed bookings.

Optionally add pricing rules for weekday/weekend/holiday rate overrides — via admin or /api/v1/courts/pricing-rules/ (no web form for this yet).

The web page only generates slots on demand, though — for a rolling window that never runs dry without a visit, still schedule python manage.py generate_slots --days 14 daily (see Platform configuration).

Becoming a trainer

Register or log in with the Trainer role — you'll see a My Trainer Profile button in the top nav. Fill in your bio, sports you coach, hourly rate, experience, and certifications; you're automatically set as the trainer and can come back to the same page to edit it later.

Add your weekly availability (day + time range) via admin or /api/v1/trainers/availability/ (no web form for this yet). Once your profile exists, you're listed at Trainers and players can book sessions with you.

Sessions start as pending — there's no trainer-side dashboard to confirm/decline a session yet, so for now that's done via admin or the API (updating the booking's status).

Hosting an event or tournament

Any logged-in user can organize an event today — create one via the Django admin or by posting to /api/v1/events/, setting title, sport, venue, dates, registration deadline, entry fee, and max participants.

Optionally add divisions (e.g. Men's Singles, Women's Doubles, Mixed Doubles), each with its own capacity and optional entry-fee override, via admin or /api/v1/events/divisions/.

Players register from the event's page at Events. Once a division (or the event) hits max_participants, new registrants are automatically waitlisted instead of rejected.

Games, squads & finding players

  • Games — host a public or private game, or join one with room left.
  • Squads — start a standing group, post announcements, and let members join/leave. Private squads don't allow self-serve joining — an existing member needs to add people directly for now.
  • Find Players — search by sport, skill level, and city to find people to play with. This is opt-in: it only lists people who've added a sport at My Player Profile — having a customer account alone doesn't make you show up there, and you won't see yourself in your own results.

Payments, wallet & rewards

Booking checkout uses real Razorpay if the platform has keys configured; otherwise it falls back to a "demo mode" simulated payment (the default in a fresh setup) so the flow stays testable without a live payment gateway. Your payment history lives on each booking's detail page, and your running balance is at Wallet.

Reward points, active coupons, and current offers are listed at Rewards, along with membership plans — buying a membership plan isn't wired up as a self-serve checkout yet, so memberships are currently assigned by an admin.

Platform configuration (admins & developers)

Environment variables

Set in .env (see .env.example): SECRET_KEY, DEBUG, database settings, REDIS_URL / CELERY_BROKER_URL, RAZORPAY_KEY_ID / RAZORPAY_KEY_SECRET, SLOT_LOCK_TIMEOUT_MINUTES, and AWS/S3 settings for production.

Admin access

Create one with python manage.py createsuperuser, then sign in at /admin/ — with your email, not username. From there: verify venues and trainers, moderate reviews, and manage coupons, offers, and membership plans.

Note this is a separate permission from the role field: a staff/superuser account (is_staff=True) is what unlocks admin access and the Platform Bookings link in the nav (/reports/bookings/) — a dashboard of every booking and payment across every venue, filterable by venue/status/date with a revenue total. Picking "Admin" as your role at sign-up doesn't grant this by itself (and self-registration blocks that choice anyway).

Keeping bookable slots available

Run python manage.py generate_slots --days 14 daily (a Celery beat entry or a system cron job) so there's always a rolling booking window. See apps/courts/management/commands/generate_slots.py.

Background jobs & realtime chat

Background jobs need Redis running plus celery -A config worker -l info and celery -A config beat -l info. Realtime chat additionally needs an ASGI server for WebSocket support: daphne -b 0.0.0.0 -p 8001 config.asgi:application.

Still stubbed, not yet wired up

  • A periodic task to auto-expire stale pending bookings whose slot lock has lapsed (the model logic exists in apps/bookings/services.py's expire_booking, just not scheduled yet).
  • FCM/SMS/email senders for notifications — the Notification/DeviceToken models are ready, delivery isn't.
  • A Razorpay webhook endpoint (payment verification today is client-driven only).
  • Self-serve event creation, availability, and pricing-rule forms in the web UI (currently admin/API only — venue and trainer profile creation now have web forms, as described above).

FAQ

Selected slots are locked for a configurable window (10 minutes by default, SLOT_LOCK_TIMEOUT_MINUTES) while you complete payment. If payment isn't completed in time, the lock lapses and the slot becomes available again.
New venues need to be verified by an admin before they appear in the public venue list. Ask an admin to verify it from the Django admin.
Yes — cancel it from My Bookings any time before it happens. Slots return to available immediately; refund handling for paid bookings is manual today (via admin), not automatic.
Yes. With no RAZORPAY_KEY_ID/SECRET configured, the payment page automatically switches to a 'demo mode' button that simulates a successful payment and confirms the booking, without calling the real Razorpay API.
The login field expects your email address, not a username — the User model's USERNAME_FIELD is 'email'.