Overview
Use this workflow to publish reliable games and practices, then launch game-day tools from the schedule.
You will use:
edit-schedule.htmlto create and manage events.game-plan.htmlto prepare lineups.team.htmlandcalendar.htmlto review, share, and export.live-game.htmlfor live viewing and replay access.
In This Article
- Set up schedule inputs and external calendar links.
- Add games with key details, assignments, and stat config.
- Add one-time or recurring practices.
- Edit one date or an entire recurring series safely.
- Launch planning, tracking, command center, and live tools.
- Share live links and find replay/report links.
- Verify availability visibility and export
.icsfiles. - Subscribe to live calendar feeds (private team feed and public games feed).
- Use the draft slot generator for organization-level scheduling.
- Preview registration schedule imports before applying.
Who Is This For
- Coach: Publish weekly events, prep upcoming games, and launch tracking quickly.
- Admin: Maintain calendar feeds, clean recurring data, and keep schedule quality high.
Prerequisites
- Your team is created and accessible.
- You are signed in with coach/admin manage access for that team.
- Roster and game details are ready (date, time, location, opponent).
- If importing calendars, you have valid
.icsURLs.
Choose Your Path
- Build or update the full schedule: start at Step 1 and continue through Step 7.
- Import from another calendar: complete Step 2, then Step 7 for any games you need to track.
- Prepare game execution: use Step 8 and Step 9.
- Share live or replay access with families: use Step 10.
- Validate final visibility, personal calendar sync, and export views: use Step 11.
- Subscribe to a live calendar feed: use Sync Calendar from the schedule page or export the private HTTPS feed URL.
- Share a public games feed with fans: use the Fan Feed option (only for public/shareable games).
- Generate organization draft slots: open organization scheduling and use the Draft Generator tab.
Step-by-Step Workflow
-
Open
edit-schedule.htmlfor the correct team.Start in
All Upcoming. Confirm the team name before you edit. -
Add or verify external calendars in Calendar Links.
Select
+ Add Calendar, paste a valid.icsURL, and save.Coach focus: add feeds you rely on.
Admin focus: remove outdated feeds and keep trusted sources.
-
Add games in the Game tab.
Enter
Date & Time,Opponent,Location, andHome/Away.Add useful optional data:
Kit Color,Season Label,Competition Type,Arrival Time, notes, and assignments.Select the stat config you plan to use, then save.
Stat tracker config selection: When a game is saved, a
statTrackerConfigIdis assigned to it. This ID controls which sport and column layout the tracker uses. For basketball games (those whose config hasbaseType: Basketball), when you select Track at game time you are prompted to choose a tracker mode: Standard (routes totrack.html), Beta (routes totrack-basketball.html, the basketball-optimized mobile tracker), Live Broadcast Tracker (full stats plus broadcast), or Photo Score Sheet (stat import via photo analysis). For non-basketball configs the mode chooser is skipped and the game always opens intrack.html.Live status persistence: After a game goes live its
liveStatusfield is written to Firestore and persists when the schedule editor reloads. The Live Now and Watch Replay labels appear correctly on schedule and team cards because they read directly from the savedliveStatusvalue — no manual refresh is needed after a game transitions from live to completed.Score sheet upload: After a game is complete, coaches and admins can upload a score sheet image from the game's action menu. The photo is analyzed by AI and the parsed stats are previewed before being imported. The upload button re-enables after a prior sheet is removed, so you can replace an incorrect upload without reloading the page.
-
Add practices in the Practice tab.
Set title, start/end, location, and notes.
For recurring practices, set frequency, interval, days, and end rule (
Never,On date, orAfter occurrences). -
Review the schedule list before launch.
Use
Show Practicesand filter chips:All Upcoming,Upcoming Games,Upcoming Practices,Past Events.Confirm events appear in the right place.
-
Manage recurring changes safely.
For recurring practices, open Manage and choose the correct scope:
Edit this date,Edit entire series,Cancel this date, orCancel entire series.If a one-date override is no longer needed, use
Revert to Series. -
Convert imported game events to tracked games when needed.
On calendar-sourced games, select
Trackto create a scheduled game record.Do this before full tracking and availability workflows.
-
Build the pregame plan from schedule.
Open
Game Planfor that game (game-plan.html).Choose formation, set periods and sub times, build lineups, and save.
Coach focus: lineup balance and substitutions.
Admin focus: verify game selection and detail alignment.
-
Launch game-day execution from schedule actions.
Use
Trackfor stat tracking.For basketball configs, choose a mode:
Standard,Beta,Live Broadcast Tracker, orPhoto Score Sheet.Use
Command Centerfor game-day operations. -
Launch live watch and sharing.
Use
View LiveorLive Nowto openlive-game.html.Use
Shareon schedule or team cards to send the live watch link.After the game, use
Watch ReplayorReportlinks. -
Validate visibility and export.
In
team.html, review list and calendar views and check live/replay/report links.Use Sync Calendar near the schedule export actions to subscribe through Apple Calendar, open the Google Calendar add-calendar flow, or copy the private HTTPS subscription link.
Use the existing
.icsexport when you need a one-time static schedule file.In
calendar.html, use filters (view, range, type, team), verify availability status, and export.icswhen needed.
Private Team Calendar Feed
The private team calendar feed is a Firebase HTTPS endpoint that serves a token-authorized ICS calendar file. Unlike a one-time export, this is a live subscription — Apple Calendar, Google Calendar, or any ICS-compatible app can subscribe to the URL and receive automatic updates as events are added, changed, or canceled.
- On the schedule page or
calendar.html, click Sync Calendar next to the ICS export button. - The Sync Calendar dialog opens with three options: Apple Calendar (opens the URL directly in Calendar on Mac or iOS), Google Calendar (opens Google Calendar's "Add by URL" subscription flow), and Copy Link (copies the private HTTPS URL to your clipboard).
- The URL is token-authorized — it encodes a stable SHA-256 token that verifies your team membership. Do not share this URL publicly; it grants read access to your team's full schedule including practices, notes, and arrival times.
- What's included in the feed: all games and practices with location, arrival time (if set), event notes, and cancellation status. Canceled events appear with
STATUS:CANCELLEDso subscribers' calendars update correctly instead of showing stale events. - Stable event UIDs: each event has a consistent Firestore-based UID so edits to existing events sync correctly to subscribing calendars rather than creating duplicate entries.
- Token security: revoked or expired tokens are rejected at the feed endpoint. Membership visibility checks run on every request — if you lose team access, your feed subscription stops returning data automatically. There is no separate per-URL revoke action; access is tied to team membership.
Because the feed reads live Firestore data on every sync, updates appear in your calendar app the next time it polls the URL. Apple Calendar polls every 24 hours by default; you can force a refresh by right-clicking the calendar and choosing Refresh, or reduce the sync interval in Calendar Preferences.
Public Fan Games Feed
The public fan feed (publicTeamGamesIcs Firebase Function) serves a read-only, games-only ICS calendar for public teams or explicitly shareable games. It is designed for distribution to fans, league websites, and club newsletters without exposing any private team data.
- Who can see it: Anyone with the link. No token or login is required.
- What's included: Games only — date, time, opponent, location, and home/away designation. Practices, private events, RSVP data, player assignments, officiating slots, and notes are never included in this feed.
- When it appears in the UI: The Fan Feed option is shown in the schedule and calendar export area only when the team is set to Public (visible in Browse Teams) or when individual games are explicitly marked as shareable. If the team is private and no games are shareable, the Fan Feed option is hidden.
- Stable UIDs: The same Firestore-based UID scheme is used as in the private feed, so fan calendar subscriptions update correctly when game details change rather than creating duplicate entries.
- Use case: Share the fan feed URL with your league website, club newsletter, local sports calendar aggregator, or any public venue that wants live schedule updates without requiring team membership.
- How to get the URL: Find the Fan Feed option in the schedule or calendar export area. Copy the URL and distribute it freely — it carries no private data.
ICS Export Details
The one-time ICS export and the live calendar feeds all use the same event time logic, but behave differently after the export point.
- Actual end times: ICS exports now use the actual
endTimefield from the event record when it is set. This was a recent fix — previously, exports used type-specific defaults regardless of the saved end time. - Fallback defaults: If no end time is set on an event, the export applies a type-specific fallback: 1 hour for practices and 2 hours for games. These defaults produce reasonable calendar blocks when end times have not been entered.
- One-time export vs. live subscription: A one-time export downloads a static
.icsfile reflecting the schedule at that moment. It will not update if events change after you download it. A live subscription (private feed or fan feed) reads current Firestore data on each calendar app sync and stays current throughout the season. For season-long calendar sync, prefer a live subscription over repeated one-time exports. - Re-export if times look wrong: If a previously exported file shows incorrect end times, re-export. The export now uses actual event end times with type-specific defaults as the fallback. The fix is applied on every new export — no data migration is needed.
Organization Scheduling (Extended)
Organization-level scheduling is used by platform admins or organization-level users — not team-level coaches. It allows league operators to build a full season grid and publish game slots to individual team schedules in a controlled, reviewable flow.
Who accesses organization scheduling
Platform admins and organization-level users can load all active teams in the organization schedule editor. Team-level coaches do not have access to the org scheduling view — they only see their own team's published events.
Draft slot generator — full flow
- Open organization scheduling and select the Draft Generator tab.
- Select participating teams — you can select all active teams or a targeted subset.
- Set the season start and end dates to define the scheduling window.
- Configure venue availability windows: which days of the week and time ranges the venue is available for games.
- Enter organization blackout dates (holidays, league-wide breaks) and venue blackout dates (maintenance closures, other events booked at the venue).
- Set the default game duration. This is used for slot spacing and for ICS export of published events.
- The generator runs locally in the browser and produces a draft grid of candidate slots. No data is written yet.
- Review the preview before saving. The preview shows: total slots generated, which teams are unassigned (when the number of teams exceeds available slots), conflict count (slots that overlap with blackout windows), and slot count per team.
- Edit the draft: manually add, remove, or edit individual slots in the grid before saving. Assign teams to slots by drag or direct selection.
- Save the draft locally — the draft is stored in the organization scheduling context but NOT published to individual team schedules. Teams cannot see draft slots until you explicitly publish.
Publishing organization draft slots
Publishing is a separate, explicit action. When publishing, you choose which team schedules to push the draft slots to — you can publish all at once or target a subset of teams. When a shared matchup is published, if the away-team mirror write fails the home-team game write is rolled back and the failure is surfaced to the user so they can retry. Previously, mirror write errors were silently swallowed. Stat config isolation is maintained: team-scoped statTrackerConfigId values are not copied into shared schedule payloads for opponent teams — each team's stat config remains independent.
Bulk import
- Download the CSV template from the org scheduling import panel.
- Fill in team assignments, dates, times, and locations in the template.
- Upload the completed CSV. A validation preview shows row status for each row: Valid, Invalid format, Duplicate, or Conflict.
- Import only non-conflicting, valid rows. Conflict and invalid rows are excluded automatically.
Progressive tournament fields
Tournament slot editing shows relevant fields based on the source type selected. Fixed team shows only the Team name field by default. Home/Away shows additional assignment fields for both sides. When you re-open an edit, the correct visible field group is restored based on the saved source type — you will not need to re-select the type to see the right fields.
Registration Schedule Import (Extended)
The registration schedule import pulls scheduled events (games, practices) from the connected registration provider (such as Sports Connect) and previews them before any changes are applied to your local schedule. No events are created or modified until you explicitly confirm the import.
The preview
Each row in the import preview shows: date and time, event type (game or practice), opponent name or event title, location, and import status. Status values:
- Add: A new event that does not exist locally. It will be created on import.
- Update: Matches an existing local event but has field-level differences. The existing event will be updated with provider values.
- Unchanged: Matches an existing local event exactly. No action will be taken — the row is shown for visibility only.
- Conflict: Detected as a likely duplicate based on date, time, and opponent/title closeness. Conflict rows are flagged and excluded from import by default — they cannot be selected for import.
Conflict detection
A "likely duplicate" is detected when the date, time, and opponent or title closely match an existing local event. Conflicts are automatically excluded — you cannot accidentally import a duplicate through normal import flow. If you believe a conflict is not a real duplicate, edit the existing local event first to remove the conflicting detail, then re-run the import preview.
Partial import and row selection
Use the row checkboxes in the preview to deselect specific Add or Update rows you want to skip. Only checked rows are included in the import. Conflict rows have their checkboxes disabled — they cannot be selected regardless of user action.
Metadata and audit
Registration source metadata is stored on every imported event: provider name, external event ID, and import timestamp. This information is preserved for audit purposes and is visible in the event's admin detail view. After import, events appear in your schedule normally and can be edited in edit-schedule.html — registration metadata is preserved through edits but all event fields remain editable.
Calendar Feeds and Sync
ALL PLAYS provides multiple calendar feed types for different audiences.
- Private team feed: Token-authorized HTTPS ICS feed. Includes games and practices with location, notes, arrival time, and cancellation status. Subscribe via Apple Calendar, Google Calendar, or copy the link from the Sync Calendar dialog.
- Public games feed (Fan Feed): Read-only, games-only ICS feed for public teams or explicitly shareable games. Excludes practices, private events, RSVP data, and assignments. The Fan Feed option appears in the schedule UI only when visibility allows it.
- One-time ICS export: Still available for a point-in-time snapshot.
ICS exports now use actual event end times. Falls back to type-specific defaults (1 hour for practices, 2 hours for games) when no end time is set.
Organization Draft Slot Generator
For league/organization admins managing multiple teams, the draft slot generator builds a full season slot grid before publishing to individual team schedules.
- Open organization scheduling and select the Draft Generator tab.
- Select teams, season start/end dates, venue availability windows, blackout dates (organization and venue), and game duration.
- Review the generated draft: conflicts, unassigned teams, and slot counts are shown before saving.
- Edit or remove individual draft slots manually as needed.
- Save draft locally — slots are not published to team schedules until explicitly published.
Common Questions
- When should I import a calendar vs add games manually?
Import for bulk visibility. Add manually when you need full game metadata and immediate tracking readiness.
- Why can’t I respond to availability on some events?
Calendar-only events must be tracked into the schedule first.
- How do I avoid breaking a recurring practice series?
Choose the action scope carefully: one date or entire series.
- Which basketball tracker mode should I use?
Standard for basic flow, Beta for advanced flow, Live Broadcast Tracker for broadcast mode, and Photo Score Sheet for sheet-first entry.
- What is the fastest way to share with families?
Use Share from schedule or team cards. Use Sync Calendar on the team schedule when families want a live personal calendar subscription instead of a one-time file export.
- How do I subscribe to the team calendar (not just export)?
Use Sync Calendar beside the ICS export button. Choose Apple Calendar, Google Calendar, or copy the private HTTPS feed URL for a live subscription that stays current as events change.
- Who can see the Fan Feed?
The Fan Feed is public — anyone with the link can subscribe. It only includes games from public teams or games marked as shareable. Practices, private events, and RSVP data are never included.
- How often does the private calendar feed update?
The private feed reads live Firestore data on every request, so its content is always current. Updates appear in your calendar app the next time the app polls the subscription URL. Apple Calendar polls every 24 hours by default; Google Calendar typically polls every 24 hours as well. Force a manual refresh in Apple Calendar by right-clicking the subscribed calendar and choosing Refresh.
- Can I revoke a calendar feed subscription?
The private feed URL is token-authorized and tied to team membership. If a user's team membership is revoked, the feed immediately stops returning data on the next sync — there is no separate per-URL revoke action. For complete removal, the user should also delete the subscribed calendar from their calendar app to stop future sync attempts.
- What if an imported game has the wrong opponent name?
Edit the game in edit-schedule.html after import. Registration source metadata (provider name, external event ID, import timestamp) is preserved on the event record for audit purposes, but all event fields — including opponent name, date, time, and location — are fully editable after import.
- Can I bulk-publish organization draft slots to specific teams only?
Yes. When publishing from the organization draft, you choose which team schedules to push the slots to. You can publish to all participating teams at once or select a subset. Review the draft on the draft review screen before publishing to confirm slot assignments and avoid duplicating previously published slots.
Recovery & Troubleshooting
- Event missing after save: check filters, enable
Show Practices, and confirmUpcomingvsPast. - Wrong recurring dates changed: reopen Manage, apply the correct scope, and use
Revert to Serieswhen needed. - Wrong tracker mode opened: verify the game stat config, then run
Trackagain and choose the correct mode. - Live link not useful yet: open
View Livefirst, confirm game status, then resend withShare. .icsexport missing events: adjust filters, then export again.- Access denied: confirm you are signed in with coach/admin manage access to that team.
- ICS export shows wrong end times: Re-export — end times now use actual event end times with type-specific defaults (1 hr practices, 2 hr games).
- Fan Feed option not showing: The Fan Feed only appears for public teams or when the game is explicitly marked as shareable.
- Organization draft slots publishing to wrong teams: Save draft locally first, review all slot assignments, then publish.
- Private feed not updating in Apple Calendar: Apple Calendar syncs subscriptions approximately every 24 hours. To force an immediate refresh, right-click the subscribed calendar in the Calendar app and choose Refresh. You can also reduce the default sync interval in Calendar Preferences under the Accounts tab for the relevant account.
- Fan Feed URL not visible in the schedule UI: The Fan Feed option only appears when the team is set to Public in team settings, or when at least one game is explicitly marked as shareable. Confirm the team visibility setting in
edit-team.htmlbefore looking for the Fan Feed option. - Organization draft slots publishing duplicates: Before publishing, open the draft review screen and check the status of each slot. Slots that were already published in a prior session will be flagged. Do not re-publish a draft set that has already been applied — use the per-team schedule editor to add any missing individual slots instead.
- ICS export times are wrong: Re-export the file. The export now uses actual end times from the event record. If an event has no end time set, it defaults to +1 hour for practices and +2 hours for games. If times still look incorrect after re-exporting, confirm that end times are saved on the event in
edit-schedule.html.
Related Workflows
team-setup: Create and configure the team before scheduling.roster: Confirm players before arrival and availability work.game-day: Run sideline operations after publishing schedule.track-game: Capture stats and outcomes during play.communication: Send updates, cancellations, and links.live-watch-replay: Manage live audience and replay access.
Need More Help
- Reproduce the issue once.
- Note the page:
edit-schedule.html,calendar.html,team.html,game-plan.html, orlive-game.html. - Include team name, event date/time, and opponent.
- Include the exact action clicked (
Track,Command Center,Share,Watch Replay, or recurring manage action) and what happened.